Added new concept of a tuning database; tryout phase
[hashcat.git] / src / shared.c
1 /**
2 * Authors.....: Jens Steube <jens.steube@gmail.com>
3 * Gabriele Gristina <matrix@hashcat.net>
4 *
5 * License.....: MIT
6 */
7
8 #ifdef OSX
9 #include <stdio.h>
10 #endif
11
12 #include <shared.h>
13 #include <limits.h>
14
15 /**
16 * basic bit handling
17 */
18
19 u32 rotl32 (const u32 a, const u32 n)
20 {
21 return ((a << n) | (a >> (32 - n)));
22 }
23
24 u32 rotr32 (const u32 a, const u32 n)
25 {
26 return ((a >> n) | (a << (32 - n)));
27 }
28
29 u64 rotl64 (const u64 a, const u64 n)
30 {
31 return ((a << n) | (a >> (64 - n)));
32 }
33
34 u64 rotr64 (const u64 a, const u64 n)
35 {
36 return ((a >> n) | (a << (64 - n)));
37 }
38
39 u32 byte_swap_32 (const u32 n)
40 {
41 return (n & 0xff000000) >> 24
42 | (n & 0x00ff0000) >> 8
43 | (n & 0x0000ff00) << 8
44 | (n & 0x000000ff) << 24;
45 }
46
47 u64 byte_swap_64 (const u64 n)
48 {
49 return (n & 0xff00000000000000ULL) >> 56
50 | (n & 0x00ff000000000000ULL) >> 40
51 | (n & 0x0000ff0000000000ULL) >> 24
52 | (n & 0x000000ff00000000ULL) >> 8
53 | (n & 0x00000000ff000000ULL) << 8
54 | (n & 0x0000000000ff0000ULL) << 24
55 | (n & 0x000000000000ff00ULL) << 40
56 | (n & 0x00000000000000ffULL) << 56;
57 }
58
59 /**
60 * ciphers for use on cpu
61 */
62
63 #include "cpu-des.c"
64 #include "cpu-aes.c"
65
66 /**
67 * hashes for use on cpu
68 */
69
70 #include "cpu-md5.c"
71 #include "cpu-sha256.c"
72
73 /**
74 * logging
75 */
76
77 int last_len = 0;
78
79 void log_final (FILE *fp, const char *fmt, va_list ap)
80 {
81 if (last_len)
82 {
83 fputc ('\r', fp);
84
85 for (int i = 0; i < last_len; i++)
86 {
87 fputc (' ', fp);
88 }
89
90 fputc ('\r', fp);
91 }
92
93 char s[4096] = { 0 };
94
95 int max_len = (int) sizeof (s);
96
97 int len = vsnprintf (s, max_len, fmt, ap);
98
99 if (len > max_len) len = max_len;
100
101 fwrite (s, len, 1, fp);
102
103 fflush (fp);
104
105 last_len = len;
106 }
107
108 void log_out_nn (FILE *fp, const char *fmt, ...)
109 {
110 if (SUPPRESS_OUTPUT) return;
111
112 va_list ap;
113
114 va_start (ap, fmt);
115
116 log_final (fp, fmt, ap);
117
118 va_end (ap);
119 }
120
121 void log_info_nn (const char *fmt, ...)
122 {
123 if (SUPPRESS_OUTPUT) return;
124
125 va_list ap;
126
127 va_start (ap, fmt);
128
129 log_final (stdout, fmt, ap);
130
131 va_end (ap);
132 }
133
134 void log_error_nn (const char *fmt, ...)
135 {
136 if (SUPPRESS_OUTPUT) return;
137
138 va_list ap;
139
140 va_start (ap, fmt);
141
142 log_final (stderr, fmt, ap);
143
144 va_end (ap);
145 }
146
147 void log_out (FILE *fp, const char *fmt, ...)
148 {
149 if (SUPPRESS_OUTPUT) return;
150
151 va_list ap;
152
153 va_start (ap, fmt);
154
155 log_final (fp, fmt, ap);
156
157 va_end (ap);
158
159 fputc ('\n', fp);
160
161 last_len = 0;
162 }
163
164 void log_info (const char *fmt, ...)
165 {
166 if (SUPPRESS_OUTPUT) return;
167
168 va_list ap;
169
170 va_start (ap, fmt);
171
172 log_final (stdout, fmt, ap);
173
174 va_end (ap);
175
176 fputc ('\n', stdout);
177
178 last_len = 0;
179 }
180
181 void log_error (const char *fmt, ...)
182 {
183 if (SUPPRESS_OUTPUT) return;
184
185 fputc ('\n', stderr);
186 fputc ('\n', stderr);
187
188 va_list ap;
189
190 va_start (ap, fmt);
191
192 log_final (stderr, fmt, ap);
193
194 va_end (ap);
195
196 fputc ('\n', stderr);
197 fputc ('\n', stderr);
198
199 last_len = 0;
200 }
201
202 /**
203 * converter
204 */
205
206 u8 int_to_base32 (const u8 c)
207 {
208 static const u8 tbl[0x20] =
209 {
210 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
211 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
212 };
213
214 return tbl[c];
215 }
216
217 u8 base32_to_int (const u8 c)
218 {
219 if ((c >= 'A') && (c <= 'Z')) return c - 'A';
220 else if ((c >= '2') && (c <= '7')) return c - '2' + 26;
221
222 return 0;
223 }
224
225 u8 int_to_itoa32 (const u8 c)
226 {
227 static const u8 tbl[0x20] =
228 {
229 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
230 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
231 };
232
233 return tbl[c];
234 }
235
236 u8 itoa32_to_int (const u8 c)
237 {
238 if ((c >= '0') && (c <= '9')) return c - '0';
239 else if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10;
240
241 return 0;
242 }
243
244 u8 int_to_itoa64 (const u8 c)
245 {
246 static const u8 tbl[0x40] =
247 {
248 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
249 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
250 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
251 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
252 };
253
254 return tbl[c];
255 }
256
257 u8 itoa64_to_int (const u8 c)
258 {
259 static const u8 tbl[0x100] =
260 {
261 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
262 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
263 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01,
264 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
265 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
266 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
267 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
268 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
269 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
270 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
271 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
272 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
273 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
274 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
275 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
276 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
277 };
278
279 return tbl[c];
280 }
281
282 u8 int_to_base64 (const u8 c)
283 {
284 static const u8 tbl[0x40] =
285 {
286 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
287 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
288 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
289 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f,
290 };
291
292 return tbl[c];
293 }
294
295 u8 base64_to_int (const u8 c)
296 {
297 static const u8 tbl[0x100] =
298 {
299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
300 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
302 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
303 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
304 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
305 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
306 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
309 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 };
316
317 return tbl[c];
318 }
319
320 u8 int_to_bf64 (const u8 c)
321 {
322 static const u8 tbl[0x40] =
323 {
324 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
325 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
326 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
327 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
328 };
329
330 return tbl[c];
331 }
332
333 u8 bf64_to_int (const u8 c)
334 {
335 static const u8 tbl[0x100] =
336 {
337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
338 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
340 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
341 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
342 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
343 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
344 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
347 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
349 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 };
354
355 return tbl[c];
356 }
357
358 u8 int_to_lotus64 (const u8 c)
359 {
360 if (c < 10) return '0' + c;
361 else if (c < 36) return 'A' + c - 10;
362 else if (c < 62) return 'a' + c - 36;
363 else if (c == 62) return '+';
364 else if (c == 63) return '/';
365
366 return 0;
367 }
368
369 u8 lotus64_to_int (const u8 c)
370 {
371 if ((c >= '0') && (c <= '9')) return c - '0';
372 else if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10;
373 else if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36;
374 else if (c == '+') return 62;
375 else if (c == '/') return 63;
376 else
377
378 return 0;
379 }
380
381 int base32_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
382 {
383 const u8 *in_ptr = in_buf;
384
385 u8 *out_ptr = out_buf;
386
387 for (int i = 0; i < in_len; i += 8)
388 {
389 const u8 out_val0 = f (in_ptr[0] & 0x7f);
390 const u8 out_val1 = f (in_ptr[1] & 0x7f);
391 const u8 out_val2 = f (in_ptr[2] & 0x7f);
392 const u8 out_val3 = f (in_ptr[3] & 0x7f);
393 const u8 out_val4 = f (in_ptr[4] & 0x7f);
394 const u8 out_val5 = f (in_ptr[5] & 0x7f);
395 const u8 out_val6 = f (in_ptr[6] & 0x7f);
396 const u8 out_val7 = f (in_ptr[7] & 0x7f);
397
398 out_ptr[0] = ((out_val0 << 3) & 0xf8) | ((out_val1 >> 2) & 0x07);
399 out_ptr[1] = ((out_val1 << 6) & 0xc0) | ((out_val2 << 1) & 0x3e) | ((out_val3 >> 4) & 0x01);
400 out_ptr[2] = ((out_val3 << 4) & 0xf0) | ((out_val4 >> 1) & 0x0f);
401 out_ptr[3] = ((out_val4 << 7) & 0x80) | ((out_val5 << 2) & 0x7c) | ((out_val6 >> 3) & 0x03);
402 out_ptr[4] = ((out_val6 << 5) & 0xe0) | ((out_val7 >> 0) & 0x1f);
403
404 in_ptr += 8;
405 out_ptr += 5;
406 }
407
408 for (int i = 0; i < in_len; i++)
409 {
410 if (in_buf[i] != '=') continue;
411
412 in_len = i;
413 }
414
415 int out_len = (in_len * 5) / 8;
416
417 return out_len;
418 }
419
420 int base32_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
421 {
422 const u8 *in_ptr = in_buf;
423
424 u8 *out_ptr = out_buf;
425
426 for (int i = 0; i < in_len; i += 5)
427 {
428 const u8 out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f));
429 const u8 out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03));
430 const u8 out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f));
431 const u8 out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f));
432 const u8 out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01));
433 const u8 out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f));
434 const u8 out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07));
435 const u8 out_val7 = f ( ((in_ptr[4] >> 0) & 0x1f));
436
437 out_ptr[0] = out_val0 & 0x7f;
438 out_ptr[1] = out_val1 & 0x7f;
439 out_ptr[2] = out_val2 & 0x7f;
440 out_ptr[3] = out_val3 & 0x7f;
441 out_ptr[4] = out_val4 & 0x7f;
442 out_ptr[5] = out_val5 & 0x7f;
443 out_ptr[6] = out_val6 & 0x7f;
444 out_ptr[7] = out_val7 & 0x7f;
445
446 in_ptr += 5;
447 out_ptr += 8;
448 }
449
450 int out_len = (int) (((0.5 + (float) in_len) * 8) / 5); // ceil (in_len * 8 / 5)
451
452 while (out_len % 8)
453 {
454 out_buf[out_len] = '=';
455
456 out_len++;
457 }
458
459 return out_len;
460 }
461
462 int base64_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
463 {
464 const u8 *in_ptr = in_buf;
465
466 u8 *out_ptr = out_buf;
467
468 for (int i = 0; i < in_len; i += 4)
469 {
470 const u8 out_val0 = f (in_ptr[0] & 0x7f);
471 const u8 out_val1 = f (in_ptr[1] & 0x7f);
472 const u8 out_val2 = f (in_ptr[2] & 0x7f);
473 const u8 out_val3 = f (in_ptr[3] & 0x7f);
474
475 out_ptr[0] = ((out_val0 << 2) & 0xfc) | ((out_val1 >> 4) & 0x03);
476 out_ptr[1] = ((out_val1 << 4) & 0xf0) | ((out_val2 >> 2) & 0x0f);
477 out_ptr[2] = ((out_val2 << 6) & 0xc0) | ((out_val3 >> 0) & 0x3f);
478
479 in_ptr += 4;
480 out_ptr += 3;
481 }
482
483 for (int i = 0; i < in_len; i++)
484 {
485 if (in_buf[i] != '=') continue;
486
487 in_len = i;
488 }
489
490 int out_len = (in_len * 6) / 8;
491
492 return out_len;
493 }
494
495 int base64_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
496 {
497 const u8 *in_ptr = in_buf;
498
499 u8 *out_ptr = out_buf;
500
501 for (int i = 0; i < in_len; i += 3)
502 {
503 const u8 out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f));
504 const u8 out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f));
505 const u8 out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03));
506 const u8 out_val3 = f ( ((in_ptr[2] >> 0) & 0x3f));
507
508 out_ptr[0] = out_val0 & 0x7f;
509 out_ptr[1] = out_val1 & 0x7f;
510 out_ptr[2] = out_val2 & 0x7f;
511 out_ptr[3] = out_val3 & 0x7f;
512
513 in_ptr += 3;
514 out_ptr += 4;
515 }
516
517 int out_len = (int) (((0.5 + (float) in_len) * 8) / 6); // ceil (in_len * 8 / 6)
518
519 while (out_len % 4)
520 {
521 out_buf[out_len] = '=';
522
523 out_len++;
524 }
525
526 return out_len;
527 }
528
529 int is_valid_hex_char (const u8 c)
530 {
531 if ((c >= '0') && (c <= '9')) return 1;
532 if ((c >= 'A') && (c <= 'F')) return 1;
533 if ((c >= 'a') && (c <= 'f')) return 1;
534
535 return 0;
536 }
537
538 u8 hex_convert (const u8 c)
539 {
540 return (c & 15) + (c >> 6) * 9;
541 }
542
543 u8 hex_to_u8 (const u8 hex[2])
544 {
545 u8 v = 0;
546
547 v |= (hex_convert (hex[1]) << 0);
548 v |= (hex_convert (hex[0]) << 4);
549
550 return (v);
551 }
552
553 u32 hex_to_u32 (const u8 hex[8])
554 {
555 u32 v = 0;
556
557 v |= ((u32) hex_convert (hex[7])) << 0;
558 v |= ((u32) hex_convert (hex[6])) << 4;
559 v |= ((u32) hex_convert (hex[5])) << 8;
560 v |= ((u32) hex_convert (hex[4])) << 12;
561 v |= ((u32) hex_convert (hex[3])) << 16;
562 v |= ((u32) hex_convert (hex[2])) << 20;
563 v |= ((u32) hex_convert (hex[1])) << 24;
564 v |= ((u32) hex_convert (hex[0])) << 28;
565
566 return (v);
567 }
568
569 u64 hex_to_u64 (const u8 hex[16])
570 {
571 u64 v = 0;
572
573 v |= ((u64) hex_convert (hex[15]) << 0);
574 v |= ((u64) hex_convert (hex[14]) << 4);
575 v |= ((u64) hex_convert (hex[13]) << 8);
576 v |= ((u64) hex_convert (hex[12]) << 12);
577 v |= ((u64) hex_convert (hex[11]) << 16);
578 v |= ((u64) hex_convert (hex[10]) << 20);
579 v |= ((u64) hex_convert (hex[ 9]) << 24);
580 v |= ((u64) hex_convert (hex[ 8]) << 28);
581 v |= ((u64) hex_convert (hex[ 7]) << 32);
582 v |= ((u64) hex_convert (hex[ 6]) << 36);
583 v |= ((u64) hex_convert (hex[ 5]) << 40);
584 v |= ((u64) hex_convert (hex[ 4]) << 44);
585 v |= ((u64) hex_convert (hex[ 3]) << 48);
586 v |= ((u64) hex_convert (hex[ 2]) << 52);
587 v |= ((u64) hex_convert (hex[ 1]) << 56);
588 v |= ((u64) hex_convert (hex[ 0]) << 60);
589
590 return (v);
591 }
592
593 void bin_to_hex_lower (const u32 v, u8 hex[8])
594 {
595 hex[0] = v >> 28 & 15;
596 hex[1] = v >> 24 & 15;
597 hex[2] = v >> 20 & 15;
598 hex[3] = v >> 16 & 15;
599 hex[4] = v >> 12 & 15;
600 hex[5] = v >> 8 & 15;
601 hex[6] = v >> 4 & 15;
602 hex[7] = v >> 0 & 15;
603
604 u32 add;
605
606 hex[0] += 6; add = ((hex[0] & 0x10) >> 4) * 39; hex[0] += 42 + add;
607 hex[1] += 6; add = ((hex[1] & 0x10) >> 4) * 39; hex[1] += 42 + add;
608 hex[2] += 6; add = ((hex[2] & 0x10) >> 4) * 39; hex[2] += 42 + add;
609 hex[3] += 6; add = ((hex[3] & 0x10) >> 4) * 39; hex[3] += 42 + add;
610 hex[4] += 6; add = ((hex[4] & 0x10) >> 4) * 39; hex[4] += 42 + add;
611 hex[5] += 6; add = ((hex[5] & 0x10) >> 4) * 39; hex[5] += 42 + add;
612 hex[6] += 6; add = ((hex[6] & 0x10) >> 4) * 39; hex[6] += 42 + add;
613 hex[7] += 6; add = ((hex[7] & 0x10) >> 4) * 39; hex[7] += 42 + add;
614 }
615
616 /**
617 * decoder
618 */
619
620 static void AES128_decrypt_cbc (const u32 key[4], const u32 iv[4], const u32 in[16], u32 out[16])
621 {
622 AES_KEY skey;
623
624 AES_set_decrypt_key ((const u8 *) key, 128, &skey);
625
626 u32 _iv[4] = { 0 };
627
628 _iv[0] = iv[0];
629 _iv[1] = iv[1];
630 _iv[2] = iv[2];
631 _iv[3] = iv[3];
632
633 for (int i = 0; i < 16; i += 4)
634 {
635 u32 _in[4] = { 0 };
636 u32 _out[4] = { 0 };
637
638 _in[0] = in[i + 0];
639 _in[1] = in[i + 1];
640 _in[2] = in[i + 2];
641 _in[3] = in[i + 3];
642
643 AES_decrypt (&skey, (const u8 *) _in, (u8 *) _out);
644
645 _out[0] ^= _iv[0];
646 _out[1] ^= _iv[1];
647 _out[2] ^= _iv[2];
648 _out[3] ^= _iv[3];
649
650 out[i + 0] = _out[0];
651 out[i + 1] = _out[1];
652 out[i + 2] = _out[2];
653 out[i + 3] = _out[3];
654
655 _iv[0] = _in[0];
656 _iv[1] = _in[1];
657 _iv[2] = _in[2];
658 _iv[3] = _in[3];
659 }
660 }
661
662 static void juniper_decrypt_hash (char *in, char *out)
663 {
664 // base64 decode
665
666 u8 base64_buf[100] = { 0 };
667
668 base64_decode (base64_to_int, (const u8 *) in, DISPLAY_LEN_MIN_501, base64_buf);
669
670 // iv stuff
671
672 u32 juniper_iv[4] = { 0 };
673
674 memcpy (juniper_iv, base64_buf, 12);
675
676 memcpy (out, juniper_iv, 12);
677
678 // reversed key
679
680 u32 juniper_key[4] = { 0 };
681
682 juniper_key[0] = byte_swap_32 (0xa6707a7e);
683 juniper_key[1] = byte_swap_32 (0x8df91059);
684 juniper_key[2] = byte_swap_32 (0xdea70ae5);
685 juniper_key[3] = byte_swap_32 (0x2f9c2442);
686
687 // AES decrypt
688
689 u32 *in_ptr = (u32 *) (base64_buf + 12);
690 u32 *out_ptr = (u32 *) (out + 12);
691
692 AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr);
693 }
694
695 void phpass_decode (u8 digest[16], u8 buf[22])
696 {
697 int l;
698
699 l = itoa64_to_int (buf[ 0]) << 0;
700 l |= itoa64_to_int (buf[ 1]) << 6;
701 l |= itoa64_to_int (buf[ 2]) << 12;
702 l |= itoa64_to_int (buf[ 3]) << 18;
703
704 digest[ 0] = (l >> 0) & 0xff;
705 digest[ 1] = (l >> 8) & 0xff;
706 digest[ 2] = (l >> 16) & 0xff;
707
708 l = itoa64_to_int (buf[ 4]) << 0;
709 l |= itoa64_to_int (buf[ 5]) << 6;
710 l |= itoa64_to_int (buf[ 6]) << 12;
711 l |= itoa64_to_int (buf[ 7]) << 18;
712
713 digest[ 3] = (l >> 0) & 0xff;
714 digest[ 4] = (l >> 8) & 0xff;
715 digest[ 5] = (l >> 16) & 0xff;
716
717 l = itoa64_to_int (buf[ 8]) << 0;
718 l |= itoa64_to_int (buf[ 9]) << 6;
719 l |= itoa64_to_int (buf[10]) << 12;
720 l |= itoa64_to_int (buf[11]) << 18;
721
722 digest[ 6] = (l >> 0) & 0xff;
723 digest[ 7] = (l >> 8) & 0xff;
724 digest[ 8] = (l >> 16) & 0xff;
725
726 l = itoa64_to_int (buf[12]) << 0;
727 l |= itoa64_to_int (buf[13]) << 6;
728 l |= itoa64_to_int (buf[14]) << 12;
729 l |= itoa64_to_int (buf[15]) << 18;
730
731 digest[ 9] = (l >> 0) & 0xff;
732 digest[10] = (l >> 8) & 0xff;
733 digest[11] = (l >> 16) & 0xff;
734
735 l = itoa64_to_int (buf[16]) << 0;
736 l |= itoa64_to_int (buf[17]) << 6;
737 l |= itoa64_to_int (buf[18]) << 12;
738 l |= itoa64_to_int (buf[19]) << 18;
739
740 digest[12] = (l >> 0) & 0xff;
741 digest[13] = (l >> 8) & 0xff;
742 digest[14] = (l >> 16) & 0xff;
743
744 l = itoa64_to_int (buf[20]) << 0;
745 l |= itoa64_to_int (buf[21]) << 6;
746
747 digest[15] = (l >> 0) & 0xff;
748 }
749
750 void phpass_encode (u8 digest[16], u8 buf[22])
751 {
752 int l;
753
754 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
755
756 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
757 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
758 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
759 buf[ 3] = int_to_itoa64 (l & 0x3f);
760
761 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
762
763 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
764 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
765 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
766 buf[ 7] = int_to_itoa64 (l & 0x3f);
767
768 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
769
770 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
771 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
772 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
773 buf[11] = int_to_itoa64 (l & 0x3f);
774
775 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
776
777 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
778 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
779 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
780 buf[15] = int_to_itoa64 (l & 0x3f);
781
782 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
783
784 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
785 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
786 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
787 buf[19] = int_to_itoa64 (l & 0x3f);
788
789 l = (digest[15] << 0);
790
791 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
792 buf[21] = int_to_itoa64 (l & 0x3f);
793 }
794
795 void md5crypt_decode (u8 digest[16], u8 buf[22])
796 {
797 int l;
798
799 l = itoa64_to_int (buf[ 0]) << 0;
800 l |= itoa64_to_int (buf[ 1]) << 6;
801 l |= itoa64_to_int (buf[ 2]) << 12;
802 l |= itoa64_to_int (buf[ 3]) << 18;
803
804 digest[ 0] = (l >> 16) & 0xff;
805 digest[ 6] = (l >> 8) & 0xff;
806 digest[12] = (l >> 0) & 0xff;
807
808 l = itoa64_to_int (buf[ 4]) << 0;
809 l |= itoa64_to_int (buf[ 5]) << 6;
810 l |= itoa64_to_int (buf[ 6]) << 12;
811 l |= itoa64_to_int (buf[ 7]) << 18;
812
813 digest[ 1] = (l >> 16) & 0xff;
814 digest[ 7] = (l >> 8) & 0xff;
815 digest[13] = (l >> 0) & 0xff;
816
817 l = itoa64_to_int (buf[ 8]) << 0;
818 l |= itoa64_to_int (buf[ 9]) << 6;
819 l |= itoa64_to_int (buf[10]) << 12;
820 l |= itoa64_to_int (buf[11]) << 18;
821
822 digest[ 2] = (l >> 16) & 0xff;
823 digest[ 8] = (l >> 8) & 0xff;
824 digest[14] = (l >> 0) & 0xff;
825
826 l = itoa64_to_int (buf[12]) << 0;
827 l |= itoa64_to_int (buf[13]) << 6;
828 l |= itoa64_to_int (buf[14]) << 12;
829 l |= itoa64_to_int (buf[15]) << 18;
830
831 digest[ 3] = (l >> 16) & 0xff;
832 digest[ 9] = (l >> 8) & 0xff;
833 digest[15] = (l >> 0) & 0xff;
834
835 l = itoa64_to_int (buf[16]) << 0;
836 l |= itoa64_to_int (buf[17]) << 6;
837 l |= itoa64_to_int (buf[18]) << 12;
838 l |= itoa64_to_int (buf[19]) << 18;
839
840 digest[ 4] = (l >> 16) & 0xff;
841 digest[10] = (l >> 8) & 0xff;
842 digest[ 5] = (l >> 0) & 0xff;
843
844 l = itoa64_to_int (buf[20]) << 0;
845 l |= itoa64_to_int (buf[21]) << 6;
846
847 digest[11] = (l >> 0) & 0xff;
848 }
849
850 void md5crypt_encode (u8 digest[16], u8 buf[22])
851 {
852 int l;
853
854 l = (digest[ 0] << 16) | (digest[ 6] << 8) | (digest[12] << 0);
855
856 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
857 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
858 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
859 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
860
861 l = (digest[ 1] << 16) | (digest[ 7] << 8) | (digest[13] << 0);
862
863 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
864 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
865 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
866 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
867
868 l = (digest[ 2] << 16) | (digest[ 8] << 8) | (digest[14] << 0);
869
870 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
871 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
872 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
873 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
874
875 l = (digest[ 3] << 16) | (digest[ 9] << 8) | (digest[15] << 0);
876
877 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
878 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
879 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
880 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
881
882 l = (digest[ 4] << 16) | (digest[10] << 8) | (digest[ 5] << 0);
883
884 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
885 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
886 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
887 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
888
889 l = (digest[11] << 0);
890
891 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
892 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
893 }
894
895 void sha512crypt_decode (u8 digest[64], u8 buf[86])
896 {
897 int l;
898
899 l = itoa64_to_int (buf[ 0]) << 0;
900 l |= itoa64_to_int (buf[ 1]) << 6;
901 l |= itoa64_to_int (buf[ 2]) << 12;
902 l |= itoa64_to_int (buf[ 3]) << 18;
903
904 digest[ 0] = (l >> 16) & 0xff;
905 digest[21] = (l >> 8) & 0xff;
906 digest[42] = (l >> 0) & 0xff;
907
908 l = itoa64_to_int (buf[ 4]) << 0;
909 l |= itoa64_to_int (buf[ 5]) << 6;
910 l |= itoa64_to_int (buf[ 6]) << 12;
911 l |= itoa64_to_int (buf[ 7]) << 18;
912
913 digest[22] = (l >> 16) & 0xff;
914 digest[43] = (l >> 8) & 0xff;
915 digest[ 1] = (l >> 0) & 0xff;
916
917 l = itoa64_to_int (buf[ 8]) << 0;
918 l |= itoa64_to_int (buf[ 9]) << 6;
919 l |= itoa64_to_int (buf[10]) << 12;
920 l |= itoa64_to_int (buf[11]) << 18;
921
922 digest[44] = (l >> 16) & 0xff;
923 digest[ 2] = (l >> 8) & 0xff;
924 digest[23] = (l >> 0) & 0xff;
925
926 l = itoa64_to_int (buf[12]) << 0;
927 l |= itoa64_to_int (buf[13]) << 6;
928 l |= itoa64_to_int (buf[14]) << 12;
929 l |= itoa64_to_int (buf[15]) << 18;
930
931 digest[ 3] = (l >> 16) & 0xff;
932 digest[24] = (l >> 8) & 0xff;
933 digest[45] = (l >> 0) & 0xff;
934
935 l = itoa64_to_int (buf[16]) << 0;
936 l |= itoa64_to_int (buf[17]) << 6;
937 l |= itoa64_to_int (buf[18]) << 12;
938 l |= itoa64_to_int (buf[19]) << 18;
939
940 digest[25] = (l >> 16) & 0xff;
941 digest[46] = (l >> 8) & 0xff;
942 digest[ 4] = (l >> 0) & 0xff;
943
944 l = itoa64_to_int (buf[20]) << 0;
945 l |= itoa64_to_int (buf[21]) << 6;
946 l |= itoa64_to_int (buf[22]) << 12;
947 l |= itoa64_to_int (buf[23]) << 18;
948
949 digest[47] = (l >> 16) & 0xff;
950 digest[ 5] = (l >> 8) & 0xff;
951 digest[26] = (l >> 0) & 0xff;
952
953 l = itoa64_to_int (buf[24]) << 0;
954 l |= itoa64_to_int (buf[25]) << 6;
955 l |= itoa64_to_int (buf[26]) << 12;
956 l |= itoa64_to_int (buf[27]) << 18;
957
958 digest[ 6] = (l >> 16) & 0xff;
959 digest[27] = (l >> 8) & 0xff;
960 digest[48] = (l >> 0) & 0xff;
961
962 l = itoa64_to_int (buf[28]) << 0;
963 l |= itoa64_to_int (buf[29]) << 6;
964 l |= itoa64_to_int (buf[30]) << 12;
965 l |= itoa64_to_int (buf[31]) << 18;
966
967 digest[28] = (l >> 16) & 0xff;
968 digest[49] = (l >> 8) & 0xff;
969 digest[ 7] = (l >> 0) & 0xff;
970
971 l = itoa64_to_int (buf[32]) << 0;
972 l |= itoa64_to_int (buf[33]) << 6;
973 l |= itoa64_to_int (buf[34]) << 12;
974 l |= itoa64_to_int (buf[35]) << 18;
975
976 digest[50] = (l >> 16) & 0xff;
977 digest[ 8] = (l >> 8) & 0xff;
978 digest[29] = (l >> 0) & 0xff;
979
980 l = itoa64_to_int (buf[36]) << 0;
981 l |= itoa64_to_int (buf[37]) << 6;
982 l |= itoa64_to_int (buf[38]) << 12;
983 l |= itoa64_to_int (buf[39]) << 18;
984
985 digest[ 9] = (l >> 16) & 0xff;
986 digest[30] = (l >> 8) & 0xff;
987 digest[51] = (l >> 0) & 0xff;
988
989 l = itoa64_to_int (buf[40]) << 0;
990 l |= itoa64_to_int (buf[41]) << 6;
991 l |= itoa64_to_int (buf[42]) << 12;
992 l |= itoa64_to_int (buf[43]) << 18;
993
994 digest[31] = (l >> 16) & 0xff;
995 digest[52] = (l >> 8) & 0xff;
996 digest[10] = (l >> 0) & 0xff;
997
998 l = itoa64_to_int (buf[44]) << 0;
999 l |= itoa64_to_int (buf[45]) << 6;
1000 l |= itoa64_to_int (buf[46]) << 12;
1001 l |= itoa64_to_int (buf[47]) << 18;
1002
1003 digest[53] = (l >> 16) & 0xff;
1004 digest[11] = (l >> 8) & 0xff;
1005 digest[32] = (l >> 0) & 0xff;
1006
1007 l = itoa64_to_int (buf[48]) << 0;
1008 l |= itoa64_to_int (buf[49]) << 6;
1009 l |= itoa64_to_int (buf[50]) << 12;
1010 l |= itoa64_to_int (buf[51]) << 18;
1011
1012 digest[12] = (l >> 16) & 0xff;
1013 digest[33] = (l >> 8) & 0xff;
1014 digest[54] = (l >> 0) & 0xff;
1015
1016 l = itoa64_to_int (buf[52]) << 0;
1017 l |= itoa64_to_int (buf[53]) << 6;
1018 l |= itoa64_to_int (buf[54]) << 12;
1019 l |= itoa64_to_int (buf[55]) << 18;
1020
1021 digest[34] = (l >> 16) & 0xff;
1022 digest[55] = (l >> 8) & 0xff;
1023 digest[13] = (l >> 0) & 0xff;
1024
1025 l = itoa64_to_int (buf[56]) << 0;
1026 l |= itoa64_to_int (buf[57]) << 6;
1027 l |= itoa64_to_int (buf[58]) << 12;
1028 l |= itoa64_to_int (buf[59]) << 18;
1029
1030 digest[56] = (l >> 16) & 0xff;
1031 digest[14] = (l >> 8) & 0xff;
1032 digest[35] = (l >> 0) & 0xff;
1033
1034 l = itoa64_to_int (buf[60]) << 0;
1035 l |= itoa64_to_int (buf[61]) << 6;
1036 l |= itoa64_to_int (buf[62]) << 12;
1037 l |= itoa64_to_int (buf[63]) << 18;
1038
1039 digest[15] = (l >> 16) & 0xff;
1040 digest[36] = (l >> 8) & 0xff;
1041 digest[57] = (l >> 0) & 0xff;
1042
1043 l = itoa64_to_int (buf[64]) << 0;
1044 l |= itoa64_to_int (buf[65]) << 6;
1045 l |= itoa64_to_int (buf[66]) << 12;
1046 l |= itoa64_to_int (buf[67]) << 18;
1047
1048 digest[37] = (l >> 16) & 0xff;
1049 digest[58] = (l >> 8) & 0xff;
1050 digest[16] = (l >> 0) & 0xff;
1051
1052 l = itoa64_to_int (buf[68]) << 0;
1053 l |= itoa64_to_int (buf[69]) << 6;
1054 l |= itoa64_to_int (buf[70]) << 12;
1055 l |= itoa64_to_int (buf[71]) << 18;
1056
1057 digest[59] = (l >> 16) & 0xff;
1058 digest[17] = (l >> 8) & 0xff;
1059 digest[38] = (l >> 0) & 0xff;
1060
1061 l = itoa64_to_int (buf[72]) << 0;
1062 l |= itoa64_to_int (buf[73]) << 6;
1063 l |= itoa64_to_int (buf[74]) << 12;
1064 l |= itoa64_to_int (buf[75]) << 18;
1065
1066 digest[18] = (l >> 16) & 0xff;
1067 digest[39] = (l >> 8) & 0xff;
1068 digest[60] = (l >> 0) & 0xff;
1069
1070 l = itoa64_to_int (buf[76]) << 0;
1071 l |= itoa64_to_int (buf[77]) << 6;
1072 l |= itoa64_to_int (buf[78]) << 12;
1073 l |= itoa64_to_int (buf[79]) << 18;
1074
1075 digest[40] = (l >> 16) & 0xff;
1076 digest[61] = (l >> 8) & 0xff;
1077 digest[19] = (l >> 0) & 0xff;
1078
1079 l = itoa64_to_int (buf[80]) << 0;
1080 l |= itoa64_to_int (buf[81]) << 6;
1081 l |= itoa64_to_int (buf[82]) << 12;
1082 l |= itoa64_to_int (buf[83]) << 18;
1083
1084 digest[62] = (l >> 16) & 0xff;
1085 digest[20] = (l >> 8) & 0xff;
1086 digest[41] = (l >> 0) & 0xff;
1087
1088 l = itoa64_to_int (buf[84]) << 0;
1089 l |= itoa64_to_int (buf[85]) << 6;
1090
1091 digest[63] = (l >> 0) & 0xff;
1092 }
1093
1094 void sha512crypt_encode (u8 digest[64], u8 buf[86])
1095 {
1096 int l;
1097
1098 l = (digest[ 0] << 16) | (digest[21] << 8) | (digest[42] << 0);
1099
1100 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1101 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1102 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1103 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
1104
1105 l = (digest[22] << 16) | (digest[43] << 8) | (digest[ 1] << 0);
1106
1107 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1108 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1109 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1110 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
1111
1112 l = (digest[44] << 16) | (digest[ 2] << 8) | (digest[23] << 0);
1113
1114 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1115 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1116 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1117 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
1118
1119 l = (digest[ 3] << 16) | (digest[24] << 8) | (digest[45] << 0);
1120
1121 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1122 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1123 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1124 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
1125
1126 l = (digest[25] << 16) | (digest[46] << 8) | (digest[ 4] << 0);
1127
1128 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1129 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1130 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1131 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
1132
1133 l = (digest[47] << 16) | (digest[ 5] << 8) | (digest[26] << 0);
1134
1135 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1136 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1137 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1138 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
1139
1140 l = (digest[ 6] << 16) | (digest[27] << 8) | (digest[48] << 0);
1141
1142 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1143 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1144 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1145 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
1146
1147 l = (digest[28] << 16) | (digest[49] << 8) | (digest[ 7] << 0);
1148
1149 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1150 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1151 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1152 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
1153
1154 l = (digest[50] << 16) | (digest[ 8] << 8) | (digest[29] << 0);
1155
1156 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1157 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1158 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1159 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
1160
1161 l = (digest[ 9] << 16) | (digest[30] << 8) | (digest[51] << 0);
1162
1163 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1164 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1165 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1166 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
1167
1168 l = (digest[31] << 16) | (digest[52] << 8) | (digest[10] << 0);
1169
1170 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1171 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1172 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1173 buf[43] = int_to_itoa64 (l & 0x3f); l >>= 6;
1174
1175 l = (digest[53] << 16) | (digest[11] << 8) | (digest[32] << 0);
1176
1177 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1178 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1179 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1180 buf[47] = int_to_itoa64 (l & 0x3f); l >>= 6;
1181
1182 l = (digest[12] << 16) | (digest[33] << 8) | (digest[54] << 0);
1183
1184 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1185 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1186 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1187 buf[51] = int_to_itoa64 (l & 0x3f); l >>= 6;
1188
1189 l = (digest[34] << 16) | (digest[55] << 8) | (digest[13] << 0);
1190
1191 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1192 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1193 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1194 buf[55] = int_to_itoa64 (l & 0x3f); l >>= 6;
1195
1196 l = (digest[56] << 16) | (digest[14] << 8) | (digest[35] << 0);
1197
1198 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1199 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1200 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1201 buf[59] = int_to_itoa64 (l & 0x3f); l >>= 6;
1202
1203 l = (digest[15] << 16) | (digest[36] << 8) | (digest[57] << 0);
1204
1205 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1206 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1207 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1208 buf[63] = int_to_itoa64 (l & 0x3f); l >>= 6;
1209
1210 l = (digest[37] << 16) | (digest[58] << 8) | (digest[16] << 0);
1211
1212 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1213 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1214 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1215 buf[67] = int_to_itoa64 (l & 0x3f); l >>= 6;
1216
1217 l = (digest[59] << 16) | (digest[17] << 8) | (digest[38] << 0);
1218
1219 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1220 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1221 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1222 buf[71] = int_to_itoa64 (l & 0x3f); l >>= 6;
1223
1224 l = (digest[18] << 16) | (digest[39] << 8) | (digest[60] << 0);
1225
1226 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1227 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1228 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1229 buf[75] = int_to_itoa64 (l & 0x3f); l >>= 6;
1230
1231 l = (digest[40] << 16) | (digest[61] << 8) | (digest[19] << 0);
1232
1233 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1234 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1235 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1236 buf[79] = int_to_itoa64 (l & 0x3f); l >>= 6;
1237
1238 l = (digest[62] << 16) | (digest[20] << 8) | (digest[41] << 0);
1239
1240 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1241 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1242 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1243 buf[83] = int_to_itoa64 (l & 0x3f); l >>= 6;
1244
1245 l = 0 | 0 | (digest[63] << 0);
1246
1247 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1248 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1249 }
1250
1251 void sha1aix_decode (u8 digest[20], u8 buf[27])
1252 {
1253 int l;
1254
1255 l = itoa64_to_int (buf[ 0]) << 0;
1256 l |= itoa64_to_int (buf[ 1]) << 6;
1257 l |= itoa64_to_int (buf[ 2]) << 12;
1258 l |= itoa64_to_int (buf[ 3]) << 18;
1259
1260 digest[ 2] = (l >> 0) & 0xff;
1261 digest[ 1] = (l >> 8) & 0xff;
1262 digest[ 0] = (l >> 16) & 0xff;
1263
1264 l = itoa64_to_int (buf[ 4]) << 0;
1265 l |= itoa64_to_int (buf[ 5]) << 6;
1266 l |= itoa64_to_int (buf[ 6]) << 12;
1267 l |= itoa64_to_int (buf[ 7]) << 18;
1268
1269 digest[ 5] = (l >> 0) & 0xff;
1270 digest[ 4] = (l >> 8) & 0xff;
1271 digest[ 3] = (l >> 16) & 0xff;
1272
1273 l = itoa64_to_int (buf[ 8]) << 0;
1274 l |= itoa64_to_int (buf[ 9]) << 6;
1275 l |= itoa64_to_int (buf[10]) << 12;
1276 l |= itoa64_to_int (buf[11]) << 18;
1277
1278 digest[ 8] = (l >> 0) & 0xff;
1279 digest[ 7] = (l >> 8) & 0xff;
1280 digest[ 6] = (l >> 16) & 0xff;
1281
1282 l = itoa64_to_int (buf[12]) << 0;
1283 l |= itoa64_to_int (buf[13]) << 6;
1284 l |= itoa64_to_int (buf[14]) << 12;
1285 l |= itoa64_to_int (buf[15]) << 18;
1286
1287 digest[11] = (l >> 0) & 0xff;
1288 digest[10] = (l >> 8) & 0xff;
1289 digest[ 9] = (l >> 16) & 0xff;
1290
1291 l = itoa64_to_int (buf[16]) << 0;
1292 l |= itoa64_to_int (buf[17]) << 6;
1293 l |= itoa64_to_int (buf[18]) << 12;
1294 l |= itoa64_to_int (buf[19]) << 18;
1295
1296 digest[14] = (l >> 0) & 0xff;
1297 digest[13] = (l >> 8) & 0xff;
1298 digest[12] = (l >> 16) & 0xff;
1299
1300 l = itoa64_to_int (buf[20]) << 0;
1301 l |= itoa64_to_int (buf[21]) << 6;
1302 l |= itoa64_to_int (buf[22]) << 12;
1303 l |= itoa64_to_int (buf[23]) << 18;
1304
1305 digest[17] = (l >> 0) & 0xff;
1306 digest[16] = (l >> 8) & 0xff;
1307 digest[15] = (l >> 16) & 0xff;
1308
1309 l = itoa64_to_int (buf[24]) << 0;
1310 l |= itoa64_to_int (buf[25]) << 6;
1311 l |= itoa64_to_int (buf[26]) << 12;
1312
1313 digest[19] = (l >> 8) & 0xff;
1314 digest[18] = (l >> 16) & 0xff;
1315 }
1316
1317 void sha1aix_encode (u8 digest[20], u8 buf[27])
1318 {
1319 int l;
1320
1321 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1322
1323 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1324 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1325 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1326 buf[ 3] = int_to_itoa64 (l & 0x3f);
1327
1328 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1329
1330 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1331 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1332 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1333 buf[ 7] = int_to_itoa64 (l & 0x3f);
1334
1335 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1336
1337 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1338 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1339 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1340 buf[11] = int_to_itoa64 (l & 0x3f);
1341
1342 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1343
1344 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1345 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1346 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1347 buf[15] = int_to_itoa64 (l & 0x3f);
1348
1349 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1350
1351 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1352 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1353 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1354 buf[19] = int_to_itoa64 (l & 0x3f);
1355
1356 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1357
1358 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1359 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1360 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1361 buf[23] = int_to_itoa64 (l & 0x3f);
1362
1363 l = 0 | (digest[19] << 8) | (digest[18] << 16);
1364
1365 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1366 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1367 buf[26] = int_to_itoa64 (l & 0x3f);
1368 }
1369
1370 void sha256aix_decode (u8 digest[32], u8 buf[43])
1371 {
1372 int l;
1373
1374 l = itoa64_to_int (buf[ 0]) << 0;
1375 l |= itoa64_to_int (buf[ 1]) << 6;
1376 l |= itoa64_to_int (buf[ 2]) << 12;
1377 l |= itoa64_to_int (buf[ 3]) << 18;
1378
1379 digest[ 2] = (l >> 0) & 0xff;
1380 digest[ 1] = (l >> 8) & 0xff;
1381 digest[ 0] = (l >> 16) & 0xff;
1382
1383 l = itoa64_to_int (buf[ 4]) << 0;
1384 l |= itoa64_to_int (buf[ 5]) << 6;
1385 l |= itoa64_to_int (buf[ 6]) << 12;
1386 l |= itoa64_to_int (buf[ 7]) << 18;
1387
1388 digest[ 5] = (l >> 0) & 0xff;
1389 digest[ 4] = (l >> 8) & 0xff;
1390 digest[ 3] = (l >> 16) & 0xff;
1391
1392 l = itoa64_to_int (buf[ 8]) << 0;
1393 l |= itoa64_to_int (buf[ 9]) << 6;
1394 l |= itoa64_to_int (buf[10]) << 12;
1395 l |= itoa64_to_int (buf[11]) << 18;
1396
1397 digest[ 8] = (l >> 0) & 0xff;
1398 digest[ 7] = (l >> 8) & 0xff;
1399 digest[ 6] = (l >> 16) & 0xff;
1400
1401 l = itoa64_to_int (buf[12]) << 0;
1402 l |= itoa64_to_int (buf[13]) << 6;
1403 l |= itoa64_to_int (buf[14]) << 12;
1404 l |= itoa64_to_int (buf[15]) << 18;
1405
1406 digest[11] = (l >> 0) & 0xff;
1407 digest[10] = (l >> 8) & 0xff;
1408 digest[ 9] = (l >> 16) & 0xff;
1409
1410 l = itoa64_to_int (buf[16]) << 0;
1411 l |= itoa64_to_int (buf[17]) << 6;
1412 l |= itoa64_to_int (buf[18]) << 12;
1413 l |= itoa64_to_int (buf[19]) << 18;
1414
1415 digest[14] = (l >> 0) & 0xff;
1416 digest[13] = (l >> 8) & 0xff;
1417 digest[12] = (l >> 16) & 0xff;
1418
1419 l = itoa64_to_int (buf[20]) << 0;
1420 l |= itoa64_to_int (buf[21]) << 6;
1421 l |= itoa64_to_int (buf[22]) << 12;
1422 l |= itoa64_to_int (buf[23]) << 18;
1423
1424 digest[17] = (l >> 0) & 0xff;
1425 digest[16] = (l >> 8) & 0xff;
1426 digest[15] = (l >> 16) & 0xff;
1427
1428 l = itoa64_to_int (buf[24]) << 0;
1429 l |= itoa64_to_int (buf[25]) << 6;
1430 l |= itoa64_to_int (buf[26]) << 12;
1431 l |= itoa64_to_int (buf[27]) << 18;
1432
1433 digest[20] = (l >> 0) & 0xff;
1434 digest[19] = (l >> 8) & 0xff;
1435 digest[18] = (l >> 16) & 0xff;
1436
1437 l = itoa64_to_int (buf[28]) << 0;
1438 l |= itoa64_to_int (buf[29]) << 6;
1439 l |= itoa64_to_int (buf[30]) << 12;
1440 l |= itoa64_to_int (buf[31]) << 18;
1441
1442 digest[23] = (l >> 0) & 0xff;
1443 digest[22] = (l >> 8) & 0xff;
1444 digest[21] = (l >> 16) & 0xff;
1445
1446 l = itoa64_to_int (buf[32]) << 0;
1447 l |= itoa64_to_int (buf[33]) << 6;
1448 l |= itoa64_to_int (buf[34]) << 12;
1449 l |= itoa64_to_int (buf[35]) << 18;
1450
1451 digest[26] = (l >> 0) & 0xff;
1452 digest[25] = (l >> 8) & 0xff;
1453 digest[24] = (l >> 16) & 0xff;
1454
1455 l = itoa64_to_int (buf[36]) << 0;
1456 l |= itoa64_to_int (buf[37]) << 6;
1457 l |= itoa64_to_int (buf[38]) << 12;
1458 l |= itoa64_to_int (buf[39]) << 18;
1459
1460 digest[29] = (l >> 0) & 0xff;
1461 digest[28] = (l >> 8) & 0xff;
1462 digest[27] = (l >> 16) & 0xff;
1463
1464 l = itoa64_to_int (buf[40]) << 0;
1465 l |= itoa64_to_int (buf[41]) << 6;
1466 l |= itoa64_to_int (buf[42]) << 12;
1467
1468 //digest[32] = (l >> 0) & 0xff;
1469 digest[31] = (l >> 8) & 0xff;
1470 digest[30] = (l >> 16) & 0xff;
1471 }
1472
1473 void sha256aix_encode (u8 digest[32], u8 buf[43])
1474 {
1475 int l;
1476
1477 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1478
1479 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1480 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1481 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1482 buf[ 3] = int_to_itoa64 (l & 0x3f);
1483
1484 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1485
1486 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1487 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1488 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1489 buf[ 7] = int_to_itoa64 (l & 0x3f);
1490
1491 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1492
1493 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1494 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1495 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1496 buf[11] = int_to_itoa64 (l & 0x3f);
1497
1498 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1499
1500 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1501 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1502 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1503 buf[15] = int_to_itoa64 (l & 0x3f);
1504
1505 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1506
1507 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1508 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1509 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1510 buf[19] = int_to_itoa64 (l & 0x3f);
1511
1512 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1513
1514 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1515 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1516 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1517 buf[23] = int_to_itoa64 (l & 0x3f);
1518
1519 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1520
1521 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1522 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1523 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1524 buf[27] = int_to_itoa64 (l & 0x3f);
1525
1526 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1527
1528 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1529 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1530 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1531 buf[31] = int_to_itoa64 (l & 0x3f);
1532
1533 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1534
1535 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1536 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1537 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1538 buf[35] = int_to_itoa64 (l & 0x3f);
1539
1540 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1541
1542 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1543 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1544 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1545 buf[39] = int_to_itoa64 (l & 0x3f);
1546
1547 l = 0 | (digest[31] << 8) | (digest[30] << 16);
1548
1549 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1550 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1551 buf[42] = int_to_itoa64 (l & 0x3f);
1552 }
1553
1554 void sha512aix_decode (u8 digest[64], u8 buf[86])
1555 {
1556 int l;
1557
1558 l = itoa64_to_int (buf[ 0]) << 0;
1559 l |= itoa64_to_int (buf[ 1]) << 6;
1560 l |= itoa64_to_int (buf[ 2]) << 12;
1561 l |= itoa64_to_int (buf[ 3]) << 18;
1562
1563 digest[ 2] = (l >> 0) & 0xff;
1564 digest[ 1] = (l >> 8) & 0xff;
1565 digest[ 0] = (l >> 16) & 0xff;
1566
1567 l = itoa64_to_int (buf[ 4]) << 0;
1568 l |= itoa64_to_int (buf[ 5]) << 6;
1569 l |= itoa64_to_int (buf[ 6]) << 12;
1570 l |= itoa64_to_int (buf[ 7]) << 18;
1571
1572 digest[ 5] = (l >> 0) & 0xff;
1573 digest[ 4] = (l >> 8) & 0xff;
1574 digest[ 3] = (l >> 16) & 0xff;
1575
1576 l = itoa64_to_int (buf[ 8]) << 0;
1577 l |= itoa64_to_int (buf[ 9]) << 6;
1578 l |= itoa64_to_int (buf[10]) << 12;
1579 l |= itoa64_to_int (buf[11]) << 18;
1580
1581 digest[ 8] = (l >> 0) & 0xff;
1582 digest[ 7] = (l >> 8) & 0xff;
1583 digest[ 6] = (l >> 16) & 0xff;
1584
1585 l = itoa64_to_int (buf[12]) << 0;
1586 l |= itoa64_to_int (buf[13]) << 6;
1587 l |= itoa64_to_int (buf[14]) << 12;
1588 l |= itoa64_to_int (buf[15]) << 18;
1589
1590 digest[11] = (l >> 0) & 0xff;
1591 digest[10] = (l >> 8) & 0xff;
1592 digest[ 9] = (l >> 16) & 0xff;
1593
1594 l = itoa64_to_int (buf[16]) << 0;
1595 l |= itoa64_to_int (buf[17]) << 6;
1596 l |= itoa64_to_int (buf[18]) << 12;
1597 l |= itoa64_to_int (buf[19]) << 18;
1598
1599 digest[14] = (l >> 0) & 0xff;
1600 digest[13] = (l >> 8) & 0xff;
1601 digest[12] = (l >> 16) & 0xff;
1602
1603 l = itoa64_to_int (buf[20]) << 0;
1604 l |= itoa64_to_int (buf[21]) << 6;
1605 l |= itoa64_to_int (buf[22]) << 12;
1606 l |= itoa64_to_int (buf[23]) << 18;
1607
1608 digest[17] = (l >> 0) & 0xff;
1609 digest[16] = (l >> 8) & 0xff;
1610 digest[15] = (l >> 16) & 0xff;
1611
1612 l = itoa64_to_int (buf[24]) << 0;
1613 l |= itoa64_to_int (buf[25]) << 6;
1614 l |= itoa64_to_int (buf[26]) << 12;
1615 l |= itoa64_to_int (buf[27]) << 18;
1616
1617 digest[20] = (l >> 0) & 0xff;
1618 digest[19] = (l >> 8) & 0xff;
1619 digest[18] = (l >> 16) & 0xff;
1620
1621 l = itoa64_to_int (buf[28]) << 0;
1622 l |= itoa64_to_int (buf[29]) << 6;
1623 l |= itoa64_to_int (buf[30]) << 12;
1624 l |= itoa64_to_int (buf[31]) << 18;
1625
1626 digest[23] = (l >> 0) & 0xff;
1627 digest[22] = (l >> 8) & 0xff;
1628 digest[21] = (l >> 16) & 0xff;
1629
1630 l = itoa64_to_int (buf[32]) << 0;
1631 l |= itoa64_to_int (buf[33]) << 6;
1632 l |= itoa64_to_int (buf[34]) << 12;
1633 l |= itoa64_to_int (buf[35]) << 18;
1634
1635 digest[26] = (l >> 0) & 0xff;
1636 digest[25] = (l >> 8) & 0xff;
1637 digest[24] = (l >> 16) & 0xff;
1638
1639 l = itoa64_to_int (buf[36]) << 0;
1640 l |= itoa64_to_int (buf[37]) << 6;
1641 l |= itoa64_to_int (buf[38]) << 12;
1642 l |= itoa64_to_int (buf[39]) << 18;
1643
1644 digest[29] = (l >> 0) & 0xff;
1645 digest[28] = (l >> 8) & 0xff;
1646 digest[27] = (l >> 16) & 0xff;
1647
1648 l = itoa64_to_int (buf[40]) << 0;
1649 l |= itoa64_to_int (buf[41]) << 6;
1650 l |= itoa64_to_int (buf[42]) << 12;
1651 l |= itoa64_to_int (buf[43]) << 18;
1652
1653 digest[32] = (l >> 0) & 0xff;
1654 digest[31] = (l >> 8) & 0xff;
1655 digest[30] = (l >> 16) & 0xff;
1656
1657 l = itoa64_to_int (buf[44]) << 0;
1658 l |= itoa64_to_int (buf[45]) << 6;
1659 l |= itoa64_to_int (buf[46]) << 12;
1660 l |= itoa64_to_int (buf[47]) << 18;
1661
1662 digest[35] = (l >> 0) & 0xff;
1663 digest[34] = (l >> 8) & 0xff;
1664 digest[33] = (l >> 16) & 0xff;
1665
1666 l = itoa64_to_int (buf[48]) << 0;
1667 l |= itoa64_to_int (buf[49]) << 6;
1668 l |= itoa64_to_int (buf[50]) << 12;
1669 l |= itoa64_to_int (buf[51]) << 18;
1670
1671 digest[38] = (l >> 0) & 0xff;
1672 digest[37] = (l >> 8) & 0xff;
1673 digest[36] = (l >> 16) & 0xff;
1674
1675 l = itoa64_to_int (buf[52]) << 0;
1676 l |= itoa64_to_int (buf[53]) << 6;
1677 l |= itoa64_to_int (buf[54]) << 12;
1678 l |= itoa64_to_int (buf[55]) << 18;
1679
1680 digest[41] = (l >> 0) & 0xff;
1681 digest[40] = (l >> 8) & 0xff;
1682 digest[39] = (l >> 16) & 0xff;
1683
1684 l = itoa64_to_int (buf[56]) << 0;
1685 l |= itoa64_to_int (buf[57]) << 6;
1686 l |= itoa64_to_int (buf[58]) << 12;
1687 l |= itoa64_to_int (buf[59]) << 18;
1688
1689 digest[44] = (l >> 0) & 0xff;
1690 digest[43] = (l >> 8) & 0xff;
1691 digest[42] = (l >> 16) & 0xff;
1692
1693 l = itoa64_to_int (buf[60]) << 0;
1694 l |= itoa64_to_int (buf[61]) << 6;
1695 l |= itoa64_to_int (buf[62]) << 12;
1696 l |= itoa64_to_int (buf[63]) << 18;
1697
1698 digest[47] = (l >> 0) & 0xff;
1699 digest[46] = (l >> 8) & 0xff;
1700 digest[45] = (l >> 16) & 0xff;
1701
1702 l = itoa64_to_int (buf[64]) << 0;
1703 l |= itoa64_to_int (buf[65]) << 6;
1704 l |= itoa64_to_int (buf[66]) << 12;
1705 l |= itoa64_to_int (buf[67]) << 18;
1706
1707 digest[50] = (l >> 0) & 0xff;
1708 digest[49] = (l >> 8) & 0xff;
1709 digest[48] = (l >> 16) & 0xff;
1710
1711 l = itoa64_to_int (buf[68]) << 0;
1712 l |= itoa64_to_int (buf[69]) << 6;
1713 l |= itoa64_to_int (buf[70]) << 12;
1714 l |= itoa64_to_int (buf[71]) << 18;
1715
1716 digest[53] = (l >> 0) & 0xff;
1717 digest[52] = (l >> 8) & 0xff;
1718 digest[51] = (l >> 16) & 0xff;
1719
1720 l = itoa64_to_int (buf[72]) << 0;
1721 l |= itoa64_to_int (buf[73]) << 6;
1722 l |= itoa64_to_int (buf[74]) << 12;
1723 l |= itoa64_to_int (buf[75]) << 18;
1724
1725 digest[56] = (l >> 0) & 0xff;
1726 digest[55] = (l >> 8) & 0xff;
1727 digest[54] = (l >> 16) & 0xff;
1728
1729 l = itoa64_to_int (buf[76]) << 0;
1730 l |= itoa64_to_int (buf[77]) << 6;
1731 l |= itoa64_to_int (buf[78]) << 12;
1732 l |= itoa64_to_int (buf[79]) << 18;
1733
1734 digest[59] = (l >> 0) & 0xff;
1735 digest[58] = (l >> 8) & 0xff;
1736 digest[57] = (l >> 16) & 0xff;
1737
1738 l = itoa64_to_int (buf[80]) << 0;
1739 l |= itoa64_to_int (buf[81]) << 6;
1740 l |= itoa64_to_int (buf[82]) << 12;
1741 l |= itoa64_to_int (buf[83]) << 18;
1742
1743 digest[62] = (l >> 0) & 0xff;
1744 digest[61] = (l >> 8) & 0xff;
1745 digest[60] = (l >> 16) & 0xff;
1746
1747 l = itoa64_to_int (buf[84]) << 0;
1748 l |= itoa64_to_int (buf[85]) << 6;
1749
1750 digest[63] = (l >> 16) & 0xff;
1751 }
1752
1753 void sha512aix_encode (u8 digest[64], u8 buf[86])
1754 {
1755 int l;
1756
1757 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1758
1759 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1760 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1761 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1762 buf[ 3] = int_to_itoa64 (l & 0x3f);
1763
1764 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1765
1766 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1767 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1768 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1769 buf[ 7] = int_to_itoa64 (l & 0x3f);
1770
1771 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1772
1773 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1774 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1775 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1776 buf[11] = int_to_itoa64 (l & 0x3f);
1777
1778 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1779
1780 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1781 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1782 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1783 buf[15] = int_to_itoa64 (l & 0x3f);
1784
1785 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1786
1787 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1788 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1789 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1790 buf[19] = int_to_itoa64 (l & 0x3f);
1791
1792 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1793
1794 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1795 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1796 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1797 buf[23] = int_to_itoa64 (l & 0x3f);
1798
1799 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1800
1801 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1802 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1803 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1804 buf[27] = int_to_itoa64 (l & 0x3f);
1805
1806 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1807
1808 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1809 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1810 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1811 buf[31] = int_to_itoa64 (l & 0x3f);
1812
1813 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1814
1815 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1816 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1817 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1818 buf[35] = int_to_itoa64 (l & 0x3f);
1819
1820 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1821
1822 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1823 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1824 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1825 buf[39] = int_to_itoa64 (l & 0x3f);
1826
1827 l = (digest[32] << 0) | (digest[31] << 8) | (digest[30] << 16);
1828
1829 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1830 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1831 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1832 buf[43] = int_to_itoa64 (l & 0x3f);
1833
1834 l = (digest[35] << 0) | (digest[34] << 8) | (digest[33] << 16);
1835
1836 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1837 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1838 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1839 buf[47] = int_to_itoa64 (l & 0x3f);
1840
1841 l = (digest[38] << 0) | (digest[37] << 8) | (digest[36] << 16);
1842
1843 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1844 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1845 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1846 buf[51] = int_to_itoa64 (l & 0x3f);
1847
1848 l = (digest[41] << 0) | (digest[40] << 8) | (digest[39] << 16);
1849
1850 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1851 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1852 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1853 buf[55] = int_to_itoa64 (l & 0x3f);
1854
1855 l = (digest[44] << 0) | (digest[43] << 8) | (digest[42] << 16);
1856
1857 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1858 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1859 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1860 buf[59] = int_to_itoa64 (l & 0x3f);
1861
1862 l = (digest[47] << 0) | (digest[46] << 8) | (digest[45] << 16);
1863
1864 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1865 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1866 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1867 buf[63] = int_to_itoa64 (l & 0x3f);
1868
1869 l = (digest[50] << 0) | (digest[49] << 8) | (digest[48] << 16);
1870
1871 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1872 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1873 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1874 buf[67] = int_to_itoa64 (l & 0x3f);
1875
1876 l = (digest[53] << 0) | (digest[52] << 8) | (digest[51] << 16);
1877
1878 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1879 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1880 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1881 buf[71] = int_to_itoa64 (l & 0x3f);
1882
1883 l = (digest[56] << 0) | (digest[55] << 8) | (digest[54] << 16);
1884
1885 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1886 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1887 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1888 buf[75] = int_to_itoa64 (l & 0x3f);
1889
1890 l = (digest[59] << 0) | (digest[58] << 8) | (digest[57] << 16);
1891
1892 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1893 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1894 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1895 buf[79] = int_to_itoa64 (l & 0x3f);
1896
1897 l = (digest[62] << 0) | (digest[61] << 8) | (digest[60] << 16);
1898
1899 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1900 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1901 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1902 buf[83] = int_to_itoa64 (l & 0x3f);
1903
1904 l = 0 | 0 | (digest[63] << 16);
1905
1906 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1907 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1908 }
1909
1910 void sha256crypt_decode (u8 digest[32], u8 buf[43])
1911 {
1912 int l;
1913
1914 l = itoa64_to_int (buf[ 0]) << 0;
1915 l |= itoa64_to_int (buf[ 1]) << 6;
1916 l |= itoa64_to_int (buf[ 2]) << 12;
1917 l |= itoa64_to_int (buf[ 3]) << 18;
1918
1919 digest[ 0] = (l >> 16) & 0xff;
1920 digest[10] = (l >> 8) & 0xff;
1921 digest[20] = (l >> 0) & 0xff;
1922
1923 l = itoa64_to_int (buf[ 4]) << 0;
1924 l |= itoa64_to_int (buf[ 5]) << 6;
1925 l |= itoa64_to_int (buf[ 6]) << 12;
1926 l |= itoa64_to_int (buf[ 7]) << 18;
1927
1928 digest[21] = (l >> 16) & 0xff;
1929 digest[ 1] = (l >> 8) & 0xff;
1930 digest[11] = (l >> 0) & 0xff;
1931
1932 l = itoa64_to_int (buf[ 8]) << 0;
1933 l |= itoa64_to_int (buf[ 9]) << 6;
1934 l |= itoa64_to_int (buf[10]) << 12;
1935 l |= itoa64_to_int (buf[11]) << 18;
1936
1937 digest[12] = (l >> 16) & 0xff;
1938 digest[22] = (l >> 8) & 0xff;
1939 digest[ 2] = (l >> 0) & 0xff;
1940
1941 l = itoa64_to_int (buf[12]) << 0;
1942 l |= itoa64_to_int (buf[13]) << 6;
1943 l |= itoa64_to_int (buf[14]) << 12;
1944 l |= itoa64_to_int (buf[15]) << 18;
1945
1946 digest[ 3] = (l >> 16) & 0xff;
1947 digest[13] = (l >> 8) & 0xff;
1948 digest[23] = (l >> 0) & 0xff;
1949
1950 l = itoa64_to_int (buf[16]) << 0;
1951 l |= itoa64_to_int (buf[17]) << 6;
1952 l |= itoa64_to_int (buf[18]) << 12;
1953 l |= itoa64_to_int (buf[19]) << 18;
1954
1955 digest[24] = (l >> 16) & 0xff;
1956 digest[ 4] = (l >> 8) & 0xff;
1957 digest[14] = (l >> 0) & 0xff;
1958
1959 l = itoa64_to_int (buf[20]) << 0;
1960 l |= itoa64_to_int (buf[21]) << 6;
1961 l |= itoa64_to_int (buf[22]) << 12;
1962 l |= itoa64_to_int (buf[23]) << 18;
1963
1964 digest[15] = (l >> 16) & 0xff;
1965 digest[25] = (l >> 8) & 0xff;
1966 digest[ 5] = (l >> 0) & 0xff;
1967
1968 l = itoa64_to_int (buf[24]) << 0;
1969 l |= itoa64_to_int (buf[25]) << 6;
1970 l |= itoa64_to_int (buf[26]) << 12;
1971 l |= itoa64_to_int (buf[27]) << 18;
1972
1973 digest[ 6] = (l >> 16) & 0xff;
1974 digest[16] = (l >> 8) & 0xff;
1975 digest[26] = (l >> 0) & 0xff;
1976
1977 l = itoa64_to_int (buf[28]) << 0;
1978 l |= itoa64_to_int (buf[29]) << 6;
1979 l |= itoa64_to_int (buf[30]) << 12;
1980 l |= itoa64_to_int (buf[31]) << 18;
1981
1982 digest[27] = (l >> 16) & 0xff;
1983 digest[ 7] = (l >> 8) & 0xff;
1984 digest[17] = (l >> 0) & 0xff;
1985
1986 l = itoa64_to_int (buf[32]) << 0;
1987 l |= itoa64_to_int (buf[33]) << 6;
1988 l |= itoa64_to_int (buf[34]) << 12;
1989 l |= itoa64_to_int (buf[35]) << 18;
1990
1991 digest[18] = (l >> 16) & 0xff;
1992 digest[28] = (l >> 8) & 0xff;
1993 digest[ 8] = (l >> 0) & 0xff;
1994
1995 l = itoa64_to_int (buf[36]) << 0;
1996 l |= itoa64_to_int (buf[37]) << 6;
1997 l |= itoa64_to_int (buf[38]) << 12;
1998 l |= itoa64_to_int (buf[39]) << 18;
1999
2000 digest[ 9] = (l >> 16) & 0xff;
2001 digest[19] = (l >> 8) & 0xff;
2002 digest[29] = (l >> 0) & 0xff;
2003
2004 l = itoa64_to_int (buf[40]) << 0;
2005 l |= itoa64_to_int (buf[41]) << 6;
2006 l |= itoa64_to_int (buf[42]) << 12;
2007
2008 digest[31] = (l >> 8) & 0xff;
2009 digest[30] = (l >> 0) & 0xff;
2010 }
2011
2012 void sha256crypt_encode (u8 digest[32], u8 buf[43])
2013 {
2014 int l;
2015
2016 l = (digest[ 0] << 16) | (digest[10] << 8) | (digest[20] << 0);
2017
2018 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2019 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2020 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2021 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
2022
2023 l = (digest[21] << 16) | (digest[ 1] << 8) | (digest[11] << 0);
2024
2025 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2026 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2027 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2028 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
2029
2030 l = (digest[12] << 16) | (digest[22] << 8) | (digest[ 2] << 0);
2031
2032 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2033 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2034 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2035 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
2036
2037 l = (digest[ 3] << 16) | (digest[13] << 8) | (digest[23] << 0);
2038
2039 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2040 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2041 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2042 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
2043
2044 l = (digest[24] << 16) | (digest[ 4] << 8) | (digest[14] << 0);
2045
2046 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2047 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2048 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2049 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
2050
2051 l = (digest[15] << 16) | (digest[25] << 8) | (digest[ 5] << 0);
2052
2053 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2054 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2055 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2056 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
2057
2058 l = (digest[ 6] << 16) | (digest[16] << 8) | (digest[26] << 0);
2059
2060 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2061 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2062 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2063 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
2064
2065 l = (digest[27] << 16) | (digest[ 7] << 8) | (digest[17] << 0);
2066
2067 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2068 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2069 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2070 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
2071
2072 l = (digest[18] << 16) | (digest[28] << 8) | (digest[ 8] << 0);
2073
2074 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2075 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2076 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2077 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
2078
2079 l = (digest[ 9] << 16) | (digest[19] << 8) | (digest[29] << 0);
2080
2081 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2082 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2083 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2084 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
2085
2086 l = 0 | (digest[31] << 8) | (digest[30] << 0);
2087
2088 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2089 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2090 buf[42] = int_to_itoa64 (l & 0x3f);
2091 }
2092
2093 void drupal7_decode (u8 digest[64], u8 buf[44])
2094 {
2095 int l;
2096
2097 l = itoa64_to_int (buf[ 0]) << 0;
2098 l |= itoa64_to_int (buf[ 1]) << 6;
2099 l |= itoa64_to_int (buf[ 2]) << 12;
2100 l |= itoa64_to_int (buf[ 3]) << 18;
2101
2102 digest[ 0] = (l >> 0) & 0xff;
2103 digest[ 1] = (l >> 8) & 0xff;
2104 digest[ 2] = (l >> 16) & 0xff;
2105
2106 l = itoa64_to_int (buf[ 4]) << 0;
2107 l |= itoa64_to_int (buf[ 5]) << 6;
2108 l |= itoa64_to_int (buf[ 6]) << 12;
2109 l |= itoa64_to_int (buf[ 7]) << 18;
2110
2111 digest[ 3] = (l >> 0) & 0xff;
2112 digest[ 4] = (l >> 8) & 0xff;
2113 digest[ 5] = (l >> 16) & 0xff;
2114
2115 l = itoa64_to_int (buf[ 8]) << 0;
2116 l |= itoa64_to_int (buf[ 9]) << 6;
2117 l |= itoa64_to_int (buf[10]) << 12;
2118 l |= itoa64_to_int (buf[11]) << 18;
2119
2120 digest[ 6] = (l >> 0) & 0xff;
2121 digest[ 7] = (l >> 8) & 0xff;
2122 digest[ 8] = (l >> 16) & 0xff;
2123
2124 l = itoa64_to_int (buf[12]) << 0;
2125 l |= itoa64_to_int (buf[13]) << 6;
2126 l |= itoa64_to_int (buf[14]) << 12;
2127 l |= itoa64_to_int (buf[15]) << 18;
2128
2129 digest[ 9] = (l >> 0) & 0xff;
2130 digest[10] = (l >> 8) & 0xff;
2131 digest[11] = (l >> 16) & 0xff;
2132
2133 l = itoa64_to_int (buf[16]) << 0;
2134 l |= itoa64_to_int (buf[17]) << 6;
2135 l |= itoa64_to_int (buf[18]) << 12;
2136 l |= itoa64_to_int (buf[19]) << 18;
2137
2138 digest[12] = (l >> 0) & 0xff;
2139 digest[13] = (l >> 8) & 0xff;
2140 digest[14] = (l >> 16) & 0xff;
2141
2142 l = itoa64_to_int (buf[20]) << 0;
2143 l |= itoa64_to_int (buf[21]) << 6;
2144 l |= itoa64_to_int (buf[22]) << 12;
2145 l |= itoa64_to_int (buf[23]) << 18;
2146
2147 digest[15] = (l >> 0) & 0xff;
2148 digest[16] = (l >> 8) & 0xff;
2149 digest[17] = (l >> 16) & 0xff;
2150
2151 l = itoa64_to_int (buf[24]) << 0;
2152 l |= itoa64_to_int (buf[25]) << 6;
2153 l |= itoa64_to_int (buf[26]) << 12;
2154 l |= itoa64_to_int (buf[27]) << 18;
2155
2156 digest[18] = (l >> 0) & 0xff;
2157 digest[19] = (l >> 8) & 0xff;
2158 digest[20] = (l >> 16) & 0xff;
2159
2160 l = itoa64_to_int (buf[28]) << 0;
2161 l |= itoa64_to_int (buf[29]) << 6;
2162 l |= itoa64_to_int (buf[30]) << 12;
2163 l |= itoa64_to_int (buf[31]) << 18;
2164
2165 digest[21] = (l >> 0) & 0xff;
2166 digest[22] = (l >> 8) & 0xff;
2167 digest[23] = (l >> 16) & 0xff;
2168
2169 l = itoa64_to_int (buf[32]) << 0;
2170 l |= itoa64_to_int (buf[33]) << 6;
2171 l |= itoa64_to_int (buf[34]) << 12;
2172 l |= itoa64_to_int (buf[35]) << 18;
2173
2174 digest[24] = (l >> 0) & 0xff;
2175 digest[25] = (l >> 8) & 0xff;
2176 digest[26] = (l >> 16) & 0xff;
2177
2178 l = itoa64_to_int (buf[36]) << 0;
2179 l |= itoa64_to_int (buf[37]) << 6;
2180 l |= itoa64_to_int (buf[38]) << 12;
2181 l |= itoa64_to_int (buf[39]) << 18;
2182
2183 digest[27] = (l >> 0) & 0xff;
2184 digest[28] = (l >> 8) & 0xff;
2185 digest[29] = (l >> 16) & 0xff;
2186
2187 l = itoa64_to_int (buf[40]) << 0;
2188 l |= itoa64_to_int (buf[41]) << 6;
2189 l |= itoa64_to_int (buf[42]) << 12;
2190 l |= itoa64_to_int (buf[43]) << 18;
2191
2192 digest[30] = (l >> 0) & 0xff;
2193 digest[31] = (l >> 8) & 0xff;
2194 digest[32] = (l >> 16) & 0xff;
2195
2196 digest[33] = 0;
2197 digest[34] = 0;
2198 digest[35] = 0;
2199 digest[36] = 0;
2200 digest[37] = 0;
2201 digest[38] = 0;
2202 digest[39] = 0;
2203 digest[40] = 0;
2204 digest[41] = 0;
2205 digest[42] = 0;
2206 digest[43] = 0;
2207 digest[44] = 0;
2208 digest[45] = 0;
2209 digest[46] = 0;
2210 digest[47] = 0;
2211 digest[48] = 0;
2212 digest[49] = 0;
2213 digest[50] = 0;
2214 digest[51] = 0;
2215 digest[52] = 0;
2216 digest[53] = 0;
2217 digest[54] = 0;
2218 digest[55] = 0;
2219 digest[56] = 0;
2220 digest[57] = 0;
2221 digest[58] = 0;
2222 digest[59] = 0;
2223 digest[60] = 0;
2224 digest[61] = 0;
2225 digest[62] = 0;
2226 digest[63] = 0;
2227 }
2228
2229 void drupal7_encode (u8 digest[64], u8 buf[43])
2230 {
2231 int l;
2232
2233 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
2234
2235 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2236 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2237 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2238 buf[ 3] = int_to_itoa64 (l & 0x3f);
2239
2240 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
2241
2242 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2243 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2244 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2245 buf[ 7] = int_to_itoa64 (l & 0x3f);
2246
2247 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
2248
2249 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2250 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2251 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2252 buf[11] = int_to_itoa64 (l & 0x3f);
2253
2254 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
2255
2256 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2257 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2258 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2259 buf[15] = int_to_itoa64 (l & 0x3f);
2260
2261 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
2262
2263 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2264 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2265 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2266 buf[19] = int_to_itoa64 (l & 0x3f);
2267
2268 l = (digest[15] << 0) | (digest[16] << 8) | (digest[17] << 16);
2269
2270 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2271 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2272 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2273 buf[23] = int_to_itoa64 (l & 0x3f);
2274
2275 l = (digest[18] << 0) | (digest[19] << 8) | (digest[20] << 16);
2276
2277 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2278 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2279 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2280 buf[27] = int_to_itoa64 (l & 0x3f);
2281
2282 l = (digest[21] << 0) | (digest[22] << 8) | (digest[23] << 16);
2283
2284 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2285 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2286 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2287 buf[31] = int_to_itoa64 (l & 0x3f);
2288
2289 l = (digest[24] << 0) | (digest[25] << 8) | (digest[26] << 16);
2290
2291 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2292 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2293 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2294 buf[35] = int_to_itoa64 (l & 0x3f);
2295
2296 l = (digest[27] << 0) | (digest[28] << 8) | (digest[29] << 16);
2297
2298 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2299 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2300 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2301 buf[39] = int_to_itoa64 (l & 0x3f);
2302
2303 l = (digest[30] << 0) | (digest[31] << 8) | (digest[32] << 16);
2304
2305 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2306 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2307 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
2308 //buf[43] = int_to_itoa64 (l & 0x3f);
2309 }
2310
2311 /**
2312 * tty
2313 */
2314
2315 #ifdef LINUX
2316 static struct termio savemodes;
2317 static int havemodes = 0;
2318
2319 int tty_break()
2320 {
2321 struct termio modmodes;
2322
2323 if (ioctl (fileno (stdin), TCGETA, &savemodes) < 0) return -1;
2324
2325 havemodes = 1;
2326
2327 modmodes = savemodes;
2328 modmodes.c_lflag &= ~ICANON;
2329 modmodes.c_cc[VMIN] = 1;
2330 modmodes.c_cc[VTIME] = 0;
2331
2332 return ioctl (fileno (stdin), TCSETAW, &modmodes);
2333 }
2334
2335 int tty_getchar()
2336 {
2337 fd_set rfds;
2338
2339 FD_ZERO (&rfds);
2340
2341 FD_SET (fileno (stdin), &rfds);
2342
2343 struct timeval tv;
2344
2345 tv.tv_sec = 1;
2346 tv.tv_usec = 0;
2347
2348 int retval = select (1, &rfds, NULL, NULL, &tv);
2349
2350 if (retval == 0) return 0;
2351 if (retval == -1) return -1;
2352
2353 return getchar();
2354 }
2355
2356 int tty_fix()
2357 {
2358 if (!havemodes) return 0;
2359
2360 return ioctl (fileno (stdin), TCSETAW, &savemodes);
2361 }
2362 #endif
2363
2364 #ifdef OSX
2365 static struct termios savemodes;
2366 static int havemodes = 0;
2367
2368 int tty_break()
2369 {
2370 struct termios modmodes;
2371
2372 if (ioctl (fileno (stdin), TIOCGETA, &savemodes) < 0) return -1;
2373
2374 havemodes = 1;
2375
2376 modmodes = savemodes;
2377 modmodes.c_lflag &= ~ICANON;
2378 modmodes.c_cc[VMIN] = 1;
2379 modmodes.c_cc[VTIME] = 0;
2380
2381 return ioctl (fileno (stdin), TIOCSETAW, &modmodes);
2382 }
2383
2384 int tty_getchar()
2385 {
2386 fd_set rfds;
2387
2388 FD_ZERO (&rfds);
2389
2390 FD_SET (fileno (stdin), &rfds);
2391
2392 struct timeval tv;
2393
2394 tv.tv_sec = 1;
2395 tv.tv_usec = 0;
2396
2397 int retval = select (1, &rfds, NULL, NULL, &tv);
2398
2399 if (retval == 0) return 0;
2400 if (retval == -1) return -1;
2401
2402 return getchar();
2403 }
2404
2405 int tty_fix()
2406 {
2407 if (!havemodes) return 0;
2408
2409 return ioctl (fileno (stdin), TIOCSETAW, &savemodes);
2410 }
2411 #endif
2412
2413 #ifdef WIN
2414 static DWORD saveMode = 0;
2415
2416 int tty_break()
2417 {
2418 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2419
2420 GetConsoleMode (stdinHandle, &saveMode);
2421 SetConsoleMode (stdinHandle, ENABLE_PROCESSED_INPUT);
2422
2423 return 0;
2424 }
2425
2426 int tty_getchar()
2427 {
2428 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2429
2430 DWORD rc = WaitForSingleObject (stdinHandle, 1000);
2431
2432 if (rc == WAIT_TIMEOUT) return 0;
2433 if (rc == WAIT_ABANDONED) return -1;
2434 if (rc == WAIT_FAILED) return -1;
2435
2436 // The whole ReadConsoleInput () part is a workaround.
2437 // For some unknown reason, maybe a mingw bug, a random signal
2438 // is sent to stdin which unblocks WaitForSingleObject () and sets rc 0.
2439 // Then it wants to read with getche () a keyboard input
2440 // which has never been made.
2441
2442 INPUT_RECORD buf[100];
2443
2444 DWORD num = 0;
2445
2446 memset (buf, 0, sizeof (buf));
2447
2448 ReadConsoleInput (stdinHandle, buf, 100, &num);
2449
2450 FlushConsoleInputBuffer (stdinHandle);
2451
2452 for (uint i = 0; i < num; i++)
2453 {
2454 if (buf[i].EventType != KEY_EVENT) continue;
2455
2456 KEY_EVENT_RECORD KeyEvent = buf[i].Event.KeyEvent;
2457
2458 if (KeyEvent.bKeyDown != TRUE) continue;
2459
2460 return KeyEvent.uChar.AsciiChar;
2461 }
2462
2463 return 0;
2464 }
2465
2466 int tty_fix()
2467 {
2468 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2469
2470 SetConsoleMode (stdinHandle, saveMode);
2471
2472 return 0;
2473 }
2474 #endif
2475
2476 /**
2477 * mem alloc
2478 */
2479
2480 #define MSG_ENOMEM "Insufficient memory available"
2481
2482 void *mycalloc (size_t nmemb, size_t size)
2483 {
2484 void *p = calloc (nmemb, size);
2485
2486 if (p == NULL)
2487 {
2488 log_error ("ERROR: %s", MSG_ENOMEM);
2489
2490 exit (-1);
2491 }
2492
2493 return (p);
2494 }
2495
2496 void *mymalloc (size_t size)
2497 {
2498 void *p = malloc (size);
2499
2500 if (p == NULL)
2501 {
2502 log_error ("ERROR: %s", MSG_ENOMEM);
2503
2504 exit (-1);
2505 }
2506
2507 memset (p, 0, size);
2508
2509 return (p);
2510 }
2511
2512 void myfree (void *ptr)
2513 {
2514 if (ptr == NULL) return;
2515
2516 free (ptr);
2517 }
2518
2519 void *myrealloc (void *ptr, size_t oldsz, size_t add)
2520 {
2521 void *p = realloc (ptr, oldsz + add);
2522
2523 if (p == NULL)
2524 {
2525 log_error ("ERROR: %s", MSG_ENOMEM);
2526
2527 exit (-1);
2528 }
2529
2530 memset ((char *) p + oldsz, 0, add);
2531
2532 return (p);
2533 }
2534
2535 char *mystrdup (const char *s)
2536 {
2537 const size_t len = strlen (s);
2538
2539 char *b = (char *) mymalloc (len + 1);
2540
2541 memcpy (b, s, len);
2542
2543 return (b);
2544 }
2545
2546 FILE *logfile_open (char *logfile)
2547 {
2548 FILE *fp = fopen (logfile, "ab");
2549
2550 if (fp == NULL)
2551 {
2552 fp = stdout;
2553 }
2554
2555 return fp;
2556 }
2557
2558 void logfile_close (FILE *fp)
2559 {
2560 if (fp == stdout) return;
2561
2562 fclose (fp);
2563 }
2564
2565 void logfile_append (const char *fmt, ...)
2566 {
2567 if (data.logfile_disable == 1) return;
2568
2569 FILE *fp = logfile_open (data.logfile);
2570
2571 va_list ap;
2572
2573 va_start (ap, fmt);
2574
2575 vfprintf (fp, fmt, ap);
2576
2577 va_end (ap);
2578
2579 fputc ('\n', fp);
2580
2581 fflush (fp);
2582
2583 logfile_close (fp);
2584 }
2585
2586 int logfile_generate_id ()
2587 {
2588 const int n = rand ();
2589
2590 time_t t;
2591
2592 time (&t);
2593
2594 return t + n;
2595 }
2596
2597 char *logfile_generate_topid ()
2598 {
2599 const int id = logfile_generate_id ();
2600
2601 char *topid = (char *) mymalloc (1 + 16 + 1);
2602
2603 snprintf (topid, 1 + 16, "TOP%08x", id);
2604
2605 return topid;
2606 }
2607
2608 char *logfile_generate_subid ()
2609 {
2610 const int id = logfile_generate_id ();
2611
2612 char *subid = (char *) mymalloc (1 + 16 + 1);
2613
2614 snprintf (subid, 1 + 16, "SUB%08x", id);
2615
2616 return subid;
2617 }
2618
2619 /**
2620 * system
2621 */
2622
2623 #if F_SETLKW
2624 void lock_file (FILE *fp)
2625 {
2626 struct flock lock;
2627
2628 memset (&lock, 0, sizeof (struct flock));
2629
2630 lock.l_type = F_WRLCK;
2631 while (fcntl(fileno(fp), F_SETLKW, &lock))
2632 {
2633 if (errno != EINTR)
2634 {
2635 log_error ("ERROR: failed acquiring write lock: %s", strerror (errno));
2636
2637 exit (-1);
2638 }
2639 }
2640 }
2641
2642 void unlock_file (FILE *fp)
2643 {
2644 struct flock lock;
2645
2646 memset (&lock, 0, sizeof (struct flock));
2647
2648 lock.l_type = F_UNLCK;
2649 fcntl(fileno(fp), F_SETLK, &lock);
2650 }
2651 #endif // F_SETLKW
2652
2653 #ifdef _WIN
2654 void fsync (int fd)
2655 {
2656 HANDLE h = (HANDLE) _get_osfhandle (fd);
2657
2658 FlushFileBuffers (h);
2659 }
2660 #endif
2661
2662 /**
2663 * thermal
2664 */
2665
2666 #ifdef HAVE_HWMON
2667 #if defined(_WIN) && defined(HAVE_NVAPI)
2668 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2669 {
2670 NvU32 pGpuCount;
2671
2672 if (hm_NvAPI_EnumPhysicalGPUs (data.hm_nv, nvGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2673
2674 if (pGpuCount == 0)
2675 {
2676 log_info ("WARN: No NvAPI adapters found");
2677
2678 return (0);
2679 }
2680
2681 return (pGpuCount);
2682 }
2683 #endif // _WIN && HAVE_NVAPI
2684
2685 #if defined(LINUX) && defined(HAVE_NVML)
2686 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2687 {
2688 int pGpuCount = 0;
2689
2690 for (uint i = 0; i < DEVICES_MAX; i++)
2691 {
2692 if (hm_NVML_nvmlDeviceGetHandleByIndex (data.hm_nv, 1, i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2693
2694 // can be used to determine if the device by index matches the cuda device by index
2695 // char name[100]; memset (name, 0, sizeof (name));
2696 // hm_NVML_nvmlDeviceGetName (data.hm_nv, nvGPUHandle[i], name, sizeof (name) - 1);
2697
2698 pGpuCount++;
2699 }
2700
2701 if (pGpuCount == 0)
2702 {
2703 log_info ("WARN: No NVML adapters found");
2704
2705 return (0);
2706 }
2707
2708 return (pGpuCount);
2709 }
2710 #endif // LINUX && HAVE_NVML
2711
2712 #ifdef HAVE_ADL
2713 int get_adapters_num_amd (void *adl, int *iNumberAdapters)
2714 {
2715 if (hm_ADL_Adapter_NumberOfAdapters_Get ((ADL_PTR *) adl, iNumberAdapters) != ADL_OK) return -1;
2716
2717 if (iNumberAdapters == 0)
2718 {
2719 log_info ("WARN: No ADL adapters found.");
2720
2721 return -1;
2722 }
2723
2724 return 0;
2725 }
2726
2727 /*
2728 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2729 {
2730 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2731 ADLODParameters lpOdParameters;
2732
2733 lpOdParameters.iSize = sizeof (ADLODParameters);
2734 size_t plevels_size = 0;
2735
2736 if (hm_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2737
2738 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2739 __func__, iAdapterIndex,
2740 lpOdParameters.iNumberOfPerformanceLevels,
2741 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2742 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2743
2744 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2745
2746 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2747
2748 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2749
2750 if (hm_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2751
2752 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2753 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2754 __func__, iAdapterIndex, j,
2755 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2756
2757 myfree (lpOdPerformanceLevels);
2758
2759 return 0;
2760 }
2761 */
2762
2763 LPAdapterInfo hm_get_adapter_info_amd (void *adl, int iNumberAdapters)
2764 {
2765 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2766
2767 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2768
2769 if (hm_ADL_Adapter_AdapterInfo_Get ((ADL_PTR *) adl, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2770
2771 return lpAdapterInfo;
2772 }
2773
2774 /*
2775 //
2776 // does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2777 //
2778
2779 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2780 {
2781 u32 idx = -1;
2782
2783 for (uint i = 0; i < num_adl_adapters; i++)
2784 {
2785 int opencl_bus_num = hm_device[i].busid;
2786 int opencl_dev_num = hm_device[i].devid;
2787
2788 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2789 {
2790 idx = i;
2791
2792 break;
2793 }
2794 }
2795
2796 if (idx >= DEVICES_MAX) return -1;
2797
2798 return idx;
2799 }
2800
2801 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2802 {
2803 for (uint i = 0; i < opencl_num_devices; i++)
2804 {
2805 cl_device_topology_amd device_topology;
2806
2807 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2808
2809 hm_device[i].busid = device_topology.pcie.bus;
2810 hm_device[i].devid = device_topology.pcie.device;
2811 }
2812 }
2813 */
2814
2815 void hm_sort_adl_adapters_by_busid_devid (u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2816 {
2817 // basically bubble sort
2818
2819 for (int i = 0; i < num_adl_adapters; i++)
2820 {
2821 for (int j = 0; j < num_adl_adapters - 1; j++)
2822 {
2823 // get info of adapter [x]
2824
2825 u32 adapter_index_x = valid_adl_device_list[j];
2826 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2827
2828 u32 bus_num_x = info_x.iBusNumber;
2829 u32 dev_num_x = info_x.iDeviceNumber;
2830
2831 // get info of adapter [y]
2832
2833 u32 adapter_index_y = valid_adl_device_list[j + 1];
2834 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2835
2836 u32 bus_num_y = info_y.iBusNumber;
2837 u32 dev_num_y = info_y.iDeviceNumber;
2838
2839 uint need_swap = 0;
2840
2841 if (bus_num_y < bus_num_x)
2842 {
2843 need_swap = 1;
2844 }
2845 else if (bus_num_y == bus_num_x)
2846 {
2847 if (dev_num_y < dev_num_x)
2848 {
2849 need_swap = 1;
2850 }
2851 }
2852
2853 if (need_swap == 1)
2854 {
2855 u32 temp = valid_adl_device_list[j + 1];
2856
2857 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2858 valid_adl_device_list[j + 0] = temp;
2859 }
2860 }
2861 }
2862 }
2863
2864 u32 *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2865 {
2866 *num_adl_adapters = 0;
2867
2868 u32 *adl_adapters = NULL;
2869
2870 int *bus_numbers = NULL;
2871 int *device_numbers = NULL;
2872
2873 for (int i = 0; i < iNumberAdapters; i++)
2874 {
2875 AdapterInfo info = lpAdapterInfo[i];
2876
2877 if (strlen (info.strUDID) < 1) continue;
2878
2879 #ifdef WIN
2880 if (info.iVendorID != 1002) continue;
2881 #else
2882 if (info.iVendorID != 0x1002) continue;
2883 #endif
2884
2885 if (info.iBusNumber < 0) continue;
2886 if (info.iDeviceNumber < 0) continue;
2887
2888 int found = 0;
2889
2890 for (int pos = 0; pos < *num_adl_adapters; pos++)
2891 {
2892 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2893 {
2894 found = 1;
2895 break;
2896 }
2897 }
2898
2899 if (found) continue;
2900
2901 // add it to the list
2902
2903 adl_adapters = (u32 *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2904
2905 adl_adapters[*num_adl_adapters] = i;
2906
2907 // rest is just bookkeeping
2908
2909 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2910 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2911
2912 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2913 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2914
2915 (*num_adl_adapters)++;
2916 }
2917
2918 myfree (bus_numbers);
2919 myfree (device_numbers);
2920
2921 // sort the list by increasing bus id, device id number
2922
2923 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2924
2925 return adl_adapters;
2926 }
2927
2928 int hm_check_fanspeed_control (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2929 {
2930 // loop through all valid devices
2931
2932 for (int i = 0; i < num_adl_adapters; i++)
2933 {
2934 u32 adapter_index = valid_adl_device_list[i];
2935
2936 // get AdapterInfo
2937
2938 AdapterInfo info = lpAdapterInfo[adapter_index];
2939
2940 // unfortunately this doesn't work since bus id and dev id are not unique
2941 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2942 // if (opencl_device_index == -1) continue;
2943
2944 int opencl_device_index = i;
2945
2946 // if (hm_show_performance_level (adl, info.iAdapterIndex) != 0) return -1;
2947
2948 // get fanspeed info
2949
2950 if (hm_device[opencl_device_index].od_version == 5)
2951 {
2952 ADLFanSpeedInfo FanSpeedInfo;
2953
2954 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2955
2956 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2957
2958 if (hm_ADL_Overdrive5_FanSpeedInfo_Get (adl, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2959
2960 // check read and write capability in fanspeedinfo
2961
2962 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2963 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2964 {
2965 hm_device[opencl_device_index].fan_supported = 1;
2966 }
2967 else
2968 {
2969 hm_device[opencl_device_index].fan_supported = 0;
2970 }
2971 }
2972 else // od_version == 6
2973 {
2974 ADLOD6FanSpeedInfo faninfo;
2975
2976 memset (&faninfo, 0, sizeof (faninfo));
2977
2978 if (hm_ADL_Overdrive6_FanSpeed_Get (adl, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
2979
2980 // check read capability in fanspeedinfo
2981
2982 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
2983 {
2984 hm_device[opencl_device_index].fan_supported = 1;
2985 }
2986 else
2987 {
2988 hm_device[opencl_device_index].fan_supported = 0;
2989 }
2990 }
2991 }
2992
2993 return 0;
2994 }
2995
2996 int hm_get_overdrive_version (void *adl, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2997 {
2998 for (int i = 0; i < num_adl_adapters; i++)
2999 {
3000 u32 adapter_index = valid_adl_device_list[i];
3001
3002 // get AdapterInfo
3003
3004 AdapterInfo info = lpAdapterInfo[adapter_index];
3005
3006 // get overdrive version
3007
3008 int od_supported = 0;
3009 int od_enabled = 0;
3010 int od_version = 0;
3011
3012 if (hm_ADL_Overdrive_Caps (adl, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3013
3014 // store the overdrive version in hm_device
3015
3016 // unfortunately this doesn't work since bus id and dev id are not unique
3017 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3018 // if (opencl_device_index == -1) continue;
3019
3020 int opencl_device_index = i;
3021
3022 hm_device[opencl_device_index].od_version = od_version;
3023 }
3024
3025 return 0;
3026 }
3027
3028 int hm_get_adapter_index_amd (hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3029 {
3030 for (int i = 0; i < num_adl_adapters; i++)
3031 {
3032 u32 adapter_index = valid_adl_device_list[i];
3033
3034 // get AdapterInfo
3035
3036 AdapterInfo info = lpAdapterInfo[adapter_index];
3037
3038 // store the iAdapterIndex in hm_device
3039
3040 // unfortunately this doesn't work since bus id and dev id are not unique
3041 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3042 // if (opencl_device_index == -1) continue;
3043
3044 int opencl_device_index = i;
3045
3046 hm_device[opencl_device_index].adapter_index.amd = info.iAdapterIndex;
3047 }
3048
3049 return num_adl_adapters;
3050 }
3051 #endif // HAVE_ADL
3052
3053 int hm_get_temperature_with_device_id (const uint device_id)
3054 {
3055 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3056
3057 #ifdef HAVE_ADL
3058 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3059 {
3060 if (data.hm_amd)
3061 {
3062 if (data.hm_device[device_id].od_version == 5)
3063 {
3064 ADLTemperature Temperature;
3065
3066 Temperature.iSize = sizeof (ADLTemperature);
3067
3068 if (hm_ADL_Overdrive5_Temperature_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &Temperature) != ADL_OK) return -1;
3069
3070 return Temperature.iTemperature / 1000;
3071 }
3072 else if (data.hm_device[device_id].od_version == 6)
3073 {
3074 int Temperature = 0;
3075
3076 if (hm_ADL_Overdrive6_Temperature_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &Temperature) != ADL_OK) return -1;
3077
3078 return Temperature / 1000;
3079 }
3080 }
3081 }
3082 #endif
3083
3084 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3085 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3086 {
3087 #if defined(LINUX) && defined(HAVE_NVML)
3088 int temperature = 0;
3089
3090 hm_NVML_nvmlDeviceGetTemperature (data.hm_nv, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_GPU, (unsigned int *) &temperature);
3091
3092 return temperature;
3093 #endif
3094
3095 #if defined(WIN) && defined(HAVE_NVAPI)
3096 NV_GPU_THERMAL_SETTINGS pThermalSettings;
3097
3098 pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER;
3099 pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU;
3100 pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN;
3101 pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
3102
3103 if (hm_NvAPI_GPU_GetThermalSettings (data.hm_nv, data.hm_device[device_id].adapter_index.nv, 0, &pThermalSettings) != NVAPI_OK) return -1;
3104
3105 return pThermalSettings.sensor[0].currentTemp;
3106 #endif // WIN && HAVE_NVAPI
3107 }
3108 #endif // HAVE_NVML || HAVE_NVAPI
3109
3110 return -1;
3111 }
3112
3113 int hm_get_fanspeed_with_device_id (const uint device_id)
3114 {
3115 // we shouldn't really need this extra CL_DEVICE_TYPE_GPU check, because fan_supported should not be set w/ CPUs
3116 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3117
3118 if (data.hm_device[device_id].fan_supported == 1)
3119 {
3120 #ifdef HAVE_ADL
3121 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3122 {
3123 if (data.hm_amd)
3124 {
3125 if (data.hm_device[device_id].od_version == 5)
3126 {
3127 ADLFanSpeedValue lpFanSpeedValue;
3128
3129 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3130
3131 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3132 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3133 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3134
3135 if (hm_ADL_Overdrive5_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3136
3137 return lpFanSpeedValue.iFanSpeed;
3138 }
3139 else // od_version == 6
3140 {
3141 ADLOD6FanSpeedInfo faninfo;
3142
3143 memset (&faninfo, 0, sizeof (faninfo));
3144
3145 if (hm_ADL_Overdrive6_FanSpeed_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &faninfo) != ADL_OK) return -1;
3146
3147 return faninfo.iFanSpeedPercent;
3148 }
3149 }
3150 }
3151 #endif // HAVE_ADL
3152
3153 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3154 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3155 {
3156 #if defined(LINUX) && defined(HAVE_NVML)
3157 int speed = 0;
3158
3159 hm_NVML_nvmlDeviceGetFanSpeed (data.hm_nv, 1, data.hm_device[device_id].adapter_index.nv, (unsigned int *) &speed);
3160
3161 return speed;
3162 #endif
3163
3164 #if defined(WIN) && defined(HAVE_NVAPI)
3165
3166 NV_GPU_COOLER_SETTINGS pCoolerSettings;
3167
3168 pCoolerSettings.Version = GPU_COOLER_SETTINGS_VER | sizeof (NV_GPU_COOLER_SETTINGS);
3169
3170 hm_NvAPI_GPU_GetCoolerSettings (data.hm_nv, data.hm_device[device_id].adapter_index.nv, 0, &pCoolerSettings);
3171
3172 return pCoolerSettings.Cooler[0].CurrentLevel;
3173 #endif
3174 }
3175 #endif // HAVE_NVML || HAVE_NVAPI
3176 }
3177
3178 return -1;
3179 }
3180
3181 int hm_get_utilization_with_device_id (const uint device_id)
3182 {
3183 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3184
3185 #ifdef HAVE_ADL
3186 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3187 {
3188 if (data.hm_amd)
3189 {
3190 ADLPMActivity PMActivity;
3191
3192 PMActivity.iSize = sizeof (ADLPMActivity);
3193
3194 if (hm_ADL_Overdrive_CurrentActivity_Get (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3195
3196 return PMActivity.iActivityPercent;
3197 }
3198 }
3199 #endif // HAVE_ADL
3200
3201 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3202 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3203 {
3204 #if defined(LINUX) && defined(HAVE_NVML)
3205 nvmlUtilization_t utilization;
3206
3207 hm_NVML_nvmlDeviceGetUtilizationRates (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &utilization);
3208
3209 return utilization.gpu;
3210 #endif
3211
3212 #if defined(WIN) && defined(HAVE_NVAPI)
3213 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3214
3215 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3216
3217 if (hm_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_nv, data.hm_device[device_id].adapter_index.nv, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3218
3219 return pDynamicPstatesInfoEx.utilization[0].percentage;
3220 #endif
3221 }
3222 #endif // HAVE_NVML || HAVE_NVAPI
3223
3224 return -1;
3225 }
3226
3227 #ifdef HAVE_ADL
3228 int hm_set_fanspeed_with_device_id_amd (const uint device_id, const int fanspeed)
3229 {
3230 if (data.hm_device[device_id].fan_supported == 1)
3231 {
3232 if (data.hm_amd)
3233 {
3234 if (data.hm_device[device_id].od_version == 5)
3235 {
3236 ADLFanSpeedValue lpFanSpeedValue;
3237
3238 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3239
3240 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3241 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3242 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3243 lpFanSpeedValue.iFanSpeed = fanspeed;
3244
3245 if (hm_ADL_Overdrive5_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3246
3247 return 0;
3248 }
3249 else // od_version == 6
3250 {
3251 ADLOD6FanSpeedValue fan_speed_value;
3252
3253 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3254
3255 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3256 fan_speed_value.iFanSpeed = fanspeed;
3257
3258 if (hm_ADL_Overdrive6_FanSpeed_Set (data.hm_amd, data.hm_device[device_id].adapter_index.amd, &fan_speed_value) != ADL_OK) return -1;
3259
3260 return 0;
3261 }
3262 }
3263 }
3264
3265 return -1;
3266 }
3267 #endif
3268
3269 // helper function for status display
3270
3271 void hm_device_val_to_str (char *target_buf, int max_buf_size, char *suffix, int value)
3272 {
3273 #define VALUE_NOT_AVAILABLE "N/A"
3274
3275 if (value == -1)
3276 {
3277 snprintf (target_buf, max_buf_size, VALUE_NOT_AVAILABLE);
3278 }
3279 else
3280 {
3281 snprintf (target_buf, max_buf_size, "%2d%s", value, suffix);
3282 }
3283 }
3284 #endif // HAVE_HWMON
3285
3286 /**
3287 * maskprocessor
3288 */
3289
3290 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3291 {
3292 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3293
3294 if (css_cnt > SP_PW_MAX)
3295 {
3296 log_error ("ERROR: mask length is too long");
3297
3298 exit (-1);
3299 }
3300
3301 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3302 {
3303 uint *uniq_tbl = uniq_tbls[css_pos];
3304
3305 uint *cs_buf = css[css_pos].cs_buf;
3306 uint cs_len = css[css_pos].cs_len;
3307
3308 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3309 {
3310 uint c = cs_buf[cs_pos] & 0xff;
3311
3312 uniq_tbl[c] = 1;
3313 }
3314 }
3315 }
3316
3317 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3318 {
3319 cs_t *cs = &css[css_cnt];
3320
3321 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3322
3323 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3324
3325 size_t i;
3326
3327 for (i = 0; i < cs->cs_len; i++)
3328 {
3329 const uint u = cs->cs_buf[i];
3330
3331 css_uniq[u] = 1;
3332 }
3333
3334 for (i = 0; i < in_len; i++)
3335 {
3336 uint u = in_buf[i] & 0xff;
3337
3338 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3339
3340 if (css_uniq[u] == 1) continue;
3341
3342 css_uniq[u] = 1;
3343
3344 cs->cs_buf[cs->cs_len] = u;
3345
3346 cs->cs_len++;
3347 }
3348
3349 myfree (css_uniq);
3350 }
3351
3352 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3353 {
3354 size_t in_pos;
3355
3356 for (in_pos = 0; in_pos < in_len; in_pos++)
3357 {
3358 uint p0 = in_buf[in_pos] & 0xff;
3359
3360 if (interpret == 1 && p0 == '?')
3361 {
3362 in_pos++;
3363
3364 if (in_pos == in_len) break;
3365
3366 uint p1 = in_buf[in_pos] & 0xff;
3367
3368 switch (p1)
3369 {
3370 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3371 break;
3372 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3373 break;
3374 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3375 break;
3376 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3377 break;
3378 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3379 break;
3380 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3381 break;
3382 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3383 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3384 break;
3385 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3386 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3387 break;
3388 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3389 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3390 break;
3391 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3392 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3393 break;
3394 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3395 break;
3396 default: log_error ("Syntax error: %s", in_buf);
3397 exit (-1);
3398 }
3399 }
3400 else
3401 {
3402 if (data.hex_charset)
3403 {
3404 in_pos++;
3405
3406 if (in_pos == in_len)
3407 {
3408 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3409
3410 exit (-1);
3411 }
3412
3413 uint p1 = in_buf[in_pos] & 0xff;
3414
3415 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3416 {
3417 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3418
3419 exit (-1);
3420 }
3421
3422 uint chr = 0;
3423
3424 chr = hex_convert (p1) << 0;
3425 chr |= hex_convert (p0) << 4;
3426
3427 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3428 }
3429 else
3430 {
3431 uint chr = p0;
3432
3433 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3434 }
3435 }
3436 }
3437 }
3438
3439 u64 mp_get_sum (uint css_cnt, cs_t *css)
3440 {
3441 u64 sum = 1;
3442
3443 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3444 {
3445 sum *= css[css_pos].cs_len;
3446 }
3447
3448 return (sum);
3449 }
3450
3451 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3452 {
3453 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3454
3455 uint mask_pos;
3456 uint css_pos;
3457
3458 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3459 {
3460 char p0 = mask_buf[mask_pos];
3461
3462 if (p0 == '?')
3463 {
3464 mask_pos++;
3465
3466 if (mask_pos == mask_len) break;
3467
3468 char p1 = mask_buf[mask_pos];
3469
3470 uint chr = p1;
3471
3472 switch (p1)
3473 {
3474 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3475 break;
3476 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3477 break;
3478 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3479 break;
3480 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3481 break;
3482 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3483 break;
3484 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3485 break;
3486 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3487 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3488 break;
3489 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3490 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3491 break;
3492 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3493 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3494 break;
3495 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3496 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3497 break;
3498 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3499 break;
3500 default: log_error ("ERROR: syntax error: %s", mask_buf);
3501 exit (-1);
3502 }
3503 }
3504 else
3505 {
3506 if (data.hex_charset)
3507 {
3508 mask_pos++;
3509
3510 // if there is no 2nd hex character, show an error:
3511
3512 if (mask_pos == mask_len)
3513 {
3514 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3515
3516 exit (-1);
3517 }
3518
3519 char p1 = mask_buf[mask_pos];
3520
3521 // if they are not valid hex character, show an error:
3522
3523 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3524 {
3525 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3526
3527 exit (-1);
3528 }
3529
3530 uint chr = 0;
3531
3532 chr |= hex_convert (p1) << 0;
3533 chr |= hex_convert (p0) << 4;
3534
3535 mp_add_cs_buf (&chr, 1, css, css_pos);
3536 }
3537 else
3538 {
3539 uint chr = p0;
3540
3541 mp_add_cs_buf (&chr, 1, css, css_pos);
3542 }
3543 }
3544 }
3545
3546 if (css_pos == 0)
3547 {
3548 log_error ("ERROR: invalid mask length (0)");
3549
3550 exit (-1);
3551 }
3552
3553 *css_cnt = css_pos;
3554
3555 return (css);
3556 }
3557
3558 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3559 {
3560 for (int i = 0; i < css_cnt; i++)
3561 {
3562 uint len = css[i].cs_len;
3563 u64 next = val / len;
3564 uint pos = val % len;
3565 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3566 val = next;
3567 }
3568 }
3569
3570 void mp_cut_at (char *mask, uint max)
3571 {
3572 uint i;
3573 uint j;
3574 uint mask_len = strlen (mask);
3575
3576 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3577 {
3578 if (mask[i] == '?') i++;
3579 }
3580
3581 mask[i] = 0;
3582 }
3583
3584 void mp_setup_sys (cs_t *mp_sys)
3585 {
3586 uint pos;
3587 uint chr;
3588 uint donec[CHARSIZ] = { 0 };
3589
3590 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3591 mp_sys[0].cs_buf[pos++] = chr;
3592 mp_sys[0].cs_len = pos; }
3593
3594 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3595 mp_sys[1].cs_buf[pos++] = chr;
3596 mp_sys[1].cs_len = pos; }
3597
3598 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3599 mp_sys[2].cs_buf[pos++] = chr;
3600 mp_sys[2].cs_len = pos; }
3601
3602 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3603 mp_sys[3].cs_buf[pos++] = chr;
3604 mp_sys[3].cs_len = pos; }
3605
3606 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3607 mp_sys[4].cs_len = pos; }
3608
3609 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3610 mp_sys[5].cs_len = pos; }
3611 }
3612
3613 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3614 {
3615 FILE *fp = fopen (buf, "rb");
3616
3617 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3618 {
3619 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3620 }
3621 else
3622 {
3623 char mp_file[1024] = { 0 };
3624
3625 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3626
3627 fclose (fp);
3628
3629 len = in_superchop (mp_file);
3630
3631 if (len == 0)
3632 {
3633 log_info ("WARNING: charset file corrupted");
3634
3635 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3636 }
3637 else
3638 {
3639 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3640 }
3641 }
3642 }
3643
3644 void mp_reset_usr (cs_t *mp_usr, uint index)
3645 {
3646 mp_usr[index].cs_len = 0;
3647
3648 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3649 }
3650
3651 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3652 {
3653 char *new_mask_buf = (char *) mymalloc (256);
3654
3655 uint mask_pos;
3656
3657 uint css_pos;
3658
3659 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3660 {
3661 if (css_pos == len) break;
3662
3663 char p0 = mask_buf[mask_pos];
3664
3665 new_mask_buf[mask_pos] = p0;
3666
3667 if (p0 == '?')
3668 {
3669 mask_pos++;
3670
3671 if (mask_pos == mask_len) break;
3672
3673 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3674 }
3675 else
3676 {
3677 if (data.hex_charset)
3678 {
3679 mask_pos++;
3680
3681 if (mask_pos == mask_len)
3682 {
3683 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3684
3685 exit (-1);
3686 }
3687
3688 char p1 = mask_buf[mask_pos];
3689
3690 // if they are not valid hex character, show an error:
3691
3692 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3693 {
3694 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3695
3696 exit (-1);
3697 }
3698
3699 new_mask_buf[mask_pos] = p1;
3700 }
3701 }
3702 }
3703
3704 if (css_pos == len) return (new_mask_buf);
3705
3706 myfree (new_mask_buf);
3707
3708 return (NULL);
3709 }
3710
3711 /**
3712 * statprocessor
3713 */
3714
3715 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3716 {
3717 u64 sum = 1;
3718
3719 uint i;
3720
3721 for (i = start; i < stop; i++)
3722 {
3723 sum *= root_css_buf[i].cs_len;
3724 }
3725
3726 return (sum);
3727 }
3728
3729 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3730 {
3731 u64 v = ctx;
3732
3733 cs_t *cs = &root_css_buf[start];
3734
3735 uint i;
3736
3737 for (i = start; i < stop; i++)
3738 {
3739 const u64 m = v % cs->cs_len;
3740 const u64 d = v / cs->cs_len;
3741
3742 v = d;
3743
3744 const uint k = cs->cs_buf[m];
3745
3746 pw_buf[i - start] = (char) k;
3747
3748 cs = &markov_css_buf[(i * CHARSIZ) + k];
3749 }
3750 }
3751
3752 int sp_comp_val (const void *p1, const void *p2)
3753 {
3754 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3755 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3756
3757 return b2->val - b1->val;
3758 }
3759
3760 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)
3761 {
3762 uint i;
3763 uint j;
3764 uint k;
3765
3766 /**
3767 * Initialize hcstats
3768 */
3769
3770 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
3771
3772 u64 *root_stats_ptr = root_stats_buf;
3773
3774 u64 *root_stats_buf_by_pos[SP_PW_MAX];
3775
3776 for (i = 0; i < SP_PW_MAX; i++)
3777 {
3778 root_stats_buf_by_pos[i] = root_stats_ptr;
3779
3780 root_stats_ptr += CHARSIZ;
3781 }
3782
3783 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
3784
3785 u64 *markov_stats_ptr = markov_stats_buf;
3786
3787 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3788
3789 for (i = 0; i < SP_PW_MAX; i++)
3790 {
3791 for (j = 0; j < CHARSIZ; j++)
3792 {
3793 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3794
3795 markov_stats_ptr += CHARSIZ;
3796 }
3797 }
3798
3799 /**
3800 * Load hcstats File
3801 */
3802
3803 if (hcstat == NULL)
3804 {
3805 char hcstat_tmp[256] = { 0 };
3806
3807 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
3808
3809 hcstat = hcstat_tmp;
3810 }
3811
3812 FILE *fd = fopen (hcstat, "rb");
3813
3814 if (fd == NULL)
3815 {
3816 log_error ("%s: %s", hcstat, strerror (errno));
3817
3818 exit (-1);
3819 }
3820
3821 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3822 {
3823 log_error ("%s: Could not load data", hcstat);
3824
3825 fclose (fd);
3826
3827 exit (-1);
3828 }
3829
3830 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3831 {
3832 log_error ("%s: Could not load data", hcstat);
3833
3834 fclose (fd);
3835
3836 exit (-1);
3837 }
3838
3839 fclose (fd);
3840
3841 /**
3842 * Markov modifier of hcstat_table on user request
3843 */
3844
3845 if (disable)
3846 {
3847 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
3848 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
3849 }
3850
3851 if (classic)
3852 {
3853 /* Add all stats to first position */
3854
3855 for (i = 1; i < SP_PW_MAX; i++)
3856 {
3857 u64 *out = root_stats_buf_by_pos[0];
3858 u64 *in = root_stats_buf_by_pos[i];
3859
3860 for (j = 0; j < CHARSIZ; j++)
3861 {
3862 *out++ += *in++;
3863 }
3864 }
3865
3866 for (i = 1; i < SP_PW_MAX; i++)
3867 {
3868 u64 *out = markov_stats_buf_by_key[0][0];
3869 u64 *in = markov_stats_buf_by_key[i][0];
3870
3871 for (j = 0; j < CHARSIZ; j++)
3872 {
3873 for (k = 0; k < CHARSIZ; k++)
3874 {
3875 *out++ += *in++;
3876 }
3877 }
3878 }
3879
3880 /* copy them to all pw_positions */
3881
3882 for (i = 1; i < SP_PW_MAX; i++)
3883 {
3884 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
3885 }
3886
3887 for (i = 1; i < SP_PW_MAX; i++)
3888 {
3889 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
3890 }
3891 }
3892
3893 /**
3894 * Initialize tables
3895 */
3896
3897 hcstat_table_t *root_table_ptr = root_table_buf;
3898
3899 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
3900
3901 for (i = 0; i < SP_PW_MAX; i++)
3902 {
3903 root_table_buf_by_pos[i] = root_table_ptr;
3904
3905 root_table_ptr += CHARSIZ;
3906 }
3907
3908 hcstat_table_t *markov_table_ptr = markov_table_buf;
3909
3910 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
3911
3912 for (i = 0; i < SP_PW_MAX; i++)
3913 {
3914 for (j = 0; j < CHARSIZ; j++)
3915 {
3916 markov_table_buf_by_key[i][j] = markov_table_ptr;
3917
3918 markov_table_ptr += CHARSIZ;
3919 }
3920 }
3921
3922 /**
3923 * Convert hcstat to tables
3924 */
3925
3926 for (i = 0; i < SP_ROOT_CNT; i++)
3927 {
3928 uint key = i % CHARSIZ;
3929
3930 root_table_buf[i].key = key;
3931 root_table_buf[i].val = root_stats_buf[i];
3932 }
3933
3934 for (i = 0; i < SP_MARKOV_CNT; i++)
3935 {
3936 uint key = i % CHARSIZ;
3937
3938 markov_table_buf[i].key = key;
3939 markov_table_buf[i].val = markov_stats_buf[i];
3940 }
3941
3942 myfree (root_stats_buf);
3943 myfree (markov_stats_buf);
3944
3945 /**
3946 * Finally sort them
3947 */
3948
3949 for (i = 0; i < SP_PW_MAX; i++)
3950 {
3951 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3952 }
3953
3954 for (i = 0; i < SP_PW_MAX; i++)
3955 {
3956 for (j = 0; j < CHARSIZ; j++)
3957 {
3958 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3959 }
3960 }
3961 }
3962
3963 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])
3964 {
3965 /**
3966 * Convert tables to css
3967 */
3968
3969 for (uint i = 0; i < SP_ROOT_CNT; i++)
3970 {
3971 uint pw_pos = i / CHARSIZ;
3972
3973 cs_t *cs = &root_css_buf[pw_pos];
3974
3975 if (cs->cs_len == threshold) continue;
3976
3977 uint key = root_table_buf[i].key;
3978
3979 if (uniq_tbls[pw_pos][key] == 0) continue;
3980
3981 cs->cs_buf[cs->cs_len] = key;
3982
3983 cs->cs_len++;
3984 }
3985
3986 /**
3987 * Convert table to css
3988 */
3989
3990 for (uint i = 0; i < SP_MARKOV_CNT; i++)
3991 {
3992 uint c = i / CHARSIZ;
3993
3994 cs_t *cs = &markov_css_buf[c];
3995
3996 if (cs->cs_len == threshold) continue;
3997
3998 uint pw_pos = c / CHARSIZ;
3999
4000 uint key = markov_table_buf[i].key;
4001
4002 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4003
4004 cs->cs_buf[cs->cs_len] = key;
4005
4006 cs->cs_len++;
4007 }
4008
4009 /*
4010 for (uint i = 0; i < 8; i++)
4011 {
4012 for (uint j = 0x20; j < 0x80; j++)
4013 {
4014 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4015
4016 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4017
4018 for (uint k = 0; k < 10; k++)
4019 {
4020 printf (" %u\n", ptr->cs_buf[k]);
4021 }
4022 }
4023 }
4024 */
4025 }
4026
4027 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4028 {
4029 for (uint i = 0; i < SP_PW_MAX; i += 2)
4030 {
4031 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4032
4033 out += CHARSIZ;
4034 in += CHARSIZ;
4035
4036 out->key = 0;
4037 out->val = 1;
4038
4039 out++;
4040
4041 for (uint j = 1; j < CHARSIZ; j++)
4042 {
4043 out->key = j;
4044 out->val = 0;
4045
4046 out++;
4047 }
4048 }
4049 }
4050
4051 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4052 {
4053 for (uint i = 0; i < SP_PW_MAX; i += 2)
4054 {
4055 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4056
4057 out += CHARSIZ * CHARSIZ;
4058 in += CHARSIZ * CHARSIZ;
4059
4060 for (uint j = 0; j < CHARSIZ; j++)
4061 {
4062 out->key = 0;
4063 out->val = 1;
4064
4065 out++;
4066
4067 for (uint k = 1; k < CHARSIZ; k++)
4068 {
4069 out->key = k;
4070 out->val = 0;
4071
4072 out++;
4073 }
4074 }
4075 }
4076 }
4077
4078 /**
4079 * mixed shared functions
4080 */
4081
4082 void dump_hex (const u8 *s, const int sz)
4083 {
4084 for (int i = 0; i < sz; i++)
4085 {
4086 log_info_nn ("%02x ", s[i]);
4087 }
4088
4089 log_info ("");
4090 }
4091
4092 void usage_mini_print (const char *progname)
4093 {
4094 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4095 }
4096
4097 void usage_big_print (const char *progname)
4098 {
4099 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4100 }
4101
4102 char *get_exec_path ()
4103 {
4104 int exec_path_len = 1024;
4105
4106 char *exec_path = (char *) mymalloc (exec_path_len);
4107
4108 #ifdef LINUX
4109
4110 char tmp[32] = { 0 };
4111
4112 snprintf (tmp, sizeof (tmp) - 1, "/proc/%d/exe", getpid ());
4113
4114 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4115
4116 #elif WIN
4117
4118 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4119
4120 #elif OSX
4121
4122 uint size = exec_path_len;
4123
4124 if (_NSGetExecutablePath (exec_path, &size) != 0)
4125 {
4126 log_error("! executable path buffer too small\n");
4127
4128 exit (-1);
4129 }
4130
4131 const int len = strlen (exec_path);
4132
4133 #else
4134 #error Your Operating System is not supported or detected
4135 #endif
4136
4137 exec_path[len] = 0;
4138
4139 return exec_path;
4140 }
4141
4142 char *get_install_dir (const char *progname)
4143 {
4144 char *install_dir = mystrdup (progname);
4145 char *last_slash = NULL;
4146
4147 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4148 {
4149 *last_slash = 0;
4150 }
4151 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4152 {
4153 *last_slash = 0;
4154 }
4155 else
4156 {
4157 install_dir[0] = '.';
4158 install_dir[1] = 0;
4159 }
4160
4161 return (install_dir);
4162 }
4163
4164 char *get_profile_dir (const char *homedir)
4165 {
4166 #define DOT_HASHCAT ".hashcat"
4167
4168 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1;
4169
4170 char *profile_dir = (char *) mymalloc (len + 1);
4171
4172 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4173
4174 return profile_dir;
4175 }
4176
4177 char *get_session_dir (const char *profile_dir)
4178 {
4179 #define SESSIONS_FOLDER "sessions"
4180
4181 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1;
4182
4183 char *session_dir = (char *) mymalloc (len + 1);
4184
4185 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4186
4187 return session_dir;
4188 }
4189
4190 uint count_lines (FILE *fd)
4191 {
4192 uint cnt = 0;
4193
4194 char *buf = (char *) mymalloc (BUFSIZ + 1);
4195
4196 char prev = '\n';
4197
4198 while (!feof (fd))
4199 {
4200 size_t nread = fread (buf, sizeof (char), BUFSIZ, fd);
4201
4202 if (nread < 1) continue;
4203
4204 size_t i;
4205
4206 for (i = 0; i < nread; i++)
4207 {
4208 if (prev == '\n') cnt++;
4209
4210 prev = buf[i];
4211 }
4212 }
4213
4214 myfree (buf);
4215
4216 return cnt;
4217 }
4218
4219 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4220 {
4221 uint crc = ~0;
4222
4223 FILE *fd = fopen (filename, "rb");
4224
4225 if (fd == NULL)
4226 {
4227 log_error ("%s: %s", filename, strerror (errno));
4228
4229 exit (-1);
4230 }
4231
4232 #define MAX_KEY_SIZE (1024 * 1024)
4233
4234 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4235
4236 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4237
4238 fclose (fd);
4239
4240 int kpos = 0;
4241
4242 for (int fpos = 0; fpos < nread; fpos++)
4243 {
4244 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4245
4246 keytab[kpos++] += (crc >> 24) & 0xff;
4247 keytab[kpos++] += (crc >> 16) & 0xff;
4248 keytab[kpos++] += (crc >> 8) & 0xff;
4249 keytab[kpos++] += (crc >> 0) & 0xff;
4250
4251 if (kpos >= 64) kpos = 0;
4252 }
4253
4254 myfree (buf);
4255 }
4256
4257 #ifdef OSX
4258 int pthread_setaffinity_np (pthread_t thread, size_t cpu_size, cpu_set_t *cpu_set)
4259 {
4260 int core;
4261
4262 for (core = 0; core < (8 * (int)cpu_size); core++)
4263 if (CPU_ISSET(core, cpu_set)) break;
4264
4265 thread_affinity_policy_data_t policy = { core };
4266
4267 const int rc = thread_policy_set (pthread_mach_thread_np (thread), THREAD_AFFINITY_POLICY, (thread_policy_t) &policy, 1);
4268
4269 if (data.quiet == 0)
4270 {
4271 if (rc != KERN_SUCCESS)
4272 {
4273 log_error ("ERROR: %s : %d", "thread_policy_set()", rc);
4274 }
4275 }
4276
4277 return rc;
4278 }
4279 #endif
4280
4281 void set_cpu_affinity (char *cpu_affinity)
4282 {
4283 #ifdef WIN
4284 DWORD_PTR aff_mask = 0;
4285 #elif _POSIX
4286 cpu_set_t cpuset;
4287 CPU_ZERO (&cpuset);
4288 #endif
4289
4290 if (cpu_affinity)
4291 {
4292 char *devices = strdup (cpu_affinity);
4293
4294 char *next = strtok (devices, ",");
4295
4296 do
4297 {
4298 uint cpu_id = atoi (next);
4299
4300 if (cpu_id == 0)
4301 {
4302 #ifdef WIN
4303 aff_mask = 0;
4304 #elif _POSIX
4305 CPU_ZERO (&cpuset);
4306 #endif
4307
4308 break;
4309 }
4310
4311 if (cpu_id > 32)
4312 {
4313 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4314
4315 exit (-1);
4316 }
4317
4318 #ifdef WIN
4319 aff_mask |= 1 << (cpu_id - 1);
4320 #elif _POSIX
4321 CPU_SET ((cpu_id - 1), &cpuset);
4322 #endif
4323
4324 } while ((next = strtok (NULL, ",")) != NULL);
4325
4326 free (devices);
4327 }
4328
4329 #ifdef WIN
4330 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4331 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4332 #elif _POSIX
4333 pthread_t thread = pthread_self ();
4334 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4335 #endif
4336 }
4337
4338 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4339 {
4340 char *element, *end;
4341
4342 end = (char *) base + nmemb * size;
4343
4344 for (element = (char *) base; element < end; element += size)
4345 if (!compar (element, key))
4346 return element;
4347
4348 return NULL;
4349 }
4350
4351 int sort_by_salt (const void *v1, const void *v2)
4352 {
4353 const salt_t *s1 = (const salt_t *) v1;
4354 const salt_t *s2 = (const salt_t *) v2;
4355
4356 const int res1 = s1->salt_len - s2->salt_len;
4357
4358 if (res1 != 0) return (res1);
4359
4360 const int res2 = s1->salt_iter - s2->salt_iter;
4361
4362 if (res2 != 0) return (res2);
4363
4364 uint n;
4365
4366 n = 16;
4367
4368 while (n--)
4369 {
4370 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4371 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4372 }
4373
4374 n = 8;
4375
4376 while (n--)
4377 {
4378 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4379 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4380 }
4381
4382 return (0);
4383 }
4384
4385 int sort_by_salt_buf (const void *v1, const void *v2)
4386 {
4387 const pot_t *p1 = (const pot_t *) v1;
4388 const pot_t *p2 = (const pot_t *) v2;
4389
4390 const hash_t *h1 = &p1->hash;
4391 const hash_t *h2 = &p2->hash;
4392
4393 const salt_t *s1 = h1->salt;
4394 const salt_t *s2 = h2->salt;
4395
4396 uint n = 16;
4397
4398 while (n--)
4399 {
4400 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4401 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4402 }
4403
4404 return 0;
4405 }
4406
4407 int sort_by_hash_t_salt (const void *v1, const void *v2)
4408 {
4409 const hash_t *h1 = (const hash_t *) v1;
4410 const hash_t *h2 = (const hash_t *) v2;
4411
4412 const salt_t *s1 = h1->salt;
4413 const salt_t *s2 = h2->salt;
4414
4415 // testphase: this should work
4416 uint n = 16;
4417
4418 while (n--)
4419 {
4420 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4421 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4422 }
4423
4424 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4425 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4426 if (s1->salt_len > s2->salt_len) return ( 1);
4427 if (s1->salt_len < s2->salt_len) return (-1);
4428
4429 uint n = s1->salt_len;
4430
4431 while (n--)
4432 {
4433 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4434 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4435 }
4436 */
4437
4438 return 0;
4439 }
4440
4441 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4442 {
4443 const hash_t *h1 = (const hash_t *) v1;
4444 const hash_t *h2 = (const hash_t *) v2;
4445
4446 const salt_t *s1 = h1->salt;
4447 const salt_t *s2 = h2->salt;
4448
4449 // 16 - 2 (since last 2 uints contain the digest)
4450 uint n = 14;
4451
4452 while (n--)
4453 {
4454 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4455 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4456 }
4457
4458 return 0;
4459 }
4460
4461 int sort_by_hash_no_salt (const void *v1, const void *v2)
4462 {
4463 const hash_t *h1 = (const hash_t *) v1;
4464 const hash_t *h2 = (const hash_t *) v2;
4465
4466 const void *d1 = h1->digest;
4467 const void *d2 = h2->digest;
4468
4469 return data.sort_by_digest (d1, d2);
4470 }
4471
4472 int sort_by_hash (const void *v1, const void *v2)
4473 {
4474 const hash_t *h1 = (const hash_t *) v1;
4475 const hash_t *h2 = (const hash_t *) v2;
4476
4477 if (data.isSalted)
4478 {
4479 const salt_t *s1 = h1->salt;
4480 const salt_t *s2 = h2->salt;
4481
4482 int res = sort_by_salt (s1, s2);
4483
4484 if (res != 0) return (res);
4485 }
4486
4487 const void *d1 = h1->digest;
4488 const void *d2 = h2->digest;
4489
4490 return data.sort_by_digest (d1, d2);
4491 }
4492
4493 int sort_by_pot (const void *v1, const void *v2)
4494 {
4495 const pot_t *p1 = (const pot_t *) v1;
4496 const pot_t *p2 = (const pot_t *) v2;
4497
4498 const hash_t *h1 = &p1->hash;
4499 const hash_t *h2 = &p2->hash;
4500
4501 return sort_by_hash (h1, h2);
4502 }
4503
4504 int sort_by_mtime (const void *p1, const void *p2)
4505 {
4506 const char **f1 = (const char **) p1;
4507 const char **f2 = (const char **) p2;
4508
4509 struct stat s1; stat (*f1, &s1);
4510 struct stat s2; stat (*f2, &s2);
4511
4512 return s2.st_mtime - s1.st_mtime;
4513 }
4514
4515 int sort_by_cpu_rule (const void *p1, const void *p2)
4516 {
4517 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4518 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4519
4520 return memcmp (r1, r2, sizeof (cpu_rule_t));
4521 }
4522
4523 int sort_by_kernel_rule (const void *p1, const void *p2)
4524 {
4525 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4526 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4527
4528 return memcmp (r1, r2, sizeof (kernel_rule_t));
4529 }
4530
4531 int sort_by_stringptr (const void *p1, const void *p2)
4532 {
4533 const char **s1 = (const char **) p1;
4534 const char **s2 = (const char **) p2;
4535
4536 return strcmp (*s1, *s2);
4537 }
4538
4539 int sort_by_dictstat (const void *s1, const void *s2)
4540 {
4541 dictstat_t *d1 = (dictstat_t *) s1;
4542 dictstat_t *d2 = (dictstat_t *) s2;
4543
4544 #ifdef LINUX
4545 d2->stat.st_atim = d1->stat.st_atim;
4546 #else
4547 d2->stat.st_atime = d1->stat.st_atime;
4548 #endif
4549
4550 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4551 }
4552
4553 int sort_by_bitmap (const void *p1, const void *p2)
4554 {
4555 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4556 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4557
4558 return b1->collisions - b2->collisions;
4559 }
4560
4561 int sort_by_digest_4_2 (const void *v1, const void *v2)
4562 {
4563 const u32 *d1 = (const u32 *) v1;
4564 const u32 *d2 = (const u32 *) v2;
4565
4566 uint n = 2;
4567
4568 while (n--)
4569 {
4570 if (d1[n] > d2[n]) return ( 1);
4571 if (d1[n] < d2[n]) return (-1);
4572 }
4573
4574 return (0);
4575 }
4576
4577 int sort_by_digest_4_4 (const void *v1, const void *v2)
4578 {
4579 const u32 *d1 = (const u32 *) v1;
4580 const u32 *d2 = (const u32 *) v2;
4581
4582 uint n = 4;
4583
4584 while (n--)
4585 {
4586 if (d1[n] > d2[n]) return ( 1);
4587 if (d1[n] < d2[n]) return (-1);
4588 }
4589
4590 return (0);
4591 }
4592
4593 int sort_by_digest_4_5 (const void *v1, const void *v2)
4594 {
4595 const u32 *d1 = (const u32 *) v1;
4596 const u32 *d2 = (const u32 *) v2;
4597
4598 uint n = 5;
4599
4600 while (n--)
4601 {
4602 if (d1[n] > d2[n]) return ( 1);
4603 if (d1[n] < d2[n]) return (-1);
4604 }
4605
4606 return (0);
4607 }
4608
4609 int sort_by_digest_4_6 (const void *v1, const void *v2)
4610 {
4611 const u32 *d1 = (const u32 *) v1;
4612 const u32 *d2 = (const u32 *) v2;
4613
4614 uint n = 6;
4615
4616 while (n--)
4617 {
4618 if (d1[n] > d2[n]) return ( 1);
4619 if (d1[n] < d2[n]) return (-1);
4620 }
4621
4622 return (0);
4623 }
4624
4625 int sort_by_digest_4_8 (const void *v1, const void *v2)
4626 {
4627 const u32 *d1 = (const u32 *) v1;
4628 const u32 *d2 = (const u32 *) v2;
4629
4630 uint n = 8;
4631
4632 while (n--)
4633 {
4634 if (d1[n] > d2[n]) return ( 1);
4635 if (d1[n] < d2[n]) return (-1);
4636 }
4637
4638 return (0);
4639 }
4640
4641 int sort_by_digest_4_16 (const void *v1, const void *v2)
4642 {
4643 const u32 *d1 = (const u32 *) v1;
4644 const u32 *d2 = (const u32 *) v2;
4645
4646 uint n = 16;
4647
4648 while (n--)
4649 {
4650 if (d1[n] > d2[n]) return ( 1);
4651 if (d1[n] < d2[n]) return (-1);
4652 }
4653
4654 return (0);
4655 }
4656
4657 int sort_by_digest_4_32 (const void *v1, const void *v2)
4658 {
4659 const u32 *d1 = (const u32 *) v1;
4660 const u32 *d2 = (const u32 *) v2;
4661
4662 uint n = 32;
4663
4664 while (n--)
4665 {
4666 if (d1[n] > d2[n]) return ( 1);
4667 if (d1[n] < d2[n]) return (-1);
4668 }
4669
4670 return (0);
4671 }
4672
4673 int sort_by_digest_4_64 (const void *v1, const void *v2)
4674 {
4675 const u32 *d1 = (const u32 *) v1;
4676 const u32 *d2 = (const u32 *) v2;
4677
4678 uint n = 64;
4679
4680 while (n--)
4681 {
4682 if (d1[n] > d2[n]) return ( 1);
4683 if (d1[n] < d2[n]) return (-1);
4684 }
4685
4686 return (0);
4687 }
4688
4689 int sort_by_digest_8_8 (const void *v1, const void *v2)
4690 {
4691 const u64 *d1 = (const u64 *) v1;
4692 const u64 *d2 = (const u64 *) v2;
4693
4694 uint n = 8;
4695
4696 while (n--)
4697 {
4698 if (d1[n] > d2[n]) return ( 1);
4699 if (d1[n] < d2[n]) return (-1);
4700 }
4701
4702 return (0);
4703 }
4704
4705 int sort_by_digest_8_16 (const void *v1, const void *v2)
4706 {
4707 const u64 *d1 = (const u64 *) v1;
4708 const u64 *d2 = (const u64 *) v2;
4709
4710 uint n = 16;
4711
4712 while (n--)
4713 {
4714 if (d1[n] > d2[n]) return ( 1);
4715 if (d1[n] < d2[n]) return (-1);
4716 }
4717
4718 return (0);
4719 }
4720
4721 int sort_by_digest_8_25 (const void *v1, const void *v2)
4722 {
4723 const u64 *d1 = (const u64 *) v1;
4724 const u64 *d2 = (const u64 *) v2;
4725
4726 uint n = 25;
4727
4728 while (n--)
4729 {
4730 if (d1[n] > d2[n]) return ( 1);
4731 if (d1[n] < d2[n]) return (-1);
4732 }
4733
4734 return (0);
4735 }
4736
4737 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4738 {
4739 const u32 *d1 = (const u32 *) v1;
4740 const u32 *d2 = (const u32 *) v2;
4741
4742 const uint dgst_pos0 = data.dgst_pos0;
4743 const uint dgst_pos1 = data.dgst_pos1;
4744 const uint dgst_pos2 = data.dgst_pos2;
4745 const uint dgst_pos3 = data.dgst_pos3;
4746
4747 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4748 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4749 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4750 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4751 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4752 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4753 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4754 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4755
4756 return (0);
4757 }
4758
4759 int sort_by_tuning_db_alias (const void *v1, const void *v2)
4760 {
4761 const tuning_db_alias_t *t1 = (const tuning_db_alias_t *) v1;
4762 const tuning_db_alias_t *t2 = (const tuning_db_alias_t *) v2;
4763
4764 const int res1 = strcmp (t1->device_name, t2->device_name);
4765
4766 if (res1 != 0) return (res1);
4767
4768 return 0;
4769 }
4770
4771 int sort_by_tuning_db_entry (const void *v1, const void *v2)
4772 {
4773 const tuning_db_entry_t *t1 = (const tuning_db_entry_t *) v1;
4774 const tuning_db_entry_t *t2 = (const tuning_db_entry_t *) v2;
4775
4776 const int res1 = strcmp (t1->device_name, t2->device_name);
4777
4778 if (res1 != 0) return (res1);
4779
4780 const int res2 = t1->attack_mode
4781 - t2->attack_mode;
4782
4783 if (res2 != 0) return (res2);
4784
4785 const int res3 = t1->hash_type
4786 - t2->hash_type;
4787
4788 if (res3 != 0) return (res3);
4789
4790 const int res4 = t1->workload_profile
4791 - t2->workload_profile;
4792
4793 if (res4 != 0) return (res4);
4794
4795 return 0;
4796 }
4797
4798 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)
4799 {
4800 uint outfile_autohex = data.outfile_autohex;
4801
4802 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4803
4804 FILE *debug_fp = NULL;
4805
4806 if (debug_file != NULL)
4807 {
4808 debug_fp = fopen (debug_file, "ab");
4809
4810 lock_file (debug_fp);
4811 }
4812 else
4813 {
4814 debug_fp = stderr;
4815 }
4816
4817 if (debug_fp == NULL)
4818 {
4819 log_info ("WARNING: Could not open debug-file for writing");
4820 }
4821 else
4822 {
4823 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4824 {
4825 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4826
4827 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4828 }
4829
4830 fwrite (rule_ptr, rule_len, 1, debug_fp);
4831
4832 if (debug_mode == 4)
4833 {
4834 fputc (':', debug_fp);
4835
4836 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4837 }
4838
4839 fputc ('\n', debug_fp);
4840
4841 if (debug_file != NULL) fclose (debug_fp);
4842 }
4843 }
4844
4845 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4846 {
4847 int needs_hexify = 0;
4848
4849 if (outfile_autohex == 1)
4850 {
4851 for (uint i = 0; i < plain_len; i++)
4852 {
4853 if (plain_ptr[i] < 0x20)
4854 {
4855 needs_hexify = 1;
4856
4857 break;
4858 }
4859
4860 if (plain_ptr[i] > 0x7f)
4861 {
4862 needs_hexify = 1;
4863
4864 break;
4865 }
4866 }
4867 }
4868
4869 if (needs_hexify == 1)
4870 {
4871 fprintf (fp, "$HEX[");
4872
4873 for (uint i = 0; i < plain_len; i++)
4874 {
4875 fprintf (fp, "%02x", plain_ptr[i]);
4876 }
4877
4878 fprintf (fp, "]");
4879 }
4880 else
4881 {
4882 fwrite (plain_ptr, plain_len, 1, fp);
4883 }
4884 }
4885
4886 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)
4887 {
4888 uint outfile_format = data.outfile_format;
4889
4890 char separator = data.separator;
4891
4892 if (outfile_format & OUTFILE_FMT_HASH)
4893 {
4894 fprintf (out_fp, "%s", out_buf);
4895
4896 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4897 {
4898 fputc (separator, out_fp);
4899 }
4900 }
4901 else if (data.username)
4902 {
4903 if (username != NULL)
4904 {
4905 for (uint i = 0; i < user_len; i++)
4906 {
4907 fprintf (out_fp, "%c", username[i]);
4908 }
4909
4910 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4911 {
4912 fputc (separator, out_fp);
4913 }
4914 }
4915 }
4916
4917 if (outfile_format & OUTFILE_FMT_PLAIN)
4918 {
4919 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4920
4921 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4922 {
4923 fputc (separator, out_fp);
4924 }
4925 }
4926
4927 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4928 {
4929 for (uint i = 0; i < plain_len; i++)
4930 {
4931 fprintf (out_fp, "%02x", plain_ptr[i]);
4932 }
4933
4934 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4935 {
4936 fputc (separator, out_fp);
4937 }
4938 }
4939
4940 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4941 {
4942 #ifdef _WIN
4943 __mingw_fprintf (out_fp, "%llu", crackpos);
4944 #endif
4945
4946 #ifdef _POSIX
4947 #ifdef __x86_64__
4948 fprintf (out_fp, "%lu", (unsigned long) crackpos);
4949 #else
4950 fprintf (out_fp, "%llu", crackpos);
4951 #endif
4952 #endif
4953 }
4954
4955 fputc ('\n', out_fp);
4956 }
4957
4958 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)
4959 {
4960 pot_t pot_key;
4961
4962 pot_key.hash.salt = hashes_buf->salt;
4963 pot_key.hash.digest = hashes_buf->digest;
4964
4965 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4966
4967 if (pot_ptr)
4968 {
4969 log_info_nn ("");
4970
4971 input_buf[input_len] = 0;
4972
4973 // user
4974 unsigned char *username = NULL;
4975 uint user_len = 0;
4976
4977 if (data.username)
4978 {
4979 user_t *user = hashes_buf->hash_info->user;
4980
4981 if (user)
4982 {
4983 username = (unsigned char *) (user->user_name);
4984
4985 user_len = user->user_len;
4986 }
4987 }
4988
4989 // do output the line
4990 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
4991 }
4992 }
4993
4994 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
4995 #define LM_MASKED_PLAIN "[notfound]"
4996
4997 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)
4998 {
4999 // left
5000
5001 pot_t pot_left_key;
5002
5003 pot_left_key.hash.salt = hash_left->salt;
5004 pot_left_key.hash.digest = hash_left->digest;
5005
5006 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5007
5008 // right
5009
5010 uint weak_hash_found = 0;
5011
5012 pot_t pot_right_key;
5013
5014 pot_right_key.hash.salt = hash_right->salt;
5015 pot_right_key.hash.digest = hash_right->digest;
5016
5017 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5018
5019 if (pot_right_ptr == NULL)
5020 {
5021 // special case, if "weak hash"
5022
5023 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5024 {
5025 weak_hash_found = 1;
5026
5027 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5028
5029 // in theory this is not needed, but we are paranoia:
5030
5031 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5032 pot_right_ptr->plain_len = 0;
5033 }
5034 }
5035
5036 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
5037 {
5038 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
5039
5040 return;
5041 }
5042
5043 // at least one half was found:
5044
5045 log_info_nn ("");
5046
5047 input_buf[input_len] = 0;
5048
5049 // user
5050
5051 unsigned char *username = NULL;
5052 uint user_len = 0;
5053
5054 if (data.username)
5055 {
5056 user_t *user = hash_left->hash_info->user;
5057
5058 if (user)
5059 {
5060 username = (unsigned char *) (user->user_name);
5061
5062 user_len = user->user_len;
5063 }
5064 }
5065
5066 // mask the part which was not found
5067
5068 uint left_part_masked = 0;
5069 uint right_part_masked = 0;
5070
5071 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
5072
5073 if (pot_left_ptr == NULL)
5074 {
5075 left_part_masked = 1;
5076
5077 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5078
5079 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5080
5081 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5082 pot_left_ptr->plain_len = mask_plain_len;
5083 }
5084
5085 if (pot_right_ptr == NULL)
5086 {
5087 right_part_masked = 1;
5088
5089 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5090
5091 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5092
5093 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5094 pot_right_ptr->plain_len = mask_plain_len;
5095 }
5096
5097 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5098
5099 pot_t pot_ptr;
5100
5101 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5102
5103 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5104
5105 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5106
5107 // do output the line
5108
5109 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5110
5111 if (weak_hash_found == 1) myfree (pot_right_ptr);
5112
5113 if (left_part_masked == 1) myfree (pot_left_ptr);
5114 if (right_part_masked == 1) myfree (pot_right_ptr);
5115 }
5116
5117 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)
5118 {
5119 pot_t pot_key;
5120
5121 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5122
5123 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5124
5125 if (pot_ptr == NULL)
5126 {
5127 log_info_nn ("");
5128
5129 input_buf[input_len] = 0;
5130
5131 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5132 }
5133 }
5134
5135 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)
5136 {
5137 // left
5138
5139 pot_t pot_left_key;
5140
5141 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5142
5143 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5144
5145 // right
5146
5147 pot_t pot_right_key;
5148
5149 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5150
5151 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5152
5153 uint weak_hash_found = 0;
5154
5155 if (pot_right_ptr == NULL)
5156 {
5157 // special case, if "weak hash"
5158
5159 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5160 {
5161 weak_hash_found = 1;
5162
5163 // we just need that pot_right_ptr is not a NULL pointer
5164
5165 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5166 }
5167 }
5168
5169 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5170 {
5171 if (weak_hash_found == 1) myfree (pot_right_ptr);
5172
5173 return;
5174 }
5175
5176 // ... at least one part was not cracked
5177
5178 log_info_nn ("");
5179
5180 input_buf[input_len] = 0;
5181
5182 // only show the hash part which is still not cracked
5183
5184 uint user_len = input_len - 32;
5185
5186 char *hash_output = (char *) mymalloc (33);
5187
5188 memcpy (hash_output, input_buf, input_len);
5189
5190 if (pot_left_ptr != NULL)
5191 {
5192 // only show right part (because left part was already found)
5193
5194 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5195
5196 hash_output[user_len + 16] = 0;
5197 }
5198
5199 if (pot_right_ptr != NULL)
5200 {
5201 // only show left part (because right part was already found)
5202
5203 memcpy (hash_output + user_len, input_buf + user_len, 16);
5204
5205 hash_output[user_len + 16] = 0;
5206 }
5207
5208 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5209
5210 myfree (hash_output);
5211
5212 if (weak_hash_found == 1) myfree (pot_right_ptr);
5213 }
5214
5215 uint setup_opencl_platforms_filter (char *opencl_platforms)
5216 {
5217 uint opencl_platforms_filter = 0;
5218
5219 if (opencl_platforms)
5220 {
5221 char *platforms = strdup (opencl_platforms);
5222
5223 char *next = strtok (platforms, ",");
5224
5225 do
5226 {
5227 int platform = atoi (next);
5228
5229 if (platform < 1 || platform > 32)
5230 {
5231 log_error ("ERROR: invalid OpenCL platform %u specified", platform);
5232
5233 exit (-1);
5234 }
5235
5236 opencl_platforms_filter |= 1 << (platform - 1);
5237
5238 } while ((next = strtok (NULL, ",")) != NULL);
5239
5240 free (platforms);
5241 }
5242 else
5243 {
5244 opencl_platforms_filter = -1;
5245 }
5246
5247 return opencl_platforms_filter;
5248 }
5249
5250 u32 setup_devices_filter (char *opencl_devices)
5251 {
5252 u32 devices_filter = 0;
5253
5254 if (opencl_devices)
5255 {
5256 char *devices = strdup (opencl_devices);
5257
5258 char *next = strtok (devices, ",");
5259
5260 do
5261 {
5262 int device_id = atoi (next);
5263
5264 if (device_id < 1 || device_id > 32)
5265 {
5266 log_error ("ERROR: invalid device_id %u specified", device_id);
5267
5268 exit (-1);
5269 }
5270
5271 devices_filter |= 1 << (device_id - 1);
5272
5273 } while ((next = strtok (NULL, ",")) != NULL);
5274
5275 free (devices);
5276 }
5277 else
5278 {
5279 devices_filter = -1;
5280 }
5281
5282 return devices_filter;
5283 }
5284
5285 cl_device_type setup_device_types_filter (char *opencl_device_types)
5286 {
5287 cl_device_type device_types_filter = 0;
5288
5289 if (opencl_device_types)
5290 {
5291 char *device_types = strdup (opencl_device_types);
5292
5293 char *next = strtok (device_types, ",");
5294
5295 do
5296 {
5297 int device_type = atoi (next);
5298
5299 if (device_type < 1 || device_type > 3)
5300 {
5301 log_error ("ERROR: invalid device_type %u specified", device_type);
5302
5303 exit (-1);
5304 }
5305
5306 device_types_filter |= 1 << device_type;
5307
5308 } while ((next = strtok (NULL, ",")) != NULL);
5309
5310 free (device_types);
5311 }
5312 else
5313 {
5314 // Do not use CPU by default, this often reduces GPU performance because
5315 // the CPU is too busy to handle GPU synchronization
5316
5317 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5318 }
5319
5320 return device_types_filter;
5321 }
5322
5323 u32 get_random_num (const u32 min, const u32 max)
5324 {
5325 if (min == max) return (min);
5326
5327 return ((rand () % (max - min)) + min);
5328 }
5329
5330 u32 mydivc32 (const u32 dividend, const u32 divisor)
5331 {
5332 u32 quotient = dividend / divisor;
5333
5334 if (dividend % divisor) quotient++;
5335
5336 return quotient;
5337 }
5338
5339 u64 mydivc64 (const u64 dividend, const u64 divisor)
5340 {
5341 u64 quotient = dividend / divisor;
5342
5343 if (dividend % divisor) quotient++;
5344
5345 return quotient;
5346 }
5347
5348 void format_timer_display (struct tm *tm, char *buf, size_t len)
5349 {
5350 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5351 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5352
5353 if (tm->tm_year - 70)
5354 {
5355 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5356 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5357
5358 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5359 }
5360 else if (tm->tm_yday)
5361 {
5362 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5363 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5364
5365 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5366 }
5367 else if (tm->tm_hour)
5368 {
5369 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5370 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5371
5372 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5373 }
5374 else if (tm->tm_min)
5375 {
5376 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5377 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5378
5379 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5380 }
5381 else
5382 {
5383 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5384
5385 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5386 }
5387 }
5388
5389 void format_speed_display (float val, char *buf, size_t len)
5390 {
5391 if (val <= 0)
5392 {
5393 buf[0] = '0';
5394 buf[1] = ' ';
5395 buf[2] = 0;
5396
5397 return;
5398 }
5399
5400 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5401
5402 uint level = 0;
5403
5404 while (val > 99999)
5405 {
5406 val /= 1000;
5407
5408 level++;
5409 }
5410
5411 /* generate output */
5412
5413 if (level == 0)
5414 {
5415 snprintf (buf, len - 1, "%.0f ", val);
5416 }
5417 else
5418 {
5419 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5420 }
5421 }
5422
5423 void lowercase (u8 *buf, int len)
5424 {
5425 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5426 }
5427
5428 void uppercase (u8 *buf, int len)
5429 {
5430 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5431 }
5432
5433 int fgetl (FILE *fp, char *line_buf)
5434 {
5435 int line_len = 0;
5436
5437 while (!feof (fp))
5438 {
5439 const int c = fgetc (fp);
5440
5441 if (c == EOF) break;
5442
5443 line_buf[line_len] = (char) c;
5444
5445 line_len++;
5446
5447 if (line_len == BUFSIZ) line_len--;
5448
5449 if (c == '\n') break;
5450 }
5451
5452 if (line_len == 0) return 0;
5453
5454 if (line_buf[line_len - 1] == '\n')
5455 {
5456 line_len--;
5457
5458 line_buf[line_len] = 0;
5459 }
5460
5461 if (line_len == 0) return 0;
5462
5463 if (line_buf[line_len - 1] == '\r')
5464 {
5465 line_len--;
5466
5467 line_buf[line_len] = 0;
5468 }
5469
5470 return (line_len);
5471 }
5472
5473 int in_superchop (char *buf)
5474 {
5475 int len = strlen (buf);
5476
5477 while (len)
5478 {
5479 if (buf[len - 1] == '\n')
5480 {
5481 len--;
5482
5483 continue;
5484 }
5485
5486 if (buf[len - 1] == '\r')
5487 {
5488 len--;
5489
5490 continue;
5491 }
5492
5493 break;
5494 }
5495
5496 buf[len] = 0;
5497
5498 return len;
5499 }
5500
5501 char **scan_directory (const char *path)
5502 {
5503 char *tmp_path = mystrdup (path);
5504
5505 size_t tmp_path_len = strlen (tmp_path);
5506
5507 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5508 {
5509 tmp_path[tmp_path_len - 1] = 0;
5510
5511 tmp_path_len = strlen (tmp_path);
5512 }
5513
5514 char **files = NULL;
5515
5516 int num_files = 0;
5517
5518 DIR *d = NULL;
5519
5520 if ((d = opendir (tmp_path)) != NULL)
5521 {
5522 #ifdef OSX
5523 struct dirent e;
5524
5525 for (;;) {
5526 memset (&e, 0, sizeof (e));
5527 struct dirent *de = NULL;
5528
5529 if (readdir_r (d, &e, &de) != 0)
5530 {
5531 log_error ("ERROR: readdir_r() failed");
5532
5533 break;
5534 }
5535
5536 if (de == NULL) break;
5537 #else
5538 struct dirent *de;
5539
5540 while ((de = readdir (d)) != NULL)
5541 {
5542 #endif
5543 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5544
5545 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5546
5547 char *path_file = (char *) mymalloc (path_size + 1);
5548
5549 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5550
5551 path_file[path_size] = 0;
5552
5553 DIR *d_test;
5554
5555 if ((d_test = opendir (path_file)) != NULL)
5556 {
5557 closedir (d_test);
5558
5559 myfree (path_file);
5560 }
5561 else
5562 {
5563 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5564
5565 num_files++;
5566
5567 files[num_files - 1] = path_file;
5568 }
5569 }
5570
5571 closedir (d);
5572 }
5573 else if (errno == ENOTDIR)
5574 {
5575 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5576
5577 num_files++;
5578
5579 files[num_files - 1] = mystrdup (path);
5580 }
5581
5582 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5583
5584 num_files++;
5585
5586 files[num_files - 1] = NULL;
5587
5588 myfree (tmp_path);
5589
5590 return (files);
5591 }
5592
5593 int count_dictionaries (char **dictionary_files)
5594 {
5595 if (dictionary_files == NULL) return 0;
5596
5597 int cnt = 0;
5598
5599 for (int d = 0; dictionary_files[d] != NULL; d++)
5600 {
5601 cnt++;
5602 }
5603
5604 return (cnt);
5605 }
5606
5607 char *stroptitype (const uint opti_type)
5608 {
5609 switch (opti_type)
5610 {
5611 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5612 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5613 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5614 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5615 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5616 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5617 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5618 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5619 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5620 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5621 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5622 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5623 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5624 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5625 case OPTI_TYPE_USES_BITS_8: return ((char *) OPTI_STR_USES_BITS_8); break;
5626 case OPTI_TYPE_USES_BITS_16: return ((char *) OPTI_STR_USES_BITS_16); break;
5627 case OPTI_TYPE_USES_BITS_32: return ((char *) OPTI_STR_USES_BITS_32); break;
5628 case OPTI_TYPE_USES_BITS_64: return ((char *) OPTI_STR_USES_BITS_64); break;
5629 }
5630
5631 return (NULL);
5632 }
5633
5634 char *strparser (const uint parser_status)
5635 {
5636 switch (parser_status)
5637 {
5638 case PARSER_OK: return ((char *) PA_000); break;
5639 case PARSER_COMMENT: return ((char *) PA_001); break;
5640 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5641 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5642 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5643 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5644 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5645 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5646 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5647 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5648 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5649 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5650 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5651 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5652 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5653 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5654 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5655 }
5656
5657 return ((char *) PA_255);
5658 }
5659
5660 char *strhashtype (const uint hash_mode)
5661 {
5662 switch (hash_mode)
5663 {
5664 case 0: return ((char *) HT_00000); break;
5665 case 10: return ((char *) HT_00010); break;
5666 case 11: return ((char *) HT_00011); break;
5667 case 12: return ((char *) HT_00012); break;
5668 case 20: return ((char *) HT_00020); break;
5669 case 21: return ((char *) HT_00021); break;
5670 case 22: return ((char *) HT_00022); break;
5671 case 23: return ((char *) HT_00023); break;
5672 case 30: return ((char *) HT_00030); break;
5673 case 40: return ((char *) HT_00040); break;
5674 case 50: return ((char *) HT_00050); break;
5675 case 60: return ((char *) HT_00060); break;
5676 case 100: return ((char *) HT_00100); break;
5677 case 101: return ((char *) HT_00101); break;
5678 case 110: return ((char *) HT_00110); break;
5679 case 111: return ((char *) HT_00111); break;
5680 case 112: return ((char *) HT_00112); break;
5681 case 120: return ((char *) HT_00120); break;
5682 case 121: return ((char *) HT_00121); break;
5683 case 122: return ((char *) HT_00122); break;
5684 case 124: return ((char *) HT_00124); break;
5685 case 130: return ((char *) HT_00130); break;
5686 case 131: return ((char *) HT_00131); break;
5687 case 132: return ((char *) HT_00132); break;
5688 case 133: return ((char *) HT_00133); break;
5689 case 140: return ((char *) HT_00140); break;
5690 case 141: return ((char *) HT_00141); break;
5691 case 150: return ((char *) HT_00150); break;
5692 case 160: return ((char *) HT_00160); break;
5693 case 190: return ((char *) HT_00190); break;
5694 case 200: return ((char *) HT_00200); break;
5695 case 300: return ((char *) HT_00300); break;
5696 case 400: return ((char *) HT_00400); break;
5697 case 500: return ((char *) HT_00500); break;
5698 case 501: return ((char *) HT_00501); break;
5699 case 900: return ((char *) HT_00900); break;
5700 case 910: return ((char *) HT_00910); break;
5701 case 1000: return ((char *) HT_01000); break;
5702 case 1100: return ((char *) HT_01100); break;
5703 case 1400: return ((char *) HT_01400); break;
5704 case 1410: return ((char *) HT_01410); break;
5705 case 1420: return ((char *) HT_01420); break;
5706 case 1421: return ((char *) HT_01421); break;
5707 case 1430: return ((char *) HT_01430); break;
5708 case 1440: return ((char *) HT_01440); break;
5709 case 1441: return ((char *) HT_01441); break;
5710 case 1450: return ((char *) HT_01450); break;
5711 case 1460: return ((char *) HT_01460); break;
5712 case 1500: return ((char *) HT_01500); break;
5713 case 1600: return ((char *) HT_01600); break;
5714 case 1700: return ((char *) HT_01700); break;
5715 case 1710: return ((char *) HT_01710); break;
5716 case 1711: return ((char *) HT_01711); break;
5717 case 1720: return ((char *) HT_01720); break;
5718 case 1722: return ((char *) HT_01722); break;
5719 case 1730: return ((char *) HT_01730); break;
5720 case 1731: return ((char *) HT_01731); break;
5721 case 1740: return ((char *) HT_01740); break;
5722 case 1750: return ((char *) HT_01750); break;
5723 case 1760: return ((char *) HT_01760); break;
5724 case 1800: return ((char *) HT_01800); break;
5725 case 2100: return ((char *) HT_02100); break;
5726 case 2400: return ((char *) HT_02400); break;
5727 case 2410: return ((char *) HT_02410); break;
5728 case 2500: return ((char *) HT_02500); break;
5729 case 2600: return ((char *) HT_02600); break;
5730 case 2611: return ((char *) HT_02611); break;
5731 case 2612: return ((char *) HT_02612); break;
5732 case 2711: return ((char *) HT_02711); break;
5733 case 2811: return ((char *) HT_02811); break;
5734 case 3000: return ((char *) HT_03000); break;
5735 case 3100: return ((char *) HT_03100); break;
5736 case 3200: return ((char *) HT_03200); break;
5737 case 3710: return ((char *) HT_03710); break;
5738 case 3711: return ((char *) HT_03711); break;
5739 case 3800: return ((char *) HT_03800); break;
5740 case 4300: return ((char *) HT_04300); break;
5741 case 4400: return ((char *) HT_04400); break;
5742 case 4500: return ((char *) HT_04500); break;
5743 case 4700: return ((char *) HT_04700); break;
5744 case 4800: return ((char *) HT_04800); break;
5745 case 4900: return ((char *) HT_04900); break;
5746 case 5000: return ((char *) HT_05000); break;
5747 case 5100: return ((char *) HT_05100); break;
5748 case 5200: return ((char *) HT_05200); break;
5749 case 5300: return ((char *) HT_05300); break;
5750 case 5400: return ((char *) HT_05400); break;
5751 case 5500: return ((char *) HT_05500); break;
5752 case 5600: return ((char *) HT_05600); break;
5753 case 5700: return ((char *) HT_05700); break;
5754 case 5800: return ((char *) HT_05800); break;
5755 case 6000: return ((char *) HT_06000); break;
5756 case 6100: return ((char *) HT_06100); break;
5757 case 6211: return ((char *) HT_06211); break;
5758 case 6212: return ((char *) HT_06212); break;
5759 case 6213: return ((char *) HT_06213); break;
5760 case 6221: return ((char *) HT_06221); break;
5761 case 6222: return ((char *) HT_06222); break;
5762 case 6223: return ((char *) HT_06223); break;
5763 case 6231: return ((char *) HT_06231); break;
5764 case 6232: return ((char *) HT_06232); break;
5765 case 6233: return ((char *) HT_06233); break;
5766 case 6241: return ((char *) HT_06241); break;
5767 case 6242: return ((char *) HT_06242); break;
5768 case 6243: return ((char *) HT_06243); break;
5769 case 6300: return ((char *) HT_06300); break;
5770 case 6400: return ((char *) HT_06400); break;
5771 case 6500: return ((char *) HT_06500); break;
5772 case 6600: return ((char *) HT_06600); break;
5773 case 6700: return ((char *) HT_06700); break;
5774 case 6800: return ((char *) HT_06800); break;
5775 case 6900: return ((char *) HT_06900); break;
5776 case 7100: return ((char *) HT_07100); break;
5777 case 7200: return ((char *) HT_07200); break;
5778 case 7300: return ((char *) HT_07300); break;
5779 case 7400: return ((char *) HT_07400); break;
5780 case 7500: return ((char *) HT_07500); break;
5781 case 7600: return ((char *) HT_07600); break;
5782 case 7700: return ((char *) HT_07700); break;
5783 case 7800: return ((char *) HT_07800); break;
5784 case 7900: return ((char *) HT_07900); break;
5785 case 8000: return ((char *) HT_08000); break;
5786 case 8100: return ((char *) HT_08100); break;
5787 case 8200: return ((char *) HT_08200); break;
5788 case 8300: return ((char *) HT_08300); break;
5789 case 8400: return ((char *) HT_08400); break;
5790 case 8500: return ((char *) HT_08500); break;
5791 case 8600: return ((char *) HT_08600); break;
5792 case 8700: return ((char *) HT_08700); break;
5793 case 8800: return ((char *) HT_08800); break;
5794 case 8900: return ((char *) HT_08900); break;
5795 case 9000: return ((char *) HT_09000); break;
5796 case 9100: return ((char *) HT_09100); break;
5797 case 9200: return ((char *) HT_09200); break;
5798 case 9300: return ((char *) HT_09300); break;
5799 case 9400: return ((char *) HT_09400); break;
5800 case 9500: return ((char *) HT_09500); break;
5801 case 9600: return ((char *) HT_09600); break;
5802 case 9700: return ((char *) HT_09700); break;
5803 case 9710: return ((char *) HT_09710); break;
5804 case 9720: return ((char *) HT_09720); break;
5805 case 9800: return ((char *) HT_09800); break;
5806 case 9810: return ((char *) HT_09810); break;
5807 case 9820: return ((char *) HT_09820); break;
5808 case 9900: return ((char *) HT_09900); break;
5809 case 10000: return ((char *) HT_10000); break;
5810 case 10100: return ((char *) HT_10100); break;
5811 case 10200: return ((char *) HT_10200); break;
5812 case 10300: return ((char *) HT_10300); break;
5813 case 10400: return ((char *) HT_10400); break;
5814 case 10410: return ((char *) HT_10410); break;
5815 case 10420: return ((char *) HT_10420); break;
5816 case 10500: return ((char *) HT_10500); break;
5817 case 10600: return ((char *) HT_10600); break;
5818 case 10700: return ((char *) HT_10700); break;
5819 case 10800: return ((char *) HT_10800); break;
5820 case 10900: return ((char *) HT_10900); break;
5821 case 11000: return ((char *) HT_11000); break;
5822 case 11100: return ((char *) HT_11100); break;
5823 case 11200: return ((char *) HT_11200); break;
5824 case 11300: return ((char *) HT_11300); break;
5825 case 11400: return ((char *) HT_11400); break;
5826 case 11500: return ((char *) HT_11500); break;
5827 case 11600: return ((char *) HT_11600); break;
5828 case 11700: return ((char *) HT_11700); break;
5829 case 11800: return ((char *) HT_11800); break;
5830 case 11900: return ((char *) HT_11900); break;
5831 case 12000: return ((char *) HT_12000); break;
5832 case 12100: return ((char *) HT_12100); break;
5833 case 12200: return ((char *) HT_12200); break;
5834 case 12300: return ((char *) HT_12300); break;
5835 case 12400: return ((char *) HT_12400); break;
5836 case 12500: return ((char *) HT_12500); break;
5837 case 12600: return ((char *) HT_12600); break;
5838 case 12700: return ((char *) HT_12700); break;
5839 case 12800: return ((char *) HT_12800); break;
5840 case 12900: return ((char *) HT_12900); break;
5841 case 13000: return ((char *) HT_13000); break;
5842 }
5843
5844 return ((char *) "Unknown");
5845 }
5846
5847 char *strstatus (const uint devices_status)
5848 {
5849 switch (devices_status)
5850 {
5851 case STATUS_INIT: return ((char *) ST_0000); break;
5852 case STATUS_STARTING: return ((char *) ST_0001); break;
5853 case STATUS_RUNNING: return ((char *) ST_0002); break;
5854 case STATUS_PAUSED: return ((char *) ST_0003); break;
5855 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5856 case STATUS_CRACKED: return ((char *) ST_0005); break;
5857 case STATUS_ABORTED: return ((char *) ST_0006); break;
5858 case STATUS_QUIT: return ((char *) ST_0007); break;
5859 case STATUS_BYPASS: return ((char *) ST_0008); break;
5860 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5861 }
5862
5863 return ((char *) "Unknown");
5864 }
5865
5866 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5867 {
5868 uint hash_type = data.hash_type;
5869 uint hash_mode = data.hash_mode;
5870 uint salt_type = data.salt_type;
5871 uint opts_type = data.opts_type;
5872 uint opti_type = data.opti_type;
5873 uint dgst_size = data.dgst_size;
5874
5875 char *hashfile = data.hashfile;
5876
5877 uint len = 4096;
5878
5879 uint digest_buf[64] = { 0 };
5880
5881 u64 *digest_buf64 = (u64 *) digest_buf;
5882
5883 char *digests_buf_ptr = (char *) data.digests_buf;
5884
5885 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5886
5887 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5888 {
5889 uint tt;
5890
5891 switch (hash_type)
5892 {
5893 case HASH_TYPE_DESCRYPT:
5894 FP (digest_buf[1], digest_buf[0], tt);
5895 break;
5896
5897 case HASH_TYPE_DESRACF:
5898 digest_buf[0] = rotl32 (digest_buf[0], 29);
5899 digest_buf[1] = rotl32 (digest_buf[1], 29);
5900
5901 FP (digest_buf[1], digest_buf[0], tt);
5902 break;
5903
5904 case HASH_TYPE_LM:
5905 FP (digest_buf[1], digest_buf[0], tt);
5906 break;
5907
5908 case HASH_TYPE_NETNTLM:
5909 digest_buf[0] = rotl32 (digest_buf[0], 29);
5910 digest_buf[1] = rotl32 (digest_buf[1], 29);
5911 digest_buf[2] = rotl32 (digest_buf[2], 29);
5912 digest_buf[3] = rotl32 (digest_buf[3], 29);
5913
5914 FP (digest_buf[1], digest_buf[0], tt);
5915 FP (digest_buf[3], digest_buf[2], tt);
5916 break;
5917
5918 case HASH_TYPE_BSDICRYPT:
5919 digest_buf[0] = rotl32 (digest_buf[0], 31);
5920 digest_buf[1] = rotl32 (digest_buf[1], 31);
5921
5922 FP (digest_buf[1], digest_buf[0], tt);
5923 break;
5924 }
5925 }
5926
5927 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5928 {
5929 switch (hash_type)
5930 {
5931 case HASH_TYPE_MD4:
5932 digest_buf[0] += MD4M_A;
5933 digest_buf[1] += MD4M_B;
5934 digest_buf[2] += MD4M_C;
5935 digest_buf[3] += MD4M_D;
5936 break;
5937
5938 case HASH_TYPE_MD5:
5939 digest_buf[0] += MD5M_A;
5940 digest_buf[1] += MD5M_B;
5941 digest_buf[2] += MD5M_C;
5942 digest_buf[3] += MD5M_D;
5943 break;
5944
5945 case HASH_TYPE_SHA1:
5946 digest_buf[0] += SHA1M_A;
5947 digest_buf[1] += SHA1M_B;
5948 digest_buf[2] += SHA1M_C;
5949 digest_buf[3] += SHA1M_D;
5950 digest_buf[4] += SHA1M_E;
5951 break;
5952
5953 case HASH_TYPE_SHA256:
5954 digest_buf[0] += SHA256M_A;
5955 digest_buf[1] += SHA256M_B;
5956 digest_buf[2] += SHA256M_C;
5957 digest_buf[3] += SHA256M_D;
5958 digest_buf[4] += SHA256M_E;
5959 digest_buf[5] += SHA256M_F;
5960 digest_buf[6] += SHA256M_G;
5961 digest_buf[7] += SHA256M_H;
5962 break;
5963
5964 case HASH_TYPE_SHA384:
5965 digest_buf64[0] += SHA384M_A;
5966 digest_buf64[1] += SHA384M_B;
5967 digest_buf64[2] += SHA384M_C;
5968 digest_buf64[3] += SHA384M_D;
5969 digest_buf64[4] += SHA384M_E;
5970 digest_buf64[5] += SHA384M_F;
5971 digest_buf64[6] += 0;
5972 digest_buf64[7] += 0;
5973 break;
5974
5975 case HASH_TYPE_SHA512:
5976 digest_buf64[0] += SHA512M_A;
5977 digest_buf64[1] += SHA512M_B;
5978 digest_buf64[2] += SHA512M_C;
5979 digest_buf64[3] += SHA512M_D;
5980 digest_buf64[4] += SHA512M_E;
5981 digest_buf64[5] += SHA512M_F;
5982 digest_buf64[6] += SHA512M_G;
5983 digest_buf64[7] += SHA512M_H;
5984 break;
5985 }
5986 }
5987
5988 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
5989 {
5990 if (dgst_size == DGST_SIZE_4_2)
5991 {
5992 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5993 }
5994 else if (dgst_size == DGST_SIZE_4_4)
5995 {
5996 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5997 }
5998 else if (dgst_size == DGST_SIZE_4_5)
5999 {
6000 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6001 }
6002 else if (dgst_size == DGST_SIZE_4_6)
6003 {
6004 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6005 }
6006 else if (dgst_size == DGST_SIZE_4_8)
6007 {
6008 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6009 }
6010 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
6011 {
6012 if (hash_type == HASH_TYPE_WHIRLPOOL)
6013 {
6014 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6015 }
6016 else if (hash_type == HASH_TYPE_SHA384)
6017 {
6018 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6019 }
6020 else if (hash_type == HASH_TYPE_SHA512)
6021 {
6022 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6023 }
6024 else if (hash_type == HASH_TYPE_GOST)
6025 {
6026 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6027 }
6028 }
6029 else if (dgst_size == DGST_SIZE_4_64)
6030 {
6031 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6032 }
6033 else if (dgst_size == DGST_SIZE_8_25)
6034 {
6035 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6036 }
6037 }
6038
6039 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
6040 | (data.salt_type == SALT_TYPE_EXTERN)
6041 | (data.salt_type == SALT_TYPE_EMBEDDED));
6042
6043 salt_t salt;
6044
6045 if (isSalted)
6046 {
6047 memset (&salt, 0, sizeof (salt_t));
6048
6049 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
6050
6051 char *ptr = (char *) salt.salt_buf;
6052
6053 uint len = salt.salt_len;
6054
6055 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6056 {
6057 uint tt;
6058
6059 switch (hash_type)
6060 {
6061 case HASH_TYPE_NETNTLM:
6062
6063 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
6064 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
6065
6066 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
6067
6068 break;
6069 }
6070 }
6071
6072 if (opts_type & OPTS_TYPE_ST_UNICODE)
6073 {
6074 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6075 {
6076 ptr[i] = ptr[j];
6077 }
6078
6079 len = len / 2;
6080 }
6081
6082 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6083 {
6084 uint max = salt.salt_len / 4;
6085
6086 if (len % 4) max++;
6087
6088 for (uint i = 0; i < max; i++)
6089 {
6090 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6091 }
6092 }
6093
6094 if (opts_type & OPTS_TYPE_ST_HEX)
6095 {
6096 char tmp[64] = { 0 };
6097
6098 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6099 {
6100 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6101 }
6102
6103 len = len * 2;
6104
6105 memcpy (ptr, tmp, len);
6106 }
6107
6108 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6109
6110 memset (ptr + len, 0, memset_size);
6111
6112 salt.salt_len = len;
6113 }
6114
6115 //
6116 // some modes require special encoding
6117 //
6118
6119 uint out_buf_plain[256] = { 0 };
6120 uint out_buf_salt[256] = { 0 };
6121
6122 char tmp_buf[1024] = { 0 };
6123
6124 char *ptr_plain = (char *) out_buf_plain;
6125 char *ptr_salt = (char *) out_buf_salt;
6126
6127 if (hash_mode == 22)
6128 {
6129 char username[30] = { 0 };
6130
6131 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6132
6133 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6134
6135 u16 *ptr = (u16 *) digest_buf;
6136
6137 tmp_buf[ 0] = sig[0];
6138 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6139 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6140 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6141 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6142 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6143 tmp_buf[ 6] = sig[1];
6144 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6145 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6146 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6147 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6148 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6149 tmp_buf[12] = sig[2];
6150 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6151 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6152 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6153 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6154 tmp_buf[17] = sig[3];
6155 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6156 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6157 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6158 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6159 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6160 tmp_buf[23] = sig[4];
6161 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6162 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6163 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6164 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6165 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6166 tmp_buf[29] = sig[5];
6167
6168 snprintf (out_buf, len-1, "%s:%s",
6169 tmp_buf,
6170 username);
6171 }
6172 else if (hash_mode == 23)
6173 {
6174 // do not show the \nskyper\n part in output
6175
6176 char *salt_buf_ptr = (char *) salt.salt_buf;
6177
6178 salt_buf_ptr[salt.salt_len - 8] = 0;
6179
6180 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6181 digest_buf[0],
6182 digest_buf[1],
6183 digest_buf[2],
6184 digest_buf[3],
6185 salt_buf_ptr);
6186 }
6187 else if (hash_mode == 101)
6188 {
6189 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6190
6191 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6192 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6193 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6194 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6195 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6196
6197 memcpy (tmp_buf, digest_buf, 20);
6198
6199 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6200
6201 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6202 }
6203 else if (hash_mode == 111)
6204 {
6205 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6206
6207 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6208 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6209 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6210 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6211 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6212
6213 memcpy (tmp_buf, digest_buf, 20);
6214 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6215
6216 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6217
6218 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6219 }
6220 else if (hash_mode == 122)
6221 {
6222 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6223 (char *) salt.salt_buf,
6224 digest_buf[0],
6225 digest_buf[1],
6226 digest_buf[2],
6227 digest_buf[3],
6228 digest_buf[4]);
6229 }
6230 else if (hash_mode == 124)
6231 {
6232 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6233 (char *) salt.salt_buf,
6234 digest_buf[0],
6235 digest_buf[1],
6236 digest_buf[2],
6237 digest_buf[3],
6238 digest_buf[4]);
6239 }
6240 else if (hash_mode == 131)
6241 {
6242 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6243 (char *) salt.salt_buf,
6244 0, 0, 0, 0, 0,
6245 digest_buf[0],
6246 digest_buf[1],
6247 digest_buf[2],
6248 digest_buf[3],
6249 digest_buf[4]);
6250 }
6251 else if (hash_mode == 132)
6252 {
6253 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6254 (char *) salt.salt_buf,
6255 digest_buf[0],
6256 digest_buf[1],
6257 digest_buf[2],
6258 digest_buf[3],
6259 digest_buf[4]);
6260 }
6261 else if (hash_mode == 133)
6262 {
6263 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6264
6265 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6266 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6267 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6268 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6269 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6270
6271 memcpy (tmp_buf, digest_buf, 20);
6272
6273 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6274
6275 snprintf (out_buf, len-1, "%s", ptr_plain);
6276 }
6277 else if (hash_mode == 141)
6278 {
6279 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6280
6281 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6282
6283 memset (tmp_buf, 0, sizeof (tmp_buf));
6284
6285 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6286
6287 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6288 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6289 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6290 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6291 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6292
6293 memcpy (tmp_buf, digest_buf, 20);
6294
6295 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6296
6297 ptr_plain[27] = 0;
6298
6299 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6300 }
6301 else if (hash_mode == 400)
6302 {
6303 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6304
6305 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6306 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6307 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6308 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6309
6310 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6311
6312 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6313 }
6314 else if (hash_mode == 500)
6315 {
6316 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6317
6318 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6319 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6320 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6321 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6322
6323 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6324
6325 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6326 {
6327 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6328 }
6329 else
6330 {
6331 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6332 }
6333 }
6334 else if (hash_mode == 501)
6335 {
6336 uint digest_idx = salt.digests_offset + digest_pos;
6337
6338 hashinfo_t **hashinfo_ptr = data.hash_info;
6339 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6340
6341 snprintf (out_buf, len-1, "%s", hash_buf);
6342 }
6343 else if (hash_mode == 1421)
6344 {
6345 u8 *salt_ptr = (u8 *) salt.salt_buf;
6346
6347 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6348 salt_ptr[0],
6349 salt_ptr[1],
6350 salt_ptr[2],
6351 salt_ptr[3],
6352 salt_ptr[4],
6353 salt_ptr[5],
6354 digest_buf[0],
6355 digest_buf[1],
6356 digest_buf[2],
6357 digest_buf[3],
6358 digest_buf[4],
6359 digest_buf[5],
6360 digest_buf[6],
6361 digest_buf[7]);
6362 }
6363 else if (hash_mode == 1441)
6364 {
6365 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6366
6367 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6368
6369 memset (tmp_buf, 0, sizeof (tmp_buf));
6370
6371 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6372
6373 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6374 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6375 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6376 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6377 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6378 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6379 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6380 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6381
6382 memcpy (tmp_buf, digest_buf, 32);
6383
6384 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6385
6386 ptr_plain[43] = 0;
6387
6388 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6389 }
6390 else if (hash_mode == 1500)
6391 {
6392 out_buf[0] = salt.salt_sign[0] & 0xff;
6393 out_buf[1] = salt.salt_sign[1] & 0xff;
6394 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6395 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6396 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6397
6398 memset (tmp_buf, 0, sizeof (tmp_buf));
6399
6400 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6401
6402 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6403 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6404
6405 memcpy (tmp_buf, digest_buf, 8);
6406
6407 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6408
6409 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6410
6411 out_buf[13] = 0;
6412 }
6413 else if (hash_mode == 1600)
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 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6420 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6421
6422 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6423
6424 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6425 {
6426 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6427 }
6428 else
6429 {
6430 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6431 }
6432 }
6433 else if (hash_mode == 1711)
6434 {
6435 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6436
6437 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6438 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6439 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6440 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6441 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6442 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6443 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6444 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6445
6446 memcpy (tmp_buf, digest_buf, 64);
6447 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6448
6449 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6450
6451 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6452 }
6453 else if (hash_mode == 1722)
6454 {
6455 uint *ptr = digest_buf;
6456
6457 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6458 (unsigned char *) salt.salt_buf,
6459 ptr[ 1], ptr[ 0],
6460 ptr[ 3], ptr[ 2],
6461 ptr[ 5], ptr[ 4],
6462 ptr[ 7], ptr[ 6],
6463 ptr[ 9], ptr[ 8],
6464 ptr[11], ptr[10],
6465 ptr[13], ptr[12],
6466 ptr[15], ptr[14]);
6467 }
6468 else if (hash_mode == 1731)
6469 {
6470 uint *ptr = digest_buf;
6471
6472 snprintf (out_buf, len-1, "0x0200%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 == 1800)
6484 {
6485 // temp workaround
6486
6487 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6488 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6489 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6490 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6491 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6492 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6493 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6494 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6495
6496 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6497
6498 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6499 {
6500 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6501 }
6502 else
6503 {
6504 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6505 }
6506 }
6507 else if (hash_mode == 2100)
6508 {
6509 uint pos = 0;
6510
6511 snprintf (out_buf + pos, len-1, "%s%i#",
6512 SIGNATURE_DCC2,
6513 salt.salt_iter + 1);
6514
6515 uint signature_len = strlen (out_buf);
6516
6517 pos += signature_len;
6518 len -= signature_len;
6519
6520 char *salt_ptr = (char *) salt.salt_buf;
6521
6522 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6523
6524 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6525 byte_swap_32 (digest_buf[0]),
6526 byte_swap_32 (digest_buf[1]),
6527 byte_swap_32 (digest_buf[2]),
6528 byte_swap_32 (digest_buf[3]));
6529 }
6530 else if ((hash_mode == 2400) || (hash_mode == 2410))
6531 {
6532 memcpy (tmp_buf, digest_buf, 16);
6533
6534 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6535
6536 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6537 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6538 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6539 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6540
6541 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6542 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6543 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6544 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6545
6546 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6547 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6548 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6549 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6550
6551 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6552 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6553 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6554 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6555
6556 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6557 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6558 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6559 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6560
6561 out_buf[16] = 0;
6562 }
6563 else if (hash_mode == 2500)
6564 {
6565 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6566
6567 wpa_t *wpa = &wpas[salt_pos];
6568
6569 uint pke[25] = { 0 };
6570
6571 char *pke_ptr = (char *) pke;
6572
6573 for (uint i = 0; i < 25; i++)
6574 {
6575 pke[i] = byte_swap_32 (wpa->pke[i]);
6576 }
6577
6578 unsigned char mac1[6] = { 0 };
6579 unsigned char mac2[6] = { 0 };
6580
6581 memcpy (mac1, pke_ptr + 23, 6);
6582 memcpy (mac2, pke_ptr + 29, 6);
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 mac1[0],
6587 mac1[1],
6588 mac1[2],
6589 mac1[3],
6590 mac1[4],
6591 mac1[5],
6592 mac2[0],
6593 mac2[1],
6594 mac2[2],
6595 mac2[3],
6596 mac2[4],
6597 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 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7227
7228 digest_buf_c[32] = 0;
7229
7230 // domain
7231
7232 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7233
7234 char domain_buf_c[33] = { 0 };
7235
7236 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7237
7238 for (uint i = 0; i < salt_pc_len; i++)
7239 {
7240 const char next = domain_buf_c[i];
7241
7242 domain_buf_c[i] = '.';
7243
7244 i += next;
7245 }
7246
7247 domain_buf_c[salt_pc_len] = 0;
7248
7249 // final
7250
7251 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7252 }
7253 else if (hash_mode == 8500)
7254 {
7255 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7256 }
7257 else if (hash_mode == 2612)
7258 {
7259 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7260 SIGNATURE_PHPS,
7261 (char *) salt.salt_buf,
7262 digest_buf[0],
7263 digest_buf[1],
7264 digest_buf[2],
7265 digest_buf[3]);
7266 }
7267 else if (hash_mode == 3711)
7268 {
7269 char *salt_ptr = (char *) salt.salt_buf;
7270
7271 salt_ptr[salt.salt_len - 1] = 0;
7272
7273 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7274 SIGNATURE_MEDIAWIKI_B,
7275 salt_ptr,
7276 digest_buf[0],
7277 digest_buf[1],
7278 digest_buf[2],
7279 digest_buf[3]);
7280 }
7281 else if (hash_mode == 8800)
7282 {
7283 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7284
7285 androidfde_t *androidfde = &androidfdes[salt_pos];
7286
7287 char tmp[3073] = { 0 };
7288
7289 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7290 {
7291 sprintf (tmp + j, "%08x", androidfde->data[i]);
7292 }
7293
7294 tmp[3072] = 0;
7295
7296 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7297 SIGNATURE_ANDROIDFDE,
7298 byte_swap_32 (salt.salt_buf[0]),
7299 byte_swap_32 (salt.salt_buf[1]),
7300 byte_swap_32 (salt.salt_buf[2]),
7301 byte_swap_32 (salt.salt_buf[3]),
7302 byte_swap_32 (digest_buf[0]),
7303 byte_swap_32 (digest_buf[1]),
7304 byte_swap_32 (digest_buf[2]),
7305 byte_swap_32 (digest_buf[3]),
7306 tmp);
7307 }
7308 else if (hash_mode == 8900)
7309 {
7310 uint N = salt.scrypt_N;
7311 uint r = salt.scrypt_r;
7312 uint p = salt.scrypt_p;
7313
7314 char base64_salt[32] = { 0 };
7315
7316 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7317
7318 memset (tmp_buf, 0, 46);
7319
7320 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7321 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7322 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7323 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7324 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7325 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7326 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7327 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7328 digest_buf[8] = 0; // needed for base64_encode ()
7329
7330 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7331
7332 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7333 SIGNATURE_SCRYPT,
7334 N,
7335 r,
7336 p,
7337 base64_salt,
7338 tmp_buf);
7339 }
7340 else if (hash_mode == 9000)
7341 {
7342 snprintf (out_buf, len-1, "%s", hashfile);
7343 }
7344 else if (hash_mode == 9200)
7345 {
7346 // salt
7347
7348 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7349
7350 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7351
7352 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7353
7354 // hash
7355
7356 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7357 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7358 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7359 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7360 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7361 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7362 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7363 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7364 digest_buf[8] = 0; // needed for base64_encode ()
7365
7366 char tmp_buf[64] = { 0 };
7367
7368 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7369 tmp_buf[43] = 0; // cut it here
7370
7371 // output
7372
7373 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7374 }
7375 else if (hash_mode == 9300)
7376 {
7377 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7378 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7379 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7380 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7381 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7382 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7383 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7384 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7385 digest_buf[8] = 0; // needed for base64_encode ()
7386
7387 char tmp_buf[64] = { 0 };
7388
7389 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7390 tmp_buf[43] = 0; // cut it here
7391
7392 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7393
7394 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7395 }
7396 else if (hash_mode == 9400)
7397 {
7398 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7399
7400 office2007_t *office2007 = &office2007s[salt_pos];
7401
7402 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7403 SIGNATURE_OFFICE2007,
7404 2007,
7405 20,
7406 office2007->keySize,
7407 16,
7408 salt.salt_buf[0],
7409 salt.salt_buf[1],
7410 salt.salt_buf[2],
7411 salt.salt_buf[3],
7412 office2007->encryptedVerifier[0],
7413 office2007->encryptedVerifier[1],
7414 office2007->encryptedVerifier[2],
7415 office2007->encryptedVerifier[3],
7416 office2007->encryptedVerifierHash[0],
7417 office2007->encryptedVerifierHash[1],
7418 office2007->encryptedVerifierHash[2],
7419 office2007->encryptedVerifierHash[3],
7420 office2007->encryptedVerifierHash[4]);
7421 }
7422 else if (hash_mode == 9500)
7423 {
7424 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7425
7426 office2010_t *office2010 = &office2010s[salt_pos];
7427
7428 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,
7429
7430 salt.salt_buf[0],
7431 salt.salt_buf[1],
7432 salt.salt_buf[2],
7433 salt.salt_buf[3],
7434 office2010->encryptedVerifier[0],
7435 office2010->encryptedVerifier[1],
7436 office2010->encryptedVerifier[2],
7437 office2010->encryptedVerifier[3],
7438 office2010->encryptedVerifierHash[0],
7439 office2010->encryptedVerifierHash[1],
7440 office2010->encryptedVerifierHash[2],
7441 office2010->encryptedVerifierHash[3],
7442 office2010->encryptedVerifierHash[4],
7443 office2010->encryptedVerifierHash[5],
7444 office2010->encryptedVerifierHash[6],
7445 office2010->encryptedVerifierHash[7]);
7446 }
7447 else if (hash_mode == 9600)
7448 {
7449 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7450
7451 office2013_t *office2013 = &office2013s[salt_pos];
7452
7453 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,
7454
7455 salt.salt_buf[0],
7456 salt.salt_buf[1],
7457 salt.salt_buf[2],
7458 salt.salt_buf[3],
7459 office2013->encryptedVerifier[0],
7460 office2013->encryptedVerifier[1],
7461 office2013->encryptedVerifier[2],
7462 office2013->encryptedVerifier[3],
7463 office2013->encryptedVerifierHash[0],
7464 office2013->encryptedVerifierHash[1],
7465 office2013->encryptedVerifierHash[2],
7466 office2013->encryptedVerifierHash[3],
7467 office2013->encryptedVerifierHash[4],
7468 office2013->encryptedVerifierHash[5],
7469 office2013->encryptedVerifierHash[6],
7470 office2013->encryptedVerifierHash[7]);
7471 }
7472 else if (hash_mode == 9700)
7473 {
7474 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7475
7476 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7477
7478 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7479 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7480 byte_swap_32 (salt.salt_buf[0]),
7481 byte_swap_32 (salt.salt_buf[1]),
7482 byte_swap_32 (salt.salt_buf[2]),
7483 byte_swap_32 (salt.salt_buf[3]),
7484 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7485 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7486 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7487 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7488 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7489 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7490 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7491 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7492 }
7493 else if (hash_mode == 9710)
7494 {
7495 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7496
7497 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7498
7499 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7500 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7501 byte_swap_32 (salt.salt_buf[0]),
7502 byte_swap_32 (salt.salt_buf[1]),
7503 byte_swap_32 (salt.salt_buf[2]),
7504 byte_swap_32 (salt.salt_buf[3]),
7505 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7506 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7507 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7508 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7509 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7510 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7511 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7512 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7513 }
7514 else if (hash_mode == 9720)
7515 {
7516 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7517
7518 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7519
7520 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7521
7522 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7523 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7524 byte_swap_32 (salt.salt_buf[0]),
7525 byte_swap_32 (salt.salt_buf[1]),
7526 byte_swap_32 (salt.salt_buf[2]),
7527 byte_swap_32 (salt.salt_buf[3]),
7528 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7529 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7530 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7531 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7532 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7533 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7534 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7535 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7536 rc4key[0],
7537 rc4key[1],
7538 rc4key[2],
7539 rc4key[3],
7540 rc4key[4]);
7541 }
7542 else if (hash_mode == 9800)
7543 {
7544 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7545
7546 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7547
7548 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7549 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7550 salt.salt_buf[0],
7551 salt.salt_buf[1],
7552 salt.salt_buf[2],
7553 salt.salt_buf[3],
7554 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7555 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7556 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7557 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7558 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7559 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7560 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7561 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7562 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7563 }
7564 else if (hash_mode == 9810)
7565 {
7566 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7567
7568 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7569
7570 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7571 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7572 salt.salt_buf[0],
7573 salt.salt_buf[1],
7574 salt.salt_buf[2],
7575 salt.salt_buf[3],
7576 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7577 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7578 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7579 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7580 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7581 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7582 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7583 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7584 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7585 }
7586 else if (hash_mode == 9820)
7587 {
7588 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7589
7590 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7591
7592 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7593
7594 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7595 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7596 salt.salt_buf[0],
7597 salt.salt_buf[1],
7598 salt.salt_buf[2],
7599 salt.salt_buf[3],
7600 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7601 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7602 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7603 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7604 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7605 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7606 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7607 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7608 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7609 rc4key[0],
7610 rc4key[1],
7611 rc4key[2],
7612 rc4key[3],
7613 rc4key[4]);
7614 }
7615 else if (hash_mode == 10000)
7616 {
7617 // salt
7618
7619 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7620
7621 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7622
7623 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7624
7625 // hash
7626
7627 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7628 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7629 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7630 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7631 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7632 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7633 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7634 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7635 digest_buf[8] = 0; // needed for base64_encode ()
7636
7637 char tmp_buf[64] = { 0 };
7638
7639 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7640
7641 // output
7642
7643 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7644 }
7645 else if (hash_mode == 10100)
7646 {
7647 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7648 digest_buf[0],
7649 digest_buf[1],
7650 2,
7651 4,
7652 byte_swap_32 (salt.salt_buf[0]),
7653 byte_swap_32 (salt.salt_buf[1]),
7654 byte_swap_32 (salt.salt_buf[2]),
7655 byte_swap_32 (salt.salt_buf[3]));
7656 }
7657 else if (hash_mode == 10200)
7658 {
7659 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7660
7661 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7662
7663 // challenge
7664
7665 char challenge[100] = { 0 };
7666
7667 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7668
7669 // response
7670
7671 char tmp_buf[100] = { 0 };
7672
7673 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7674 (char *) cram_md5->user,
7675 digest_buf[0],
7676 digest_buf[1],
7677 digest_buf[2],
7678 digest_buf[3]);
7679
7680 char response[100] = { 0 };
7681
7682 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7683
7684 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7685 }
7686 else if (hash_mode == 10300)
7687 {
7688 char tmp_buf[100] = { 0 };
7689
7690 memcpy (tmp_buf + 0, digest_buf, 20);
7691 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7692
7693 uint tmp_len = 20 + salt.salt_len;
7694
7695 // base64 encode it
7696
7697 char base64_encoded[100] = { 0 };
7698
7699 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7700
7701 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7702 }
7703 else if (hash_mode == 10400)
7704 {
7705 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7706
7707 pdf_t *pdf = &pdfs[salt_pos];
7708
7709 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",
7710
7711 pdf->V,
7712 pdf->R,
7713 40,
7714 pdf->P,
7715 pdf->enc_md,
7716 pdf->id_len,
7717 byte_swap_32 (pdf->id_buf[0]),
7718 byte_swap_32 (pdf->id_buf[1]),
7719 byte_swap_32 (pdf->id_buf[2]),
7720 byte_swap_32 (pdf->id_buf[3]),
7721 pdf->u_len,
7722 byte_swap_32 (pdf->u_buf[0]),
7723 byte_swap_32 (pdf->u_buf[1]),
7724 byte_swap_32 (pdf->u_buf[2]),
7725 byte_swap_32 (pdf->u_buf[3]),
7726 byte_swap_32 (pdf->u_buf[4]),
7727 byte_swap_32 (pdf->u_buf[5]),
7728 byte_swap_32 (pdf->u_buf[6]),
7729 byte_swap_32 (pdf->u_buf[7]),
7730 pdf->o_len,
7731 byte_swap_32 (pdf->o_buf[0]),
7732 byte_swap_32 (pdf->o_buf[1]),
7733 byte_swap_32 (pdf->o_buf[2]),
7734 byte_swap_32 (pdf->o_buf[3]),
7735 byte_swap_32 (pdf->o_buf[4]),
7736 byte_swap_32 (pdf->o_buf[5]),
7737 byte_swap_32 (pdf->o_buf[6]),
7738 byte_swap_32 (pdf->o_buf[7])
7739 );
7740 }
7741 else if (hash_mode == 10410)
7742 {
7743 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7744
7745 pdf_t *pdf = &pdfs[salt_pos];
7746
7747 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",
7748
7749 pdf->V,
7750 pdf->R,
7751 40,
7752 pdf->P,
7753 pdf->enc_md,
7754 pdf->id_len,
7755 byte_swap_32 (pdf->id_buf[0]),
7756 byte_swap_32 (pdf->id_buf[1]),
7757 byte_swap_32 (pdf->id_buf[2]),
7758 byte_swap_32 (pdf->id_buf[3]),
7759 pdf->u_len,
7760 byte_swap_32 (pdf->u_buf[0]),
7761 byte_swap_32 (pdf->u_buf[1]),
7762 byte_swap_32 (pdf->u_buf[2]),
7763 byte_swap_32 (pdf->u_buf[3]),
7764 byte_swap_32 (pdf->u_buf[4]),
7765 byte_swap_32 (pdf->u_buf[5]),
7766 byte_swap_32 (pdf->u_buf[6]),
7767 byte_swap_32 (pdf->u_buf[7]),
7768 pdf->o_len,
7769 byte_swap_32 (pdf->o_buf[0]),
7770 byte_swap_32 (pdf->o_buf[1]),
7771 byte_swap_32 (pdf->o_buf[2]),
7772 byte_swap_32 (pdf->o_buf[3]),
7773 byte_swap_32 (pdf->o_buf[4]),
7774 byte_swap_32 (pdf->o_buf[5]),
7775 byte_swap_32 (pdf->o_buf[6]),
7776 byte_swap_32 (pdf->o_buf[7])
7777 );
7778 }
7779 else if (hash_mode == 10420)
7780 {
7781 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7782
7783 pdf_t *pdf = &pdfs[salt_pos];
7784
7785 u8 *rc4key = (u8 *) pdf->rc4key;
7786
7787 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",
7788
7789 pdf->V,
7790 pdf->R,
7791 40,
7792 pdf->P,
7793 pdf->enc_md,
7794 pdf->id_len,
7795 byte_swap_32 (pdf->id_buf[0]),
7796 byte_swap_32 (pdf->id_buf[1]),
7797 byte_swap_32 (pdf->id_buf[2]),
7798 byte_swap_32 (pdf->id_buf[3]),
7799 pdf->u_len,
7800 byte_swap_32 (pdf->u_buf[0]),
7801 byte_swap_32 (pdf->u_buf[1]),
7802 byte_swap_32 (pdf->u_buf[2]),
7803 byte_swap_32 (pdf->u_buf[3]),
7804 byte_swap_32 (pdf->u_buf[4]),
7805 byte_swap_32 (pdf->u_buf[5]),
7806 byte_swap_32 (pdf->u_buf[6]),
7807 byte_swap_32 (pdf->u_buf[7]),
7808 pdf->o_len,
7809 byte_swap_32 (pdf->o_buf[0]),
7810 byte_swap_32 (pdf->o_buf[1]),
7811 byte_swap_32 (pdf->o_buf[2]),
7812 byte_swap_32 (pdf->o_buf[3]),
7813 byte_swap_32 (pdf->o_buf[4]),
7814 byte_swap_32 (pdf->o_buf[5]),
7815 byte_swap_32 (pdf->o_buf[6]),
7816 byte_swap_32 (pdf->o_buf[7]),
7817 rc4key[0],
7818 rc4key[1],
7819 rc4key[2],
7820 rc4key[3],
7821 rc4key[4]
7822 );
7823 }
7824 else if (hash_mode == 10500)
7825 {
7826 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7827
7828 pdf_t *pdf = &pdfs[salt_pos];
7829
7830 if (pdf->id_len == 32)
7831 {
7832 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",
7833
7834 pdf->V,
7835 pdf->R,
7836 128,
7837 pdf->P,
7838 pdf->enc_md,
7839 pdf->id_len,
7840 byte_swap_32 (pdf->id_buf[0]),
7841 byte_swap_32 (pdf->id_buf[1]),
7842 byte_swap_32 (pdf->id_buf[2]),
7843 byte_swap_32 (pdf->id_buf[3]),
7844 byte_swap_32 (pdf->id_buf[4]),
7845 byte_swap_32 (pdf->id_buf[5]),
7846 byte_swap_32 (pdf->id_buf[6]),
7847 byte_swap_32 (pdf->id_buf[7]),
7848 pdf->u_len,
7849 byte_swap_32 (pdf->u_buf[0]),
7850 byte_swap_32 (pdf->u_buf[1]),
7851 byte_swap_32 (pdf->u_buf[2]),
7852 byte_swap_32 (pdf->u_buf[3]),
7853 byte_swap_32 (pdf->u_buf[4]),
7854 byte_swap_32 (pdf->u_buf[5]),
7855 byte_swap_32 (pdf->u_buf[6]),
7856 byte_swap_32 (pdf->u_buf[7]),
7857 pdf->o_len,
7858 byte_swap_32 (pdf->o_buf[0]),
7859 byte_swap_32 (pdf->o_buf[1]),
7860 byte_swap_32 (pdf->o_buf[2]),
7861 byte_swap_32 (pdf->o_buf[3]),
7862 byte_swap_32 (pdf->o_buf[4]),
7863 byte_swap_32 (pdf->o_buf[5]),
7864 byte_swap_32 (pdf->o_buf[6]),
7865 byte_swap_32 (pdf->o_buf[7])
7866 );
7867 }
7868 else
7869 {
7870 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",
7871
7872 pdf->V,
7873 pdf->R,
7874 128,
7875 pdf->P,
7876 pdf->enc_md,
7877 pdf->id_len,
7878 byte_swap_32 (pdf->id_buf[0]),
7879 byte_swap_32 (pdf->id_buf[1]),
7880 byte_swap_32 (pdf->id_buf[2]),
7881 byte_swap_32 (pdf->id_buf[3]),
7882 pdf->u_len,
7883 byte_swap_32 (pdf->u_buf[0]),
7884 byte_swap_32 (pdf->u_buf[1]),
7885 byte_swap_32 (pdf->u_buf[2]),
7886 byte_swap_32 (pdf->u_buf[3]),
7887 byte_swap_32 (pdf->u_buf[4]),
7888 byte_swap_32 (pdf->u_buf[5]),
7889 byte_swap_32 (pdf->u_buf[6]),
7890 byte_swap_32 (pdf->u_buf[7]),
7891 pdf->o_len,
7892 byte_swap_32 (pdf->o_buf[0]),
7893 byte_swap_32 (pdf->o_buf[1]),
7894 byte_swap_32 (pdf->o_buf[2]),
7895 byte_swap_32 (pdf->o_buf[3]),
7896 byte_swap_32 (pdf->o_buf[4]),
7897 byte_swap_32 (pdf->o_buf[5]),
7898 byte_swap_32 (pdf->o_buf[6]),
7899 byte_swap_32 (pdf->o_buf[7])
7900 );
7901 }
7902 }
7903 else if (hash_mode == 10600)
7904 {
7905 uint digest_idx = salt.digests_offset + digest_pos;
7906
7907 hashinfo_t **hashinfo_ptr = data.hash_info;
7908 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7909
7910 snprintf (out_buf, len-1, "%s", hash_buf);
7911 }
7912 else if (hash_mode == 10700)
7913 {
7914 uint digest_idx = salt.digests_offset + digest_pos;
7915
7916 hashinfo_t **hashinfo_ptr = data.hash_info;
7917 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7918
7919 snprintf (out_buf, len-1, "%s", hash_buf);
7920 }
7921 else if (hash_mode == 10900)
7922 {
7923 uint digest_idx = salt.digests_offset + digest_pos;
7924
7925 hashinfo_t **hashinfo_ptr = data.hash_info;
7926 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7927
7928 snprintf (out_buf, len-1, "%s", hash_buf);
7929 }
7930 else if (hash_mode == 11100)
7931 {
7932 u32 salt_challenge = salt.salt_buf[0];
7933
7934 salt_challenge = byte_swap_32 (salt_challenge);
7935
7936 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7937
7938 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7939 SIGNATURE_POSTGRESQL_AUTH,
7940 user_name,
7941 salt_challenge,
7942 digest_buf[0],
7943 digest_buf[1],
7944 digest_buf[2],
7945 digest_buf[3]);
7946 }
7947 else if (hash_mode == 11200)
7948 {
7949 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7950 SIGNATURE_MYSQL_AUTH,
7951 (unsigned char *) salt.salt_buf,
7952 digest_buf[0],
7953 digest_buf[1],
7954 digest_buf[2],
7955 digest_buf[3],
7956 digest_buf[4]);
7957 }
7958 else if (hash_mode == 11300)
7959 {
7960 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7961
7962 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7963
7964 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7965 const uint ckey_len = bitcoin_wallet->ckey_len;
7966 const uint public_key_len = bitcoin_wallet->public_key_len;
7967
7968 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7969 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7970 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7971
7972 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7973 {
7974 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
7975
7976 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7977 }
7978
7979 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7980 {
7981 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
7982
7983 sprintf (ckey_buf + j, "%02x", ptr[i]);
7984 }
7985
7986 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7987 {
7988 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
7989
7990 sprintf (public_key_buf + j, "%02x", ptr[i]);
7991 }
7992
7993 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
7994 SIGNATURE_BITCOIN_WALLET,
7995 cry_master_len * 2,
7996 cry_master_buf,
7997 salt.salt_len,
7998 (unsigned char *) salt.salt_buf,
7999 salt.salt_iter + 1,
8000 ckey_len * 2,
8001 ckey_buf,
8002 public_key_len * 2,
8003 public_key_buf
8004 );
8005
8006 free (cry_master_buf);
8007 free (ckey_buf);
8008 free (public_key_buf);
8009 }
8010 else if (hash_mode == 11400)
8011 {
8012 uint digest_idx = salt.digests_offset + digest_pos;
8013
8014 hashinfo_t **hashinfo_ptr = data.hash_info;
8015 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8016
8017 snprintf (out_buf, len-1, "%s", hash_buf);
8018 }
8019 else if (hash_mode == 11600)
8020 {
8021 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
8022
8023 seven_zip_t *seven_zip = &seven_zips[salt_pos];
8024
8025 const uint data_len = seven_zip->data_len;
8026
8027 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
8028
8029 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8030 {
8031 const u8 *ptr = (const u8 *) seven_zip->data_buf;
8032
8033 sprintf (data_buf + j, "%02x", ptr[i]);
8034 }
8035
8036 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
8037 SIGNATURE_SEVEN_ZIP,
8038 0,
8039 salt.salt_sign[0],
8040 0,
8041 (char *) seven_zip->salt_buf,
8042 seven_zip->iv_len,
8043 seven_zip->iv_buf[0],
8044 seven_zip->iv_buf[1],
8045 seven_zip->iv_buf[2],
8046 seven_zip->iv_buf[3],
8047 seven_zip->crc,
8048 seven_zip->data_len,
8049 seven_zip->unpack_size,
8050 data_buf);
8051
8052 free (data_buf);
8053 }
8054 else if (hash_mode == 11700)
8055 {
8056 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8057 digest_buf[0],
8058 digest_buf[1],
8059 digest_buf[2],
8060 digest_buf[3],
8061 digest_buf[4],
8062 digest_buf[5],
8063 digest_buf[6],
8064 digest_buf[7]);
8065 }
8066 else if (hash_mode == 11800)
8067 {
8068 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8069 digest_buf[ 0],
8070 digest_buf[ 1],
8071 digest_buf[ 2],
8072 digest_buf[ 3],
8073 digest_buf[ 4],
8074 digest_buf[ 5],
8075 digest_buf[ 6],
8076 digest_buf[ 7],
8077 digest_buf[ 8],
8078 digest_buf[ 9],
8079 digest_buf[10],
8080 digest_buf[11],
8081 digest_buf[12],
8082 digest_buf[13],
8083 digest_buf[14],
8084 digest_buf[15]);
8085 }
8086 else if (hash_mode == 11900)
8087 {
8088 uint digest_idx = salt.digests_offset + digest_pos;
8089
8090 hashinfo_t **hashinfo_ptr = data.hash_info;
8091 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8092
8093 snprintf (out_buf, len-1, "%s", hash_buf);
8094 }
8095 else if (hash_mode == 12000)
8096 {
8097 uint digest_idx = salt.digests_offset + digest_pos;
8098
8099 hashinfo_t **hashinfo_ptr = data.hash_info;
8100 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8101
8102 snprintf (out_buf, len-1, "%s", hash_buf);
8103 }
8104 else if (hash_mode == 12100)
8105 {
8106 uint digest_idx = salt.digests_offset + digest_pos;
8107
8108 hashinfo_t **hashinfo_ptr = data.hash_info;
8109 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8110
8111 snprintf (out_buf, len-1, "%s", hash_buf);
8112 }
8113 else if (hash_mode == 12200)
8114 {
8115 uint *ptr_digest = digest_buf;
8116 uint *ptr_salt = salt.salt_buf;
8117
8118 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8119 SIGNATURE_ECRYPTFS,
8120 ptr_salt[0],
8121 ptr_salt[1],
8122 ptr_digest[0],
8123 ptr_digest[1]);
8124 }
8125 else if (hash_mode == 12300)
8126 {
8127 uint *ptr_digest = digest_buf;
8128 uint *ptr_salt = salt.salt_buf;
8129
8130 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",
8131 ptr_digest[ 0], ptr_digest[ 1],
8132 ptr_digest[ 2], ptr_digest[ 3],
8133 ptr_digest[ 4], ptr_digest[ 5],
8134 ptr_digest[ 6], ptr_digest[ 7],
8135 ptr_digest[ 8], ptr_digest[ 9],
8136 ptr_digest[10], ptr_digest[11],
8137 ptr_digest[12], ptr_digest[13],
8138 ptr_digest[14], ptr_digest[15],
8139 ptr_salt[0],
8140 ptr_salt[1],
8141 ptr_salt[2],
8142 ptr_salt[3]);
8143 }
8144 else if (hash_mode == 12400)
8145 {
8146 // encode iteration count
8147
8148 char salt_iter[5] = { 0 };
8149
8150 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8151 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8152 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8153 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8154 salt_iter[4] = 0;
8155
8156 // encode salt
8157
8158 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8159 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8160 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8161 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8162 ptr_salt[4] = 0;
8163
8164 // encode digest
8165
8166 memset (tmp_buf, 0, sizeof (tmp_buf));
8167
8168 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8169 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8170
8171 memcpy (tmp_buf, digest_buf, 8);
8172
8173 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8174
8175 ptr_plain[11] = 0;
8176
8177 // fill the resulting buffer
8178
8179 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8180 }
8181 else if (hash_mode == 12500)
8182 {
8183 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8184 SIGNATURE_RAR3,
8185 byte_swap_32 (salt.salt_buf[0]),
8186 byte_swap_32 (salt.salt_buf[1]),
8187 salt.salt_buf[2],
8188 salt.salt_buf[3],
8189 salt.salt_buf[4],
8190 salt.salt_buf[5]);
8191 }
8192 else if (hash_mode == 12600)
8193 {
8194 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8195 digest_buf[0] + salt.salt_buf_pc[0],
8196 digest_buf[1] + salt.salt_buf_pc[1],
8197 digest_buf[2] + salt.salt_buf_pc[2],
8198 digest_buf[3] + salt.salt_buf_pc[3],
8199 digest_buf[4] + salt.salt_buf_pc[4],
8200 digest_buf[5] + salt.salt_buf_pc[5],
8201 digest_buf[6] + salt.salt_buf_pc[6],
8202 digest_buf[7] + salt.salt_buf_pc[7]);
8203 }
8204 else if (hash_mode == 12700)
8205 {
8206 uint digest_idx = salt.digests_offset + digest_pos;
8207
8208 hashinfo_t **hashinfo_ptr = data.hash_info;
8209 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8210
8211 snprintf (out_buf, len-1, "%s", hash_buf);
8212 }
8213 else if (hash_mode == 12800)
8214 {
8215 const u8 *ptr = (const u8 *) salt.salt_buf;
8216
8217 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",
8218 SIGNATURE_MS_DRSR,
8219 ptr[0],
8220 ptr[1],
8221 ptr[2],
8222 ptr[3],
8223 ptr[4],
8224 ptr[5],
8225 ptr[6],
8226 ptr[7],
8227 ptr[8],
8228 ptr[9],
8229 salt.salt_iter + 1,
8230 byte_swap_32 (digest_buf[0]),
8231 byte_swap_32 (digest_buf[1]),
8232 byte_swap_32 (digest_buf[2]),
8233 byte_swap_32 (digest_buf[3]),
8234 byte_swap_32 (digest_buf[4]),
8235 byte_swap_32 (digest_buf[5]),
8236 byte_swap_32 (digest_buf[6]),
8237 byte_swap_32 (digest_buf[7])
8238 );
8239 }
8240 else if (hash_mode == 12900)
8241 {
8242 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",
8243 salt.salt_buf[ 4],
8244 salt.salt_buf[ 5],
8245 salt.salt_buf[ 6],
8246 salt.salt_buf[ 7],
8247 salt.salt_buf[ 8],
8248 salt.salt_buf[ 9],
8249 salt.salt_buf[10],
8250 salt.salt_buf[11],
8251 byte_swap_32 (digest_buf[0]),
8252 byte_swap_32 (digest_buf[1]),
8253 byte_swap_32 (digest_buf[2]),
8254 byte_swap_32 (digest_buf[3]),
8255 byte_swap_32 (digest_buf[4]),
8256 byte_swap_32 (digest_buf[5]),
8257 byte_swap_32 (digest_buf[6]),
8258 byte_swap_32 (digest_buf[7]),
8259 salt.salt_buf[ 0],
8260 salt.salt_buf[ 1],
8261 salt.salt_buf[ 2],
8262 salt.salt_buf[ 3]
8263 );
8264 }
8265 else if (hash_mode == 13000)
8266 {
8267 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8268
8269 rar5_t *rar5 = &rar5s[salt_pos];
8270
8271 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8272 salt.salt_buf[0],
8273 salt.salt_buf[1],
8274 salt.salt_buf[2],
8275 salt.salt_buf[3],
8276 salt.salt_sign[0],
8277 rar5->iv[0],
8278 rar5->iv[1],
8279 rar5->iv[2],
8280 rar5->iv[3],
8281 byte_swap_32 (digest_buf[0]),
8282 byte_swap_32 (digest_buf[1])
8283 );
8284 }
8285 else
8286 {
8287 if (hash_type == HASH_TYPE_MD4)
8288 {
8289 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8290 digest_buf[0],
8291 digest_buf[1],
8292 digest_buf[2],
8293 digest_buf[3]);
8294 }
8295 else if (hash_type == HASH_TYPE_MD5)
8296 {
8297 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8298 digest_buf[0],
8299 digest_buf[1],
8300 digest_buf[2],
8301 digest_buf[3]);
8302 }
8303 else if (hash_type == HASH_TYPE_SHA1)
8304 {
8305 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8306 digest_buf[0],
8307 digest_buf[1],
8308 digest_buf[2],
8309 digest_buf[3],
8310 digest_buf[4]);
8311 }
8312 else if (hash_type == HASH_TYPE_SHA256)
8313 {
8314 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8315 digest_buf[0],
8316 digest_buf[1],
8317 digest_buf[2],
8318 digest_buf[3],
8319 digest_buf[4],
8320 digest_buf[5],
8321 digest_buf[6],
8322 digest_buf[7]);
8323 }
8324 else if (hash_type == HASH_TYPE_SHA384)
8325 {
8326 uint *ptr = digest_buf;
8327
8328 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8329 ptr[ 1], ptr[ 0],
8330 ptr[ 3], ptr[ 2],
8331 ptr[ 5], ptr[ 4],
8332 ptr[ 7], ptr[ 6],
8333 ptr[ 9], ptr[ 8],
8334 ptr[11], ptr[10]);
8335 }
8336 else if (hash_type == HASH_TYPE_SHA512)
8337 {
8338 uint *ptr = digest_buf;
8339
8340 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8341 ptr[ 1], ptr[ 0],
8342 ptr[ 3], ptr[ 2],
8343 ptr[ 5], ptr[ 4],
8344 ptr[ 7], ptr[ 6],
8345 ptr[ 9], ptr[ 8],
8346 ptr[11], ptr[10],
8347 ptr[13], ptr[12],
8348 ptr[15], ptr[14]);
8349 }
8350 else if (hash_type == HASH_TYPE_LM)
8351 {
8352 snprintf (out_buf, len-1, "%08x%08x",
8353 digest_buf[0],
8354 digest_buf[1]);
8355 }
8356 else if (hash_type == HASH_TYPE_ORACLEH)
8357 {
8358 snprintf (out_buf, len-1, "%08X%08X",
8359 digest_buf[0],
8360 digest_buf[1]);
8361 }
8362 else if (hash_type == HASH_TYPE_BCRYPT)
8363 {
8364 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8365 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8366
8367 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8368
8369 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8370 }
8371 else if (hash_type == HASH_TYPE_KECCAK)
8372 {
8373 uint *ptr = digest_buf;
8374
8375 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",
8376 ptr[ 1], ptr[ 0],
8377 ptr[ 3], ptr[ 2],
8378 ptr[ 5], ptr[ 4],
8379 ptr[ 7], ptr[ 6],
8380 ptr[ 9], ptr[ 8],
8381 ptr[11], ptr[10],
8382 ptr[13], ptr[12],
8383 ptr[15], ptr[14],
8384 ptr[17], ptr[16],
8385 ptr[19], ptr[18],
8386 ptr[21], ptr[20],
8387 ptr[23], ptr[22],
8388 ptr[25], ptr[24],
8389 ptr[27], ptr[26],
8390 ptr[29], ptr[28],
8391 ptr[31], ptr[30],
8392 ptr[33], ptr[32],
8393 ptr[35], ptr[34],
8394 ptr[37], ptr[36],
8395 ptr[39], ptr[38],
8396 ptr[41], ptr[30],
8397 ptr[43], ptr[42],
8398 ptr[45], ptr[44],
8399 ptr[47], ptr[46],
8400 ptr[49], ptr[48]
8401 );
8402
8403 out_buf[salt.keccak_mdlen * 2] = 0;
8404 }
8405 else if (hash_type == HASH_TYPE_RIPEMD160)
8406 {
8407 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8408 digest_buf[0],
8409 digest_buf[1],
8410 digest_buf[2],
8411 digest_buf[3],
8412 digest_buf[4]);
8413 }
8414 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8415 {
8416 digest_buf[ 0] = digest_buf[ 0];
8417 digest_buf[ 1] = digest_buf[ 1];
8418 digest_buf[ 2] = digest_buf[ 2];
8419 digest_buf[ 3] = digest_buf[ 3];
8420 digest_buf[ 4] = digest_buf[ 4];
8421 digest_buf[ 5] = digest_buf[ 5];
8422 digest_buf[ 6] = digest_buf[ 6];
8423 digest_buf[ 7] = digest_buf[ 7];
8424 digest_buf[ 8] = digest_buf[ 8];
8425 digest_buf[ 9] = digest_buf[ 9];
8426 digest_buf[10] = digest_buf[10];
8427 digest_buf[11] = digest_buf[11];
8428 digest_buf[12] = digest_buf[12];
8429 digest_buf[13] = digest_buf[13];
8430 digest_buf[14] = digest_buf[14];
8431 digest_buf[15] = digest_buf[15];
8432
8433 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8434 digest_buf[ 0],
8435 digest_buf[ 1],
8436 digest_buf[ 2],
8437 digest_buf[ 3],
8438 digest_buf[ 4],
8439 digest_buf[ 5],
8440 digest_buf[ 6],
8441 digest_buf[ 7],
8442 digest_buf[ 8],
8443 digest_buf[ 9],
8444 digest_buf[10],
8445 digest_buf[11],
8446 digest_buf[12],
8447 digest_buf[13],
8448 digest_buf[14],
8449 digest_buf[15]);
8450 }
8451 else if (hash_type == HASH_TYPE_GOST)
8452 {
8453 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8454 digest_buf[0],
8455 digest_buf[1],
8456 digest_buf[2],
8457 digest_buf[3],
8458 digest_buf[4],
8459 digest_buf[5],
8460 digest_buf[6],
8461 digest_buf[7]);
8462 }
8463 else if (hash_type == HASH_TYPE_MYSQL)
8464 {
8465 snprintf (out_buf, len-1, "%08x%08x",
8466 digest_buf[0],
8467 digest_buf[1]);
8468 }
8469 else if (hash_type == HASH_TYPE_LOTUS5)
8470 {
8471 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8472 digest_buf[0],
8473 digest_buf[1],
8474 digest_buf[2],
8475 digest_buf[3]);
8476 }
8477 else if (hash_type == HASH_TYPE_LOTUS6)
8478 {
8479 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8480 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8481 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8482 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8483
8484 char buf[16] = { 0 };
8485
8486 memcpy (buf + 0, salt.salt_buf, 5);
8487 memcpy (buf + 5, digest_buf, 9);
8488
8489 buf[3] -= -4;
8490
8491 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
8492
8493 tmp_buf[18] = salt.salt_buf_pc[7];
8494 tmp_buf[19] = 0;
8495
8496 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8497 }
8498 else if (hash_type == HASH_TYPE_LOTUS8)
8499 {
8500 char buf[52] = { 0 };
8501
8502 // salt
8503
8504 memcpy (buf + 0, salt.salt_buf, 16);
8505
8506 buf[3] -= -4;
8507
8508 // iteration
8509
8510 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8511
8512 // chars
8513
8514 buf[26] = salt.salt_buf_pc[0];
8515 buf[27] = salt.salt_buf_pc[1];
8516
8517 // digest
8518
8519 memcpy (buf + 28, digest_buf, 8);
8520
8521 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
8522
8523 tmp_buf[49] = 0;
8524
8525 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8526 }
8527 else if (hash_type == HASH_TYPE_CRC32)
8528 {
8529 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8530 }
8531 }
8532
8533 if (salt_type == SALT_TYPE_INTERN)
8534 {
8535 size_t pos = strlen (out_buf);
8536
8537 out_buf[pos] = data.separator;
8538
8539 char *ptr = (char *) salt.salt_buf;
8540
8541 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8542
8543 out_buf[pos + 1 + salt.salt_len] = 0;
8544 }
8545 }
8546
8547 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8548 {
8549 memset (hccap, 0, sizeof (hccap_t));
8550
8551 salt_t *salt = &data.salts_buf[salt_pos];
8552
8553 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8554
8555 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8556 wpa_t *wpa = &wpas[salt_pos];
8557
8558 hccap->keyver = wpa->keyver;
8559
8560 hccap->eapol_size = wpa->eapol_size;
8561
8562 if (wpa->keyver != 1)
8563 {
8564 uint eapol_tmp[64] = { 0 };
8565
8566 for (uint i = 0; i < 64; i++)
8567 {
8568 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8569 }
8570
8571 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8572 }
8573 else
8574 {
8575 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8576 }
8577
8578 uint pke_tmp[25] = { 0 };
8579
8580 for (int i = 5; i < 25; i++)
8581 {
8582 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8583 }
8584
8585 char *pke_ptr = (char *) pke_tmp;
8586
8587 memcpy (hccap->mac1, pke_ptr + 23, 6);
8588 memcpy (hccap->mac2, pke_ptr + 29, 6);
8589 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8590 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8591
8592 char *digests_buf_ptr = (char *) data.digests_buf;
8593
8594 uint dgst_size = data.dgst_size;
8595
8596 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8597
8598 if (wpa->keyver != 1)
8599 {
8600 uint digest_tmp[4] = { 0 };
8601
8602 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8603 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8604 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8605 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8606
8607 memcpy (hccap->keymic, digest_tmp, 16);
8608 }
8609 else
8610 {
8611 memcpy (hccap->keymic, digest_ptr, 16);
8612 }
8613 }
8614
8615 void SuspendThreads ()
8616 {
8617 if (data.devices_status == STATUS_RUNNING)
8618 {
8619 hc_timer_set (&data.timer_paused);
8620
8621 data.devices_status = STATUS_PAUSED;
8622
8623 log_info ("Paused");
8624 }
8625 }
8626
8627 void ResumeThreads ()
8628 {
8629 if (data.devices_status == STATUS_PAUSED)
8630 {
8631 float ms_paused;
8632
8633 hc_timer_get (data.timer_paused, ms_paused);
8634
8635 data.ms_paused += ms_paused;
8636
8637 data.devices_status = STATUS_RUNNING;
8638
8639 log_info ("Resumed");
8640 }
8641 }
8642
8643 void bypass ()
8644 {
8645 if (data.devices_status != STATUS_RUNNING) return;
8646
8647 data.devices_status = STATUS_BYPASS;
8648
8649 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8650 }
8651
8652 void stop_at_checkpoint ()
8653 {
8654 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8655 {
8656 if (data.devices_status != STATUS_RUNNING) return;
8657 }
8658
8659 // this feature only makes sense if --restore-disable was not specified
8660
8661 if (data.restore_disable == 1)
8662 {
8663 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8664
8665 return;
8666 }
8667
8668 // check if monitoring of Restore Point updates should be enabled or disabled
8669
8670 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8671 {
8672 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8673
8674 // save the current restore point value
8675
8676 data.checkpoint_cur_words = get_lowest_words_done ();
8677
8678 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8679 }
8680 else
8681 {
8682 data.devices_status = STATUS_RUNNING;
8683
8684 // reset the global value for checkpoint checks
8685
8686 data.checkpoint_cur_words = 0;
8687
8688 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8689 }
8690 }
8691
8692 void myabort ()
8693 {
8694 if (data.devices_status == STATUS_INIT) return;
8695 if (data.devices_status == STATUS_STARTING) return;
8696
8697 data.devices_status = STATUS_ABORTED;
8698 }
8699
8700 void myquit ()
8701 {
8702 if (data.devices_status == STATUS_INIT) return;
8703 if (data.devices_status == STATUS_STARTING) return;
8704
8705 data.devices_status = STATUS_QUIT;
8706 }
8707
8708 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
8709 {
8710 FILE *fp = fopen (kernel_file, "rb");
8711
8712 if (fp != NULL)
8713 {
8714 struct stat st;
8715
8716 memset (&st, 0, sizeof (st));
8717
8718 stat (kernel_file, &st);
8719
8720 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
8721
8722 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
8723
8724 if (num_read != (size_t) st.st_size)
8725 {
8726 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8727
8728 exit (-1);
8729 }
8730
8731 fclose (fp);
8732
8733 buf[st.st_size] = 0;
8734
8735 for (int i = 0; i < num_devices; i++)
8736 {
8737 kernel_lengths[i] = (size_t) st.st_size;
8738
8739 kernel_sources[i] = buf;
8740 }
8741 }
8742 else
8743 {
8744 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8745
8746 exit (-1);
8747 }
8748
8749 return;
8750 }
8751
8752 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
8753 {
8754 if (binary_size > 0)
8755 {
8756 FILE *fp = fopen (dst, "wb");
8757
8758 lock_file (fp);
8759 fwrite (binary, sizeof (u8), binary_size, fp);
8760
8761 fflush (fp);
8762 fclose (fp);
8763 }
8764 }
8765
8766 /**
8767 * restore
8768 */
8769
8770 restore_data_t *init_restore (int argc, char **argv)
8771 {
8772 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8773
8774 if (data.restore_disable == 0)
8775 {
8776 FILE *fp = fopen (data.eff_restore_file, "rb");
8777
8778 if (fp)
8779 {
8780 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8781
8782 if (nread != 1)
8783 {
8784 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8785
8786 exit (-1);
8787 }
8788
8789 fclose (fp);
8790
8791 if (rd->pid)
8792 {
8793 char pidbin[BUFSIZ] = { 0 };
8794
8795 int pidbin_len = -1;
8796
8797 #ifdef _POSIX
8798 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8799
8800 FILE *fd = fopen (pidbin, "rb");
8801
8802 if (fd)
8803 {
8804 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8805
8806 pidbin[pidbin_len] = 0;
8807
8808 fclose (fd);
8809
8810 char *argv0_r = strrchr (argv[0], '/');
8811
8812 char *pidbin_r = strrchr (pidbin, '/');
8813
8814 if (argv0_r == NULL) argv0_r = argv[0];
8815
8816 if (pidbin_r == NULL) pidbin_r = pidbin;
8817
8818 if (strcmp (argv0_r, pidbin_r) == 0)
8819 {
8820 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8821
8822 exit (-1);
8823 }
8824 }
8825
8826 #elif _WIN
8827 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8828
8829 char pidbin2[BUFSIZ] = { 0 };
8830
8831 int pidbin2_len = -1;
8832
8833 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8834 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8835
8836 pidbin[pidbin_len] = 0;
8837 pidbin2[pidbin2_len] = 0;
8838
8839 if (pidbin2_len)
8840 {
8841 if (strcmp (pidbin, pidbin2) == 0)
8842 {
8843 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8844
8845 exit (-1);
8846 }
8847 }
8848 #endif
8849 }
8850
8851 if (rd->version_bin < RESTORE_MIN)
8852 {
8853 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8854
8855 exit (-1);
8856 }
8857 }
8858 }
8859
8860 memset (rd, 0, sizeof (restore_data_t));
8861
8862 rd->version_bin = VERSION_BIN;
8863
8864 #ifdef _POSIX
8865 rd->pid = getpid ();
8866 #elif _WIN
8867 rd->pid = GetCurrentProcessId ();
8868 #endif
8869
8870 if (getcwd (rd->cwd, 255) == NULL)
8871 {
8872 myfree (rd);
8873
8874 return (NULL);
8875 }
8876
8877 rd->argc = argc;
8878 rd->argv = argv;
8879
8880 return (rd);
8881 }
8882
8883 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8884 {
8885 FILE *fp = fopen (eff_restore_file, "rb");
8886
8887 if (fp == NULL)
8888 {
8889 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8890
8891 exit (-1);
8892 }
8893
8894 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8895 {
8896 log_error ("ERROR: cannot read %s", eff_restore_file);
8897
8898 exit (-1);
8899 }
8900
8901 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8902
8903 for (uint i = 0; i < rd->argc; i++)
8904 {
8905 char buf[BUFSIZ] = { 0 };
8906
8907 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8908 {
8909 log_error ("ERROR: cannot read %s", eff_restore_file);
8910
8911 exit (-1);
8912 }
8913
8914 size_t len = strlen (buf);
8915
8916 if (len) buf[len - 1] = 0;
8917
8918 rd->argv[i] = mystrdup (buf);
8919 }
8920
8921 fclose (fp);
8922
8923 char new_cwd[1024] = { 0 };
8924
8925 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8926
8927 if (nwd == NULL)
8928 {
8929 log_error ("Restore file is corrupted");
8930 }
8931
8932 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8933 {
8934 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8935 {
8936 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8937
8938 exit (-1);
8939 }
8940
8941 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8942 }
8943
8944 if (chdir (rd->cwd))
8945 {
8946 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8947
8948 exit (-1);
8949 }
8950 }
8951
8952 u64 get_lowest_words_done ()
8953 {
8954 u64 words_cur = -1;
8955
8956 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8957 {
8958 hc_device_param_t *device_param = &data.devices_param[device_id];
8959
8960 if (device_param->skipped) continue;
8961
8962 const u64 words_done = device_param->words_done;
8963
8964 if (words_done < words_cur) words_cur = words_done;
8965 }
8966
8967 // It's possible that a device's workload isn't finished right after a restore-case.
8968 // In that case, this function would return 0 and overwrite the real restore point
8969 // There's also data.words_cur which is set to rd->words_cur but it changes while
8970 // the attack is running therefore we should stick to rd->words_cur.
8971 // Note that -s influences rd->words_cur we should keep a close look on that.
8972
8973 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
8974
8975 return words_cur;
8976 }
8977
8978 void write_restore (const char *new_restore_file, restore_data_t *rd)
8979 {
8980 u64 words_cur = get_lowest_words_done ();
8981
8982 rd->words_cur = words_cur;
8983
8984 FILE *fp = fopen (new_restore_file, "wb");
8985
8986 if (fp == NULL)
8987 {
8988 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
8989
8990 exit (-1);
8991 }
8992
8993 if (setvbuf (fp, NULL, _IONBF, 0))
8994 {
8995 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
8996
8997 exit (-1);
8998 }
8999
9000 fwrite (rd, sizeof (restore_data_t), 1, fp);
9001
9002 for (uint i = 0; i < rd->argc; i++)
9003 {
9004 fprintf (fp, "%s", rd->argv[i]);
9005 fputc ('\n', fp);
9006 }
9007
9008 fflush (fp);
9009
9010 fsync (fileno (fp));
9011
9012 fclose (fp);
9013 }
9014
9015 void cycle_restore ()
9016 {
9017 const char *eff_restore_file = data.eff_restore_file;
9018 const char *new_restore_file = data.new_restore_file;
9019
9020 restore_data_t *rd = data.rd;
9021
9022 write_restore (new_restore_file, rd);
9023
9024 struct stat st;
9025
9026 memset (&st, 0, sizeof(st));
9027
9028 if (stat (eff_restore_file, &st) == 0)
9029 {
9030 if (unlink (eff_restore_file))
9031 {
9032 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
9033 }
9034 }
9035
9036 if (rename (new_restore_file, eff_restore_file))
9037 {
9038 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
9039 }
9040 }
9041
9042 void check_checkpoint ()
9043 {
9044 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
9045
9046 u64 words_cur = get_lowest_words_done ();
9047
9048 if (words_cur != data.checkpoint_cur_words)
9049 {
9050 myabort ();
9051 }
9052 }
9053
9054 /**
9055 * tuning db
9056 */
9057
9058 void tuning_db_destroy (tuning_db_t *tuning_db)
9059 {
9060 int i;
9061
9062 for (i = 0; i < tuning_db->alias_cnt; i++)
9063 {
9064 tuning_db_alias_t *alias = &tuning_db->alias_buf[i];
9065
9066 myfree (alias->device_name);
9067 myfree (alias->alias_name);
9068 }
9069
9070 for (i = 0; i < tuning_db->entry_cnt; i++)
9071 {
9072 tuning_db_entry_t *entry = &tuning_db->entry_buf[i];
9073
9074 myfree (entry->device_name);
9075 }
9076
9077 myfree (tuning_db->alias_buf);
9078 myfree (tuning_db->entry_buf);
9079
9080 myfree (tuning_db);
9081 }
9082
9083 tuning_db_t *tuning_db_alloc (FILE *fp)
9084 {
9085 tuning_db_t *tuning_db = (tuning_db_t *) mymalloc (sizeof (tuning_db_t));
9086
9087 int num_lines = count_lines (fp);
9088
9089 // a bit over-allocated
9090
9091 tuning_db->alias_buf = (tuning_db_alias_t *) mycalloc (num_lines + 1, sizeof (tuning_db_alias_t));
9092 tuning_db->alias_cnt = 0;
9093
9094 tuning_db->entry_buf = (tuning_db_entry_t *) mycalloc (num_lines + 1, sizeof (tuning_db_entry_t));
9095 tuning_db->entry_cnt = 0;
9096
9097 return tuning_db;
9098 }
9099
9100 tuning_db_t *tuning_db_init (const char *tuning_db_file)
9101 {
9102 FILE *fp = fopen (tuning_db_file, "rb");
9103
9104 if (fp == NULL)
9105 {
9106 log_error ("%s: %s", tuning_db_file, strerror (errno));
9107
9108 exit (-1);
9109 }
9110
9111 tuning_db_t *tuning_db = tuning_db_alloc (fp);
9112
9113 rewind (fp);
9114
9115 int line_num = 0;
9116
9117 while (!feof (fp))
9118 {
9119 char buf[BUFSIZ];
9120
9121 char *line_buf = fgets (buf, sizeof (buf) - 1, fp);
9122
9123 if (line_buf == NULL) break;
9124
9125 line_num++;
9126
9127 const int line_len = in_superchop (line_buf);
9128
9129 if (line_len == 0) continue;
9130
9131 if (line_buf[0] == '#') continue;
9132
9133 // start processing
9134
9135 char *token_ptr[7] = { NULL };
9136
9137 int token_cnt = 0;
9138
9139 char *next = strtok (line_buf, "\t ");
9140
9141 token_ptr[token_cnt] = next;
9142
9143 token_cnt++;
9144
9145 while ((next = strtok (NULL, "\t ")) != NULL)
9146 {
9147 token_ptr[token_cnt] = next;
9148
9149 token_cnt++;
9150 }
9151
9152 if (token_cnt == 2)
9153 {
9154 char *device_name = token_ptr[0];
9155 char *alias_name = token_ptr[1];
9156
9157 tuning_db_alias_t *alias = &tuning_db->alias_buf[tuning_db->alias_cnt];
9158
9159 alias->device_name = mystrdup (device_name);
9160 alias->alias_name = mystrdup (alias_name);
9161
9162 tuning_db->alias_cnt++;
9163 }
9164 else if (token_cnt == 7)
9165 {
9166 if ((token_ptr[1][0] != '0') &&
9167 (token_ptr[1][0] != '1') &&
9168 (token_ptr[1][0] != '3') &&
9169 (token_ptr[1][0] != '*'))
9170 {
9171 log_info ("WARNING: Tuning-db: Invalid attack_mode '%c' in Line '%u'", token_ptr[1][0], line_num);
9172
9173 continue;
9174 }
9175
9176 if ((token_ptr[3][0] != '1') &&
9177 (token_ptr[3][0] != '2') &&
9178 (token_ptr[3][0] != '3') &&
9179 (token_ptr[3][0] != '*'))
9180 {
9181 log_info ("WARNING: Tuning-db: Invalid workload_profile '%c' in Line '%u'", token_ptr[3][0], line_num);
9182
9183 continue;
9184 }
9185
9186 if ((token_ptr[4][0] != '1') &&
9187 (token_ptr[4][0] != '2') &&
9188 (token_ptr[4][0] != '4') &&
9189 (token_ptr[4][0] != '8') &&
9190 (token_ptr[4][0] != 'N'))
9191 {
9192 log_info ("WARNING: Tuning-db: Invalid vector_width '%c' in Line '%u'", token_ptr[4][0], line_num);
9193
9194 continue;
9195 }
9196
9197 char *device_name = token_ptr[0];
9198
9199 int attack_mode = -1;
9200 int hash_type = -1;
9201 int workload_profile = -1;
9202 int vector_width = -1;
9203 int kernel_accel = -1;
9204 int kernel_loops = -1;
9205
9206 if (token_ptr[1][0] != '*') attack_mode = atoi (token_ptr[1]);
9207 if (token_ptr[2][0] != '*') hash_type = atoi (token_ptr[2]);
9208 if (token_ptr[3][0] != '*') workload_profile = atoi (token_ptr[3]);
9209 if (token_ptr[4][0] != 'N') vector_width = atoi (token_ptr[4]);
9210
9211 kernel_accel = atoi (token_ptr[5]);
9212
9213 if ((kernel_accel < 1) || (kernel_accel > 1024))
9214 {
9215 log_info ("WARNING: Tuning-db: Invalid kernel_accel '%d' in Line '%u'", kernel_accel, line_num);
9216
9217 continue;
9218 }
9219
9220 kernel_loops = atoi (token_ptr[6]);
9221
9222 if ((kernel_loops < 1) || (kernel_loops > 1024))
9223 {
9224 log_info ("WARNING: Tuning-db: Invalid kernel_loops '%d' in Line '%u'", kernel_loops, line_num);
9225
9226 continue;
9227 }
9228
9229 tuning_db_entry_t *entry = &tuning_db->entry_buf[tuning_db->entry_cnt];
9230
9231 entry->device_name = mystrdup (device_name);
9232 entry->attack_mode = attack_mode;
9233 entry->hash_type = hash_type;
9234 entry->workload_profile = workload_profile;
9235 entry->vector_width = vector_width;
9236 entry->kernel_accel = kernel_accel;
9237 entry->kernel_loops = kernel_loops;
9238
9239 tuning_db->entry_cnt++;
9240 }
9241 else
9242 {
9243 // todo: some warning message
9244
9245 continue;
9246 }
9247 }
9248
9249 fclose (fp);
9250
9251 // todo: print loaded 'cnt' message
9252
9253 // sort the database
9254
9255 qsort (tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9256 qsort (tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9257
9258 return tuning_db;
9259 }
9260
9261 tuning_db_entry_t *tuning_db_search (tuning_db_t *tuning_db, char *device_name, int attack_mode, int hash_type, int workload_profile)
9262 {
9263 static tuning_db_entry_t s;
9264
9265 // first we need to convert all spaces in the device_name to underscore
9266
9267 char *device_name_nospace = strdup (device_name);
9268
9269 int device_name_length = strlen (device_name_nospace);
9270
9271 int i;
9272
9273 for (i = 0; i < device_name_length; i++)
9274 {
9275 if (device_name_nospace[i] == ' ') device_name_nospace[i] = '_';
9276 }
9277
9278 // find out if there's an alias configured
9279
9280 tuning_db_alias_t a;
9281
9282 a.device_name = device_name_nospace;
9283
9284 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);
9285
9286 char *alias_name = (alias == NULL) ? NULL : alias->alias_name;
9287
9288 // attack-mode 6 and 7 are attack-mode 1 basically
9289
9290 if (attack_mode == 6) attack_mode = 1;
9291 if (attack_mode == 7) attack_mode = 1;
9292
9293 // bsearch is not ideal but fast enough
9294
9295 s.device_name = device_name_nospace;
9296 s.attack_mode = attack_mode;
9297 s.hash_type = hash_type;
9298 s.workload_profile = workload_profile;
9299
9300 tuning_db_entry_t *entry = NULL;
9301
9302 // this will produce all 2^4 combinations required
9303
9304 for (i = 0; i < 16; i++)
9305 {
9306 s.device_name = (i & 1) ? "*" : device_name_nospace;
9307 s.attack_mode = (i & 2) ? -1 : attack_mode;
9308 s.hash_type = (i & 4) ? -1 : hash_type;
9309 s.workload_profile = (i & 8) ? -1 : workload_profile;
9310
9311 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9312
9313 if (entry != NULL) break;
9314
9315 // in non-wildcard mode also check the alias_name
9316
9317 if (((i & 1) == 0) && (alias_name != NULL))
9318 {
9319 s.device_name = alias_name;
9320
9321 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9322
9323 if (entry != NULL) break;
9324 }
9325 }
9326
9327 // if still not found use some defaults
9328
9329 if (entry == NULL)
9330 {
9331 s.vector_width = TUNING_DB_DEFAULT_VECTOR_WIDTH;
9332 s.kernel_accel = TUNING_DB_DEFAULT_KERNEL_ACCEL;
9333 s.kernel_loops = TUNING_DB_DEFAULT_KERNEL_LOOPS;
9334
9335 return &s;
9336 }
9337
9338 // free converted device_name
9339
9340 myfree (device_name_nospace);
9341
9342 return entry;
9343 }
9344
9345 /**
9346 * parser
9347 */
9348
9349 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9350 {
9351 u8 tmp[256] = { 0 };
9352
9353 if (salt_len > sizeof (tmp))
9354 {
9355 return UINT_MAX;
9356 }
9357
9358 memcpy (tmp, in, salt_len);
9359
9360 if (data.opts_type & OPTS_TYPE_ST_HEX)
9361 {
9362 if ((salt_len % 2) == 0)
9363 {
9364 u32 new_salt_len = salt_len / 2;
9365
9366 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9367 {
9368 u8 p0 = tmp[j + 0];
9369 u8 p1 = tmp[j + 1];
9370
9371 tmp[i] = hex_convert (p1) << 0;
9372 tmp[i] |= hex_convert (p0) << 4;
9373 }
9374
9375 salt_len = new_salt_len;
9376 }
9377 else
9378 {
9379 return UINT_MAX;
9380 }
9381 }
9382 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9383 {
9384 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9385 }
9386
9387 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9388
9389 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9390 {
9391 if (salt_len < 20)
9392 {
9393 u32 *tmp_uint = (u32 *) tmp;
9394
9395 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9396 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9397 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9398 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9399 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9400 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9401 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9402 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9403 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9404 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9405
9406 salt_len = salt_len * 2;
9407 }
9408 else
9409 {
9410 return UINT_MAX;
9411 }
9412 }
9413
9414 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9415 {
9416 lowercase (tmp, salt_len);
9417 }
9418
9419 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9420 {
9421 uppercase (tmp, salt_len);
9422 }
9423
9424 u32 len = salt_len;
9425
9426 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9427 {
9428 tmp[len++] = 0x80;
9429 }
9430
9431 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9432 {
9433 tmp[len++] = 0x01;
9434 }
9435
9436 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9437 {
9438 u32 *tmp_uint = (uint *) tmp;
9439
9440 u32 max = len / 4;
9441
9442 if (len % 4) max++;
9443
9444 for (u32 i = 0; i < max; i++)
9445 {
9446 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9447 }
9448
9449 // Important: we may need to increase the length of memcpy since
9450 // we don't want to "loose" some swapped bytes (could happen if
9451 // they do not perfectly fit in the 4-byte blocks)
9452 // Memcpy does always copy the bytes in the BE order, but since
9453 // we swapped them, some important bytes could be in positions
9454 // we normally skip with the original len
9455
9456 if (len % 4) len += 4 - (len % 4);
9457 }
9458
9459 memcpy (out, tmp, len);
9460
9461 return (salt_len);
9462 }
9463
9464 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9465 {
9466 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9467
9468 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9469
9470 u32 *digest = (u32 *) hash_buf->digest;
9471
9472 salt_t *salt = hash_buf->salt;
9473
9474 memcpy ((char *) salt->salt_sign, input_buf, 6);
9475
9476 char *iter_pos = input_buf + 4;
9477
9478 salt->salt_iter = 1 << atoi (iter_pos);
9479
9480 char *salt_pos = strchr (iter_pos, '$');
9481
9482 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9483
9484 salt_pos++;
9485
9486 uint salt_len = 16;
9487
9488 salt->salt_len = salt_len;
9489
9490 u8 tmp_buf[100] = { 0 };
9491
9492 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9493
9494 char *salt_buf_ptr = (char *) salt->salt_buf;
9495
9496 memcpy (salt_buf_ptr, tmp_buf, 16);
9497
9498 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9499 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9500 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9501 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9502
9503 char *hash_pos = salt_pos + 22;
9504
9505 memset (tmp_buf, 0, sizeof (tmp_buf));
9506
9507 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9508
9509 memcpy (digest, tmp_buf, 24);
9510
9511 digest[0] = byte_swap_32 (digest[0]);
9512 digest[1] = byte_swap_32 (digest[1]);
9513 digest[2] = byte_swap_32 (digest[2]);
9514 digest[3] = byte_swap_32 (digest[3]);
9515 digest[4] = byte_swap_32 (digest[4]);
9516 digest[5] = byte_swap_32 (digest[5]);
9517
9518 digest[5] &= ~0xff; // its just 23 not 24 !
9519
9520 return (PARSER_OK);
9521 }
9522
9523 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9524 {
9525 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9526
9527 u32 *digest = (u32 *) hash_buf->digest;
9528
9529 u8 tmp_buf[100] = { 0 };
9530
9531 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
9532
9533 memcpy (digest, tmp_buf, 32);
9534
9535 digest[0] = byte_swap_32 (digest[0]);
9536 digest[1] = byte_swap_32 (digest[1]);
9537 digest[2] = byte_swap_32 (digest[2]);
9538 digest[3] = byte_swap_32 (digest[3]);
9539 digest[4] = byte_swap_32 (digest[4]);
9540 digest[5] = byte_swap_32 (digest[5]);
9541 digest[6] = byte_swap_32 (digest[6]);
9542 digest[7] = byte_swap_32 (digest[7]);
9543
9544 digest[0] -= SHA256M_A;
9545 digest[1] -= SHA256M_B;
9546 digest[2] -= SHA256M_C;
9547 digest[3] -= SHA256M_D;
9548 digest[4] -= SHA256M_E;
9549 digest[5] -= SHA256M_F;
9550 digest[6] -= SHA256M_G;
9551 digest[7] -= SHA256M_H;
9552
9553 return (PARSER_OK);
9554 }
9555
9556 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9557 {
9558 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9559
9560 u32 *digest = (u32 *) hash_buf->digest;
9561
9562 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9563 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9564
9565 digest[0] = byte_swap_32 (digest[0]);
9566 digest[1] = byte_swap_32 (digest[1]);
9567
9568 uint tt;
9569
9570 IP (digest[0], digest[1], tt);
9571
9572 digest[0] = digest[0];
9573 digest[1] = digest[1];
9574 digest[2] = 0;
9575 digest[3] = 0;
9576
9577 return (PARSER_OK);
9578 }
9579
9580 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9581 {
9582 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9583
9584 u32 *digest = (u32 *) hash_buf->digest;
9585
9586 salt_t *salt = hash_buf->salt;
9587
9588 char *hash_pos = input_buf + 8;
9589
9590 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
9591 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
9592 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
9593 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
9594 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
9595
9596 digest[0] -= SHA1M_A;
9597 digest[1] -= SHA1M_B;
9598 digest[2] -= SHA1M_C;
9599 digest[3] -= SHA1M_D;
9600 digest[4] -= SHA1M_E;
9601
9602 uint salt_len = 8;
9603
9604 char *salt_buf_ptr = (char *) salt->salt_buf;
9605
9606 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9607
9608 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9609
9610 salt->salt_len = salt_len;
9611
9612 return (PARSER_OK);
9613 }
9614
9615 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9616 {
9617 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9618
9619 u64 *digest = (u64 *) hash_buf->digest;
9620
9621 salt_t *salt = hash_buf->salt;
9622
9623 char *hash_pos = input_buf + 8;
9624
9625 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
9626 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
9627 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
9628 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
9629 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
9630 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
9631 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
9632 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
9633
9634 digest[0] -= SHA512M_A;
9635 digest[1] -= SHA512M_B;
9636 digest[2] -= SHA512M_C;
9637 digest[3] -= SHA512M_D;
9638 digest[4] -= SHA512M_E;
9639 digest[5] -= SHA512M_F;
9640 digest[6] -= SHA512M_G;
9641 digest[7] -= SHA512M_H;
9642
9643 uint salt_len = 8;
9644
9645 char *salt_buf_ptr = (char *) salt->salt_buf;
9646
9647 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9648
9649 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9650
9651 salt->salt_len = salt_len;
9652
9653 return (PARSER_OK);
9654 }
9655
9656 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9657 {
9658 if (data.opts_type & OPTS_TYPE_ST_HEX)
9659 {
9660 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9661 }
9662 else
9663 {
9664 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9665 }
9666
9667 u32 *digest = (u32 *) hash_buf->digest;
9668
9669 salt_t *salt = hash_buf->salt;
9670
9671 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9672 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9673 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9674 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9675
9676 digest[0] = byte_swap_32 (digest[0]);
9677 digest[1] = byte_swap_32 (digest[1]);
9678 digest[2] = byte_swap_32 (digest[2]);
9679 digest[3] = byte_swap_32 (digest[3]);
9680
9681 digest[0] -= MD5M_A;
9682 digest[1] -= MD5M_B;
9683 digest[2] -= MD5M_C;
9684 digest[3] -= MD5M_D;
9685
9686 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9687
9688 uint salt_len = input_len - 32 - 1;
9689
9690 char *salt_buf = input_buf + 32 + 1;
9691
9692 char *salt_buf_ptr = (char *) salt->salt_buf;
9693
9694 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9695
9696 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9697
9698 salt->salt_len = salt_len;
9699
9700 return (PARSER_OK);
9701 }
9702
9703 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9704 {
9705 if (data.opts_type & OPTS_TYPE_ST_HEX)
9706 {
9707 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9708 }
9709 else
9710 {
9711 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9712 }
9713
9714 // unscramble
9715
9716 char clean_input_buf[32] = { 0 };
9717
9718 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9719 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9720
9721 for (int i = 0, j = 0, k = 0; i < 30; i++)
9722 {
9723 if (i == pos[j])
9724 {
9725 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9726
9727 j++;
9728 }
9729 else
9730 {
9731 clean_input_buf[k] = input_buf[i];
9732
9733 k++;
9734 }
9735 }
9736
9737 // base64 decode
9738
9739 u32 *digest = (u32 *) hash_buf->digest;
9740
9741 salt_t *salt = hash_buf->salt;
9742
9743 u32 a, b, c, d, e, f;
9744
9745 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9746 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9747 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9748 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9749 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9750 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9751
9752 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9753 | (((d << 12) | (e << 6) | (f)) << 0);
9754
9755 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9756 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9757 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9758 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9759 e = base64_to_int (clean_input_buf[10] & 0x7f);
9760 f = base64_to_int (clean_input_buf[11] & 0x7f);
9761
9762 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9763 | (((d << 12) | (e << 6) | (f)) << 0);
9764
9765 a = base64_to_int (clean_input_buf[12] & 0x7f);
9766 b = base64_to_int (clean_input_buf[13] & 0x7f);
9767 c = base64_to_int (clean_input_buf[14] & 0x7f);
9768 d = base64_to_int (clean_input_buf[15] & 0x7f);
9769 e = base64_to_int (clean_input_buf[16] & 0x7f);
9770 f = base64_to_int (clean_input_buf[17] & 0x7f);
9771
9772 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9773 | (((d << 12) | (e << 6) | (f)) << 0);
9774
9775 a = base64_to_int (clean_input_buf[18] & 0x7f);
9776 b = base64_to_int (clean_input_buf[19] & 0x7f);
9777 c = base64_to_int (clean_input_buf[20] & 0x7f);
9778 d = base64_to_int (clean_input_buf[21] & 0x7f);
9779 e = base64_to_int (clean_input_buf[22] & 0x7f);
9780 f = base64_to_int (clean_input_buf[23] & 0x7f);
9781
9782 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
9783 | (((d << 12) | (e << 6) | (f)) << 0);
9784
9785 digest[0] = byte_swap_32 (digest[0]);
9786 digest[1] = byte_swap_32 (digest[1]);
9787 digest[2] = byte_swap_32 (digest[2]);
9788 digest[3] = byte_swap_32 (digest[3]);
9789
9790 digest[0] -= MD5M_A;
9791 digest[1] -= MD5M_B;
9792 digest[2] -= MD5M_C;
9793 digest[3] -= MD5M_D;
9794
9795 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
9796
9797 uint salt_len = input_len - 30 - 1;
9798
9799 char *salt_buf = input_buf + 30 + 1;
9800
9801 char *salt_buf_ptr = (char *) salt->salt_buf;
9802
9803 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9804
9805 // max. salt length: salt_buf[32] => 32 - 22 (":Administration Tools:") = 10
9806 if (salt_len > 10) return (PARSER_SALT_LENGTH);
9807
9808 salt->salt_len = salt_len;
9809
9810 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9811
9812 salt->salt_len += 22;
9813
9814 return (PARSER_OK);
9815 }
9816
9817 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9818 {
9819 if (data.opts_type & OPTS_TYPE_ST_HEX)
9820 {
9821 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9822 }
9823 else
9824 {
9825 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9826 }
9827
9828 u32 *digest = (u32 *) hash_buf->digest;
9829
9830 salt_t *salt = hash_buf->salt;
9831
9832 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9833 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9834 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9835 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9836 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
9837
9838 digest[0] -= SHA1M_A;
9839 digest[1] -= SHA1M_B;
9840 digest[2] -= SHA1M_C;
9841 digest[3] -= SHA1M_D;
9842 digest[4] -= SHA1M_E;
9843
9844 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9845
9846 uint salt_len = input_len - 40 - 1;
9847
9848 char *salt_buf = input_buf + 40 + 1;
9849
9850 char *salt_buf_ptr = (char *) salt->salt_buf;
9851
9852 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9853
9854 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9855
9856 salt->salt_len = salt_len;
9857
9858 return (PARSER_OK);
9859 }
9860
9861 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9862 {
9863 if (data.opts_type & OPTS_TYPE_ST_HEX)
9864 {
9865 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9866 }
9867 else
9868 {
9869 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9870 }
9871
9872 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9873
9874 char *iter_pos = input_buf + 6;
9875
9876 salt_t *salt = hash_buf->salt;
9877
9878 uint iter = atoi (iter_pos);
9879
9880 if (iter < 1)
9881 {
9882 iter = ROUNDS_DCC2;
9883 }
9884
9885 salt->salt_iter = iter - 1;
9886
9887 char *salt_pos = strchr (iter_pos, '#');
9888
9889 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9890
9891 salt_pos++;
9892
9893 char *digest_pos = strchr (salt_pos, '#');
9894
9895 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9896
9897 digest_pos++;
9898
9899 uint salt_len = digest_pos - salt_pos - 1;
9900
9901 u32 *digest = (u32 *) hash_buf->digest;
9902
9903 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
9904 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
9905 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
9906 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
9907
9908 char *salt_buf_ptr = (char *) salt->salt_buf;
9909
9910 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9911
9912 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9913
9914 salt->salt_len = salt_len;
9915
9916 return (PARSER_OK);
9917 }
9918
9919 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9920 {
9921 u32 *digest = (u32 *) hash_buf->digest;
9922
9923 salt_t *salt = hash_buf->salt;
9924
9925 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9926
9927 hccap_t in;
9928
9929 memcpy (&in, input_buf, input_len);
9930
9931 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9932
9933 memcpy (digest, in.keymic, 16);
9934
9935 /*
9936 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9937 The phrase "Pairwise key expansion"
9938 Access Point Address (referred to as Authenticator Address AA)
9939 Supplicant Address (referred to as Supplicant Address SA)
9940 Access Point Nonce (referred to as Authenticator Anonce)
9941 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9942 */
9943
9944 uint salt_len = strlen (in.essid);
9945
9946 memcpy (salt->salt_buf, in.essid, salt_len);
9947
9948 salt->salt_len = salt_len;
9949
9950 salt->salt_iter = ROUNDS_WPA2 - 1;
9951
9952 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
9953
9954 memcpy (pke_ptr, "Pairwise key expansion", 23);
9955
9956 if (memcmp (in.mac1, in.mac2, 6) < 0)
9957 {
9958 memcpy (pke_ptr + 23, in.mac1, 6);
9959 memcpy (pke_ptr + 29, in.mac2, 6);
9960 }
9961 else
9962 {
9963 memcpy (pke_ptr + 23, in.mac2, 6);
9964 memcpy (pke_ptr + 29, in.mac1, 6);
9965 }
9966
9967 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
9968 {
9969 memcpy (pke_ptr + 35, in.nonce1, 32);
9970 memcpy (pke_ptr + 67, in.nonce2, 32);
9971 }
9972 else
9973 {
9974 memcpy (pke_ptr + 35, in.nonce2, 32);
9975 memcpy (pke_ptr + 67, in.nonce1, 32);
9976 }
9977
9978 for (int i = 0; i < 25; i++)
9979 {
9980 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
9981 }
9982
9983 wpa->keyver = in.keyver;
9984
9985 if (wpa->keyver > 255)
9986 {
9987 log_info ("ATTENTION!");
9988 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
9989 log_info (" This could be due to a recent aircrack-ng bug.");
9990 log_info (" The key version was automatically reset to a reasonable value.");
9991 log_info ("");
9992
9993 wpa->keyver &= 0xff;
9994 }
9995
9996 wpa->eapol_size = in.eapol_size;
9997
9998 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
9999
10000 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10001
10002 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10003
10004 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10005
10006 if (wpa->keyver == 1)
10007 {
10008 // nothing to do
10009 }
10010 else
10011 {
10012 digest[0] = byte_swap_32 (digest[0]);
10013 digest[1] = byte_swap_32 (digest[1]);
10014 digest[2] = byte_swap_32 (digest[2]);
10015 digest[3] = byte_swap_32 (digest[3]);
10016
10017 for (int i = 0; i < 64; i++)
10018 {
10019 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10020 }
10021 }
10022
10023 salt->salt_buf[10] = digest[1];
10024 salt->salt_buf[11] = digest[2];
10025
10026 return (PARSER_OK);
10027 }
10028
10029 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10030 {
10031 u32 *digest = (u32 *) hash_buf->digest;
10032
10033 salt_t *salt = hash_buf->salt;
10034
10035 if (input_len == 0)
10036 {
10037 log_error ("Password Safe v2 container not specified");
10038
10039 exit (-1);
10040 }
10041
10042 FILE *fp = fopen (input_buf, "rb");
10043
10044 if (fp == NULL)
10045 {
10046 log_error ("%s: %s", input_buf, strerror (errno));
10047
10048 exit (-1);
10049 }
10050
10051 psafe2_hdr buf;
10052
10053 memset (&buf, 0, sizeof (psafe2_hdr));
10054
10055 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10056
10057 fclose (fp);
10058
10059 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10060
10061 salt->salt_buf[0] = buf.random[0];
10062 salt->salt_buf[1] = buf.random[1];
10063
10064 salt->salt_len = 8;
10065 salt->salt_iter = 1000;
10066
10067 digest[0] = byte_swap_32 (buf.hash[0]);
10068 digest[1] = byte_swap_32 (buf.hash[1]);
10069 digest[2] = byte_swap_32 (buf.hash[2]);
10070 digest[3] = byte_swap_32 (buf.hash[3]);
10071 digest[4] = byte_swap_32 (buf.hash[4]);
10072
10073 return (PARSER_OK);
10074 }
10075
10076 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10077 {
10078 u32 *digest = (u32 *) hash_buf->digest;
10079
10080 salt_t *salt = hash_buf->salt;
10081
10082 if (input_len == 0)
10083 {
10084 log_error (".psafe3 not specified");
10085
10086 exit (-1);
10087 }
10088
10089 FILE *fp = fopen (input_buf, "rb");
10090
10091 if (fp == NULL)
10092 {
10093 log_error ("%s: %s", input_buf, strerror (errno));
10094
10095 exit (-1);
10096 }
10097
10098 psafe3_t in;
10099
10100 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10101
10102 fclose (fp);
10103
10104 data.hashfile = input_buf; // we will need this in case it gets cracked
10105
10106 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10107
10108 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10109
10110 salt->salt_iter = in.iterations + 1;
10111
10112 salt->salt_buf[0] = in.salt_buf[0];
10113 salt->salt_buf[1] = in.salt_buf[1];
10114 salt->salt_buf[2] = in.salt_buf[2];
10115 salt->salt_buf[3] = in.salt_buf[3];
10116 salt->salt_buf[4] = in.salt_buf[4];
10117 salt->salt_buf[5] = in.salt_buf[5];
10118 salt->salt_buf[6] = in.salt_buf[6];
10119 salt->salt_buf[7] = in.salt_buf[7];
10120
10121 salt->salt_len = 32;
10122
10123 digest[0] = in.hash_buf[0];
10124 digest[1] = in.hash_buf[1];
10125 digest[2] = in.hash_buf[2];
10126 digest[3] = in.hash_buf[3];
10127 digest[4] = in.hash_buf[4];
10128 digest[5] = in.hash_buf[5];
10129 digest[6] = in.hash_buf[6];
10130 digest[7] = in.hash_buf[7];
10131
10132 digest[0] = byte_swap_32 (digest[0]);
10133 digest[1] = byte_swap_32 (digest[1]);
10134 digest[2] = byte_swap_32 (digest[2]);
10135 digest[3] = byte_swap_32 (digest[3]);
10136 digest[4] = byte_swap_32 (digest[4]);
10137 digest[5] = byte_swap_32 (digest[5]);
10138 digest[6] = byte_swap_32 (digest[6]);
10139 digest[7] = byte_swap_32 (digest[7]);
10140
10141 return (PARSER_OK);
10142 }
10143
10144 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10145 {
10146 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10147
10148 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10149
10150 u32 *digest = (u32 *) hash_buf->digest;
10151
10152 salt_t *salt = hash_buf->salt;
10153
10154 char *iter_pos = input_buf + 3;
10155
10156 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10157
10158 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10159
10160 memcpy ((char *) salt->salt_sign, input_buf, 4);
10161
10162 salt->salt_iter = salt_iter;
10163
10164 char *salt_pos = iter_pos + 1;
10165
10166 uint salt_len = 8;
10167
10168 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10169
10170 salt->salt_len = salt_len;
10171
10172 char *hash_pos = salt_pos + salt_len;
10173
10174 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10175
10176 return (PARSER_OK);
10177 }
10178
10179 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10180 {
10181 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10182
10183 u32 *digest = (u32 *) hash_buf->digest;
10184
10185 salt_t *salt = hash_buf->salt;
10186
10187 char *salt_pos = input_buf + 3;
10188
10189 uint iterations_len = 0;
10190
10191 if (memcmp (salt_pos, "rounds=", 7) == 0)
10192 {
10193 salt_pos += 7;
10194
10195 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10196
10197 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10198 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10199
10200 salt_pos[0] = 0x0;
10201
10202 salt->salt_iter = atoi (salt_pos - iterations_len);
10203
10204 salt_pos += 1;
10205
10206 iterations_len += 8;
10207 }
10208 else
10209 {
10210 salt->salt_iter = ROUNDS_MD5CRYPT;
10211 }
10212
10213 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10214
10215 char *hash_pos = strchr (salt_pos, '$');
10216
10217 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10218
10219 uint salt_len = hash_pos - salt_pos;
10220
10221 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10222
10223 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10224
10225 salt->salt_len = salt_len;
10226
10227 hash_pos++;
10228
10229 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10230
10231 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10232
10233 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10234
10235 return (PARSER_OK);
10236 }
10237
10238 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10239 {
10240 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10241
10242 u32 *digest = (u32 *) hash_buf->digest;
10243
10244 salt_t *salt = hash_buf->salt;
10245
10246 char *salt_pos = input_buf + 6;
10247
10248 uint iterations_len = 0;
10249
10250 if (memcmp (salt_pos, "rounds=", 7) == 0)
10251 {
10252 salt_pos += 7;
10253
10254 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10255
10256 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10257 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10258
10259 salt_pos[0] = 0x0;
10260
10261 salt->salt_iter = atoi (salt_pos - iterations_len);
10262
10263 salt_pos += 1;
10264
10265 iterations_len += 8;
10266 }
10267 else
10268 {
10269 salt->salt_iter = ROUNDS_MD5CRYPT;
10270 }
10271
10272 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10273
10274 char *hash_pos = strchr (salt_pos, '$');
10275
10276 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10277
10278 uint salt_len = hash_pos - salt_pos;
10279
10280 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10281
10282 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10283
10284 salt->salt_len = salt_len;
10285
10286 hash_pos++;
10287
10288 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10289
10290 return (PARSER_OK);
10291 }
10292
10293 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10294 {
10295 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10296
10297 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10298
10299 u32 *digest = (u32 *) hash_buf->digest;
10300
10301 salt_t *salt = hash_buf->salt;
10302
10303 char *salt_pos = input_buf + 14;
10304
10305 char *hash_pos = strchr (salt_pos, '*');
10306
10307 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10308
10309 hash_pos++;
10310
10311 uint salt_len = hash_pos - salt_pos - 1;
10312
10313 char *salt_buf_ptr = (char *) salt->salt_buf;
10314
10315 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10316
10317 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10318
10319 salt->salt_len = salt_len;
10320
10321 u8 tmp_buf[100] = { 0 };
10322
10323 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10324
10325 memcpy (digest, tmp_buf, 20);
10326
10327 digest[0] = byte_swap_32 (digest[0]);
10328 digest[1] = byte_swap_32 (digest[1]);
10329 digest[2] = byte_swap_32 (digest[2]);
10330 digest[3] = byte_swap_32 (digest[3]);
10331 digest[4] = byte_swap_32 (digest[4]);
10332
10333 digest[0] -= SHA1M_A;
10334 digest[1] -= SHA1M_B;
10335 digest[2] -= SHA1M_C;
10336 digest[3] -= SHA1M_D;
10337 digest[4] -= SHA1M_E;
10338
10339 return (PARSER_OK);
10340 }
10341
10342 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10343 {
10344 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10345
10346 unsigned char c12 = itoa64_to_int (input_buf[12]);
10347
10348 if (c12 & 3) return (PARSER_HASH_VALUE);
10349
10350 u32 *digest = (u32 *) hash_buf->digest;
10351
10352 salt_t *salt = hash_buf->salt;
10353
10354 // for ascii_digest
10355 salt->salt_sign[0] = input_buf[0];
10356 salt->salt_sign[1] = input_buf[1];
10357
10358 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10359 | itoa64_to_int (input_buf[1]) << 6;
10360
10361 salt->salt_len = 2;
10362
10363 u8 tmp_buf[100] = { 0 };
10364
10365 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10366
10367 memcpy (digest, tmp_buf, 8);
10368
10369 uint tt;
10370
10371 IP (digest[0], digest[1], tt);
10372
10373 digest[2] = 0;
10374 digest[3] = 0;
10375
10376 return (PARSER_OK);
10377 }
10378
10379 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10380 {
10381 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10382
10383 u32 *digest = (u32 *) hash_buf->digest;
10384
10385 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10386 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10387 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10388 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10389
10390 digest[0] = byte_swap_32 (digest[0]);
10391 digest[1] = byte_swap_32 (digest[1]);
10392 digest[2] = byte_swap_32 (digest[2]);
10393 digest[3] = byte_swap_32 (digest[3]);
10394
10395 digest[0] -= MD4M_A;
10396 digest[1] -= MD4M_B;
10397 digest[2] -= MD4M_C;
10398 digest[3] -= MD4M_D;
10399
10400 return (PARSER_OK);
10401 }
10402
10403 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10404 {
10405 if (data.opts_type & OPTS_TYPE_ST_HEX)
10406 {
10407 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10408 }
10409 else
10410 {
10411 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10412 }
10413
10414 u32 *digest = (u32 *) hash_buf->digest;
10415
10416 salt_t *salt = hash_buf->salt;
10417
10418 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10419 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10420 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10421 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10422
10423 digest[0] = byte_swap_32 (digest[0]);
10424 digest[1] = byte_swap_32 (digest[1]);
10425 digest[2] = byte_swap_32 (digest[2]);
10426 digest[3] = byte_swap_32 (digest[3]);
10427
10428 digest[0] -= MD4M_A;
10429 digest[1] -= MD4M_B;
10430 digest[2] -= MD4M_C;
10431 digest[3] -= MD4M_D;
10432
10433 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10434
10435 uint salt_len = input_len - 32 - 1;
10436
10437 char *salt_buf = input_buf + 32 + 1;
10438
10439 char *salt_buf_ptr = (char *) salt->salt_buf;
10440
10441 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10442
10443 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10444
10445 salt->salt_len = salt_len;
10446
10447 return (PARSER_OK);
10448 }
10449
10450 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10451 {
10452 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10453
10454 u32 *digest = (u32 *) hash_buf->digest;
10455
10456 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10457 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10458 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10459 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10460
10461 digest[0] = byte_swap_32 (digest[0]);
10462 digest[1] = byte_swap_32 (digest[1]);
10463 digest[2] = byte_swap_32 (digest[2]);
10464 digest[3] = byte_swap_32 (digest[3]);
10465
10466 digest[0] -= MD5M_A;
10467 digest[1] -= MD5M_B;
10468 digest[2] -= MD5M_C;
10469 digest[3] -= MD5M_D;
10470
10471 return (PARSER_OK);
10472 }
10473
10474 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10475 {
10476 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10477
10478 u32 *digest = (u32 *) hash_buf->digest;
10479
10480 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
10481 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
10482 digest[2] = 0;
10483 digest[3] = 0;
10484
10485 digest[0] = byte_swap_32 (digest[0]);
10486 digest[1] = byte_swap_32 (digest[1]);
10487
10488 return (PARSER_OK);
10489 }
10490
10491 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10492 {
10493 if (data.opts_type & OPTS_TYPE_ST_HEX)
10494 {
10495 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10496 }
10497 else
10498 {
10499 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10500 }
10501
10502 u32 *digest = (u32 *) hash_buf->digest;
10503
10504 salt_t *salt = hash_buf->salt;
10505
10506 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10507 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10508 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10509 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10510
10511 digest[0] = byte_swap_32 (digest[0]);
10512 digest[1] = byte_swap_32 (digest[1]);
10513 digest[2] = byte_swap_32 (digest[2]);
10514 digest[3] = byte_swap_32 (digest[3]);
10515
10516 digest[0] -= MD5M_A;
10517 digest[1] -= MD5M_B;
10518 digest[2] -= MD5M_C;
10519 digest[3] -= MD5M_D;
10520
10521 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10522
10523 uint salt_len = input_len - 32 - 1;
10524
10525 char *salt_buf = input_buf + 32 + 1;
10526
10527 char *salt_buf_ptr = (char *) salt->salt_buf;
10528
10529 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10530
10531 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10532
10533 salt->salt_len = salt_len;
10534
10535 return (PARSER_OK);
10536 }
10537
10538 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10539 {
10540 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10541
10542 u32 *digest = (u32 *) hash_buf->digest;
10543
10544 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10545 | itoa64_to_int (input_buf[ 1]) << 6
10546 | itoa64_to_int (input_buf[ 2]) << 12
10547 | itoa64_to_int (input_buf[ 3]) << 18;
10548 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10549 | itoa64_to_int (input_buf[ 5]) << 6
10550 | itoa64_to_int (input_buf[ 6]) << 12
10551 | itoa64_to_int (input_buf[ 7]) << 18;
10552 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10553 | itoa64_to_int (input_buf[ 9]) << 6
10554 | itoa64_to_int (input_buf[10]) << 12
10555 | itoa64_to_int (input_buf[11]) << 18;
10556 digest[3] = itoa64_to_int (input_buf[12]) << 0
10557 | itoa64_to_int (input_buf[13]) << 6
10558 | itoa64_to_int (input_buf[14]) << 12
10559 | itoa64_to_int (input_buf[15]) << 18;
10560
10561 digest[0] -= MD5M_A;
10562 digest[1] -= MD5M_B;
10563 digest[2] -= MD5M_C;
10564 digest[3] -= MD5M_D;
10565
10566 digest[0] &= 0x00ffffff;
10567 digest[1] &= 0x00ffffff;
10568 digest[2] &= 0x00ffffff;
10569 digest[3] &= 0x00ffffff;
10570
10571 return (PARSER_OK);
10572 }
10573
10574 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10575 {
10576 if (data.opts_type & OPTS_TYPE_ST_HEX)
10577 {
10578 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10579 }
10580 else
10581 {
10582 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10583 }
10584
10585 u32 *digest = (u32 *) hash_buf->digest;
10586
10587 salt_t *salt = hash_buf->salt;
10588
10589 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10590 | itoa64_to_int (input_buf[ 1]) << 6
10591 | itoa64_to_int (input_buf[ 2]) << 12
10592 | itoa64_to_int (input_buf[ 3]) << 18;
10593 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10594 | itoa64_to_int (input_buf[ 5]) << 6
10595 | itoa64_to_int (input_buf[ 6]) << 12
10596 | itoa64_to_int (input_buf[ 7]) << 18;
10597 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10598 | itoa64_to_int (input_buf[ 9]) << 6
10599 | itoa64_to_int (input_buf[10]) << 12
10600 | itoa64_to_int (input_buf[11]) << 18;
10601 digest[3] = itoa64_to_int (input_buf[12]) << 0
10602 | itoa64_to_int (input_buf[13]) << 6
10603 | itoa64_to_int (input_buf[14]) << 12
10604 | itoa64_to_int (input_buf[15]) << 18;
10605
10606 digest[0] -= MD5M_A;
10607 digest[1] -= MD5M_B;
10608 digest[2] -= MD5M_C;
10609 digest[3] -= MD5M_D;
10610
10611 digest[0] &= 0x00ffffff;
10612 digest[1] &= 0x00ffffff;
10613 digest[2] &= 0x00ffffff;
10614 digest[3] &= 0x00ffffff;
10615
10616 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10617
10618 uint salt_len = input_len - 16 - 1;
10619
10620 char *salt_buf = input_buf + 16 + 1;
10621
10622 char *salt_buf_ptr = (char *) salt->salt_buf;
10623
10624 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10625
10626 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10627
10628 salt->salt_len = salt_len;
10629
10630 return (PARSER_OK);
10631 }
10632
10633 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
10634 {
10635 key[0] = (nthash[0] >> 0);
10636 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10637 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10638 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10639 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10640 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10641 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10642 key[7] = (nthash[6] << 1);
10643
10644 key[0] |= 0x01;
10645 key[1] |= 0x01;
10646 key[2] |= 0x01;
10647 key[3] |= 0x01;
10648 key[4] |= 0x01;
10649 key[5] |= 0x01;
10650 key[6] |= 0x01;
10651 key[7] |= 0x01;
10652 }
10653
10654 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10655 {
10656 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10657
10658 u32 *digest = (u32 *) hash_buf->digest;
10659
10660 salt_t *salt = hash_buf->salt;
10661
10662 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10663
10664 /**
10665 * parse line
10666 */
10667
10668 char *user_pos = input_buf;
10669
10670 char *unused_pos = strchr (user_pos, ':');
10671
10672 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10673
10674 uint user_len = unused_pos - user_pos;
10675
10676 if (user_len > 60) return (PARSER_SALT_LENGTH);
10677
10678 unused_pos++;
10679
10680 char *domain_pos = strchr (unused_pos, ':');
10681
10682 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10683
10684 uint unused_len = domain_pos - unused_pos;
10685
10686 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10687
10688 domain_pos++;
10689
10690 char *srvchall_pos = strchr (domain_pos, ':');
10691
10692 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10693
10694 uint domain_len = srvchall_pos - domain_pos;
10695
10696 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10697
10698 srvchall_pos++;
10699
10700 char *hash_pos = strchr (srvchall_pos, ':');
10701
10702 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10703
10704 uint srvchall_len = hash_pos - srvchall_pos;
10705
10706 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10707
10708 hash_pos++;
10709
10710 char *clichall_pos = strchr (hash_pos, ':');
10711
10712 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10713
10714 uint hash_len = clichall_pos - hash_pos;
10715
10716 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10717
10718 clichall_pos++;
10719
10720 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10721
10722 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10723
10724 /**
10725 * store some data for later use
10726 */
10727
10728 netntlm->user_len = user_len * 2;
10729 netntlm->domain_len = domain_len * 2;
10730 netntlm->srvchall_len = srvchall_len / 2;
10731 netntlm->clichall_len = clichall_len / 2;
10732
10733 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10734 char *chall_ptr = (char *) netntlm->chall_buf;
10735
10736 /**
10737 * handle username and domainname
10738 */
10739
10740 for (uint i = 0; i < user_len; i++)
10741 {
10742 *userdomain_ptr++ = user_pos[i];
10743 *userdomain_ptr++ = 0;
10744 }
10745
10746 for (uint i = 0; i < domain_len; i++)
10747 {
10748 *userdomain_ptr++ = domain_pos[i];
10749 *userdomain_ptr++ = 0;
10750 }
10751
10752 /**
10753 * handle server challenge encoding
10754 */
10755
10756 for (uint i = 0; i < srvchall_len; i += 2)
10757 {
10758 const char p0 = srvchall_pos[i + 0];
10759 const char p1 = srvchall_pos[i + 1];
10760
10761 *chall_ptr++ = hex_convert (p1) << 0
10762 | hex_convert (p0) << 4;
10763 }
10764
10765 /**
10766 * handle client challenge encoding
10767 */
10768
10769 for (uint i = 0; i < clichall_len; i += 2)
10770 {
10771 const char p0 = clichall_pos[i + 0];
10772 const char p1 = clichall_pos[i + 1];
10773
10774 *chall_ptr++ = hex_convert (p1) << 0
10775 | hex_convert (p0) << 4;
10776 }
10777
10778 /**
10779 * store data
10780 */
10781
10782 char *salt_buf_ptr = (char *) salt->salt_buf;
10783
10784 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10785
10786 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10787
10788 salt->salt_len = salt_len;
10789
10790 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10791 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10792 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10793 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10794
10795 digest[0] = byte_swap_32 (digest[0]);
10796 digest[1] = byte_swap_32 (digest[1]);
10797 digest[2] = byte_swap_32 (digest[2]);
10798 digest[3] = byte_swap_32 (digest[3]);
10799
10800 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10801
10802 uint digest_tmp[2] = { 0 };
10803
10804 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10805 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
10806
10807 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10808 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10809
10810 /* special case 2: ESS */
10811
10812 if (srvchall_len == 48)
10813 {
10814 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10815 {
10816 uint w[16] = { 0 };
10817
10818 w[ 0] = netntlm->chall_buf[6];
10819 w[ 1] = netntlm->chall_buf[7];
10820 w[ 2] = netntlm->chall_buf[0];
10821 w[ 3] = netntlm->chall_buf[1];
10822 w[ 4] = 0x80;
10823 w[14] = 16 * 8;
10824
10825 uint dgst[4] = { 0 };
10826
10827 dgst[0] = MAGIC_A;
10828 dgst[1] = MAGIC_B;
10829 dgst[2] = MAGIC_C;
10830 dgst[3] = MAGIC_D;
10831
10832 md5_64 (w, dgst);
10833
10834 salt->salt_buf[0] = dgst[0];
10835 salt->salt_buf[1] = dgst[1];
10836 }
10837 }
10838
10839 /* precompute netntlmv1 exploit start */
10840
10841 for (uint i = 0; i < 0x10000; i++)
10842 {
10843 uint key_md4[2] = { i, 0 };
10844 uint key_des[2] = { 0, 0 };
10845
10846 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
10847
10848 uint Kc[16] = { 0 };
10849 uint Kd[16] = { 0 };
10850
10851 _des_keysetup (key_des, Kc, Kd, c_skb);
10852
10853 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10854
10855 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10856
10857 if (data3[0] != digest_tmp[0]) continue;
10858 if (data3[1] != digest_tmp[1]) continue;
10859
10860 salt->salt_buf[2] = i;
10861
10862 salt->salt_len = 24;
10863
10864 break;
10865 }
10866
10867 salt->salt_buf_pc[0] = digest_tmp[0];
10868 salt->salt_buf_pc[1] = digest_tmp[1];
10869
10870 /* precompute netntlmv1 exploit stop */
10871
10872 u32 tt;
10873
10874 IP (digest[0], digest[1], tt);
10875 IP (digest[2], digest[3], tt);
10876
10877 digest[0] = rotr32 (digest[0], 29);
10878 digest[1] = rotr32 (digest[1], 29);
10879 digest[2] = rotr32 (digest[2], 29);
10880 digest[3] = rotr32 (digest[3], 29);
10881
10882 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10883
10884 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
10885 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
10886
10887 return (PARSER_OK);
10888 }
10889
10890 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10891 {
10892 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10893
10894 u32 *digest = (u32 *) hash_buf->digest;
10895
10896 salt_t *salt = hash_buf->salt;
10897
10898 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10899
10900 /**
10901 * parse line
10902 */
10903
10904 char *user_pos = input_buf;
10905
10906 char *unused_pos = strchr (user_pos, ':');
10907
10908 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10909
10910 uint user_len = unused_pos - user_pos;
10911
10912 if (user_len > 60) return (PARSER_SALT_LENGTH);
10913
10914 unused_pos++;
10915
10916 char *domain_pos = strchr (unused_pos, ':');
10917
10918 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10919
10920 uint unused_len = domain_pos - unused_pos;
10921
10922 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10923
10924 domain_pos++;
10925
10926 char *srvchall_pos = strchr (domain_pos, ':');
10927
10928 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10929
10930 uint domain_len = srvchall_pos - domain_pos;
10931
10932 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10933
10934 srvchall_pos++;
10935
10936 char *hash_pos = strchr (srvchall_pos, ':');
10937
10938 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10939
10940 uint srvchall_len = hash_pos - srvchall_pos;
10941
10942 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
10943
10944 hash_pos++;
10945
10946 char *clichall_pos = strchr (hash_pos, ':');
10947
10948 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10949
10950 uint hash_len = clichall_pos - hash_pos;
10951
10952 if (hash_len != 32) return (PARSER_HASH_LENGTH);
10953
10954 clichall_pos++;
10955
10956 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10957
10958 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
10959
10960 if (clichall_len % 2) return (PARSER_SALT_VALUE);
10961
10962 /**
10963 * store some data for later use
10964 */
10965
10966 netntlm->user_len = user_len * 2;
10967 netntlm->domain_len = domain_len * 2;
10968 netntlm->srvchall_len = srvchall_len / 2;
10969 netntlm->clichall_len = clichall_len / 2;
10970
10971 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10972 char *chall_ptr = (char *) netntlm->chall_buf;
10973
10974 /**
10975 * handle username and domainname
10976 */
10977
10978 for (uint i = 0; i < user_len; i++)
10979 {
10980 *userdomain_ptr++ = toupper (user_pos[i]);
10981 *userdomain_ptr++ = 0;
10982 }
10983
10984 for (uint i = 0; i < domain_len; i++)
10985 {
10986 *userdomain_ptr++ = domain_pos[i];
10987 *userdomain_ptr++ = 0;
10988 }
10989
10990 *userdomain_ptr++ = 0x80;
10991
10992 /**
10993 * handle server challenge encoding
10994 */
10995
10996 for (uint i = 0; i < srvchall_len; i += 2)
10997 {
10998 const char p0 = srvchall_pos[i + 0];
10999 const char p1 = srvchall_pos[i + 1];
11000
11001 *chall_ptr++ = hex_convert (p1) << 0
11002 | hex_convert (p0) << 4;
11003 }
11004
11005 /**
11006 * handle client challenge encoding
11007 */
11008
11009 for (uint i = 0; i < clichall_len; i += 2)
11010 {
11011 const char p0 = clichall_pos[i + 0];
11012 const char p1 = clichall_pos[i + 1];
11013
11014 *chall_ptr++ = hex_convert (p1) << 0
11015 | hex_convert (p0) << 4;
11016 }
11017
11018 *chall_ptr++ = 0x80;
11019
11020 /**
11021 * handle hash itself
11022 */
11023
11024 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11025 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11026 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11027 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11028
11029 digest[0] = byte_swap_32 (digest[0]);
11030 digest[1] = byte_swap_32 (digest[1]);
11031 digest[2] = byte_swap_32 (digest[2]);
11032 digest[3] = byte_swap_32 (digest[3]);
11033
11034 /**
11035 * reuse challange data as salt_buf, its the buffer that is most likely unique
11036 */
11037
11038 salt->salt_buf[0] = 0;
11039 salt->salt_buf[1] = 0;
11040 salt->salt_buf[2] = 0;
11041 salt->salt_buf[3] = 0;
11042 salt->salt_buf[4] = 0;
11043 salt->salt_buf[5] = 0;
11044 salt->salt_buf[6] = 0;
11045 salt->salt_buf[7] = 0;
11046
11047 uint *uptr;
11048
11049 uptr = (uint *) netntlm->userdomain_buf;
11050
11051 for (uint i = 0; i < 16; i += 16)
11052 {
11053 md5_64 (uptr, salt->salt_buf);
11054 }
11055
11056 uptr = (uint *) netntlm->chall_buf;
11057
11058 for (uint i = 0; i < 256; i += 16)
11059 {
11060 md5_64 (uptr, salt->salt_buf);
11061 }
11062
11063 salt->salt_len = 16;
11064
11065 return (PARSER_OK);
11066 }
11067
11068 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11069 {
11070 if (data.opts_type & OPTS_TYPE_ST_HEX)
11071 {
11072 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11073 }
11074 else
11075 {
11076 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11077 }
11078
11079 u32 *digest = (u32 *) hash_buf->digest;
11080
11081 salt_t *salt = hash_buf->salt;
11082
11083 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11084 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11085 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11086 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11087
11088 digest[0] = byte_swap_32 (digest[0]);
11089 digest[1] = byte_swap_32 (digest[1]);
11090 digest[2] = byte_swap_32 (digest[2]);
11091 digest[3] = byte_swap_32 (digest[3]);
11092
11093 digest[0] -= MD5M_A;
11094 digest[1] -= MD5M_B;
11095 digest[2] -= MD5M_C;
11096 digest[3] -= MD5M_D;
11097
11098 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11099
11100 uint salt_len = input_len - 32 - 1;
11101
11102 char *salt_buf = input_buf + 32 + 1;
11103
11104 char *salt_buf_ptr = (char *) salt->salt_buf;
11105
11106 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11107
11108 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11109
11110 salt->salt_len = salt_len;
11111
11112 return (PARSER_OK);
11113 }
11114
11115 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11116 {
11117 if (data.opts_type & OPTS_TYPE_ST_HEX)
11118 {
11119 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11120 }
11121 else
11122 {
11123 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11124 }
11125
11126 u32 *digest = (u32 *) hash_buf->digest;
11127
11128 salt_t *salt = hash_buf->salt;
11129
11130 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11131 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11132 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11133 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11134
11135 digest[0] = byte_swap_32 (digest[0]);
11136 digest[1] = byte_swap_32 (digest[1]);
11137 digest[2] = byte_swap_32 (digest[2]);
11138 digest[3] = byte_swap_32 (digest[3]);
11139
11140 digest[0] -= MD5M_A;
11141 digest[1] -= MD5M_B;
11142 digest[2] -= MD5M_C;
11143 digest[3] -= MD5M_D;
11144
11145 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11146
11147 uint salt_len = input_len - 32 - 1;
11148
11149 char *salt_buf = input_buf + 32 + 1;
11150
11151 char *salt_buf_ptr = (char *) salt->salt_buf;
11152
11153 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11154
11155 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11156
11157 salt->salt_len = salt_len;
11158
11159 return (PARSER_OK);
11160 }
11161
11162 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11163 {
11164 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11165
11166 u32 *digest = (u32 *) hash_buf->digest;
11167
11168 salt_t *salt = hash_buf->salt;
11169
11170 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11171 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11172 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11173 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11174
11175 digest[0] = byte_swap_32 (digest[0]);
11176 digest[1] = byte_swap_32 (digest[1]);
11177 digest[2] = byte_swap_32 (digest[2]);
11178 digest[3] = byte_swap_32 (digest[3]);
11179
11180 digest[0] -= MD5M_A;
11181 digest[1] -= MD5M_B;
11182 digest[2] -= MD5M_C;
11183 digest[3] -= MD5M_D;
11184
11185 /**
11186 * This is a virtual salt. While the algorithm is basically not salted
11187 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11188 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11189 */
11190
11191 char *salt_buf_ptr = (char *) salt->salt_buf;
11192
11193 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11194
11195 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11196
11197 salt->salt_len = salt_len;
11198
11199 return (PARSER_OK);
11200 }
11201
11202 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11203 {
11204 if (data.opts_type & OPTS_TYPE_ST_HEX)
11205 {
11206 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11207 }
11208 else
11209 {
11210 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11211 }
11212
11213 u32 *digest = (u32 *) hash_buf->digest;
11214
11215 salt_t *salt = hash_buf->salt;
11216
11217 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11218 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11219 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11220 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11221
11222 digest[0] = byte_swap_32 (digest[0]);
11223 digest[1] = byte_swap_32 (digest[1]);
11224 digest[2] = byte_swap_32 (digest[2]);
11225 digest[3] = byte_swap_32 (digest[3]);
11226
11227 digest[0] -= MD5M_A;
11228 digest[1] -= MD5M_B;
11229 digest[2] -= MD5M_C;
11230 digest[3] -= MD5M_D;
11231
11232 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11233
11234 uint salt_len = input_len - 32 - 1;
11235
11236 char *salt_buf = input_buf + 32 + 1;
11237
11238 char *salt_buf_ptr = (char *) salt->salt_buf;
11239
11240 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11241
11242 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11243
11244 salt->salt_len = salt_len;
11245
11246 return (PARSER_OK);
11247 }
11248
11249 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11250 {
11251 if (data.opts_type & OPTS_TYPE_ST_HEX)
11252 {
11253 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11254 }
11255 else
11256 {
11257 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11258 }
11259
11260 u32 *digest = (u32 *) hash_buf->digest;
11261
11262 salt_t *salt = hash_buf->salt;
11263
11264 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11265 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11266 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11267 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11268
11269 digest[0] = byte_swap_32 (digest[0]);
11270 digest[1] = byte_swap_32 (digest[1]);
11271 digest[2] = byte_swap_32 (digest[2]);
11272 digest[3] = byte_swap_32 (digest[3]);
11273
11274 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11275
11276 uint salt_len = input_len - 32 - 1;
11277
11278 char *salt_buf = input_buf + 32 + 1;
11279
11280 char *salt_buf_ptr = (char *) salt->salt_buf;
11281
11282 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11283
11284 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11285
11286 salt->salt_len = salt_len;
11287
11288 return (PARSER_OK);
11289 }
11290
11291 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11292 {
11293 if (data.opts_type & OPTS_TYPE_ST_HEX)
11294 {
11295 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11296 }
11297 else
11298 {
11299 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11300 }
11301
11302 u32 *digest = (u32 *) hash_buf->digest;
11303
11304 salt_t *salt = hash_buf->salt;
11305
11306 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11307 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11308 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11309 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11310
11311 digest[0] = byte_swap_32 (digest[0]);
11312 digest[1] = byte_swap_32 (digest[1]);
11313 digest[2] = byte_swap_32 (digest[2]);
11314 digest[3] = byte_swap_32 (digest[3]);
11315
11316 digest[0] -= MD4M_A;
11317 digest[1] -= MD4M_B;
11318 digest[2] -= MD4M_C;
11319 digest[3] -= MD4M_D;
11320
11321 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11322
11323 uint salt_len = input_len - 32 - 1;
11324
11325 char *salt_buf = input_buf + 32 + 1;
11326
11327 char *salt_buf_ptr = (char *) salt->salt_buf;
11328
11329 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11330
11331 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11332
11333 salt->salt_len = salt_len;
11334
11335 return (PARSER_OK);
11336 }
11337
11338 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11339 {
11340 if (data.opts_type & OPTS_TYPE_ST_HEX)
11341 {
11342 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11343 }
11344 else
11345 {
11346 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11347 }
11348
11349 u32 *digest = (u32 *) hash_buf->digest;
11350
11351 salt_t *salt = hash_buf->salt;
11352
11353 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11354 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11355 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11356 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11357
11358 digest[0] = byte_swap_32 (digest[0]);
11359 digest[1] = byte_swap_32 (digest[1]);
11360 digest[2] = byte_swap_32 (digest[2]);
11361 digest[3] = byte_swap_32 (digest[3]);
11362
11363 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11364
11365 uint salt_len = input_len - 32 - 1;
11366
11367 char *salt_buf = input_buf + 32 + 1;
11368
11369 uint salt_pc_block[16] = { 0 };
11370
11371 char *salt_pc_block_ptr = (char *) salt_pc_block;
11372
11373 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11374
11375 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11376
11377 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11378
11379 salt_pc_block[14] = salt_len * 8;
11380
11381 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
11382
11383 md5_64 (salt_pc_block, salt_pc_digest);
11384
11385 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11386 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11387 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11388 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11389
11390 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11391
11392 memcpy (salt_buf_ptr, salt_buf, salt_len);
11393
11394 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11395
11396 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11397 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11398 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11399 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11400
11401 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11402
11403 return (PARSER_OK);
11404 }
11405
11406 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11407 {
11408 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11409
11410 u32 *digest = (u32 *) hash_buf->digest;
11411
11412 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11413 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11414 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11415 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11416 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11417
11418 digest[0] -= SHA1M_A;
11419 digest[1] -= SHA1M_B;
11420 digest[2] -= SHA1M_C;
11421 digest[3] -= SHA1M_D;
11422 digest[4] -= SHA1M_E;
11423
11424 return (PARSER_OK);
11425 }
11426
11427 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11428 {
11429 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11430
11431 u32 *digest = (u32 *) hash_buf->digest;
11432
11433 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11434 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11435 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11436 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11437 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11438
11439 return (PARSER_OK);
11440 }
11441
11442 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11443 {
11444 if (data.opts_type & OPTS_TYPE_ST_HEX)
11445 {
11446 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11447 }
11448 else
11449 {
11450 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11451 }
11452
11453 u32 *digest = (u32 *) hash_buf->digest;
11454
11455 salt_t *salt = hash_buf->salt;
11456
11457 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11458 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11459 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11460 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11461 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11462
11463 digest[0] -= SHA1M_A;
11464 digest[1] -= SHA1M_B;
11465 digest[2] -= SHA1M_C;
11466 digest[3] -= SHA1M_D;
11467 digest[4] -= SHA1M_E;
11468
11469 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11470
11471 uint salt_len = input_len - 40 - 1;
11472
11473 char *salt_buf = input_buf + 40 + 1;
11474
11475 char *salt_buf_ptr = (char *) salt->salt_buf;
11476
11477 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11478
11479 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11480
11481 salt->salt_len = salt_len;
11482
11483 return (PARSER_OK);
11484 }
11485
11486 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11487 {
11488 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11489
11490 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11491
11492 u32 *digest = (u32 *) hash_buf->digest;
11493
11494 u8 tmp_buf[100] = { 0 };
11495
11496 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
11497
11498 memcpy (digest, tmp_buf, 20);
11499
11500 digest[0] = byte_swap_32 (digest[0]);
11501 digest[1] = byte_swap_32 (digest[1]);
11502 digest[2] = byte_swap_32 (digest[2]);
11503 digest[3] = byte_swap_32 (digest[3]);
11504 digest[4] = byte_swap_32 (digest[4]);
11505
11506 digest[0] -= SHA1M_A;
11507 digest[1] -= SHA1M_B;
11508 digest[2] -= SHA1M_C;
11509 digest[3] -= SHA1M_D;
11510 digest[4] -= SHA1M_E;
11511
11512 return (PARSER_OK);
11513 }
11514
11515 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11516 {
11517 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11518
11519 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11520
11521 u32 *digest = (u32 *) hash_buf->digest;
11522
11523 salt_t *salt = hash_buf->salt;
11524
11525 u8 tmp_buf[100] = { 0 };
11526
11527 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
11528
11529 memcpy (digest, tmp_buf, 20);
11530
11531 salt->salt_len = tmp_len - 20;
11532
11533 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11534
11535 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11536 {
11537 char *ptr = (char *) salt->salt_buf;
11538
11539 ptr[salt->salt_len] = 0x80;
11540 }
11541
11542 digest[0] = byte_swap_32 (digest[0]);
11543 digest[1] = byte_swap_32 (digest[1]);
11544 digest[2] = byte_swap_32 (digest[2]);
11545 digest[3] = byte_swap_32 (digest[3]);
11546 digest[4] = byte_swap_32 (digest[4]);
11547
11548 digest[0] -= SHA1M_A;
11549 digest[1] -= SHA1M_B;
11550 digest[2] -= SHA1M_C;
11551 digest[3] -= SHA1M_D;
11552 digest[4] -= SHA1M_E;
11553
11554 return (PARSER_OK);
11555 }
11556
11557 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11558 {
11559 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11560
11561 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11562
11563 u32 *digest = (u32 *) hash_buf->digest;
11564
11565 salt_t *salt = hash_buf->salt;
11566
11567 char *salt_buf = input_buf + 6;
11568
11569 uint salt_len = 8;
11570
11571 char *salt_buf_ptr = (char *) salt->salt_buf;
11572
11573 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11574
11575 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11576
11577 salt->salt_len = salt_len;
11578
11579 char *hash_pos = input_buf + 6 + 8 + 40;
11580
11581 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11582 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11583 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11584 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11585 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11586
11587 digest[0] -= SHA1M_A;
11588 digest[1] -= SHA1M_B;
11589 digest[2] -= SHA1M_C;
11590 digest[3] -= SHA1M_D;
11591 digest[4] -= SHA1M_E;
11592
11593 return (PARSER_OK);
11594 }
11595
11596 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11597 {
11598 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11599
11600 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11601
11602 u32 *digest = (u32 *) hash_buf->digest;
11603
11604 salt_t *salt = hash_buf->salt;
11605
11606 char *salt_buf = input_buf + 6;
11607
11608 uint salt_len = 8;
11609
11610 char *salt_buf_ptr = (char *) salt->salt_buf;
11611
11612 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11613
11614 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11615
11616 salt->salt_len = salt_len;
11617
11618 char *hash_pos = input_buf + 6 + 8;
11619
11620 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11621 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11622 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11623 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11624 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11625
11626 digest[0] -= SHA1M_A;
11627 digest[1] -= SHA1M_B;
11628 digest[2] -= SHA1M_C;
11629 digest[3] -= SHA1M_D;
11630 digest[4] -= SHA1M_E;
11631
11632 return (PARSER_OK);
11633 }
11634
11635 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11636 {
11637 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11638
11639 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11640
11641 u64 *digest = (u64 *) hash_buf->digest;
11642
11643 salt_t *salt = hash_buf->salt;
11644
11645 char *salt_buf = input_buf + 6;
11646
11647 uint salt_len = 8;
11648
11649 char *salt_buf_ptr = (char *) salt->salt_buf;
11650
11651 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11652
11653 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11654
11655 salt->salt_len = salt_len;
11656
11657 char *hash_pos = input_buf + 6 + 8;
11658
11659 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
11660 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
11661 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
11662 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
11663 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
11664 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
11665 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
11666 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
11667
11668 digest[0] -= SHA512M_A;
11669 digest[1] -= SHA512M_B;
11670 digest[2] -= SHA512M_C;
11671 digest[3] -= SHA512M_D;
11672 digest[4] -= SHA512M_E;
11673 digest[5] -= SHA512M_F;
11674 digest[6] -= SHA512M_G;
11675 digest[7] -= SHA512M_H;
11676
11677 return (PARSER_OK);
11678 }
11679
11680 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11681 {
11682 if (data.opts_type & OPTS_TYPE_ST_HEX)
11683 {
11684 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11685 }
11686 else
11687 {
11688 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11689 }
11690
11691 u32 *digest = (u32 *) hash_buf->digest;
11692
11693 salt_t *salt = hash_buf->salt;
11694
11695 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11696 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11697 digest[2] = 0;
11698 digest[3] = 0;
11699
11700 digest[0] = byte_swap_32 (digest[0]);
11701 digest[1] = byte_swap_32 (digest[1]);
11702
11703 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11704
11705 uint salt_len = input_len - 16 - 1;
11706
11707 char *salt_buf = input_buf + 16 + 1;
11708
11709 char *salt_buf_ptr = (char *) salt->salt_buf;
11710
11711 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11712
11713 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11714
11715 salt->salt_len = salt_len;
11716
11717 return (PARSER_OK);
11718 }
11719
11720 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11721 {
11722 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11723
11724 u32 *digest = (u32 *) hash_buf->digest;
11725
11726 salt_t *salt = hash_buf->salt;
11727
11728 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11729 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11730 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11731 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11732 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11733
11734 digest[0] -= SHA1M_A;
11735 digest[1] -= SHA1M_B;
11736 digest[2] -= SHA1M_C;
11737 digest[3] -= SHA1M_D;
11738 digest[4] -= SHA1M_E;
11739
11740 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11741
11742 uint salt_len = input_len - 40 - 1;
11743
11744 char *salt_buf = input_buf + 40 + 1;
11745
11746 char *salt_buf_ptr = (char *) salt->salt_buf;
11747
11748 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11749
11750 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11751
11752 salt->salt_len = salt_len;
11753
11754 return (PARSER_OK);
11755 }
11756
11757 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11758 {
11759 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11760
11761 u32 *digest = (u32 *) hash_buf->digest;
11762
11763 salt_t *salt = hash_buf->salt;
11764
11765 char *hash_pos = input_buf;
11766
11767 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11768 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11769 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
11770 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
11771 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
11772 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
11773 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
11774 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
11775 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
11776 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
11777 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
11778 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
11779 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
11780 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
11781 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
11782 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
11783
11784 char *salt_pos = input_buf + 128;
11785
11786 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
11787 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
11788 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
11789 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
11790
11791 salt->salt_iter = ROUNDS_ORACLET - 1;
11792 salt->salt_len = 16;
11793
11794 return (PARSER_OK);
11795 }
11796
11797 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11798 {
11799 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11800
11801 u32 *digest = (u32 *) hash_buf->digest;
11802
11803 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11804 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11805 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11806 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11807 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11808 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11809 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11810 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11811
11812 digest[0] -= SHA256M_A;
11813 digest[1] -= SHA256M_B;
11814 digest[2] -= SHA256M_C;
11815 digest[3] -= SHA256M_D;
11816 digest[4] -= SHA256M_E;
11817 digest[5] -= SHA256M_F;
11818 digest[6] -= SHA256M_G;
11819 digest[7] -= SHA256M_H;
11820
11821 return (PARSER_OK);
11822 }
11823
11824 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11825 {
11826 if (data.opts_type & OPTS_TYPE_ST_HEX)
11827 {
11828 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11829 }
11830 else
11831 {
11832 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11833 }
11834
11835 u32 *digest = (u32 *) hash_buf->digest;
11836
11837 salt_t *salt = hash_buf->salt;
11838
11839 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11840 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11841 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11842 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11843 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11844 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11845 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11846 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11847
11848 digest[0] -= SHA256M_A;
11849 digest[1] -= SHA256M_B;
11850 digest[2] -= SHA256M_C;
11851 digest[3] -= SHA256M_D;
11852 digest[4] -= SHA256M_E;
11853 digest[5] -= SHA256M_F;
11854 digest[6] -= SHA256M_G;
11855 digest[7] -= SHA256M_H;
11856
11857 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11858
11859 uint salt_len = input_len - 64 - 1;
11860
11861 char *salt_buf = input_buf + 64 + 1;
11862
11863 char *salt_buf_ptr = (char *) salt->salt_buf;
11864
11865 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11866
11867 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11868
11869 salt->salt_len = salt_len;
11870
11871 return (PARSER_OK);
11872 }
11873
11874 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11875 {
11876 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11877
11878 u64 *digest = (u64 *) hash_buf->digest;
11879
11880 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11881 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11882 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11883 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11884 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11885 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11886 digest[6] = 0;
11887 digest[7] = 0;
11888
11889 digest[0] -= SHA384M_A;
11890 digest[1] -= SHA384M_B;
11891 digest[2] -= SHA384M_C;
11892 digest[3] -= SHA384M_D;
11893 digest[4] -= SHA384M_E;
11894 digest[5] -= SHA384M_F;
11895 digest[6] -= 0;
11896 digest[7] -= 0;
11897
11898 return (PARSER_OK);
11899 }
11900
11901 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11902 {
11903 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
11904
11905 u64 *digest = (u64 *) hash_buf->digest;
11906
11907 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11908 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11909 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11910 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11911 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11912 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11913 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11914 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11915
11916 digest[0] -= SHA512M_A;
11917 digest[1] -= SHA512M_B;
11918 digest[2] -= SHA512M_C;
11919 digest[3] -= SHA512M_D;
11920 digest[4] -= SHA512M_E;
11921 digest[5] -= SHA512M_F;
11922 digest[6] -= SHA512M_G;
11923 digest[7] -= SHA512M_H;
11924
11925 return (PARSER_OK);
11926 }
11927
11928 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11929 {
11930 if (data.opts_type & OPTS_TYPE_ST_HEX)
11931 {
11932 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
11933 }
11934 else
11935 {
11936 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
11937 }
11938
11939 u64 *digest = (u64 *) hash_buf->digest;
11940
11941 salt_t *salt = hash_buf->salt;
11942
11943 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11944 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11945 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11946 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11947 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11948 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11949 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11950 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11951
11952 digest[0] -= SHA512M_A;
11953 digest[1] -= SHA512M_B;
11954 digest[2] -= SHA512M_C;
11955 digest[3] -= SHA512M_D;
11956 digest[4] -= SHA512M_E;
11957 digest[5] -= SHA512M_F;
11958 digest[6] -= SHA512M_G;
11959 digest[7] -= SHA512M_H;
11960
11961 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11962
11963 uint salt_len = input_len - 128 - 1;
11964
11965 char *salt_buf = input_buf + 128 + 1;
11966
11967 char *salt_buf_ptr = (char *) salt->salt_buf;
11968
11969 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11970
11971 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11972
11973 salt->salt_len = salt_len;
11974
11975 return (PARSER_OK);
11976 }
11977
11978 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11979 {
11980 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
11981
11982 u64 *digest = (u64 *) hash_buf->digest;
11983
11984 salt_t *salt = hash_buf->salt;
11985
11986 char *salt_pos = input_buf + 3;
11987
11988 uint iterations_len = 0;
11989
11990 if (memcmp (salt_pos, "rounds=", 7) == 0)
11991 {
11992 salt_pos += 7;
11993
11994 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
11995
11996 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
11997 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
11998
11999 salt_pos[0] = 0x0;
12000
12001 salt->salt_iter = atoi (salt_pos - iterations_len);
12002
12003 salt_pos += 1;
12004
12005 iterations_len += 8;
12006 }
12007 else
12008 {
12009 salt->salt_iter = ROUNDS_SHA512CRYPT;
12010 }
12011
12012 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12013
12014 char *hash_pos = strchr (salt_pos, '$');
12015
12016 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12017
12018 uint salt_len = hash_pos - salt_pos;
12019
12020 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12021
12022 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12023
12024 salt->salt_len = salt_len;
12025
12026 hash_pos++;
12027
12028 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12029
12030 return (PARSER_OK);
12031 }
12032
12033 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12034 {
12035 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12036
12037 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12038
12039 u64 *digest = (u64 *) hash_buf->digest;
12040
12041 salt_t *salt = hash_buf->salt;
12042
12043 uint keccak_mdlen = input_len / 2;
12044
12045 for (uint i = 0; i < keccak_mdlen / 8; i++)
12046 {
12047 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12048
12049 digest[i] = byte_swap_64 (digest[i]);
12050 }
12051
12052 salt->keccak_mdlen = keccak_mdlen;
12053
12054 return (PARSER_OK);
12055 }
12056
12057 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12058 {
12059 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12060
12061 u32 *digest = (u32 *) hash_buf->digest;
12062
12063 salt_t *salt = hash_buf->salt;
12064
12065 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12066
12067 /**
12068 * Parse that strange long line
12069 */
12070
12071 char *in_off[9];
12072
12073 size_t in_len[9] = { 0 };
12074
12075 in_off[0] = strtok (input_buf, ":");
12076
12077 in_len[0] = strlen (in_off[0]);
12078
12079 size_t i;
12080
12081 for (i = 1; i < 9; i++)
12082 {
12083 in_off[i] = strtok (NULL, ":");
12084
12085 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12086
12087 in_len[i] = strlen (in_off[i]);
12088 }
12089
12090 char *ptr = (char *) ikepsk->msg_buf;
12091
12092 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12093 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12094 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12095 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12096 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12097 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12098
12099 *ptr = 0x80;
12100
12101 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12102
12103 ptr = (char *) ikepsk->nr_buf;
12104
12105 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12106 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12107
12108 *ptr = 0x80;
12109
12110 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12111
12112 /**
12113 * Store to database
12114 */
12115
12116 ptr = in_off[8];
12117
12118 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12119 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12120 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12121 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12122
12123 digest[0] = byte_swap_32 (digest[0]);
12124 digest[1] = byte_swap_32 (digest[1]);
12125 digest[2] = byte_swap_32 (digest[2]);
12126 digest[3] = byte_swap_32 (digest[3]);
12127
12128 salt->salt_len = 32;
12129
12130 salt->salt_buf[0] = ikepsk->nr_buf[0];
12131 salt->salt_buf[1] = ikepsk->nr_buf[1];
12132 salt->salt_buf[2] = ikepsk->nr_buf[2];
12133 salt->salt_buf[3] = ikepsk->nr_buf[3];
12134 salt->salt_buf[4] = ikepsk->nr_buf[4];
12135 salt->salt_buf[5] = ikepsk->nr_buf[5];
12136 salt->salt_buf[6] = ikepsk->nr_buf[6];
12137 salt->salt_buf[7] = ikepsk->nr_buf[7];
12138
12139 return (PARSER_OK);
12140 }
12141
12142 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12143 {
12144 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12145
12146 u32 *digest = (u32 *) hash_buf->digest;
12147
12148 salt_t *salt = hash_buf->salt;
12149
12150 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12151
12152 /**
12153 * Parse that strange long line
12154 */
12155
12156 char *in_off[9];
12157
12158 size_t in_len[9] = { 0 };
12159
12160 in_off[0] = strtok (input_buf, ":");
12161
12162 in_len[0] = strlen (in_off[0]);
12163
12164 size_t i;
12165
12166 for (i = 1; i < 9; i++)
12167 {
12168 in_off[i] = strtok (NULL, ":");
12169
12170 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12171
12172 in_len[i] = strlen (in_off[i]);
12173 }
12174
12175 char *ptr = (char *) ikepsk->msg_buf;
12176
12177 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12178 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12179 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12180 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12181 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12182 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12183
12184 *ptr = 0x80;
12185
12186 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12187
12188 ptr = (char *) ikepsk->nr_buf;
12189
12190 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12191 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12192
12193 *ptr = 0x80;
12194
12195 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12196
12197 /**
12198 * Store to database
12199 */
12200
12201 ptr = in_off[8];
12202
12203 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12204 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12205 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12206 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12207 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12208
12209 salt->salt_len = 32;
12210
12211 salt->salt_buf[0] = ikepsk->nr_buf[0];
12212 salt->salt_buf[1] = ikepsk->nr_buf[1];
12213 salt->salt_buf[2] = ikepsk->nr_buf[2];
12214 salt->salt_buf[3] = ikepsk->nr_buf[3];
12215 salt->salt_buf[4] = ikepsk->nr_buf[4];
12216 salt->salt_buf[5] = ikepsk->nr_buf[5];
12217 salt->salt_buf[6] = ikepsk->nr_buf[6];
12218 salt->salt_buf[7] = ikepsk->nr_buf[7];
12219
12220 return (PARSER_OK);
12221 }
12222
12223 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12224 {
12225 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12226
12227 u32 *digest = (u32 *) hash_buf->digest;
12228
12229 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12230 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12231 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12232 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12233 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12234
12235 digest[0] = byte_swap_32 (digest[0]);
12236 digest[1] = byte_swap_32 (digest[1]);
12237 digest[2] = byte_swap_32 (digest[2]);
12238 digest[3] = byte_swap_32 (digest[3]);
12239 digest[4] = byte_swap_32 (digest[4]);
12240
12241 return (PARSER_OK);
12242 }
12243
12244 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12245 {
12246 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12247
12248 u32 *digest = (u32 *) hash_buf->digest;
12249
12250 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12251 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12252 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12253 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12254 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12255 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12256 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12257 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12258 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12259 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12260 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12261 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12262 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12263 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12264 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12265 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12266
12267 return (PARSER_OK);
12268 }
12269
12270 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12271 {
12272 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12273
12274 u32 *digest = (u32 *) hash_buf->digest;
12275
12276 salt_t *salt = hash_buf->salt;
12277
12278 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12279 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12280 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12281 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12282 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12283
12284 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12285
12286 uint salt_len = input_len - 40 - 1;
12287
12288 char *salt_buf = input_buf + 40 + 1;
12289
12290 char *salt_buf_ptr = (char *) salt->salt_buf;
12291
12292 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12293
12294 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12295
12296 salt->salt_len = salt_len;
12297
12298 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12299
12300 return (PARSER_OK);
12301 }
12302
12303 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12304 {
12305 u32 *digest = (u32 *) hash_buf->digest;
12306
12307 salt_t *salt = hash_buf->salt;
12308
12309 tc_t *tc = (tc_t *) hash_buf->esalt;
12310
12311 if (input_len == 0)
12312 {
12313 log_error ("TrueCrypt container not specified");
12314
12315 exit (-1);
12316 }
12317
12318 FILE *fp = fopen (input_buf, "rb");
12319
12320 if (fp == NULL)
12321 {
12322 log_error ("%s: %s", input_buf, strerror (errno));
12323
12324 exit (-1);
12325 }
12326
12327 char buf[512] = { 0 };
12328
12329 int n = fread (buf, 1, sizeof (buf), fp);
12330
12331 fclose (fp);
12332
12333 if (n != 512) return (PARSER_TC_FILE_SIZE);
12334
12335 memcpy (tc->salt_buf, buf, 64);
12336
12337 memcpy (tc->data_buf, buf + 64, 512 - 64);
12338
12339 salt->salt_buf[0] = tc->salt_buf[0];
12340
12341 salt->salt_len = 4;
12342
12343 salt->salt_iter = 1000 - 1;
12344
12345 digest[0] = tc->data_buf[0];
12346
12347 return (PARSER_OK);
12348 }
12349
12350 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12351 {
12352 u32 *digest = (u32 *) hash_buf->digest;
12353
12354 salt_t *salt = hash_buf->salt;
12355
12356 tc_t *tc = (tc_t *) hash_buf->esalt;
12357
12358 if (input_len == 0)
12359 {
12360 log_error ("TrueCrypt container not specified");
12361
12362 exit (-1);
12363 }
12364
12365 FILE *fp = fopen (input_buf, "rb");
12366
12367 if (fp == NULL)
12368 {
12369 log_error ("%s: %s", input_buf, strerror (errno));
12370
12371 exit (-1);
12372 }
12373
12374 char buf[512] = { 0 };
12375
12376 int n = fread (buf, 1, sizeof (buf), fp);
12377
12378 fclose (fp);
12379
12380 if (n != 512) return (PARSER_TC_FILE_SIZE);
12381
12382 memcpy (tc->salt_buf, buf, 64);
12383
12384 memcpy (tc->data_buf, buf + 64, 512 - 64);
12385
12386 salt->salt_buf[0] = tc->salt_buf[0];
12387
12388 salt->salt_len = 4;
12389
12390 salt->salt_iter = 2000 - 1;
12391
12392 digest[0] = tc->data_buf[0];
12393
12394 return (PARSER_OK);
12395 }
12396
12397 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12398 {
12399 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12400
12401 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12402
12403 u32 *digest = (u32 *) hash_buf->digest;
12404
12405 salt_t *salt = hash_buf->salt;
12406
12407 char *salt_pos = input_buf + 6;
12408
12409 char *hash_pos = strchr (salt_pos, '$');
12410
12411 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12412
12413 uint salt_len = hash_pos - salt_pos;
12414
12415 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12416
12417 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12418
12419 salt->salt_len = salt_len;
12420
12421 salt->salt_iter = 1000;
12422
12423 hash_pos++;
12424
12425 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12426
12427 return (PARSER_OK);
12428 }
12429
12430 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12431 {
12432 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12433
12434 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12435
12436 u32 *digest = (u32 *) hash_buf->digest;
12437
12438 salt_t *salt = hash_buf->salt;
12439
12440 char *iter_pos = input_buf + 7;
12441
12442 char *salt_pos = strchr (iter_pos, '$');
12443
12444 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12445
12446 salt_pos++;
12447
12448 char *hash_pos = strchr (salt_pos, '$');
12449
12450 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12451
12452 uint salt_len = hash_pos - salt_pos;
12453
12454 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12455
12456 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12457
12458 salt->salt_len = salt_len;
12459
12460 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12461
12462 salt->salt_sign[0] = atoi (salt_iter);
12463
12464 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12465
12466 hash_pos++;
12467
12468 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12469
12470 digest[0] = byte_swap_32 (digest[0]);
12471 digest[1] = byte_swap_32 (digest[1]);
12472 digest[2] = byte_swap_32 (digest[2]);
12473 digest[3] = byte_swap_32 (digest[3]);
12474 digest[4] = byte_swap_32 (digest[4]);
12475
12476 return (PARSER_OK);
12477 }
12478
12479 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12480 {
12481 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12482
12483 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12484
12485 u32 *digest = (u32 *) hash_buf->digest;
12486
12487 salt_t *salt = hash_buf->salt;
12488
12489 char *iter_pos = input_buf + 9;
12490
12491 char *salt_pos = strchr (iter_pos, '$');
12492
12493 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12494
12495 salt_pos++;
12496
12497 char *hash_pos = strchr (salt_pos, '$');
12498
12499 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12500
12501 uint salt_len = hash_pos - salt_pos;
12502
12503 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12504
12505 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12506
12507 salt->salt_len = salt_len;
12508
12509 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12510
12511 salt->salt_sign[0] = atoi (salt_iter);
12512
12513 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12514
12515 hash_pos++;
12516
12517 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12518
12519 digest[0] = byte_swap_32 (digest[0]);
12520 digest[1] = byte_swap_32 (digest[1]);
12521 digest[2] = byte_swap_32 (digest[2]);
12522 digest[3] = byte_swap_32 (digest[3]);
12523 digest[4] = byte_swap_32 (digest[4]);
12524 digest[5] = byte_swap_32 (digest[5]);
12525 digest[6] = byte_swap_32 (digest[6]);
12526 digest[7] = byte_swap_32 (digest[7]);
12527
12528 return (PARSER_OK);
12529 }
12530
12531 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12532 {
12533 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12534
12535 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12536
12537 u64 *digest = (u64 *) hash_buf->digest;
12538
12539 salt_t *salt = hash_buf->salt;
12540
12541 char *iter_pos = input_buf + 9;
12542
12543 char *salt_pos = strchr (iter_pos, '$');
12544
12545 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12546
12547 salt_pos++;
12548
12549 char *hash_pos = strchr (salt_pos, '$');
12550
12551 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12552
12553 uint salt_len = hash_pos - salt_pos;
12554
12555 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12556
12557 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12558
12559 salt->salt_len = salt_len;
12560
12561 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12562
12563 salt->salt_sign[0] = atoi (salt_iter);
12564
12565 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12566
12567 hash_pos++;
12568
12569 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12570
12571 digest[0] = byte_swap_64 (digest[0]);
12572 digest[1] = byte_swap_64 (digest[1]);
12573 digest[2] = byte_swap_64 (digest[2]);
12574 digest[3] = byte_swap_64 (digest[3]);
12575 digest[4] = byte_swap_64 (digest[4]);
12576 digest[5] = byte_swap_64 (digest[5]);
12577 digest[6] = byte_swap_64 (digest[6]);
12578 digest[7] = byte_swap_64 (digest[7]);
12579
12580 return (PARSER_OK);
12581 }
12582
12583 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12584 {
12585 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12586
12587 u32 *digest = (u32 *) hash_buf->digest;
12588
12589 salt_t *salt = hash_buf->salt;
12590
12591 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12592
12593 /**
12594 * parse line
12595 */
12596
12597 char *iterations_pos = input_buf;
12598
12599 char *saltbuf_pos = strchr (iterations_pos, ':');
12600
12601 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12602
12603 uint iterations_len = saltbuf_pos - iterations_pos;
12604
12605 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12606
12607 saltbuf_pos++;
12608
12609 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12610
12611 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12612
12613 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12614
12615 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12616
12617 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12618
12619 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12620
12621 cipherbuf_pos++;
12622
12623 /**
12624 * pbkdf2 iterations
12625 */
12626
12627 salt->salt_iter = atoi (iterations_pos) - 1;
12628
12629 /**
12630 * handle salt encoding
12631 */
12632
12633 char *saltbuf_ptr = (char *) salt->salt_buf;
12634
12635 for (uint i = 0; i < saltbuf_len; i += 2)
12636 {
12637 const char p0 = saltbuf_pos[i + 0];
12638 const char p1 = saltbuf_pos[i + 1];
12639
12640 *saltbuf_ptr++ = hex_convert (p1) << 0
12641 | hex_convert (p0) << 4;
12642 }
12643
12644 salt->salt_len = saltbuf_len / 2;
12645
12646 /**
12647 * handle cipher encoding
12648 */
12649
12650 uint *tmp = (uint *) mymalloc (32);
12651
12652 char *cipherbuf_ptr = (char *) tmp;
12653
12654 for (uint i = 2016; i < cipherbuf_len; i += 2)
12655 {
12656 const char p0 = cipherbuf_pos[i + 0];
12657 const char p1 = cipherbuf_pos[i + 1];
12658
12659 *cipherbuf_ptr++ = hex_convert (p1) << 0
12660 | hex_convert (p0) << 4;
12661 }
12662
12663 // iv is stored at salt_buf 4 (length 16)
12664 // data is stored at salt_buf 8 (length 16)
12665
12666 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12667 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12668 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12669 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12670
12671 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12672 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12673 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12674 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12675
12676 free (tmp);
12677
12678 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12679 {
12680 const char p0 = cipherbuf_pos[j + 0];
12681 const char p1 = cipherbuf_pos[j + 1];
12682
12683 agilekey->cipher[i] = hex_convert (p1) << 0
12684 | hex_convert (p0) << 4;
12685 }
12686
12687 /**
12688 * digest buf
12689 */
12690
12691 digest[0] = 0x10101010;
12692 digest[1] = 0x10101010;
12693 digest[2] = 0x10101010;
12694 digest[3] = 0x10101010;
12695
12696 return (PARSER_OK);
12697 }
12698
12699 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12700 {
12701 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12702
12703 u32 *digest = (u32 *) hash_buf->digest;
12704
12705 salt_t *salt = hash_buf->salt;
12706
12707 char *hashbuf_pos = input_buf;
12708
12709 char *iterations_pos = strchr (hashbuf_pos, ':');
12710
12711 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12712
12713 uint hash_len = iterations_pos - hashbuf_pos;
12714
12715 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12716
12717 iterations_pos++;
12718
12719 char *saltbuf_pos = strchr (iterations_pos, ':');
12720
12721 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12722
12723 uint iterations_len = saltbuf_pos - iterations_pos;
12724
12725 saltbuf_pos++;
12726
12727 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12728
12729 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12730
12731 char *salt_buf_ptr = (char *) salt->salt_buf;
12732
12733 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12734
12735 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12736
12737 salt->salt_len = salt_len;
12738
12739 salt->salt_iter = atoi (iterations_pos) - 1;
12740
12741 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
12742 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
12743 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
12744 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
12745
12746 return (PARSER_OK);
12747 }
12748
12749 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12750 {
12751 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12752
12753 u32 *digest = (u32 *) hash_buf->digest;
12754
12755 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12756 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12757 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12758 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12759 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12760 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12761 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12762 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12763
12764 digest[0] = byte_swap_32 (digest[0]);
12765 digest[1] = byte_swap_32 (digest[1]);
12766 digest[2] = byte_swap_32 (digest[2]);
12767 digest[3] = byte_swap_32 (digest[3]);
12768 digest[4] = byte_swap_32 (digest[4]);
12769 digest[5] = byte_swap_32 (digest[5]);
12770 digest[6] = byte_swap_32 (digest[6]);
12771 digest[7] = byte_swap_32 (digest[7]);
12772
12773 return (PARSER_OK);
12774 }
12775
12776 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12777 {
12778 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12779
12780 u32 *digest = (u32 *) hash_buf->digest;
12781
12782 salt_t *salt = hash_buf->salt;
12783
12784 char *salt_pos = input_buf + 3;
12785
12786 uint iterations_len = 0;
12787
12788 if (memcmp (salt_pos, "rounds=", 7) == 0)
12789 {
12790 salt_pos += 7;
12791
12792 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12793
12794 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12795 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12796
12797 salt_pos[0] = 0x0;
12798
12799 salt->salt_iter = atoi (salt_pos - iterations_len);
12800
12801 salt_pos += 1;
12802
12803 iterations_len += 8;
12804 }
12805 else
12806 {
12807 salt->salt_iter = ROUNDS_SHA256CRYPT;
12808 }
12809
12810 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12811
12812 char *hash_pos = strchr (salt_pos, '$');
12813
12814 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12815
12816 uint salt_len = hash_pos - salt_pos;
12817
12818 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12819
12820 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12821
12822 salt->salt_len = salt_len;
12823
12824 hash_pos++;
12825
12826 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12827
12828 return (PARSER_OK);
12829 }
12830
12831 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12832 {
12833 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12834
12835 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12836
12837 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12838
12839 u64 *digest = (u64 *) hash_buf->digest;
12840
12841 salt_t *salt = hash_buf->salt;
12842
12843 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12844
12845 char *iter_pos = input_buf + 4;
12846
12847 char *salt_pos = strchr (iter_pos, '$');
12848
12849 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12850
12851 salt_pos++;
12852
12853 char *hash_pos = strchr (salt_pos, '$');
12854
12855 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12856
12857 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12858
12859 hash_pos++;
12860
12861 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12862 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12863 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12864 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12865 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12866 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12867 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12868 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12869
12870 uint salt_len = hash_pos - salt_pos - 1;
12871
12872 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12873
12874 salt->salt_len = salt_len / 2;
12875
12876 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12877 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12878 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12879 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12880 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
12881 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
12882 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
12883 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
12884
12885 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12886 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12887 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12888 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12889 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12890 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12891 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12892 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12893 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12894 pbkdf2_sha512->salt_buf[9] = 0x80;
12895
12896 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12897
12898 salt->salt_iter = atoi (iter_pos) - 1;
12899
12900 return (PARSER_OK);
12901 }
12902
12903 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12904 {
12905 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12906
12907 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12908
12909 u32 *digest = (u32 *) hash_buf->digest;
12910
12911 salt_t *salt = hash_buf->salt;
12912
12913 char *salt_pos = input_buf + 14;
12914
12915 char *hash_pos = strchr (salt_pos, '*');
12916
12917 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12918
12919 hash_pos++;
12920
12921 uint salt_len = hash_pos - salt_pos - 1;
12922
12923 char *salt_buf_ptr = (char *) salt->salt_buf;
12924
12925 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
12926
12927 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12928
12929 salt->salt_len = salt_len;
12930
12931 u8 tmp_buf[100] = { 0 };
12932
12933 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
12934
12935 memcpy (digest, tmp_buf, 32);
12936
12937 digest[0] = byte_swap_32 (digest[0]);
12938 digest[1] = byte_swap_32 (digest[1]);
12939 digest[2] = byte_swap_32 (digest[2]);
12940 digest[3] = byte_swap_32 (digest[3]);
12941 digest[4] = byte_swap_32 (digest[4]);
12942 digest[5] = byte_swap_32 (digest[5]);
12943 digest[6] = byte_swap_32 (digest[6]);
12944 digest[7] = byte_swap_32 (digest[7]);
12945
12946 digest[0] -= SHA256M_A;
12947 digest[1] -= SHA256M_B;
12948 digest[2] -= SHA256M_C;
12949 digest[3] -= SHA256M_D;
12950 digest[4] -= SHA256M_E;
12951 digest[5] -= SHA256M_F;
12952 digest[6] -= SHA256M_G;
12953 digest[7] -= SHA256M_H;
12954
12955 return (PARSER_OK);
12956 }
12957
12958 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12959 {
12960 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
12961
12962 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12963
12964 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
12965
12966 u64 *digest = (u64 *) hash_buf->digest;
12967
12968 salt_t *salt = hash_buf->salt;
12969
12970 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12971
12972 char *iter_pos = input_buf + 19;
12973
12974 char *salt_pos = strchr (iter_pos, '.');
12975
12976 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12977
12978 salt_pos++;
12979
12980 char *hash_pos = strchr (salt_pos, '.');
12981
12982 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12983
12984 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12985
12986 hash_pos++;
12987
12988 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12989 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12990 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12991 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12992 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12993 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12994 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12995 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12996
12997 uint salt_len = hash_pos - salt_pos - 1;
12998
12999 salt_len /= 2;
13000
13001 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13002
13003 uint i;
13004
13005 for (i = 0; i < salt_len; i++)
13006 {
13007 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13008 }
13009
13010 salt_buf_ptr[salt_len + 3] = 0x01;
13011 salt_buf_ptr[salt_len + 4] = 0x80;
13012
13013 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13014
13015 salt->salt_len = salt_len;
13016
13017 salt->salt_iter = atoi (iter_pos) - 1;
13018
13019 return (PARSER_OK);
13020 }
13021
13022 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13023 {
13024 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13025
13026 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13027
13028 u64 *digest = (u64 *) hash_buf->digest;
13029
13030 salt_t *salt = hash_buf->salt;
13031
13032 u8 tmp_buf[120] = { 0 };
13033
13034 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13035
13036 memcpy (digest, tmp_buf, 64);
13037
13038 digest[0] = byte_swap_64 (digest[0]);
13039 digest[1] = byte_swap_64 (digest[1]);
13040 digest[2] = byte_swap_64 (digest[2]);
13041 digest[3] = byte_swap_64 (digest[3]);
13042 digest[4] = byte_swap_64 (digest[4]);
13043 digest[5] = byte_swap_64 (digest[5]);
13044 digest[6] = byte_swap_64 (digest[6]);
13045 digest[7] = byte_swap_64 (digest[7]);
13046
13047 digest[0] -= SHA512M_A;
13048 digest[1] -= SHA512M_B;
13049 digest[2] -= SHA512M_C;
13050 digest[3] -= SHA512M_D;
13051 digest[4] -= SHA512M_E;
13052 digest[5] -= SHA512M_F;
13053 digest[6] -= SHA512M_G;
13054 digest[7] -= SHA512M_H;
13055
13056 salt->salt_len = tmp_len - 64;
13057
13058 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13059
13060 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13061 {
13062 char *ptr = (char *) salt->salt_buf;
13063
13064 ptr[salt->salt_len] = 0x80;
13065 }
13066
13067 return (PARSER_OK);
13068 }
13069
13070 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13071 {
13072 if (data.opts_type & OPTS_TYPE_ST_HEX)
13073 {
13074 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13075 }
13076 else
13077 {
13078 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13079 }
13080
13081 u32 *digest = (u32 *) hash_buf->digest;
13082
13083 salt_t *salt = hash_buf->salt;
13084
13085 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13086 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13087 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13088 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13089
13090 digest[0] = byte_swap_32 (digest[0]);
13091 digest[1] = byte_swap_32 (digest[1]);
13092 digest[2] = byte_swap_32 (digest[2]);
13093 digest[3] = byte_swap_32 (digest[3]);
13094
13095 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13096
13097 uint salt_len = input_len - 32 - 1;
13098
13099 char *salt_buf = input_buf + 32 + 1;
13100
13101 char *salt_buf_ptr = (char *) salt->salt_buf;
13102
13103 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13104
13105 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13106
13107 salt->salt_len = salt_len;
13108
13109 return (PARSER_OK);
13110 }
13111
13112 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13113 {
13114 if (data.opts_type & OPTS_TYPE_ST_HEX)
13115 {
13116 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13117 }
13118 else
13119 {
13120 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13121 }
13122
13123 u32 *digest = (u32 *) hash_buf->digest;
13124
13125 salt_t *salt = hash_buf->salt;
13126
13127 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13128 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13129 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13130 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13131 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13132
13133 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13134
13135 uint salt_len = input_len - 40 - 1;
13136
13137 char *salt_buf = input_buf + 40 + 1;
13138
13139 char *salt_buf_ptr = (char *) salt->salt_buf;
13140
13141 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13142
13143 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13144
13145 salt->salt_len = salt_len;
13146
13147 return (PARSER_OK);
13148 }
13149
13150 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13151 {
13152 if (data.opts_type & OPTS_TYPE_ST_HEX)
13153 {
13154 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13155 }
13156 else
13157 {
13158 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13159 }
13160
13161 u32 *digest = (u32 *) hash_buf->digest;
13162
13163 salt_t *salt = hash_buf->salt;
13164
13165 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13166 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13167 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13168 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13169 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13170 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13171 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13172 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13173
13174 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13175
13176 uint salt_len = input_len - 64 - 1;
13177
13178 char *salt_buf = input_buf + 64 + 1;
13179
13180 char *salt_buf_ptr = (char *) salt->salt_buf;
13181
13182 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13183
13184 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13185
13186 salt->salt_len = salt_len;
13187
13188 return (PARSER_OK);
13189 }
13190
13191 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13192 {
13193 if (data.opts_type & OPTS_TYPE_ST_HEX)
13194 {
13195 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13196 }
13197 else
13198 {
13199 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13200 }
13201
13202 u64 *digest = (u64 *) hash_buf->digest;
13203
13204 salt_t *salt = hash_buf->salt;
13205
13206 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
13207 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
13208 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
13209 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
13210 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
13211 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
13212 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
13213 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
13214
13215 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13216
13217 uint salt_len = input_len - 128 - 1;
13218
13219 char *salt_buf = input_buf + 128 + 1;
13220
13221 char *salt_buf_ptr = (char *) salt->salt_buf;
13222
13223 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13224
13225 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13226
13227 salt->salt_len = salt_len;
13228
13229 return (PARSER_OK);
13230 }
13231
13232 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13233 {
13234 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13235
13236 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13237
13238 u32 *digest = (u32 *) hash_buf->digest;
13239
13240 salt_t *salt = hash_buf->salt;
13241
13242 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13243
13244 /**
13245 * parse line
13246 */
13247
13248 char *user_pos = input_buf + 10 + 1;
13249
13250 char *realm_pos = strchr (user_pos, '$');
13251
13252 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13253
13254 uint user_len = realm_pos - user_pos;
13255
13256 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13257
13258 realm_pos++;
13259
13260 char *salt_pos = strchr (realm_pos, '$');
13261
13262 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13263
13264 uint realm_len = salt_pos - realm_pos;
13265
13266 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13267
13268 salt_pos++;
13269
13270 char *data_pos = strchr (salt_pos, '$');
13271
13272 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13273
13274 uint salt_len = data_pos - salt_pos;
13275
13276 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13277
13278 data_pos++;
13279
13280 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13281
13282 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13283
13284 /**
13285 * copy data
13286 */
13287
13288 memcpy (krb5pa->user, user_pos, user_len);
13289 memcpy (krb5pa->realm, realm_pos, realm_len);
13290 memcpy (krb5pa->salt, salt_pos, salt_len);
13291
13292 char *timestamp_ptr = (char *) krb5pa->timestamp;
13293
13294 for (uint i = 0; i < (36 * 2); i += 2)
13295 {
13296 const char p0 = data_pos[i + 0];
13297 const char p1 = data_pos[i + 1];
13298
13299 *timestamp_ptr++ = hex_convert (p1) << 0
13300 | hex_convert (p0) << 4;
13301 }
13302
13303 char *checksum_ptr = (char *) krb5pa->checksum;
13304
13305 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13306 {
13307 const char p0 = data_pos[i + 0];
13308 const char p1 = data_pos[i + 1];
13309
13310 *checksum_ptr++ = hex_convert (p1) << 0
13311 | hex_convert (p0) << 4;
13312 }
13313
13314 /**
13315 * copy some data to generic buffers to make sorting happy
13316 */
13317
13318 salt->salt_buf[0] = krb5pa->timestamp[0];
13319 salt->salt_buf[1] = krb5pa->timestamp[1];
13320 salt->salt_buf[2] = krb5pa->timestamp[2];
13321 salt->salt_buf[3] = krb5pa->timestamp[3];
13322 salt->salt_buf[4] = krb5pa->timestamp[4];
13323 salt->salt_buf[5] = krb5pa->timestamp[5];
13324 salt->salt_buf[6] = krb5pa->timestamp[6];
13325 salt->salt_buf[7] = krb5pa->timestamp[7];
13326 salt->salt_buf[8] = krb5pa->timestamp[8];
13327
13328 salt->salt_len = 36;
13329
13330 digest[0] = krb5pa->checksum[0];
13331 digest[1] = krb5pa->checksum[1];
13332 digest[2] = krb5pa->checksum[2];
13333 digest[3] = krb5pa->checksum[3];
13334
13335 return (PARSER_OK);
13336 }
13337
13338 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13339 {
13340 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13341
13342 u32 *digest = (u32 *) hash_buf->digest;
13343
13344 salt_t *salt = hash_buf->salt;
13345
13346 /**
13347 * parse line
13348 */
13349
13350 char *salt_pos = input_buf;
13351
13352 char *hash_pos = strchr (salt_pos, '$');
13353
13354 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13355
13356 uint salt_len = hash_pos - salt_pos;
13357
13358 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13359
13360 hash_pos++;
13361
13362 uint hash_len = input_len - 1 - salt_len;
13363
13364 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13365
13366 /**
13367 * valid some data
13368 */
13369
13370 uint user_len = 0;
13371
13372 for (uint i = 0; i < salt_len; i++)
13373 {
13374 if (salt_pos[i] == ' ') continue;
13375
13376 user_len++;
13377 }
13378
13379 // SAP user names cannot be longer than 12 characters
13380 if (user_len > 12) return (PARSER_SALT_LENGTH);
13381
13382 // SAP user name cannot start with ! or ?
13383 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13384
13385 /**
13386 * copy data
13387 */
13388
13389 char *salt_buf_ptr = (char *) salt->salt_buf;
13390
13391 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13392
13393 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13394
13395 salt->salt_len = salt_len;
13396
13397 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
13398 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
13399 digest[2] = 0;
13400 digest[3] = 0;
13401
13402 digest[0] = byte_swap_32 (digest[0]);
13403 digest[1] = byte_swap_32 (digest[1]);
13404
13405 return (PARSER_OK);
13406 }
13407
13408 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13409 {
13410 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13411
13412 u32 *digest = (u32 *) hash_buf->digest;
13413
13414 salt_t *salt = hash_buf->salt;
13415
13416 /**
13417 * parse line
13418 */
13419
13420 char *salt_pos = input_buf;
13421
13422 char *hash_pos = strchr (salt_pos, '$');
13423
13424 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13425
13426 uint salt_len = hash_pos - salt_pos;
13427
13428 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13429
13430 hash_pos++;
13431
13432 uint hash_len = input_len - 1 - salt_len;
13433
13434 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13435
13436 /**
13437 * valid some data
13438 */
13439
13440 uint user_len = 0;
13441
13442 for (uint i = 0; i < salt_len; i++)
13443 {
13444 if (salt_pos[i] == ' ') continue;
13445
13446 user_len++;
13447 }
13448
13449 // SAP user names cannot be longer than 12 characters
13450 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
13451 // so far nobody complained so we stay with this because it helps in optimization
13452 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
13453
13454 if (user_len > 12) return (PARSER_SALT_LENGTH);
13455
13456 // SAP user name cannot start with ! or ?
13457 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13458
13459 /**
13460 * copy data
13461 */
13462
13463 char *salt_buf_ptr = (char *) salt->salt_buf;
13464
13465 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13466
13467 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13468
13469 salt->salt_len = salt_len;
13470
13471 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13472 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13473 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13474 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13475 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13476
13477 return (PARSER_OK);
13478 }
13479
13480 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13481 {
13482 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13483
13484 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13485
13486 u64 *digest = (u64 *) hash_buf->digest;
13487
13488 salt_t *salt = hash_buf->salt;
13489
13490 char *iter_pos = input_buf + 3;
13491
13492 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13493
13494 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13495
13496 memcpy ((char *) salt->salt_sign, input_buf, 4);
13497
13498 salt->salt_iter = salt_iter;
13499
13500 char *salt_pos = iter_pos + 1;
13501
13502 uint salt_len = 8;
13503
13504 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13505
13506 salt->salt_len = salt_len;
13507
13508 char *hash_pos = salt_pos + salt_len;
13509
13510 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13511
13512 // ugly hack start
13513
13514 char *tmp = (char *) salt->salt_buf_pc;
13515
13516 tmp[0] = hash_pos[42];
13517
13518 // ugly hack end
13519
13520 digest[ 0] = byte_swap_64 (digest[ 0]);
13521 digest[ 1] = byte_swap_64 (digest[ 1]);
13522 digest[ 2] = byte_swap_64 (digest[ 2]);
13523 digest[ 3] = byte_swap_64 (digest[ 3]);
13524 digest[ 4] = 0;
13525 digest[ 5] = 0;
13526 digest[ 6] = 0;
13527 digest[ 7] = 0;
13528
13529 return (PARSER_OK);
13530 }
13531
13532 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13533 {
13534 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13535
13536 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13537
13538 u32 *digest = (u32 *) hash_buf->digest;
13539
13540 salt_t *salt = hash_buf->salt;
13541
13542 char *salt_buf = input_buf + 6;
13543
13544 uint salt_len = 16;
13545
13546 char *salt_buf_ptr = (char *) salt->salt_buf;
13547
13548 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13549
13550 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13551
13552 salt->salt_len = salt_len;
13553
13554 char *hash_pos = input_buf + 6 + 16;
13555
13556 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13557 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13558 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13559 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13560 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13561 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
13562 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
13563 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
13564
13565 return (PARSER_OK);
13566 }
13567
13568 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13569 {
13570 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13571
13572 u32 *digest = (u32 *) hash_buf->digest;
13573
13574 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13575 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13576 digest[2] = 0;
13577 digest[3] = 0;
13578
13579 return (PARSER_OK);
13580 }
13581
13582 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13583 {
13584 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13585
13586 u32 *digest = (u32 *) hash_buf->digest;
13587
13588 salt_t *salt = hash_buf->salt;
13589
13590 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13591
13592 char *saltbuf_pos = input_buf;
13593
13594 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13595
13596 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13597
13598 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13599
13600 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13601 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13602
13603 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13604
13605 hashbuf_pos++;
13606
13607 uint hashbuf_len = input_len - saltbuf_len - 1;
13608
13609 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13610
13611 char *salt_ptr = (char *) saltbuf_pos;
13612 char *rakp_ptr = (char *) rakp->salt_buf;
13613
13614 uint i;
13615 uint j;
13616
13617 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13618 {
13619 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
13620 }
13621
13622 rakp_ptr[j] = 0x80;
13623
13624 rakp->salt_len = j;
13625
13626 for (i = 0; i < 64; i++)
13627 {
13628 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13629 }
13630
13631 salt->salt_buf[0] = rakp->salt_buf[0];
13632 salt->salt_buf[1] = rakp->salt_buf[1];
13633 salt->salt_buf[2] = rakp->salt_buf[2];
13634 salt->salt_buf[3] = rakp->salt_buf[3];
13635 salt->salt_buf[4] = rakp->salt_buf[4];
13636 salt->salt_buf[5] = rakp->salt_buf[5];
13637 salt->salt_buf[6] = rakp->salt_buf[6];
13638 salt->salt_buf[7] = rakp->salt_buf[7];
13639
13640 salt->salt_len = 32; // muss min. 32 haben
13641
13642 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13643 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13644 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13645 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13646 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13647
13648 return (PARSER_OK);
13649 }
13650
13651 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13652 {
13653 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13654
13655 u32 *digest = (u32 *) hash_buf->digest;
13656
13657 salt_t *salt = hash_buf->salt;
13658
13659 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13660
13661 char *salt_pos = input_buf + 1;
13662
13663 memcpy (salt->salt_buf, salt_pos, 8);
13664
13665 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13666 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13667
13668 salt->salt_len = 8;
13669
13670 char *hash_pos = salt_pos + 8;
13671
13672 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13673 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13674 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13675 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13676 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13677
13678 digest[0] -= SHA1M_A;
13679 digest[1] -= SHA1M_B;
13680 digest[2] -= SHA1M_C;
13681 digest[3] -= SHA1M_D;
13682 digest[4] -= SHA1M_E;
13683
13684 return (PARSER_OK);
13685 }
13686
13687 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13688 {
13689 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13690
13691 u32 *digest = (u32 *) hash_buf->digest;
13692
13693 salt_t *salt = hash_buf->salt;
13694
13695 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13696 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13697 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13698 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13699
13700 digest[0] = byte_swap_32 (digest[0]);
13701 digest[1] = byte_swap_32 (digest[1]);
13702 digest[2] = byte_swap_32 (digest[2]);
13703 digest[3] = byte_swap_32 (digest[3]);
13704
13705 digest[0] -= MD5M_A;
13706 digest[1] -= MD5M_B;
13707 digest[2] -= MD5M_C;
13708 digest[3] -= MD5M_D;
13709
13710 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13711
13712 char *salt_buf_ptr = input_buf + 32 + 1;
13713
13714 u32 *salt_buf = salt->salt_buf;
13715
13716 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
13717 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
13718 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
13719 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
13720
13721 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13722 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13723 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13724 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13725
13726 salt->salt_len = 16 + 1;
13727
13728 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13729
13730 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13731
13732 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
13733
13734 return (PARSER_OK);
13735 }
13736
13737 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13738 {
13739 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13740
13741 u32 *digest = (u32 *) hash_buf->digest;
13742
13743 salt_t *salt = hash_buf->salt;
13744
13745 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13746
13747 /**
13748 * parse line
13749 */
13750
13751 char *hashbuf_pos = input_buf;
13752
13753 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13754
13755 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13756
13757 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13758
13759 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13760
13761 saltbuf_pos++;
13762
13763 char *iteration_pos = strchr (saltbuf_pos, ':');
13764
13765 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13766
13767 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13768
13769 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13770
13771 iteration_pos++;
13772
13773 char *databuf_pos = strchr (iteration_pos, ':');
13774
13775 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13776
13777 const uint iteration_len = databuf_pos - iteration_pos;
13778
13779 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13780 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13781
13782 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13783
13784 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13785 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13786
13787 databuf_pos++;
13788
13789 // digest
13790
13791 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13792 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13793 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13794 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13795 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13796 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
13797 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
13798 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
13799
13800 // salt
13801
13802 char *saltbuf_ptr = (char *) salt->salt_buf;
13803
13804 for (uint i = 0; i < saltbuf_len; i += 2)
13805 {
13806 const char p0 = saltbuf_pos[i + 0];
13807 const char p1 = saltbuf_pos[i + 1];
13808
13809 *saltbuf_ptr++ = hex_convert (p1) << 0
13810 | hex_convert (p0) << 4;
13811 }
13812
13813 salt->salt_buf[4] = 0x01000000;
13814 salt->salt_buf[5] = 0x80;
13815
13816 salt->salt_len = saltbuf_len / 2;
13817
13818 // iteration
13819
13820 salt->salt_iter = atoi (iteration_pos) - 1;
13821
13822 // data
13823
13824 char *databuf_ptr = (char *) cloudkey->data_buf;
13825
13826 for (uint i = 0; i < databuf_len; i += 2)
13827 {
13828 const char p0 = databuf_pos[i + 0];
13829 const char p1 = databuf_pos[i + 1];
13830
13831 *databuf_ptr++ = hex_convert (p1) << 0
13832 | hex_convert (p0) << 4;
13833 }
13834
13835 *databuf_ptr++ = 0x80;
13836
13837 for (uint i = 0; i < 512; i++)
13838 {
13839 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13840 }
13841
13842 cloudkey->data_len = databuf_len / 2;
13843
13844 return (PARSER_OK);
13845 }
13846
13847 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13848 {
13849 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13850
13851 u32 *digest = (u32 *) hash_buf->digest;
13852
13853 salt_t *salt = hash_buf->salt;
13854
13855 /**
13856 * parse line
13857 */
13858
13859 char *hashbuf_pos = input_buf;
13860
13861 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13862
13863 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13864
13865 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13866
13867 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13868
13869 domainbuf_pos++;
13870
13871 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13872
13873 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13874
13875 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13876
13877 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13878
13879 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13880
13881 saltbuf_pos++;
13882
13883 char *iteration_pos = strchr (saltbuf_pos, ':');
13884
13885 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13886
13887 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13888
13889 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13890
13891 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13892
13893 iteration_pos++;
13894
13895 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13896
13897 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13898 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13899
13900 // ok, the plan for this algorithm is the following:
13901 // we have 2 salts here, the domain-name and a random salt
13902 // while both are used in the initial transformation,
13903 // only the random salt is used in the following iterations
13904 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13905 // and one that includes only the real salt (stored into salt_buf[]).
13906 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13907
13908 u8 tmp_buf[100] = { 0 };
13909
13910 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
13911
13912 memcpy (digest, tmp_buf, 20);
13913
13914 digest[0] = byte_swap_32 (digest[0]);
13915 digest[1] = byte_swap_32 (digest[1]);
13916 digest[2] = byte_swap_32 (digest[2]);
13917 digest[3] = byte_swap_32 (digest[3]);
13918 digest[4] = byte_swap_32 (digest[4]);
13919
13920 // domain
13921
13922 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13923
13924 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
13925
13926 char *len_ptr = NULL;
13927
13928 for (uint i = 0; i < domainbuf_len; i++)
13929 {
13930 if (salt_buf_pc_ptr[i] == '.')
13931 {
13932 len_ptr = &salt_buf_pc_ptr[i];
13933
13934 *len_ptr = 0;
13935 }
13936 else
13937 {
13938 *len_ptr += 1;
13939 }
13940 }
13941
13942 salt->salt_buf_pc[7] = domainbuf_len;
13943
13944 // "real" salt
13945
13946 char *salt_buf_ptr = (char *) salt->salt_buf;
13947
13948 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
13949
13950 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13951
13952 salt->salt_len = salt_len;
13953
13954 // iteration
13955
13956 salt->salt_iter = atoi (iteration_pos);
13957
13958 return (PARSER_OK);
13959 }
13960
13961 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13962 {
13963 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
13964
13965 u32 *digest = (u32 *) hash_buf->digest;
13966
13967 salt_t *salt = hash_buf->salt;
13968
13969 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13970 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13971 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13972 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13973 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13974
13975 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13976
13977 uint salt_len = input_len - 40 - 1;
13978
13979 char *salt_buf = input_buf + 40 + 1;
13980
13981 char *salt_buf_ptr = (char *) salt->salt_buf;
13982
13983 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13984
13985 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13986
13987 salt->salt_len = salt_len;
13988
13989 return (PARSER_OK);
13990 }
13991
13992 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13993 {
13994 const u8 ascii_to_ebcdic[] =
13995 {
13996 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
13997 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
13998 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
13999 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14000 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14001 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14002 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14003 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14004 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14005 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14006 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14007 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14008 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14009 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14010 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14011 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14012 };
14013
14014 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14015
14016 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14017
14018 u32 *digest = (u32 *) hash_buf->digest;
14019
14020 salt_t *salt = hash_buf->salt;
14021
14022 char *salt_pos = input_buf + 6 + 1;
14023
14024 char *digest_pos = strchr (salt_pos, '*');
14025
14026 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14027
14028 uint salt_len = digest_pos - salt_pos;
14029
14030 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14031
14032 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14033
14034 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14035
14036 digest_pos++;
14037
14038 char *salt_buf_ptr = (char *) salt->salt_buf;
14039 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14040
14041 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14042
14043 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14044
14045 salt->salt_len = salt_len;
14046
14047 for (uint i = 0; i < salt_len; i++)
14048 {
14049 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14050 }
14051 for (uint i = salt_len; i < 8; i++)
14052 {
14053 salt_buf_pc_ptr[i] = 0x40;
14054 }
14055
14056 uint tt;
14057
14058 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14059
14060 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14061 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14062
14063 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14064 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14065
14066 digest[0] = byte_swap_32 (digest[0]);
14067 digest[1] = byte_swap_32 (digest[1]);
14068
14069 IP (digest[0], digest[1], tt);
14070
14071 digest[0] = rotr32 (digest[0], 29);
14072 digest[1] = rotr32 (digest[1], 29);
14073 digest[2] = 0;
14074 digest[3] = 0;
14075
14076 return (PARSER_OK);
14077 }
14078
14079 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14080 {
14081 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14082
14083 u32 *digest = (u32 *) hash_buf->digest;
14084
14085 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14086 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14087 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14088 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14089
14090 digest[0] = byte_swap_32 (digest[0]);
14091 digest[1] = byte_swap_32 (digest[1]);
14092 digest[2] = byte_swap_32 (digest[2]);
14093 digest[3] = byte_swap_32 (digest[3]);
14094
14095 return (PARSER_OK);
14096 }
14097
14098 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14099 {
14100 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14101
14102 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14103
14104 u32 *digest = (u32 *) hash_buf->digest;
14105
14106 salt_t *salt = hash_buf->salt;
14107
14108 u8 tmp_buf[120] = { 0 };
14109
14110 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14111
14112 tmp_buf[3] += -4; // dont ask!
14113
14114 memcpy (salt->salt_buf, tmp_buf, 5);
14115
14116 salt->salt_len = 5;
14117
14118 memcpy (digest, tmp_buf + 5, 9);
14119
14120 // yes, only 9 byte are needed to crack, but 10 to display
14121
14122 salt->salt_buf_pc[7] = input_buf[20];
14123
14124 return (PARSER_OK);
14125 }
14126
14127 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14128 {
14129 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14130
14131 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14132
14133 u32 *digest = (u32 *) hash_buf->digest;
14134
14135 salt_t *salt = hash_buf->salt;
14136
14137 u8 tmp_buf[120] = { 0 };
14138
14139 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14140
14141 tmp_buf[3] += -4; // dont ask!
14142
14143 // salt
14144
14145 memcpy (salt->salt_buf, tmp_buf, 16);
14146
14147 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)
14148
14149 // iteration
14150
14151 char tmp_iter_buf[11] = { 0 };
14152
14153 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14154
14155 tmp_iter_buf[10] = 0;
14156
14157 salt->salt_iter = atoi (tmp_iter_buf);
14158
14159 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14160 {
14161 return (PARSER_SALT_ITERATION);
14162 }
14163
14164 salt->salt_iter--; // first round in init
14165
14166 // 2 additional bytes for display only
14167
14168 salt->salt_buf_pc[0] = tmp_buf[26];
14169 salt->salt_buf_pc[1] = tmp_buf[27];
14170
14171 // digest
14172
14173 memcpy (digest, tmp_buf + 28, 8);
14174
14175 digest[0] = byte_swap_32 (digest[0]);
14176 digest[1] = byte_swap_32 (digest[1]);
14177 digest[2] = 0;
14178 digest[3] = 0;
14179
14180 return (PARSER_OK);
14181 }
14182
14183 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14184 {
14185 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14186
14187 u32 *digest = (u32 *) hash_buf->digest;
14188
14189 salt_t *salt = hash_buf->salt;
14190
14191 char *salt_buf_pos = input_buf;
14192
14193 char *hash_buf_pos = salt_buf_pos + 6;
14194
14195 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
14196 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
14197 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
14198 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
14199 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
14200 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
14201 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
14202 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
14203
14204 digest[0] -= SHA256M_A;
14205 digest[1] -= SHA256M_B;
14206 digest[2] -= SHA256M_C;
14207 digest[3] -= SHA256M_D;
14208 digest[4] -= SHA256M_E;
14209 digest[5] -= SHA256M_F;
14210 digest[6] -= SHA256M_G;
14211 digest[7] -= SHA256M_H;
14212
14213 char *salt_buf_ptr = (char *) salt->salt_buf;
14214
14215 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14216
14217 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14218
14219 salt->salt_len = salt_len;
14220
14221 return (PARSER_OK);
14222 }
14223
14224 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14225 {
14226 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14227
14228 u32 *digest = (u32 *) hash_buf->digest;
14229
14230 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14231
14232 salt_t *salt = hash_buf->salt;
14233
14234 char *salt_buf = input_buf + 6;
14235
14236 char *digest_buf = strchr (salt_buf, '$');
14237
14238 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14239
14240 uint salt_len = digest_buf - salt_buf;
14241
14242 digest_buf++; // skip the '$' symbol
14243
14244 char *salt_buf_ptr = (char *) salt->salt_buf;
14245
14246 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14247
14248 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14249
14250 salt->salt_len = salt_len;
14251
14252 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14253 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14254 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14255 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14256
14257 digest[0] = byte_swap_32 (digest[0]);
14258 digest[1] = byte_swap_32 (digest[1]);
14259 digest[2] = byte_swap_32 (digest[2]);
14260 digest[3] = byte_swap_32 (digest[3]);
14261
14262 digest[0] -= MD5M_A;
14263 digest[1] -= MD5M_B;
14264 digest[2] -= MD5M_C;
14265 digest[3] -= MD5M_D;
14266
14267 return (PARSER_OK);
14268 }
14269
14270 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14271 {
14272 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14273
14274 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14275
14276 u32 *digest = (u32 *) hash_buf->digest;
14277
14278 salt_t *salt = hash_buf->salt;
14279
14280 char *salt_buf = input_buf + 3;
14281
14282 char *digest_buf = strchr (salt_buf, '$');
14283
14284 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14285
14286 uint salt_len = digest_buf - salt_buf;
14287
14288 digest_buf++; // skip the '$' symbol
14289
14290 char *salt_buf_ptr = (char *) salt->salt_buf;
14291
14292 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14293
14294 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14295
14296 salt_buf_ptr[salt_len] = 0x2d;
14297
14298 salt->salt_len = salt_len + 1;
14299
14300 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14301 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14302 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14303 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14304
14305 digest[0] = byte_swap_32 (digest[0]);
14306 digest[1] = byte_swap_32 (digest[1]);
14307 digest[2] = byte_swap_32 (digest[2]);
14308 digest[3] = byte_swap_32 (digest[3]);
14309
14310 digest[0] -= MD5M_A;
14311 digest[1] -= MD5M_B;
14312 digest[2] -= MD5M_C;
14313 digest[3] -= MD5M_D;
14314
14315 return (PARSER_OK);
14316 }
14317
14318 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14319 {
14320 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14321
14322 u32 *digest = (u32 *) hash_buf->digest;
14323
14324 u8 tmp_buf[100] = { 0 };
14325
14326 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
14327
14328 memcpy (digest, tmp_buf, 20);
14329
14330 digest[0] = byte_swap_32 (digest[0]);
14331 digest[1] = byte_swap_32 (digest[1]);
14332 digest[2] = byte_swap_32 (digest[2]);
14333 digest[3] = byte_swap_32 (digest[3]);
14334 digest[4] = byte_swap_32 (digest[4]);
14335
14336 digest[0] -= SHA1M_A;
14337 digest[1] -= SHA1M_B;
14338 digest[2] -= SHA1M_C;
14339 digest[3] -= SHA1M_D;
14340 digest[4] -= SHA1M_E;
14341
14342 return (PARSER_OK);
14343 }
14344
14345 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14346 {
14347 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14348
14349 u32 *digest = (u32 *) hash_buf->digest;
14350
14351 salt_t *salt = hash_buf->salt;
14352
14353 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14354 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14355 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14356 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14357
14358 digest[0] = byte_swap_32 (digest[0]);
14359 digest[1] = byte_swap_32 (digest[1]);
14360 digest[2] = byte_swap_32 (digest[2]);
14361 digest[3] = byte_swap_32 (digest[3]);
14362
14363 digest[0] -= MD5M_A;
14364 digest[1] -= MD5M_B;
14365 digest[2] -= MD5M_C;
14366 digest[3] -= MD5M_D;
14367
14368 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14369
14370 uint salt_len = input_len - 32 - 1;
14371
14372 char *salt_buf = input_buf + 32 + 1;
14373
14374 char *salt_buf_ptr = (char *) salt->salt_buf;
14375
14376 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14377
14378 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14379
14380 /*
14381 * add static "salt" part
14382 */
14383
14384 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14385
14386 salt_len += 8;
14387
14388 salt->salt_len = salt_len;
14389
14390 return (PARSER_OK);
14391 }
14392
14393 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14394 {
14395 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14396
14397 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14398
14399 u32 *digest = (u32 *) hash_buf->digest;
14400
14401 salt_t *salt = hash_buf->salt;
14402
14403 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14404
14405 /**
14406 * parse line
14407 */
14408
14409 char *saltlen_pos = input_buf + 1 + 3 + 1;
14410
14411 char *saltbuf_pos = strchr (saltlen_pos, '$');
14412
14413 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14414
14415 uint saltlen_len = saltbuf_pos - saltlen_pos;
14416
14417 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14418
14419 saltbuf_pos++;
14420
14421 char *keylen_pos = strchr (saltbuf_pos, '$');
14422
14423 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14424
14425 uint saltbuf_len = keylen_pos - saltbuf_pos;
14426
14427 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14428
14429 keylen_pos++;
14430
14431 char *keybuf_pos = strchr (keylen_pos, '$');
14432
14433 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14434
14435 uint keylen_len = keybuf_pos - keylen_pos;
14436
14437 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14438
14439 keybuf_pos++;
14440
14441 char *databuf_pos = strchr (keybuf_pos, '$');
14442
14443 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14444
14445 uint keybuf_len = databuf_pos - keybuf_pos;
14446
14447 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14448
14449 databuf_pos++;
14450
14451 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14452
14453 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14454
14455 /**
14456 * copy data
14457 */
14458
14459 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
14460 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
14461 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
14462 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
14463
14464 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
14465 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
14466 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
14467 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
14468
14469 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14470 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14471 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14472 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14473
14474 salt->salt_len = 16;
14475 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14476
14477 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14478 {
14479 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
14480 }
14481
14482 return (PARSER_OK);
14483 }
14484
14485 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14486 {
14487 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14488
14489 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14490
14491 u32 *digest = (u32 *) hash_buf->digest;
14492
14493 salt_t *salt = hash_buf->salt;
14494
14495 /**
14496 * parse line
14497 */
14498
14499 // first is the N salt parameter
14500
14501 char *N_pos = input_buf + 6;
14502
14503 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14504
14505 N_pos++;
14506
14507 salt->scrypt_N = atoi (N_pos);
14508
14509 // r
14510
14511 char *r_pos = strchr (N_pos, ':');
14512
14513 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14514
14515 r_pos++;
14516
14517 salt->scrypt_r = atoi (r_pos);
14518
14519 // p
14520
14521 char *p_pos = strchr (r_pos, ':');
14522
14523 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14524
14525 p_pos++;
14526
14527 salt->scrypt_p = atoi (p_pos);
14528
14529 // salt
14530
14531 char *saltbuf_pos = strchr (p_pos, ':');
14532
14533 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14534
14535 saltbuf_pos++;
14536
14537 char *hash_pos = strchr (saltbuf_pos, ':');
14538
14539 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14540
14541 hash_pos++;
14542
14543 // base64 decode
14544
14545 u8 tmp_buf[33] = { 0 };
14546
14547 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14548
14549 char *salt_buf_ptr = (char *) salt->salt_buf;
14550
14551 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14552
14553 salt->salt_len = tmp_len;
14554 salt->salt_iter = 1;
14555
14556 // digest - base64 decode
14557
14558 memset (tmp_buf, 0, sizeof (tmp_buf));
14559
14560 tmp_len = input_len - (hash_pos - input_buf);
14561
14562 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14563
14564 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
14565
14566 memcpy (digest, tmp_buf, 32);
14567
14568 return (PARSER_OK);
14569 }
14570
14571 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14572 {
14573 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14574
14575 u32 *digest = (u32 *) hash_buf->digest;
14576
14577 salt_t *salt = hash_buf->salt;
14578
14579 /**
14580 * parse line
14581 */
14582
14583 char decrypted[76] = { 0 }; // iv + hash
14584
14585 juniper_decrypt_hash (input_buf, decrypted);
14586
14587 char *md5crypt_hash = decrypted + 12;
14588
14589 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14590
14591 salt->salt_iter = ROUNDS_MD5CRYPT;
14592
14593 char *salt_pos = md5crypt_hash + 3;
14594
14595 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14596
14597 salt->salt_len = hash_pos - salt_pos; // should be 8
14598
14599 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14600
14601 hash_pos++;
14602
14603 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14604
14605 return (PARSER_OK);
14606 }
14607
14608 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14609 {
14610 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14611
14612 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14613
14614 u32 *digest = (u32 *) hash_buf->digest;
14615
14616 salt_t *salt = hash_buf->salt;
14617
14618 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14619
14620 /**
14621 * parse line
14622 */
14623
14624 // first is *raw* salt
14625
14626 char *salt_pos = input_buf + 3;
14627
14628 char *hash_pos = strchr (salt_pos, '$');
14629
14630 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14631
14632 uint salt_len = hash_pos - salt_pos;
14633
14634 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14635
14636 hash_pos++;
14637
14638 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14639
14640 memcpy (salt_buf_ptr, salt_pos, 14);
14641
14642 salt_buf_ptr[17] = 0x01;
14643 salt_buf_ptr[18] = 0x80;
14644
14645 // add some stuff to normal salt to make sorted happy
14646
14647 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14648 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14649 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14650 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14651
14652 salt->salt_len = salt_len;
14653 salt->salt_iter = ROUNDS_CISCO8 - 1;
14654
14655 // base64 decode hash
14656
14657 u8 tmp_buf[100] = { 0 };
14658
14659 uint hash_len = input_len - 3 - salt_len - 1;
14660
14661 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14662
14663 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14664
14665 memcpy (digest, tmp_buf, 32);
14666
14667 digest[0] = byte_swap_32 (digest[0]);
14668 digest[1] = byte_swap_32 (digest[1]);
14669 digest[2] = byte_swap_32 (digest[2]);
14670 digest[3] = byte_swap_32 (digest[3]);
14671 digest[4] = byte_swap_32 (digest[4]);
14672 digest[5] = byte_swap_32 (digest[5]);
14673 digest[6] = byte_swap_32 (digest[6]);
14674 digest[7] = byte_swap_32 (digest[7]);
14675
14676 return (PARSER_OK);
14677 }
14678
14679 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14680 {
14681 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14682
14683 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14684
14685 u32 *digest = (u32 *) hash_buf->digest;
14686
14687 salt_t *salt = hash_buf->salt;
14688
14689 /**
14690 * parse line
14691 */
14692
14693 // first is *raw* salt
14694
14695 char *salt_pos = input_buf + 3;
14696
14697 char *hash_pos = strchr (salt_pos, '$');
14698
14699 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14700
14701 uint salt_len = hash_pos - salt_pos;
14702
14703 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14704
14705 salt->salt_len = salt_len;
14706 hash_pos++;
14707
14708 char *salt_buf_ptr = (char *) salt->salt_buf;
14709
14710 memcpy (salt_buf_ptr, salt_pos, salt_len);
14711 salt_buf_ptr[salt_len] = 0;
14712
14713 // base64 decode hash
14714
14715 u8 tmp_buf[100] = { 0 };
14716
14717 uint hash_len = input_len - 3 - salt_len - 1;
14718
14719 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14720
14721 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14722
14723 memcpy (digest, tmp_buf, 32);
14724
14725 // fixed:
14726 salt->scrypt_N = 16384;
14727 salt->scrypt_r = 1;
14728 salt->scrypt_p = 1;
14729 salt->salt_iter = 1;
14730
14731 return (PARSER_OK);
14732 }
14733
14734 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14735 {
14736 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14737
14738 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14739
14740 u32 *digest = (u32 *) hash_buf->digest;
14741
14742 salt_t *salt = hash_buf->salt;
14743
14744 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14745
14746 /**
14747 * parse line
14748 */
14749
14750 char *version_pos = input_buf + 8 + 1;
14751
14752 char *verifierHashSize_pos = strchr (version_pos, '*');
14753
14754 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14755
14756 u32 version_len = verifierHashSize_pos - version_pos;
14757
14758 if (version_len != 4) return (PARSER_SALT_LENGTH);
14759
14760 verifierHashSize_pos++;
14761
14762 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14763
14764 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14765
14766 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14767
14768 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14769
14770 keySize_pos++;
14771
14772 char *saltSize_pos = strchr (keySize_pos, '*');
14773
14774 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14775
14776 u32 keySize_len = saltSize_pos - keySize_pos;
14777
14778 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14779
14780 saltSize_pos++;
14781
14782 char *osalt_pos = strchr (saltSize_pos, '*');
14783
14784 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14785
14786 u32 saltSize_len = osalt_pos - saltSize_pos;
14787
14788 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14789
14790 osalt_pos++;
14791
14792 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14793
14794 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14795
14796 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14797
14798 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14799
14800 encryptedVerifier_pos++;
14801
14802 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14803
14804 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14805
14806 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14807
14808 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14809
14810 encryptedVerifierHash_pos++;
14811
14812 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;
14813
14814 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14815
14816 const uint version = atoi (version_pos);
14817
14818 if (version != 2007) return (PARSER_SALT_VALUE);
14819
14820 const uint verifierHashSize = atoi (verifierHashSize_pos);
14821
14822 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14823
14824 const uint keySize = atoi (keySize_pos);
14825
14826 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14827
14828 office2007->keySize = keySize;
14829
14830 const uint saltSize = atoi (saltSize_pos);
14831
14832 if (saltSize != 16) return (PARSER_SALT_VALUE);
14833
14834 /**
14835 * salt
14836 */
14837
14838 salt->salt_len = 16;
14839 salt->salt_iter = ROUNDS_OFFICE2007;
14840
14841 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
14842 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
14843 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
14844 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
14845
14846 /**
14847 * esalt
14848 */
14849
14850 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
14851 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
14852 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
14853 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
14854
14855 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
14856 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
14857 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
14858 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
14859 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
14860
14861 /**
14862 * digest
14863 */
14864
14865 digest[0] = office2007->encryptedVerifierHash[0];
14866 digest[1] = office2007->encryptedVerifierHash[1];
14867 digest[2] = office2007->encryptedVerifierHash[2];
14868 digest[3] = office2007->encryptedVerifierHash[3];
14869
14870 return (PARSER_OK);
14871 }
14872
14873 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14874 {
14875 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14876
14877 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14878
14879 u32 *digest = (u32 *) hash_buf->digest;
14880
14881 salt_t *salt = hash_buf->salt;
14882
14883 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14884
14885 /**
14886 * parse line
14887 */
14888
14889 char *version_pos = input_buf + 8 + 1;
14890
14891 char *spinCount_pos = strchr (version_pos, '*');
14892
14893 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14894
14895 u32 version_len = spinCount_pos - version_pos;
14896
14897 if (version_len != 4) return (PARSER_SALT_LENGTH);
14898
14899 spinCount_pos++;
14900
14901 char *keySize_pos = strchr (spinCount_pos, '*');
14902
14903 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14904
14905 u32 spinCount_len = keySize_pos - spinCount_pos;
14906
14907 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14908
14909 keySize_pos++;
14910
14911 char *saltSize_pos = strchr (keySize_pos, '*');
14912
14913 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14914
14915 u32 keySize_len = saltSize_pos - keySize_pos;
14916
14917 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14918
14919 saltSize_pos++;
14920
14921 char *osalt_pos = strchr (saltSize_pos, '*');
14922
14923 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14924
14925 u32 saltSize_len = osalt_pos - saltSize_pos;
14926
14927 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14928
14929 osalt_pos++;
14930
14931 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14932
14933 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14934
14935 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14936
14937 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14938
14939 encryptedVerifier_pos++;
14940
14941 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14942
14943 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14944
14945 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14946
14947 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14948
14949 encryptedVerifierHash_pos++;
14950
14951 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;
14952
14953 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14954
14955 const uint version = atoi (version_pos);
14956
14957 if (version != 2010) return (PARSER_SALT_VALUE);
14958
14959 const uint spinCount = atoi (spinCount_pos);
14960
14961 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14962
14963 const uint keySize = atoi (keySize_pos);
14964
14965 if (keySize != 128) return (PARSER_SALT_VALUE);
14966
14967 const uint saltSize = atoi (saltSize_pos);
14968
14969 if (saltSize != 16) return (PARSER_SALT_VALUE);
14970
14971 /**
14972 * salt
14973 */
14974
14975 salt->salt_len = 16;
14976 salt->salt_iter = spinCount;
14977
14978 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
14979 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
14980 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
14981 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
14982
14983 /**
14984 * esalt
14985 */
14986
14987 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
14988 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
14989 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
14990 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
14991
14992 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
14993 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
14994 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
14995 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
14996 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
14997 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
14998 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
14999 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15000
15001 /**
15002 * digest
15003 */
15004
15005 digest[0] = office2010->encryptedVerifierHash[0];
15006 digest[1] = office2010->encryptedVerifierHash[1];
15007 digest[2] = office2010->encryptedVerifierHash[2];
15008 digest[3] = office2010->encryptedVerifierHash[3];
15009
15010 return (PARSER_OK);
15011 }
15012
15013 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15014 {
15015 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15016
15017 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15018
15019 u32 *digest = (u32 *) hash_buf->digest;
15020
15021 salt_t *salt = hash_buf->salt;
15022
15023 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15024
15025 /**
15026 * parse line
15027 */
15028
15029 char *version_pos = input_buf + 8 + 1;
15030
15031 char *spinCount_pos = strchr (version_pos, '*');
15032
15033 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15034
15035 u32 version_len = spinCount_pos - version_pos;
15036
15037 if (version_len != 4) return (PARSER_SALT_LENGTH);
15038
15039 spinCount_pos++;
15040
15041 char *keySize_pos = strchr (spinCount_pos, '*');
15042
15043 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15044
15045 u32 spinCount_len = keySize_pos - spinCount_pos;
15046
15047 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15048
15049 keySize_pos++;
15050
15051 char *saltSize_pos = strchr (keySize_pos, '*');
15052
15053 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15054
15055 u32 keySize_len = saltSize_pos - keySize_pos;
15056
15057 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15058
15059 saltSize_pos++;
15060
15061 char *osalt_pos = strchr (saltSize_pos, '*');
15062
15063 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15064
15065 u32 saltSize_len = osalt_pos - saltSize_pos;
15066
15067 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15068
15069 osalt_pos++;
15070
15071 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15072
15073 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15074
15075 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15076
15077 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15078
15079 encryptedVerifier_pos++;
15080
15081 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15082
15083 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15084
15085 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15086
15087 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15088
15089 encryptedVerifierHash_pos++;
15090
15091 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;
15092
15093 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15094
15095 const uint version = atoi (version_pos);
15096
15097 if (version != 2013) return (PARSER_SALT_VALUE);
15098
15099 const uint spinCount = atoi (spinCount_pos);
15100
15101 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15102
15103 const uint keySize = atoi (keySize_pos);
15104
15105 if (keySize != 256) return (PARSER_SALT_VALUE);
15106
15107 const uint saltSize = atoi (saltSize_pos);
15108
15109 if (saltSize != 16) return (PARSER_SALT_VALUE);
15110
15111 /**
15112 * salt
15113 */
15114
15115 salt->salt_len = 16;
15116 salt->salt_iter = spinCount;
15117
15118 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15119 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15120 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15121 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15122
15123 /**
15124 * esalt
15125 */
15126
15127 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15128 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15129 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15130 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15131
15132 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15133 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15134 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15135 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15136 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15137 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15138 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15139 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15140
15141 /**
15142 * digest
15143 */
15144
15145 digest[0] = office2013->encryptedVerifierHash[0];
15146 digest[1] = office2013->encryptedVerifierHash[1];
15147 digest[2] = office2013->encryptedVerifierHash[2];
15148 digest[3] = office2013->encryptedVerifierHash[3];
15149
15150 return (PARSER_OK);
15151 }
15152
15153 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15154 {
15155 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15156
15157 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15158
15159 u32 *digest = (u32 *) hash_buf->digest;
15160
15161 salt_t *salt = hash_buf->salt;
15162
15163 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15164
15165 /**
15166 * parse line
15167 */
15168
15169 char *version_pos = input_buf + 11;
15170
15171 char *osalt_pos = strchr (version_pos, '*');
15172
15173 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15174
15175 u32 version_len = osalt_pos - version_pos;
15176
15177 if (version_len != 1) return (PARSER_SALT_LENGTH);
15178
15179 osalt_pos++;
15180
15181 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15182
15183 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15184
15185 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15186
15187 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15188
15189 encryptedVerifier_pos++;
15190
15191 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15192
15193 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15194
15195 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15196
15197 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15198
15199 encryptedVerifierHash_pos++;
15200
15201 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15202
15203 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15204
15205 const uint version = *version_pos - 0x30;
15206
15207 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15208
15209 /**
15210 * esalt
15211 */
15212
15213 oldoffice01->version = version;
15214
15215 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15216 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15217 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15218 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15219
15220 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15221 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15222 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15223 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15224
15225 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15226 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15227 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15228 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15229
15230 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15231 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15232 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15233 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15234
15235 /**
15236 * salt
15237 */
15238
15239 salt->salt_len = 16;
15240
15241 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15242 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15243 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15244 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15245
15246 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15247 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15248 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15249 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15250
15251 // this is a workaround as office produces multiple documents with the same salt
15252
15253 salt->salt_len += 32;
15254
15255 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15256 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15257 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15258 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15259 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15260 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15261 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15262 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15263
15264 /**
15265 * digest
15266 */
15267
15268 digest[0] = oldoffice01->encryptedVerifierHash[0];
15269 digest[1] = oldoffice01->encryptedVerifierHash[1];
15270 digest[2] = oldoffice01->encryptedVerifierHash[2];
15271 digest[3] = oldoffice01->encryptedVerifierHash[3];
15272
15273 return (PARSER_OK);
15274 }
15275
15276 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15277 {
15278 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15279 }
15280
15281 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15282 {
15283 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15284
15285 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15286
15287 u32 *digest = (u32 *) hash_buf->digest;
15288
15289 salt_t *salt = hash_buf->salt;
15290
15291 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15292
15293 /**
15294 * parse line
15295 */
15296
15297 char *version_pos = input_buf + 11;
15298
15299 char *osalt_pos = strchr (version_pos, '*');
15300
15301 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15302
15303 u32 version_len = osalt_pos - version_pos;
15304
15305 if (version_len != 1) return (PARSER_SALT_LENGTH);
15306
15307 osalt_pos++;
15308
15309 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15310
15311 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15312
15313 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15314
15315 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15316
15317 encryptedVerifier_pos++;
15318
15319 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15320
15321 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15322
15323 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15324
15325 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15326
15327 encryptedVerifierHash_pos++;
15328
15329 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15330
15331 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15332
15333 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15334
15335 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15336
15337 rc4key_pos++;
15338
15339 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15340
15341 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15342
15343 const uint version = *version_pos - 0x30;
15344
15345 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15346
15347 /**
15348 * esalt
15349 */
15350
15351 oldoffice01->version = version;
15352
15353 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15354 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15355 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15356 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15357
15358 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15359 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15360 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15361 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15362
15363 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15364 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15365 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15366 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15367
15368 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15369 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15370 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15371 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15372
15373 oldoffice01->rc4key[1] = 0;
15374 oldoffice01->rc4key[0] = 0;
15375
15376 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15377 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15378 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15379 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15380 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15381 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15382 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15383 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15384 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15385 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15386
15387 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15388 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15389
15390 /**
15391 * salt
15392 */
15393
15394 salt->salt_len = 16;
15395
15396 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15397 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15398 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15399 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15400
15401 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15402 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15403 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15404 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15405
15406 // this is a workaround as office produces multiple documents with the same salt
15407
15408 salt->salt_len += 32;
15409
15410 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15411 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15412 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15413 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15414 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15415 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15416 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15417 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15418
15419 /**
15420 * digest
15421 */
15422
15423 digest[0] = oldoffice01->rc4key[0];
15424 digest[1] = oldoffice01->rc4key[1];
15425 digest[2] = 0;
15426 digest[3] = 0;
15427
15428 return (PARSER_OK);
15429 }
15430
15431 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15432 {
15433 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15434
15435 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15436
15437 u32 *digest = (u32 *) hash_buf->digest;
15438
15439 salt_t *salt = hash_buf->salt;
15440
15441 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15442
15443 /**
15444 * parse line
15445 */
15446
15447 char *version_pos = input_buf + 11;
15448
15449 char *osalt_pos = strchr (version_pos, '*');
15450
15451 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15452
15453 u32 version_len = osalt_pos - version_pos;
15454
15455 if (version_len != 1) return (PARSER_SALT_LENGTH);
15456
15457 osalt_pos++;
15458
15459 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15460
15461 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15462
15463 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15464
15465 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15466
15467 encryptedVerifier_pos++;
15468
15469 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15470
15471 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15472
15473 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15474
15475 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15476
15477 encryptedVerifierHash_pos++;
15478
15479 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15480
15481 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15482
15483 const uint version = *version_pos - 0x30;
15484
15485 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15486
15487 /**
15488 * esalt
15489 */
15490
15491 oldoffice34->version = version;
15492
15493 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15494 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15495 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15496 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15497
15498 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15499 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15500 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15501 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15502
15503 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15504 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15505 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15506 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15507 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15508
15509 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15510 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15511 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15512 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15513 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15514
15515 /**
15516 * salt
15517 */
15518
15519 salt->salt_len = 16;
15520
15521 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15522 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15523 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15524 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15525
15526 // this is a workaround as office produces multiple documents with the same salt
15527
15528 salt->salt_len += 32;
15529
15530 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15531 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15532 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15533 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15534 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15535 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15536 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15537 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15538
15539 /**
15540 * digest
15541 */
15542
15543 digest[0] = oldoffice34->encryptedVerifierHash[0];
15544 digest[1] = oldoffice34->encryptedVerifierHash[1];
15545 digest[2] = oldoffice34->encryptedVerifierHash[2];
15546 digest[3] = oldoffice34->encryptedVerifierHash[3];
15547
15548 return (PARSER_OK);
15549 }
15550
15551 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15552 {
15553 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15554
15555 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15556 }
15557
15558 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15559 {
15560 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15561
15562 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15563
15564 u32 *digest = (u32 *) hash_buf->digest;
15565
15566 salt_t *salt = hash_buf->salt;
15567
15568 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15569
15570 /**
15571 * parse line
15572 */
15573
15574 char *version_pos = input_buf + 11;
15575
15576 char *osalt_pos = strchr (version_pos, '*');
15577
15578 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15579
15580 u32 version_len = osalt_pos - version_pos;
15581
15582 if (version_len != 1) return (PARSER_SALT_LENGTH);
15583
15584 osalt_pos++;
15585
15586 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15587
15588 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15589
15590 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15591
15592 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15593
15594 encryptedVerifier_pos++;
15595
15596 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15597
15598 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15599
15600 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15601
15602 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15603
15604 encryptedVerifierHash_pos++;
15605
15606 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15607
15608 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15609
15610 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15611
15612 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15613
15614 rc4key_pos++;
15615
15616 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15617
15618 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15619
15620 const uint version = *version_pos - 0x30;
15621
15622 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15623
15624 /**
15625 * esalt
15626 */
15627
15628 oldoffice34->version = version;
15629
15630 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15631 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15632 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15633 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15634
15635 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15636 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15637 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15638 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15639
15640 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15641 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15642 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15643 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15644 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15645
15646 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15647 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15648 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15649 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15650 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15651
15652 oldoffice34->rc4key[1] = 0;
15653 oldoffice34->rc4key[0] = 0;
15654
15655 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15656 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15657 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15658 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15659 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15660 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15661 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15662 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15663 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15664 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15665
15666 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15667 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15668
15669 /**
15670 * salt
15671 */
15672
15673 salt->salt_len = 16;
15674
15675 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15676 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15677 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15678 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15679
15680 // this is a workaround as office produces multiple documents with the same salt
15681
15682 salt->salt_len += 32;
15683
15684 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15685 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15686 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15687 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15688 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15689 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15690 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15691 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15692
15693 /**
15694 * digest
15695 */
15696
15697 digest[0] = oldoffice34->rc4key[0];
15698 digest[1] = oldoffice34->rc4key[1];
15699 digest[2] = 0;
15700 digest[3] = 0;
15701
15702 return (PARSER_OK);
15703 }
15704
15705 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15706 {
15707 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15708
15709 u32 *digest = (u32 *) hash_buf->digest;
15710
15711 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15712 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15713 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15714 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15715
15716 digest[0] = byte_swap_32 (digest[0]);
15717 digest[1] = byte_swap_32 (digest[1]);
15718 digest[2] = byte_swap_32 (digest[2]);
15719 digest[3] = byte_swap_32 (digest[3]);
15720
15721 return (PARSER_OK);
15722 }
15723
15724 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15725 {
15726 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15727
15728 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15729
15730 u32 *digest = (u32 *) hash_buf->digest;
15731
15732 salt_t *salt = hash_buf->salt;
15733
15734 char *signature_pos = input_buf;
15735
15736 char *salt_pos = strchr (signature_pos, '$');
15737
15738 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15739
15740 u32 signature_len = salt_pos - signature_pos;
15741
15742 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15743
15744 salt_pos++;
15745
15746 char *hash_pos = strchr (salt_pos, '$');
15747
15748 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15749
15750 u32 salt_len = hash_pos - salt_pos;
15751
15752 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15753
15754 hash_pos++;
15755
15756 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
15757
15758 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15759
15760 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
15761 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
15762 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
15763 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
15764 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
15765
15766 digest[0] -= SHA1M_A;
15767 digest[1] -= SHA1M_B;
15768 digest[2] -= SHA1M_C;
15769 digest[3] -= SHA1M_D;
15770 digest[4] -= SHA1M_E;
15771
15772 char *salt_buf_ptr = (char *) salt->salt_buf;
15773
15774 memcpy (salt_buf_ptr, salt_pos, salt_len);
15775
15776 salt->salt_len = salt_len;
15777
15778 return (PARSER_OK);
15779 }
15780
15781 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15782 {
15783 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15784
15785 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15786
15787 u32 *digest = (u32 *) hash_buf->digest;
15788
15789 salt_t *salt = hash_buf->salt;
15790
15791 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15792
15793 /**
15794 * parse line
15795 */
15796
15797 char *iter_pos = input_buf + 14;
15798
15799 const int iter = atoi (iter_pos);
15800
15801 if (iter < 1) return (PARSER_SALT_ITERATION);
15802
15803 salt->salt_iter = iter - 1;
15804
15805 char *salt_pos = strchr (iter_pos, '$');
15806
15807 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15808
15809 salt_pos++;
15810
15811 char *hash_pos = strchr (salt_pos, '$');
15812
15813 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15814
15815 const uint salt_len = hash_pos - salt_pos;
15816
15817 hash_pos++;
15818
15819 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15820
15821 memcpy (salt_buf_ptr, salt_pos, salt_len);
15822
15823 salt->salt_len = salt_len;
15824
15825 salt_buf_ptr[salt_len + 3] = 0x01;
15826 salt_buf_ptr[salt_len + 4] = 0x80;
15827
15828 // add some stuff to normal salt to make sorted happy
15829
15830 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15831 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15832 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15833 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15834 salt->salt_buf[4] = salt->salt_iter;
15835
15836 // base64 decode hash
15837
15838 u8 tmp_buf[100] = { 0 };
15839
15840 uint hash_len = input_len - (hash_pos - input_buf);
15841
15842 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15843
15844 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15845
15846 memcpy (digest, tmp_buf, 32);
15847
15848 digest[0] = byte_swap_32 (digest[0]);
15849 digest[1] = byte_swap_32 (digest[1]);
15850 digest[2] = byte_swap_32 (digest[2]);
15851 digest[3] = byte_swap_32 (digest[3]);
15852 digest[4] = byte_swap_32 (digest[4]);
15853 digest[5] = byte_swap_32 (digest[5]);
15854 digest[6] = byte_swap_32 (digest[6]);
15855 digest[7] = byte_swap_32 (digest[7]);
15856
15857 return (PARSER_OK);
15858 }
15859
15860 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15861 {
15862 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15863
15864 u32 *digest = (u32 *) hash_buf->digest;
15865
15866 salt_t *salt = hash_buf->salt;
15867
15868 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15869 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15870 digest[2] = 0;
15871 digest[3] = 0;
15872
15873 digest[0] = byte_swap_32 (digest[0]);
15874 digest[1] = byte_swap_32 (digest[1]);
15875
15876 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15877 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15878 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15879
15880 char iter_c = input_buf[17];
15881 char iter_d = input_buf[19];
15882
15883 // atm only defaults, let's see if there's more request
15884 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15885 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15886
15887 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15888
15889 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
15890 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
15891 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
15892 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
15893
15894 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15895 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15896 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15897 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15898
15899 salt->salt_len = 16;
15900
15901 return (PARSER_OK);
15902 }
15903
15904 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15905 {
15906 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
15907
15908 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15909
15910 u32 *digest = (u32 *) hash_buf->digest;
15911
15912 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
15913
15914 salt_t *salt = hash_buf->salt;
15915
15916 char *salt_pos = input_buf + 10;
15917
15918 char *hash_pos = strchr (salt_pos, '$');
15919
15920 uint salt_len = hash_pos - salt_pos;
15921
15922 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15923
15924 hash_pos++;
15925
15926 uint hash_len = input_len - 10 - salt_len - 1;
15927
15928 // base64 decode salt
15929
15930 u8 tmp_buf[100] = { 0 };
15931
15932 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
15933
15934 if (salt_len > 55) return (PARSER_SALT_LENGTH);
15935
15936 tmp_buf[salt_len] = 0x80;
15937
15938 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
15939
15940 salt->salt_len = salt_len;
15941
15942 // base64 decode salt
15943
15944 memset (tmp_buf, 0, sizeof (tmp_buf));
15945
15946 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15947
15948 uint user_len = hash_len - 32;
15949
15950 const u8 *tmp_hash = tmp_buf + user_len;
15951
15952 user_len--; // skip the trailing space
15953
15954 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
15955 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
15956 digest[2] = hex_to_u32 (&tmp_hash[16]);
15957 digest[3] = hex_to_u32 (&tmp_hash[24]);
15958
15959 digest[0] = byte_swap_32 (digest[0]);
15960 digest[1] = byte_swap_32 (digest[1]);
15961 digest[2] = byte_swap_32 (digest[2]);
15962 digest[3] = byte_swap_32 (digest[3]);
15963
15964 // store username for host only (output hash if cracked)
15965
15966 memset (cram_md5->user, 0, sizeof (cram_md5->user));
15967 memcpy (cram_md5->user, tmp_buf, user_len);
15968
15969 return (PARSER_OK);
15970 }
15971
15972 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15973 {
15974 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
15975
15976 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15977
15978 u32 *digest = (u32 *) hash_buf->digest;
15979
15980 salt_t *salt = hash_buf->salt;
15981
15982 char *iter_pos = input_buf + 10;
15983
15984 u32 iter = atoi (iter_pos);
15985
15986 if (iter < 1)
15987 {
15988 return (PARSER_SALT_ITERATION);
15989 }
15990
15991 iter--; // first iteration is special
15992
15993 salt->salt_iter = iter;
15994
15995 char *base64_pos = strchr (iter_pos, '}');
15996
15997 if (base64_pos == NULL)
15998 {
15999 return (PARSER_SIGNATURE_UNMATCHED);
16000 }
16001
16002 base64_pos++;
16003
16004 // base64 decode salt
16005
16006 u32 base64_len = input_len - (base64_pos - input_buf);
16007
16008 u8 tmp_buf[100] = { 0 };
16009
16010 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16011
16012 if (decoded_len < 24)
16013 {
16014 return (PARSER_SALT_LENGTH);
16015 }
16016
16017 // copy the salt
16018
16019 uint salt_len = decoded_len - 20;
16020
16021 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16022 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16023
16024 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16025
16026 salt->salt_len = salt_len;
16027
16028 // set digest
16029
16030 u32 *digest_ptr = (u32*) tmp_buf;
16031
16032 digest[0] = byte_swap_32 (digest_ptr[0]);
16033 digest[1] = byte_swap_32 (digest_ptr[1]);
16034 digest[2] = byte_swap_32 (digest_ptr[2]);
16035 digest[3] = byte_swap_32 (digest_ptr[3]);
16036 digest[4] = byte_swap_32 (digest_ptr[4]);
16037
16038 return (PARSER_OK);
16039 }
16040
16041 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16042 {
16043 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16044
16045 u32 *digest = (u32 *) hash_buf->digest;
16046
16047 salt_t *salt = hash_buf->salt;
16048
16049 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16050 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16051 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16052 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16053 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16054
16055 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16056
16057 uint salt_len = input_len - 40 - 1;
16058
16059 char *salt_buf = input_buf + 40 + 1;
16060
16061 char *salt_buf_ptr = (char *) salt->salt_buf;
16062
16063 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16064
16065 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16066
16067 salt->salt_len = salt_len;
16068
16069 return (PARSER_OK);
16070 }
16071
16072 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16073 {
16074 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16075
16076 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16077
16078 u32 *digest = (u32 *) hash_buf->digest;
16079
16080 salt_t *salt = hash_buf->salt;
16081
16082 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16083
16084 /**
16085 * parse line
16086 */
16087
16088 char *V_pos = input_buf + 5;
16089
16090 char *R_pos = strchr (V_pos, '*');
16091
16092 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16093
16094 u32 V_len = R_pos - V_pos;
16095
16096 R_pos++;
16097
16098 char *bits_pos = strchr (R_pos, '*');
16099
16100 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16101
16102 u32 R_len = bits_pos - R_pos;
16103
16104 bits_pos++;
16105
16106 char *P_pos = strchr (bits_pos, '*');
16107
16108 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16109
16110 u32 bits_len = P_pos - bits_pos;
16111
16112 P_pos++;
16113
16114 char *enc_md_pos = strchr (P_pos, '*');
16115
16116 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16117
16118 u32 P_len = enc_md_pos - P_pos;
16119
16120 enc_md_pos++;
16121
16122 char *id_len_pos = strchr (enc_md_pos, '*');
16123
16124 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16125
16126 u32 enc_md_len = id_len_pos - enc_md_pos;
16127
16128 id_len_pos++;
16129
16130 char *id_buf_pos = strchr (id_len_pos, '*');
16131
16132 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16133
16134 u32 id_len_len = id_buf_pos - id_len_pos;
16135
16136 id_buf_pos++;
16137
16138 char *u_len_pos = strchr (id_buf_pos, '*');
16139
16140 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16141
16142 u32 id_buf_len = u_len_pos - id_buf_pos;
16143
16144 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16145
16146 u_len_pos++;
16147
16148 char *u_buf_pos = strchr (u_len_pos, '*');
16149
16150 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16151
16152 u32 u_len_len = u_buf_pos - u_len_pos;
16153
16154 u_buf_pos++;
16155
16156 char *o_len_pos = strchr (u_buf_pos, '*');
16157
16158 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16159
16160 u32 u_buf_len = o_len_pos - u_buf_pos;
16161
16162 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16163
16164 o_len_pos++;
16165
16166 char *o_buf_pos = strchr (o_len_pos, '*');
16167
16168 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16169
16170 u32 o_len_len = o_buf_pos - o_len_pos;
16171
16172 o_buf_pos++;
16173
16174 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;
16175
16176 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16177
16178 // validate data
16179
16180 const int V = atoi (V_pos);
16181 const int R = atoi (R_pos);
16182 const int P = atoi (P_pos);
16183
16184 if (V != 1) return (PARSER_SALT_VALUE);
16185 if (R != 2) return (PARSER_SALT_VALUE);
16186
16187 const int enc_md = atoi (enc_md_pos);
16188
16189 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16190
16191 const int id_len = atoi (id_len_pos);
16192 const int u_len = atoi (u_len_pos);
16193 const int o_len = atoi (o_len_pos);
16194
16195 if (id_len != 16) return (PARSER_SALT_VALUE);
16196 if (u_len != 32) return (PARSER_SALT_VALUE);
16197 if (o_len != 32) return (PARSER_SALT_VALUE);
16198
16199 const int bits = atoi (bits_pos);
16200
16201 if (bits != 40) return (PARSER_SALT_VALUE);
16202
16203 // copy data to esalt
16204
16205 pdf->V = V;
16206 pdf->R = R;
16207 pdf->P = P;
16208
16209 pdf->enc_md = enc_md;
16210
16211 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16212 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16213 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16214 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16215 pdf->id_len = id_len;
16216
16217 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16218 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16219 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16220 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16221 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16222 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16223 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16224 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16225 pdf->u_len = u_len;
16226
16227 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16228 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16229 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16230 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16231 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16232 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16233 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16234 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16235 pdf->o_len = o_len;
16236
16237 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16238 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16239 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16240 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16241
16242 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16243 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16244 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16245 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16246 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16247 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16248 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16249 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16250
16251 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16252 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16253 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16254 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16255 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16256 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16257 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16258 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16259
16260 // we use ID for salt, maybe needs to change, we will see...
16261
16262 salt->salt_buf[0] = pdf->id_buf[0];
16263 salt->salt_buf[1] = pdf->id_buf[1];
16264 salt->salt_buf[2] = pdf->id_buf[2];
16265 salt->salt_buf[3] = pdf->id_buf[3];
16266 salt->salt_len = pdf->id_len;
16267
16268 digest[0] = pdf->u_buf[0];
16269 digest[1] = pdf->u_buf[1];
16270 digest[2] = pdf->u_buf[2];
16271 digest[3] = pdf->u_buf[3];
16272
16273 return (PARSER_OK);
16274 }
16275
16276 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16277 {
16278 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16279 }
16280
16281 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16282 {
16283 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16284
16285 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16286
16287 u32 *digest = (u32 *) hash_buf->digest;
16288
16289 salt_t *salt = hash_buf->salt;
16290
16291 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16292
16293 /**
16294 * parse line
16295 */
16296
16297 char *V_pos = input_buf + 5;
16298
16299 char *R_pos = strchr (V_pos, '*');
16300
16301 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16302
16303 u32 V_len = R_pos - V_pos;
16304
16305 R_pos++;
16306
16307 char *bits_pos = strchr (R_pos, '*');
16308
16309 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16310
16311 u32 R_len = bits_pos - R_pos;
16312
16313 bits_pos++;
16314
16315 char *P_pos = strchr (bits_pos, '*');
16316
16317 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16318
16319 u32 bits_len = P_pos - bits_pos;
16320
16321 P_pos++;
16322
16323 char *enc_md_pos = strchr (P_pos, '*');
16324
16325 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16326
16327 u32 P_len = enc_md_pos - P_pos;
16328
16329 enc_md_pos++;
16330
16331 char *id_len_pos = strchr (enc_md_pos, '*');
16332
16333 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16334
16335 u32 enc_md_len = id_len_pos - enc_md_pos;
16336
16337 id_len_pos++;
16338
16339 char *id_buf_pos = strchr (id_len_pos, '*');
16340
16341 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16342
16343 u32 id_len_len = id_buf_pos - id_len_pos;
16344
16345 id_buf_pos++;
16346
16347 char *u_len_pos = strchr (id_buf_pos, '*');
16348
16349 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16350
16351 u32 id_buf_len = u_len_pos - id_buf_pos;
16352
16353 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16354
16355 u_len_pos++;
16356
16357 char *u_buf_pos = strchr (u_len_pos, '*');
16358
16359 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16360
16361 u32 u_len_len = u_buf_pos - u_len_pos;
16362
16363 u_buf_pos++;
16364
16365 char *o_len_pos = strchr (u_buf_pos, '*');
16366
16367 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16368
16369 u32 u_buf_len = o_len_pos - u_buf_pos;
16370
16371 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16372
16373 o_len_pos++;
16374
16375 char *o_buf_pos = strchr (o_len_pos, '*');
16376
16377 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16378
16379 u32 o_len_len = o_buf_pos - o_len_pos;
16380
16381 o_buf_pos++;
16382
16383 char *rc4key_pos = strchr (o_buf_pos, ':');
16384
16385 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16386
16387 u32 o_buf_len = rc4key_pos - o_buf_pos;
16388
16389 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16390
16391 rc4key_pos++;
16392
16393 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;
16394
16395 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16396
16397 // validate data
16398
16399 const int V = atoi (V_pos);
16400 const int R = atoi (R_pos);
16401 const int P = atoi (P_pos);
16402
16403 if (V != 1) return (PARSER_SALT_VALUE);
16404 if (R != 2) return (PARSER_SALT_VALUE);
16405
16406 const int enc_md = atoi (enc_md_pos);
16407
16408 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16409
16410 const int id_len = atoi (id_len_pos);
16411 const int u_len = atoi (u_len_pos);
16412 const int o_len = atoi (o_len_pos);
16413
16414 if (id_len != 16) return (PARSER_SALT_VALUE);
16415 if (u_len != 32) return (PARSER_SALT_VALUE);
16416 if (o_len != 32) return (PARSER_SALT_VALUE);
16417
16418 const int bits = atoi (bits_pos);
16419
16420 if (bits != 40) return (PARSER_SALT_VALUE);
16421
16422 // copy data to esalt
16423
16424 pdf->V = V;
16425 pdf->R = R;
16426 pdf->P = P;
16427
16428 pdf->enc_md = enc_md;
16429
16430 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16431 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16432 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16433 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16434 pdf->id_len = id_len;
16435
16436 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16437 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16438 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16439 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16440 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16441 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16442 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16443 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16444 pdf->u_len = u_len;
16445
16446 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16447 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16448 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16449 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16450 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16451 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16452 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16453 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16454 pdf->o_len = o_len;
16455
16456 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16457 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16458 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16459 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16460
16461 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16462 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16463 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16464 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16465 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16466 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16467 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16468 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16469
16470 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16471 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16472 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16473 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16474 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16475 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16476 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16477 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16478
16479 pdf->rc4key[1] = 0;
16480 pdf->rc4key[0] = 0;
16481
16482 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16483 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16484 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16485 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16486 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16487 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16488 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16489 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16490 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16491 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16492
16493 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16494 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16495
16496 // we use ID for salt, maybe needs to change, we will see...
16497
16498 salt->salt_buf[0] = pdf->id_buf[0];
16499 salt->salt_buf[1] = pdf->id_buf[1];
16500 salt->salt_buf[2] = pdf->id_buf[2];
16501 salt->salt_buf[3] = pdf->id_buf[3];
16502 salt->salt_buf[4] = pdf->u_buf[0];
16503 salt->salt_buf[5] = pdf->u_buf[1];
16504 salt->salt_buf[6] = pdf->o_buf[0];
16505 salt->salt_buf[7] = pdf->o_buf[1];
16506 salt->salt_len = pdf->id_len + 16;
16507
16508 digest[0] = pdf->rc4key[0];
16509 digest[1] = pdf->rc4key[1];
16510 digest[2] = 0;
16511 digest[3] = 0;
16512
16513 return (PARSER_OK);
16514 }
16515
16516 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16517 {
16518 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16519
16520 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16521
16522 u32 *digest = (u32 *) hash_buf->digest;
16523
16524 salt_t *salt = hash_buf->salt;
16525
16526 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16527
16528 /**
16529 * parse line
16530 */
16531
16532 char *V_pos = input_buf + 5;
16533
16534 char *R_pos = strchr (V_pos, '*');
16535
16536 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16537
16538 u32 V_len = R_pos - V_pos;
16539
16540 R_pos++;
16541
16542 char *bits_pos = strchr (R_pos, '*');
16543
16544 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16545
16546 u32 R_len = bits_pos - R_pos;
16547
16548 bits_pos++;
16549
16550 char *P_pos = strchr (bits_pos, '*');
16551
16552 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16553
16554 u32 bits_len = P_pos - bits_pos;
16555
16556 P_pos++;
16557
16558 char *enc_md_pos = strchr (P_pos, '*');
16559
16560 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16561
16562 u32 P_len = enc_md_pos - P_pos;
16563
16564 enc_md_pos++;
16565
16566 char *id_len_pos = strchr (enc_md_pos, '*');
16567
16568 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16569
16570 u32 enc_md_len = id_len_pos - enc_md_pos;
16571
16572 id_len_pos++;
16573
16574 char *id_buf_pos = strchr (id_len_pos, '*');
16575
16576 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16577
16578 u32 id_len_len = id_buf_pos - id_len_pos;
16579
16580 id_buf_pos++;
16581
16582 char *u_len_pos = strchr (id_buf_pos, '*');
16583
16584 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16585
16586 u32 id_buf_len = u_len_pos - id_buf_pos;
16587
16588 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16589
16590 u_len_pos++;
16591
16592 char *u_buf_pos = strchr (u_len_pos, '*');
16593
16594 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16595
16596 u32 u_len_len = u_buf_pos - u_len_pos;
16597
16598 u_buf_pos++;
16599
16600 char *o_len_pos = strchr (u_buf_pos, '*');
16601
16602 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16603
16604 u32 u_buf_len = o_len_pos - u_buf_pos;
16605
16606 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16607
16608 o_len_pos++;
16609
16610 char *o_buf_pos = strchr (o_len_pos, '*');
16611
16612 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16613
16614 u32 o_len_len = o_buf_pos - o_len_pos;
16615
16616 o_buf_pos++;
16617
16618 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;
16619
16620 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16621
16622 // validate data
16623
16624 const int V = atoi (V_pos);
16625 const int R = atoi (R_pos);
16626 const int P = atoi (P_pos);
16627
16628 int vr_ok = 0;
16629
16630 if ((V == 2) && (R == 3)) vr_ok = 1;
16631 if ((V == 4) && (R == 4)) vr_ok = 1;
16632
16633 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16634
16635 const int id_len = atoi (id_len_pos);
16636 const int u_len = atoi (u_len_pos);
16637 const int o_len = atoi (o_len_pos);
16638
16639 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16640
16641 if (u_len != 32) return (PARSER_SALT_VALUE);
16642 if (o_len != 32) return (PARSER_SALT_VALUE);
16643
16644 const int bits = atoi (bits_pos);
16645
16646 if (bits != 128) return (PARSER_SALT_VALUE);
16647
16648 int enc_md = 1;
16649
16650 if (R >= 4)
16651 {
16652 enc_md = atoi (enc_md_pos);
16653 }
16654
16655 // copy data to esalt
16656
16657 pdf->V = V;
16658 pdf->R = R;
16659 pdf->P = P;
16660
16661 pdf->enc_md = enc_md;
16662
16663 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16664 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16665 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16666 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16667
16668 if (id_len == 32)
16669 {
16670 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
16671 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
16672 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
16673 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
16674 }
16675
16676 pdf->id_len = id_len;
16677
16678 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16679 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16680 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16681 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16682 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16683 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16684 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16685 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16686 pdf->u_len = u_len;
16687
16688 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16689 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16690 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16691 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16692 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16693 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16694 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16695 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16696 pdf->o_len = o_len;
16697
16698 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16699 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16700 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16701 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16702
16703 if (id_len == 32)
16704 {
16705 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16706 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16707 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16708 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16709 }
16710
16711 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16712 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16713 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16714 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16715 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16716 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16717 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16718 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16719
16720 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16721 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16722 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16723 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16724 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16725 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16726 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16727 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16728
16729 // precompute rc4 data for later use
16730
16731 uint padding[8] =
16732 {
16733 0x5e4ebf28,
16734 0x418a754e,
16735 0x564e0064,
16736 0x0801faff,
16737 0xb6002e2e,
16738 0x803e68d0,
16739 0xfea90c2f,
16740 0x7a695364
16741 };
16742
16743 // md5
16744
16745 uint salt_pc_block[32] = { 0 };
16746
16747 char *salt_pc_ptr = (char *) salt_pc_block;
16748
16749 memcpy (salt_pc_ptr, padding, 32);
16750 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16751
16752 uint salt_pc_digest[4] = { 0 };
16753
16754 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16755
16756 pdf->rc4data[0] = salt_pc_digest[0];
16757 pdf->rc4data[1] = salt_pc_digest[1];
16758
16759 // we use ID for salt, maybe needs to change, we will see...
16760
16761 salt->salt_buf[0] = pdf->id_buf[0];
16762 salt->salt_buf[1] = pdf->id_buf[1];
16763 salt->salt_buf[2] = pdf->id_buf[2];
16764 salt->salt_buf[3] = pdf->id_buf[3];
16765 salt->salt_buf[4] = pdf->u_buf[0];
16766 salt->salt_buf[5] = pdf->u_buf[1];
16767 salt->salt_buf[6] = pdf->o_buf[0];
16768 salt->salt_buf[7] = pdf->o_buf[1];
16769 salt->salt_len = pdf->id_len + 16;
16770
16771 salt->salt_iter = ROUNDS_PDF14;
16772
16773 digest[0] = pdf->u_buf[0];
16774 digest[1] = pdf->u_buf[1];
16775 digest[2] = 0;
16776 digest[3] = 0;
16777
16778 return (PARSER_OK);
16779 }
16780
16781 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16782 {
16783 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16784
16785 if (ret != PARSER_OK)
16786 {
16787 return ret;
16788 }
16789
16790 u32 *digest = (u32 *) hash_buf->digest;
16791
16792 salt_t *salt = hash_buf->salt;
16793
16794 digest[0] -= SHA256M_A;
16795 digest[1] -= SHA256M_B;
16796 digest[2] -= SHA256M_C;
16797 digest[3] -= SHA256M_D;
16798 digest[4] -= SHA256M_E;
16799 digest[5] -= SHA256M_F;
16800 digest[6] -= SHA256M_G;
16801 digest[7] -= SHA256M_H;
16802
16803 salt->salt_buf[2] = 0x80;
16804
16805 return (PARSER_OK);
16806 }
16807
16808 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16809 {
16810 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16811
16812 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16813
16814 u32 *digest = (u32 *) hash_buf->digest;
16815
16816 salt_t *salt = hash_buf->salt;
16817
16818 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16819
16820 /**
16821 * parse line
16822 */
16823
16824 char *V_pos = input_buf + 5;
16825
16826 char *R_pos = strchr (V_pos, '*');
16827
16828 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16829
16830 u32 V_len = R_pos - V_pos;
16831
16832 R_pos++;
16833
16834 char *bits_pos = strchr (R_pos, '*');
16835
16836 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16837
16838 u32 R_len = bits_pos - R_pos;
16839
16840 bits_pos++;
16841
16842 char *P_pos = strchr (bits_pos, '*');
16843
16844 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16845
16846 u32 bits_len = P_pos - bits_pos;
16847
16848 P_pos++;
16849
16850 char *enc_md_pos = strchr (P_pos, '*');
16851
16852 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16853
16854 u32 P_len = enc_md_pos - P_pos;
16855
16856 enc_md_pos++;
16857
16858 char *id_len_pos = strchr (enc_md_pos, '*');
16859
16860 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16861
16862 u32 enc_md_len = id_len_pos - enc_md_pos;
16863
16864 id_len_pos++;
16865
16866 char *id_buf_pos = strchr (id_len_pos, '*');
16867
16868 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16869
16870 u32 id_len_len = id_buf_pos - id_len_pos;
16871
16872 id_buf_pos++;
16873
16874 char *u_len_pos = strchr (id_buf_pos, '*');
16875
16876 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16877
16878 u32 id_buf_len = u_len_pos - id_buf_pos;
16879
16880 u_len_pos++;
16881
16882 char *u_buf_pos = strchr (u_len_pos, '*');
16883
16884 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16885
16886 u32 u_len_len = u_buf_pos - u_len_pos;
16887
16888 u_buf_pos++;
16889
16890 char *o_len_pos = strchr (u_buf_pos, '*');
16891
16892 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16893
16894 u32 u_buf_len = o_len_pos - u_buf_pos;
16895
16896 o_len_pos++;
16897
16898 char *o_buf_pos = strchr (o_len_pos, '*');
16899
16900 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16901
16902 u32 o_len_len = o_buf_pos - o_len_pos;
16903
16904 o_buf_pos++;
16905
16906 char *last = strchr (o_buf_pos, '*');
16907
16908 if (last == NULL) last = input_buf + input_len;
16909
16910 u32 o_buf_len = last - o_buf_pos;
16911
16912 // validate data
16913
16914 const int V = atoi (V_pos);
16915 const int R = atoi (R_pos);
16916
16917 int vr_ok = 0;
16918
16919 if ((V == 5) && (R == 5)) vr_ok = 1;
16920 if ((V == 5) && (R == 6)) vr_ok = 1;
16921
16922 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16923
16924 const int bits = atoi (bits_pos);
16925
16926 if (bits != 256) return (PARSER_SALT_VALUE);
16927
16928 int enc_md = atoi (enc_md_pos);
16929
16930 if (enc_md != 1) return (PARSER_SALT_VALUE);
16931
16932 const uint id_len = atoi (id_len_pos);
16933 const uint u_len = atoi (u_len_pos);
16934 const uint o_len = atoi (o_len_pos);
16935
16936 if (V_len > 6) return (PARSER_SALT_LENGTH);
16937 if (R_len > 6) return (PARSER_SALT_LENGTH);
16938 if (P_len > 6) return (PARSER_SALT_LENGTH);
16939 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
16940 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
16941 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
16942 if (bits_len > 6) return (PARSER_SALT_LENGTH);
16943 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
16944
16945 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
16946 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
16947 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
16948
16949 // copy data to esalt
16950
16951 if (u_len < 40) return (PARSER_SALT_VALUE);
16952
16953 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
16954 {
16955 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
16956 }
16957
16958 salt->salt_buf[0] = pdf->u_buf[8];
16959 salt->salt_buf[1] = pdf->u_buf[9];
16960
16961 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16962 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16963
16964 salt->salt_len = 8;
16965 salt->salt_iter = ROUNDS_PDF17L8;
16966
16967 digest[0] = pdf->u_buf[0];
16968 digest[1] = pdf->u_buf[1];
16969 digest[2] = pdf->u_buf[2];
16970 digest[3] = pdf->u_buf[3];
16971 digest[4] = pdf->u_buf[4];
16972 digest[5] = pdf->u_buf[5];
16973 digest[6] = pdf->u_buf[6];
16974 digest[7] = pdf->u_buf[7];
16975
16976 return (PARSER_OK);
16977 }
16978
16979 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16980 {
16981 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
16982
16983 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
16984
16985 u32 *digest = (u32 *) hash_buf->digest;
16986
16987 salt_t *salt = hash_buf->salt;
16988
16989 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16990
16991 /**
16992 * parse line
16993 */
16994
16995 // iterations
16996
16997 char *iter_pos = input_buf + 7;
16998
16999 u32 iter = atoi (iter_pos);
17000
17001 if (iter < 1) return (PARSER_SALT_ITERATION);
17002 if (iter > 999999) return (PARSER_SALT_ITERATION);
17003
17004 // first is *raw* salt
17005
17006 char *salt_pos = strchr (iter_pos, ':');
17007
17008 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17009
17010 salt_pos++;
17011
17012 char *hash_pos = strchr (salt_pos, ':');
17013
17014 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17015
17016 u32 salt_len = hash_pos - salt_pos;
17017
17018 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17019
17020 hash_pos++;
17021
17022 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17023
17024 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17025
17026 // decode salt
17027
17028 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17029
17030 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17031
17032 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17033
17034 salt_buf_ptr[salt_len + 3] = 0x01;
17035 salt_buf_ptr[salt_len + 4] = 0x80;
17036
17037 salt->salt_len = salt_len;
17038 salt->salt_iter = iter - 1;
17039
17040 // decode hash
17041
17042 u8 tmp_buf[100] = { 0 };
17043
17044 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17045
17046 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17047
17048 memcpy (digest, tmp_buf, 16);
17049
17050 digest[0] = byte_swap_32 (digest[0]);
17051 digest[1] = byte_swap_32 (digest[1]);
17052 digest[2] = byte_swap_32 (digest[2]);
17053 digest[3] = byte_swap_32 (digest[3]);
17054
17055 // add some stuff to normal salt to make sorted happy
17056
17057 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17058 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17059 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17060 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17061 salt->salt_buf[4] = salt->salt_iter;
17062
17063 return (PARSER_OK);
17064 }
17065
17066 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17067 {
17068 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17069
17070 u32 *digest = (u32 *) hash_buf->digest;
17071
17072 salt_t *salt = hash_buf->salt;
17073
17074 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17075 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17076 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17077 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17078
17079 digest[0] = byte_swap_32 (digest[0]);
17080 digest[1] = byte_swap_32 (digest[1]);
17081 digest[2] = byte_swap_32 (digest[2]);
17082 digest[3] = byte_swap_32 (digest[3]);
17083
17084 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17085
17086 uint salt_len = input_len - 32 - 1;
17087
17088 char *salt_buf = input_buf + 32 + 1;
17089
17090 char *salt_buf_ptr = (char *) salt->salt_buf;
17091
17092 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17093
17094 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17095
17096 salt->salt_len = salt_len;
17097
17098 return (PARSER_OK);
17099 }
17100
17101 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17102 {
17103 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17104
17105 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17106
17107 u32 *digest = (u32 *) hash_buf->digest;
17108
17109 salt_t *salt = hash_buf->salt;
17110
17111 char *user_pos = input_buf + 10;
17112
17113 char *salt_pos = strchr (user_pos, '*');
17114
17115 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17116
17117 salt_pos++;
17118
17119 char *hash_pos = strchr (salt_pos, '*');
17120
17121 hash_pos++;
17122
17123 uint hash_len = input_len - (hash_pos - input_buf);
17124
17125 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17126
17127 uint user_len = salt_pos - user_pos - 1;
17128
17129 uint salt_len = hash_pos - salt_pos - 1;
17130
17131 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17132
17133 /*
17134 * store digest
17135 */
17136
17137 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17138 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17139 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17140 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17141
17142 digest[0] = byte_swap_32 (digest[0]);
17143 digest[1] = byte_swap_32 (digest[1]);
17144 digest[2] = byte_swap_32 (digest[2]);
17145 digest[3] = byte_swap_32 (digest[3]);
17146
17147 digest[0] -= MD5M_A;
17148 digest[1] -= MD5M_B;
17149 digest[2] -= MD5M_C;
17150 digest[3] -= MD5M_D;
17151
17152 /*
17153 * store salt
17154 */
17155
17156 char *salt_buf_ptr = (char *) salt->salt_buf;
17157
17158 // first 4 bytes are the "challenge"
17159
17160 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
17161 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
17162 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
17163 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
17164
17165 // append the user name
17166
17167 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17168
17169 salt->salt_len = 4 + user_len;
17170
17171 return (PARSER_OK);
17172 }
17173
17174 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17175 {
17176 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17177
17178 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17179
17180 u32 *digest = (u32 *) hash_buf->digest;
17181
17182 salt_t *salt = hash_buf->salt;
17183
17184 char *salt_pos = input_buf + 9;
17185
17186 char *hash_pos = strchr (salt_pos, '*');
17187
17188 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17189
17190 hash_pos++;
17191
17192 uint hash_len = input_len - (hash_pos - input_buf);
17193
17194 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17195
17196 uint salt_len = hash_pos - salt_pos - 1;
17197
17198 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17199
17200 /*
17201 * store digest
17202 */
17203
17204 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17205 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17206 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17207 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17208 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
17209
17210 /*
17211 * store salt
17212 */
17213
17214 char *salt_buf_ptr = (char *) salt->salt_buf;
17215
17216 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17217
17218 salt->salt_len = salt_len;
17219
17220 return (PARSER_OK);
17221 }
17222
17223 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17224 {
17225 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17226
17227 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17228
17229 u32 *digest = (u32 *) hash_buf->digest;
17230
17231 salt_t *salt = hash_buf->salt;
17232
17233 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17234
17235 /**
17236 * parse line
17237 */
17238
17239 char *cry_master_len_pos = input_buf + 9;
17240
17241 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17242
17243 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17244
17245 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17246
17247 cry_master_buf_pos++;
17248
17249 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17250
17251 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17252
17253 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17254
17255 cry_salt_len_pos++;
17256
17257 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17258
17259 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17260
17261 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17262
17263 cry_salt_buf_pos++;
17264
17265 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17266
17267 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17268
17269 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17270
17271 cry_rounds_pos++;
17272
17273 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17274
17275 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17276
17277 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17278
17279 ckey_len_pos++;
17280
17281 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17282
17283 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17284
17285 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
17286
17287 ckey_buf_pos++;
17288
17289 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17290
17291 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17292
17293 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17294
17295 public_key_len_pos++;
17296
17297 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17298
17299 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17300
17301 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
17302
17303 public_key_buf_pos++;
17304
17305 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;
17306
17307 const uint cry_master_len = atoi (cry_master_len_pos);
17308 const uint cry_salt_len = atoi (cry_salt_len_pos);
17309 const uint ckey_len = atoi (ckey_len_pos);
17310 const uint public_key_len = atoi (public_key_len_pos);
17311
17312 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17313 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17314 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17315 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17316
17317 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
17318 {
17319 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
17320
17321 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17322 }
17323
17324 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
17325 {
17326 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
17327
17328 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17329 }
17330
17331 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
17332 {
17333 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
17334
17335 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17336 }
17337
17338 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17339 bitcoin_wallet->ckey_len = ckey_len / 2;
17340 bitcoin_wallet->public_key_len = public_key_len / 2;
17341
17342 /*
17343 * store digest (should be unique enought, hopefully)
17344 */
17345
17346 digest[0] = bitcoin_wallet->cry_master_buf[0];
17347 digest[1] = bitcoin_wallet->cry_master_buf[1];
17348 digest[2] = bitcoin_wallet->cry_master_buf[2];
17349 digest[3] = bitcoin_wallet->cry_master_buf[3];
17350
17351 /*
17352 * store salt
17353 */
17354
17355 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17356
17357 const uint cry_rounds = atoi (cry_rounds_pos);
17358
17359 salt->salt_iter = cry_rounds - 1;
17360
17361 char *salt_buf_ptr = (char *) salt->salt_buf;
17362
17363 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17364
17365 salt->salt_len = salt_len;
17366
17367 return (PARSER_OK);
17368 }
17369
17370 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17371 {
17372 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17373
17374 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17375
17376 u32 *digest = (u32 *) hash_buf->digest;
17377
17378 salt_t *salt = hash_buf->salt;
17379
17380 sip_t *sip = (sip_t *) hash_buf->esalt;
17381
17382 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17383
17384 char *temp_input_buf = (char *) mymalloc (input_len + 1);
17385
17386 memcpy (temp_input_buf, input_buf, input_len);
17387
17388 // URI_server:
17389
17390 char *URI_server_pos = temp_input_buf + 6;
17391
17392 char *URI_client_pos = strchr (URI_server_pos, '*');
17393
17394 if (URI_client_pos == NULL)
17395 {
17396 myfree (temp_input_buf);
17397
17398 return (PARSER_SEPARATOR_UNMATCHED);
17399 }
17400
17401 URI_client_pos[0] = 0;
17402 URI_client_pos++;
17403
17404 uint URI_server_len = strlen (URI_server_pos);
17405
17406 if (URI_server_len > 512)
17407 {
17408 myfree (temp_input_buf);
17409
17410 return (PARSER_SALT_LENGTH);
17411 }
17412
17413 // URI_client:
17414
17415 char *user_pos = strchr (URI_client_pos, '*');
17416
17417 if (user_pos == NULL)
17418 {
17419 myfree (temp_input_buf);
17420
17421 return (PARSER_SEPARATOR_UNMATCHED);
17422 }
17423
17424 user_pos[0] = 0;
17425 user_pos++;
17426
17427 uint URI_client_len = strlen (URI_client_pos);
17428
17429 if (URI_client_len > 512)
17430 {
17431 myfree (temp_input_buf);
17432
17433 return (PARSER_SALT_LENGTH);
17434 }
17435
17436 // user:
17437
17438 char *realm_pos = strchr (user_pos, '*');
17439
17440 if (realm_pos == NULL)
17441 {
17442 myfree (temp_input_buf);
17443
17444 return (PARSER_SEPARATOR_UNMATCHED);
17445 }
17446
17447 realm_pos[0] = 0;
17448 realm_pos++;
17449
17450 uint user_len = strlen (user_pos);
17451
17452 if (user_len > 116)
17453 {
17454 myfree (temp_input_buf);
17455
17456 return (PARSER_SALT_LENGTH);
17457 }
17458
17459 // realm:
17460
17461 char *method_pos = strchr (realm_pos, '*');
17462
17463 if (method_pos == NULL)
17464 {
17465 myfree (temp_input_buf);
17466
17467 return (PARSER_SEPARATOR_UNMATCHED);
17468 }
17469
17470 method_pos[0] = 0;
17471 method_pos++;
17472
17473 uint realm_len = strlen (realm_pos);
17474
17475 if (realm_len > 116)
17476 {
17477 myfree (temp_input_buf);
17478
17479 return (PARSER_SALT_LENGTH);
17480 }
17481
17482 // method:
17483
17484 char *URI_prefix_pos = strchr (method_pos, '*');
17485
17486 if (URI_prefix_pos == NULL)
17487 {
17488 myfree (temp_input_buf);
17489
17490 return (PARSER_SEPARATOR_UNMATCHED);
17491 }
17492
17493 URI_prefix_pos[0] = 0;
17494 URI_prefix_pos++;
17495
17496 uint method_len = strlen (method_pos);
17497
17498 if (method_len > 246)
17499 {
17500 myfree (temp_input_buf);
17501
17502 return (PARSER_SALT_LENGTH);
17503 }
17504
17505 // URI_prefix:
17506
17507 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17508
17509 if (URI_resource_pos == NULL)
17510 {
17511 myfree (temp_input_buf);
17512
17513 return (PARSER_SEPARATOR_UNMATCHED);
17514 }
17515
17516 URI_resource_pos[0] = 0;
17517 URI_resource_pos++;
17518
17519 uint URI_prefix_len = strlen (URI_prefix_pos);
17520
17521 if (URI_prefix_len > 245)
17522 {
17523 myfree (temp_input_buf);
17524
17525 return (PARSER_SALT_LENGTH);
17526 }
17527
17528 // URI_resource:
17529
17530 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17531
17532 if (URI_suffix_pos == NULL)
17533 {
17534 myfree (temp_input_buf);
17535
17536 return (PARSER_SEPARATOR_UNMATCHED);
17537 }
17538
17539 URI_suffix_pos[0] = 0;
17540 URI_suffix_pos++;
17541
17542 uint URI_resource_len = strlen (URI_resource_pos);
17543
17544 if (URI_resource_len < 1 || URI_resource_len > 246)
17545 {
17546 myfree (temp_input_buf);
17547
17548 return (PARSER_SALT_LENGTH);
17549 }
17550
17551 // URI_suffix:
17552
17553 char *nonce_pos = strchr (URI_suffix_pos, '*');
17554
17555 if (nonce_pos == NULL)
17556 {
17557 myfree (temp_input_buf);
17558
17559 return (PARSER_SEPARATOR_UNMATCHED);
17560 }
17561
17562 nonce_pos[0] = 0;
17563 nonce_pos++;
17564
17565 uint URI_suffix_len = strlen (URI_suffix_pos);
17566
17567 if (URI_suffix_len > 245)
17568 {
17569 myfree (temp_input_buf);
17570
17571 return (PARSER_SALT_LENGTH);
17572 }
17573
17574 // nonce:
17575
17576 char *nonce_client_pos = strchr (nonce_pos, '*');
17577
17578 if (nonce_client_pos == NULL)
17579 {
17580 myfree (temp_input_buf);
17581
17582 return (PARSER_SEPARATOR_UNMATCHED);
17583 }
17584
17585 nonce_client_pos[0] = 0;
17586 nonce_client_pos++;
17587
17588 uint nonce_len = strlen (nonce_pos);
17589
17590 if (nonce_len < 1 || nonce_len > 50)
17591 {
17592 myfree (temp_input_buf);
17593
17594 return (PARSER_SALT_LENGTH);
17595 }
17596
17597 // nonce_client:
17598
17599 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17600
17601 if (nonce_count_pos == NULL)
17602 {
17603 myfree (temp_input_buf);
17604
17605 return (PARSER_SEPARATOR_UNMATCHED);
17606 }
17607
17608 nonce_count_pos[0] = 0;
17609 nonce_count_pos++;
17610
17611 uint nonce_client_len = strlen (nonce_client_pos);
17612
17613 if (nonce_client_len > 50)
17614 {
17615 myfree (temp_input_buf);
17616
17617 return (PARSER_SALT_LENGTH);
17618 }
17619
17620 // nonce_count:
17621
17622 char *qop_pos = strchr (nonce_count_pos, '*');
17623
17624 if (qop_pos == NULL)
17625 {
17626 myfree (temp_input_buf);
17627
17628 return (PARSER_SEPARATOR_UNMATCHED);
17629 }
17630
17631 qop_pos[0] = 0;
17632 qop_pos++;
17633
17634 uint nonce_count_len = strlen (nonce_count_pos);
17635
17636 if (nonce_count_len > 50)
17637 {
17638 myfree (temp_input_buf);
17639
17640 return (PARSER_SALT_LENGTH);
17641 }
17642
17643 // qop:
17644
17645 char *directive_pos = strchr (qop_pos, '*');
17646
17647 if (directive_pos == NULL)
17648 {
17649 myfree (temp_input_buf);
17650
17651 return (PARSER_SEPARATOR_UNMATCHED);
17652 }
17653
17654 directive_pos[0] = 0;
17655 directive_pos++;
17656
17657 uint qop_len = strlen (qop_pos);
17658
17659 if (qop_len > 50)
17660 {
17661 myfree (temp_input_buf);
17662
17663 return (PARSER_SALT_LENGTH);
17664 }
17665
17666 // directive
17667
17668 char *digest_pos = strchr (directive_pos, '*');
17669
17670 if (digest_pos == NULL)
17671 {
17672 myfree (temp_input_buf);
17673
17674 return (PARSER_SEPARATOR_UNMATCHED);
17675 }
17676
17677 digest_pos[0] = 0;
17678 digest_pos++;
17679
17680 uint directive_len = strlen (directive_pos);
17681
17682 if (directive_len != 3)
17683 {
17684 myfree (temp_input_buf);
17685
17686 return (PARSER_SALT_LENGTH);
17687 }
17688
17689 if (memcmp (directive_pos, "MD5", 3))
17690 {
17691 log_info ("ERROR: only the MD5 directive is currently supported\n");
17692
17693 myfree (temp_input_buf);
17694
17695 return (PARSER_SIP_AUTH_DIRECTIVE);
17696 }
17697
17698 /*
17699 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17700 */
17701
17702 uint md5_len = 0;
17703
17704 uint md5_max_len = 4 * 64;
17705
17706 uint md5_remaining_len = md5_max_len;
17707
17708 uint tmp_md5_buf[64] = { 0 };
17709
17710 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17711
17712 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17713
17714 md5_len += method_len + 1;
17715 tmp_md5_ptr += method_len + 1;
17716
17717 if (URI_prefix_len > 0)
17718 {
17719 md5_remaining_len = md5_max_len - md5_len;
17720
17721 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17722
17723 md5_len += URI_prefix_len + 1;
17724 tmp_md5_ptr += URI_prefix_len + 1;
17725 }
17726
17727 md5_remaining_len = md5_max_len - md5_len;
17728
17729 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17730
17731 md5_len += URI_resource_len;
17732 tmp_md5_ptr += URI_resource_len;
17733
17734 if (URI_suffix_len > 0)
17735 {
17736 md5_remaining_len = md5_max_len - md5_len;
17737
17738 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17739
17740 md5_len += 1 + URI_suffix_len;
17741 }
17742
17743 uint tmp_digest[4] = { 0 };
17744
17745 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17746
17747 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17748 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17749 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17750 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17751
17752 /*
17753 * esalt
17754 */
17755
17756 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17757
17758 uint esalt_len = 0;
17759
17760 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17761
17762 // there are 2 possibilities for the esalt:
17763
17764 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17765 {
17766 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17767
17768 if (esalt_len > max_esalt_len)
17769 {
17770 myfree (temp_input_buf);
17771
17772 return (PARSER_SALT_LENGTH);
17773 }
17774
17775 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17776 nonce_pos,
17777 nonce_count_pos,
17778 nonce_client_pos,
17779 qop_pos,
17780 tmp_digest[0],
17781 tmp_digest[1],
17782 tmp_digest[2],
17783 tmp_digest[3]);
17784 }
17785 else
17786 {
17787 esalt_len = 1 + nonce_len + 1 + 32;
17788
17789 if (esalt_len > max_esalt_len)
17790 {
17791 myfree (temp_input_buf);
17792
17793 return (PARSER_SALT_LENGTH);
17794 }
17795
17796 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17797 nonce_pos,
17798 tmp_digest[0],
17799 tmp_digest[1],
17800 tmp_digest[2],
17801 tmp_digest[3]);
17802 }
17803
17804 // add 0x80 to esalt
17805
17806 esalt_buf_ptr[esalt_len] = 0x80;
17807
17808 sip->esalt_len = esalt_len;
17809
17810 /*
17811 * actual salt
17812 */
17813
17814 char *sip_salt_ptr = (char *) sip->salt_buf;
17815
17816 uint salt_len = user_len + 1 + realm_len + 1;
17817
17818 uint max_salt_len = 119;
17819
17820 if (salt_len > max_salt_len)
17821 {
17822 myfree (temp_input_buf);
17823
17824 return (PARSER_SALT_LENGTH);
17825 }
17826
17827 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17828
17829 sip->salt_len = salt_len;
17830
17831 /*
17832 * fake salt (for sorting)
17833 */
17834
17835 char *salt_buf_ptr = (char *) salt->salt_buf;
17836
17837 max_salt_len = 55;
17838
17839 uint fake_salt_len = salt_len;
17840
17841 if (fake_salt_len > max_salt_len)
17842 {
17843 fake_salt_len = max_salt_len;
17844 }
17845
17846 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17847
17848 salt->salt_len = fake_salt_len;
17849
17850 /*
17851 * digest
17852 */
17853
17854 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
17855 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
17856 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
17857 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
17858
17859 digest[0] = byte_swap_32 (digest[0]);
17860 digest[1] = byte_swap_32 (digest[1]);
17861 digest[2] = byte_swap_32 (digest[2]);
17862 digest[3] = byte_swap_32 (digest[3]);
17863
17864 myfree (temp_input_buf);
17865
17866 return (PARSER_OK);
17867 }
17868
17869 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17870 {
17871 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17872
17873 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17874
17875 u32 *digest = (u32 *) hash_buf->digest;
17876
17877 salt_t *salt = hash_buf->salt;
17878
17879 // digest
17880
17881 char *digest_pos = input_buf;
17882
17883 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
17884 digest[1] = 0;
17885 digest[2] = 0;
17886 digest[3] = 0;
17887
17888 // salt
17889
17890 char *salt_buf = input_buf + 8 + 1;
17891
17892 uint salt_len = 8;
17893
17894 char *salt_buf_ptr = (char *) salt->salt_buf;
17895
17896 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17897
17898 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17899
17900 salt->salt_len = salt_len;
17901
17902 return (PARSER_OK);
17903 }
17904
17905 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17906 {
17907 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
17908
17909 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17910
17911 u32 *digest = (u32 *) hash_buf->digest;
17912
17913 salt_t *salt = hash_buf->salt;
17914
17915 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
17916
17917 /**
17918 * parse line
17919 */
17920
17921 char *p_buf_pos = input_buf + 4;
17922
17923 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
17924
17925 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17926
17927 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
17928
17929 NumCyclesPower_pos++;
17930
17931 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
17932
17933 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17934
17935 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
17936
17937 salt_len_pos++;
17938
17939 char *salt_buf_pos = strchr (salt_len_pos, '$');
17940
17941 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17942
17943 u32 salt_len_len = salt_buf_pos - salt_len_pos;
17944
17945 salt_buf_pos++;
17946
17947 char *iv_len_pos = strchr (salt_buf_pos, '$');
17948
17949 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17950
17951 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
17952
17953 iv_len_pos++;
17954
17955 char *iv_buf_pos = strchr (iv_len_pos, '$');
17956
17957 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17958
17959 u32 iv_len_len = iv_buf_pos - iv_len_pos;
17960
17961 iv_buf_pos++;
17962
17963 char *crc_buf_pos = strchr (iv_buf_pos, '$');
17964
17965 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17966
17967 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
17968
17969 crc_buf_pos++;
17970
17971 char *data_len_pos = strchr (crc_buf_pos, '$');
17972
17973 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17974
17975 u32 crc_buf_len = data_len_pos - crc_buf_pos;
17976
17977 data_len_pos++;
17978
17979 char *unpack_size_pos = strchr (data_len_pos, '$');
17980
17981 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17982
17983 u32 data_len_len = unpack_size_pos - data_len_pos;
17984
17985 unpack_size_pos++;
17986
17987 char *data_buf_pos = strchr (unpack_size_pos, '$');
17988
17989 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17990
17991 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
17992
17993 data_buf_pos++;
17994
17995 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;
17996
17997 const uint iter = atoi (NumCyclesPower_pos);
17998 const uint crc = atoi (crc_buf_pos);
17999 const uint p_buf = atoi (p_buf_pos);
18000 const uint salt_len = atoi (salt_len_pos);
18001 const uint iv_len = atoi (iv_len_pos);
18002 const uint unpack_size = atoi (unpack_size_pos);
18003 const uint data_len = atoi (data_len_pos);
18004
18005 /**
18006 * verify some data
18007 */
18008
18009 if (p_buf != 0) return (PARSER_SALT_VALUE);
18010 if (salt_len != 0) return (PARSER_SALT_VALUE);
18011
18012 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18013
18014 if (data_len > 384) return (PARSER_SALT_VALUE);
18015
18016 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18017
18018 /**
18019 * store data
18020 */
18021
18022 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18023 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18024 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18025 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18026
18027 seven_zip->iv_len = iv_len;
18028
18029 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18030
18031 seven_zip->salt_len = 0;
18032
18033 seven_zip->crc = crc;
18034
18035 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18036 {
18037 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18038
18039 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18040 }
18041
18042 seven_zip->data_len = data_len;
18043
18044 seven_zip->unpack_size = unpack_size;
18045
18046 // real salt
18047
18048 salt->salt_buf[0] = seven_zip->data_buf[0];
18049 salt->salt_buf[1] = seven_zip->data_buf[1];
18050 salt->salt_buf[2] = seven_zip->data_buf[2];
18051 salt->salt_buf[3] = seven_zip->data_buf[3];
18052
18053 salt->salt_len = 16;
18054
18055 salt->salt_sign[0] = iter;
18056
18057 salt->salt_iter = 1 << iter;
18058
18059 /**
18060 * digest
18061 */
18062
18063 digest[0] = crc;
18064 digest[1] = 0;
18065 digest[2] = 0;
18066 digest[3] = 0;
18067
18068 return (PARSER_OK);
18069 }
18070
18071 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18072 {
18073 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18074
18075 u32 *digest = (u32 *) hash_buf->digest;
18076
18077 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18078 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18079 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18080 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18081 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18082 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18083 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18084 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18085
18086 digest[0] = byte_swap_32 (digest[0]);
18087 digest[1] = byte_swap_32 (digest[1]);
18088 digest[2] = byte_swap_32 (digest[2]);
18089 digest[3] = byte_swap_32 (digest[3]);
18090 digest[4] = byte_swap_32 (digest[4]);
18091 digest[5] = byte_swap_32 (digest[5]);
18092 digest[6] = byte_swap_32 (digest[6]);
18093 digest[7] = byte_swap_32 (digest[7]);
18094
18095 return (PARSER_OK);
18096 }
18097
18098 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18099 {
18100 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18101
18102 u32 *digest = (u32 *) hash_buf->digest;
18103
18104 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18105 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18106 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18107 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18108 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18109 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18110 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18111 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18112 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18113 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18114 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18115 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18116 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18117 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18118 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18119 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18120
18121 digest[ 0] = byte_swap_32 (digest[ 0]);
18122 digest[ 1] = byte_swap_32 (digest[ 1]);
18123 digest[ 2] = byte_swap_32 (digest[ 2]);
18124 digest[ 3] = byte_swap_32 (digest[ 3]);
18125 digest[ 4] = byte_swap_32 (digest[ 4]);
18126 digest[ 5] = byte_swap_32 (digest[ 5]);
18127 digest[ 6] = byte_swap_32 (digest[ 6]);
18128 digest[ 7] = byte_swap_32 (digest[ 7]);
18129 digest[ 8] = byte_swap_32 (digest[ 8]);
18130 digest[ 9] = byte_swap_32 (digest[ 9]);
18131 digest[10] = byte_swap_32 (digest[10]);
18132 digest[11] = byte_swap_32 (digest[11]);
18133 digest[12] = byte_swap_32 (digest[12]);
18134 digest[13] = byte_swap_32 (digest[13]);
18135 digest[14] = byte_swap_32 (digest[14]);
18136 digest[15] = byte_swap_32 (digest[15]);
18137
18138 return (PARSER_OK);
18139 }
18140
18141 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18142 {
18143 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
18144
18145 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18146
18147 u32 *digest = (u32 *) hash_buf->digest;
18148
18149 salt_t *salt = hash_buf->salt;
18150
18151 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
18152
18153 /**
18154 * parse line
18155 */
18156
18157 // iterations
18158
18159 char *iter_pos = input_buf + 4;
18160
18161 u32 iter = atoi (iter_pos);
18162
18163 if (iter < 1) return (PARSER_SALT_ITERATION);
18164 if (iter > 999999) return (PARSER_SALT_ITERATION);
18165
18166 // first is *raw* salt
18167
18168 char *salt_pos = strchr (iter_pos, ':');
18169
18170 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18171
18172 salt_pos++;
18173
18174 char *hash_pos = strchr (salt_pos, ':');
18175
18176 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18177
18178 u32 salt_len = hash_pos - salt_pos;
18179
18180 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18181
18182 hash_pos++;
18183
18184 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18185
18186 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18187
18188 // decode salt
18189
18190 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
18191
18192 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18193
18194 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18195
18196 salt_buf_ptr[salt_len + 3] = 0x01;
18197 salt_buf_ptr[salt_len + 4] = 0x80;
18198
18199 salt->salt_len = salt_len;
18200 salt->salt_iter = iter - 1;
18201
18202 // decode hash
18203
18204 u8 tmp_buf[100] = { 0 };
18205
18206 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18207
18208 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18209
18210 memcpy (digest, tmp_buf, 16);
18211
18212 // add some stuff to normal salt to make sorted happy
18213
18214 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
18215 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
18216 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
18217 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
18218 salt->salt_buf[4] = salt->salt_iter;
18219
18220 return (PARSER_OK);
18221 }
18222
18223 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18224 {
18225 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
18226
18227 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
18228
18229 u32 *digest = (u32 *) hash_buf->digest;
18230
18231 salt_t *salt = hash_buf->salt;
18232
18233 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
18234
18235 /**
18236 * parse line
18237 */
18238
18239 // iterations
18240
18241 char *iter_pos = input_buf + 5;
18242
18243 u32 iter = atoi (iter_pos);
18244
18245 if (iter < 1) return (PARSER_SALT_ITERATION);
18246 if (iter > 999999) return (PARSER_SALT_ITERATION);
18247
18248 // first is *raw* salt
18249
18250 char *salt_pos = strchr (iter_pos, ':');
18251
18252 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18253
18254 salt_pos++;
18255
18256 char *hash_pos = strchr (salt_pos, ':');
18257
18258 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18259
18260 u32 salt_len = hash_pos - salt_pos;
18261
18262 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18263
18264 hash_pos++;
18265
18266 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18267
18268 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18269
18270 // decode salt
18271
18272 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18273
18274 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18275
18276 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18277
18278 salt_buf_ptr[salt_len + 3] = 0x01;
18279 salt_buf_ptr[salt_len + 4] = 0x80;
18280
18281 salt->salt_len = salt_len;
18282 salt->salt_iter = iter - 1;
18283
18284 // decode hash
18285
18286 u8 tmp_buf[100] = { 0 };
18287
18288 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18289
18290 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18291
18292 memcpy (digest, tmp_buf, 16);
18293
18294 digest[0] = byte_swap_32 (digest[0]);
18295 digest[1] = byte_swap_32 (digest[1]);
18296 digest[2] = byte_swap_32 (digest[2]);
18297 digest[3] = byte_swap_32 (digest[3]);
18298
18299 // add some stuff to normal salt to make sorted happy
18300
18301 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18302 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18303 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18304 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18305 salt->salt_buf[4] = salt->salt_iter;
18306
18307 return (PARSER_OK);
18308 }
18309
18310 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18311 {
18312 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18313
18314 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18315
18316 u64 *digest = (u64 *) hash_buf->digest;
18317
18318 salt_t *salt = hash_buf->salt;
18319
18320 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18321
18322 /**
18323 * parse line
18324 */
18325
18326 // iterations
18327
18328 char *iter_pos = input_buf + 7;
18329
18330 u32 iter = atoi (iter_pos);
18331
18332 if (iter < 1) return (PARSER_SALT_ITERATION);
18333 if (iter > 999999) return (PARSER_SALT_ITERATION);
18334
18335 // first is *raw* salt
18336
18337 char *salt_pos = strchr (iter_pos, ':');
18338
18339 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18340
18341 salt_pos++;
18342
18343 char *hash_pos = strchr (salt_pos, ':');
18344
18345 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18346
18347 u32 salt_len = hash_pos - salt_pos;
18348
18349 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18350
18351 hash_pos++;
18352
18353 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18354
18355 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18356
18357 // decode salt
18358
18359 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18360
18361 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18362
18363 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18364
18365 salt_buf_ptr[salt_len + 3] = 0x01;
18366 salt_buf_ptr[salt_len + 4] = 0x80;
18367
18368 salt->salt_len = salt_len;
18369 salt->salt_iter = iter - 1;
18370
18371 // decode hash
18372
18373 u8 tmp_buf[100] = { 0 };
18374
18375 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18376
18377 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18378
18379 memcpy (digest, tmp_buf, 64);
18380
18381 digest[0] = byte_swap_64 (digest[0]);
18382 digest[1] = byte_swap_64 (digest[1]);
18383 digest[2] = byte_swap_64 (digest[2]);
18384 digest[3] = byte_swap_64 (digest[3]);
18385 digest[4] = byte_swap_64 (digest[4]);
18386 digest[5] = byte_swap_64 (digest[5]);
18387 digest[6] = byte_swap_64 (digest[6]);
18388 digest[7] = byte_swap_64 (digest[7]);
18389
18390 // add some stuff to normal salt to make sorted happy
18391
18392 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18393 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18394 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18395 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18396 salt->salt_buf[4] = salt->salt_iter;
18397
18398 return (PARSER_OK);
18399 }
18400
18401 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18402 {
18403 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18404
18405 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18406
18407 uint *digest = (uint *) hash_buf->digest;
18408
18409 salt_t *salt = hash_buf->salt;
18410
18411 /**
18412 * parse line
18413 */
18414
18415 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18416
18417 char *hash_pos = strchr (salt_pos, '$');
18418
18419 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18420
18421 u32 salt_len = hash_pos - salt_pos;
18422
18423 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18424
18425 hash_pos++;
18426
18427 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18428
18429 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18430
18431 // decode hash
18432
18433 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
18434 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
18435 digest[ 2] = 0;
18436 digest[ 3] = 0;
18437 digest[ 4] = 0;
18438 digest[ 5] = 0;
18439 digest[ 6] = 0;
18440 digest[ 7] = 0;
18441 digest[ 8] = 0;
18442 digest[ 9] = 0;
18443 digest[10] = 0;
18444 digest[11] = 0;
18445 digest[12] = 0;
18446 digest[13] = 0;
18447 digest[14] = 0;
18448 digest[15] = 0;
18449
18450 // decode salt
18451
18452 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18453 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18454
18455 salt->salt_iter = ROUNDS_ECRYPTFS;
18456 salt->salt_len = 8;
18457
18458 return (PARSER_OK);
18459 }
18460
18461 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18462 {
18463 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18464
18465 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18466
18467 unsigned char c19 = itoa64_to_int (input_buf[19]);
18468
18469 if (c19 & 3) return (PARSER_HASH_VALUE);
18470
18471 salt_t *salt = hash_buf->salt;
18472
18473 u32 *digest = (u32 *) hash_buf->digest;
18474
18475 // iteration count
18476
18477 salt->salt_iter = itoa64_to_int (input_buf[1])
18478 | itoa64_to_int (input_buf[2]) << 6
18479 | itoa64_to_int (input_buf[3]) << 12
18480 | itoa64_to_int (input_buf[4]) << 18;
18481
18482 // set salt
18483
18484 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18485 | itoa64_to_int (input_buf[6]) << 6
18486 | itoa64_to_int (input_buf[7]) << 12
18487 | itoa64_to_int (input_buf[8]) << 18;
18488
18489 salt->salt_len = 4;
18490
18491 u8 tmp_buf[100] = { 0 };
18492
18493 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
18494
18495 memcpy (digest, tmp_buf, 8);
18496
18497 uint tt;
18498
18499 IP (digest[0], digest[1], tt);
18500
18501 digest[0] = rotr32 (digest[0], 31);
18502 digest[1] = rotr32 (digest[1], 31);
18503 digest[2] = 0;
18504 digest[3] = 0;
18505
18506 return (PARSER_OK);
18507 }
18508
18509 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18510 {
18511 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18512
18513 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18514
18515 u32 *digest = (u32 *) hash_buf->digest;
18516
18517 salt_t *salt = hash_buf->salt;
18518
18519 /**
18520 * parse line
18521 */
18522
18523 char *type_pos = input_buf + 6 + 1;
18524
18525 char *salt_pos = strchr (type_pos, '*');
18526
18527 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18528
18529 u32 type_len = salt_pos - type_pos;
18530
18531 if (type_len != 1) return (PARSER_SALT_LENGTH);
18532
18533 salt_pos++;
18534
18535 char *crypted_pos = strchr (salt_pos, '*');
18536
18537 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18538
18539 u32 salt_len = crypted_pos - salt_pos;
18540
18541 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18542
18543 crypted_pos++;
18544
18545 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18546
18547 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18548
18549 /**
18550 * copy data
18551 */
18552
18553 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18554 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18555
18556 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18557 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18558
18559 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
18560 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
18561 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
18562 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
18563
18564 salt->salt_len = 24;
18565 salt->salt_iter = ROUNDS_RAR3;
18566
18567 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18568 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18569
18570 digest[0] = 0xc43d7b00;
18571 digest[1] = 0x40070000;
18572 digest[2] = 0;
18573 digest[3] = 0;
18574
18575 return (PARSER_OK);
18576 }
18577
18578 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18579 {
18580 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
18581
18582 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
18583
18584 u32 *digest = (u32 *) hash_buf->digest;
18585
18586 salt_t *salt = hash_buf->salt;
18587
18588 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
18589
18590 /**
18591 * parse line
18592 */
18593
18594 char *param0_pos = input_buf + 1 + 4 + 1;
18595
18596 char *param1_pos = strchr (param0_pos, '$');
18597
18598 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18599
18600 u32 param0_len = param1_pos - param0_pos;
18601
18602 param1_pos++;
18603
18604 char *param2_pos = strchr (param1_pos, '$');
18605
18606 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18607
18608 u32 param1_len = param2_pos - param1_pos;
18609
18610 param2_pos++;
18611
18612 char *param3_pos = strchr (param2_pos, '$');
18613
18614 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18615
18616 u32 param2_len = param3_pos - param2_pos;
18617
18618 param3_pos++;
18619
18620 char *param4_pos = strchr (param3_pos, '$');
18621
18622 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18623
18624 u32 param3_len = param4_pos - param3_pos;
18625
18626 param4_pos++;
18627
18628 char *param5_pos = strchr (param4_pos, '$');
18629
18630 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18631
18632 u32 param4_len = param5_pos - param4_pos;
18633
18634 param5_pos++;
18635
18636 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
18637
18638 char *salt_buf = param1_pos;
18639 char *iv = param3_pos;
18640 char *pswcheck = param5_pos;
18641
18642 const uint salt_len = atoi (param0_pos);
18643 const uint iterations = atoi (param2_pos);
18644 const uint pswcheck_len = atoi (param4_pos);
18645
18646 /**
18647 * verify some data
18648 */
18649
18650 if (param1_len != 32) return (PARSER_SALT_VALUE);
18651 if (param3_len != 32) return (PARSER_SALT_VALUE);
18652 if (param5_len != 16) return (PARSER_SALT_VALUE);
18653
18654 if (salt_len != 16) return (PARSER_SALT_VALUE);
18655 if (iterations == 0) return (PARSER_SALT_VALUE);
18656 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
18657
18658 /**
18659 * store data
18660 */
18661
18662 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
18663 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
18664 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
18665 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
18666
18667 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
18668 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
18669 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
18670 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
18671
18672 salt->salt_len = 16;
18673
18674 salt->salt_sign[0] = iterations;
18675
18676 salt->salt_iter = ((1 << iterations) + 32) - 1;
18677
18678 /**
18679 * digest buf
18680 */
18681
18682 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
18683 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
18684 digest[2] = 0;
18685 digest[3] = 0;
18686
18687 return (PARSER_OK);
18688 }
18689
18690 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18691 {
18692 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18693
18694 u32 *digest = (u32 *) hash_buf->digest;
18695
18696 salt_t *salt = hash_buf->salt;
18697
18698 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18699 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18700 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18701 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18702 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18703 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18704 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18705 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18706
18707 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18708
18709 uint salt_len = input_len - 64 - 1;
18710
18711 char *salt_buf = input_buf + 64 + 1;
18712
18713 char *salt_buf_ptr = (char *) salt->salt_buf;
18714
18715 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18716
18717 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18718
18719 salt->salt_len = salt_len;
18720
18721 /**
18722 * we can precompute the first sha256 transform
18723 */
18724
18725 uint w[16] = { 0 };
18726
18727 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18728 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18729 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18730 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18731 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18732 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18733 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18734 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18735 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18736 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18737 w[10] = byte_swap_32 (salt->salt_buf[10]);
18738 w[11] = byte_swap_32 (salt->salt_buf[11]);
18739 w[12] = byte_swap_32 (salt->salt_buf[12]);
18740 w[13] = byte_swap_32 (salt->salt_buf[13]);
18741 w[14] = byte_swap_32 (salt->salt_buf[14]);
18742 w[15] = byte_swap_32 (salt->salt_buf[15]);
18743
18744 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
18745
18746 sha256_64 (w, pc256);
18747
18748 salt->salt_buf_pc[0] = pc256[0];
18749 salt->salt_buf_pc[1] = pc256[1];
18750 salt->salt_buf_pc[2] = pc256[2];
18751 salt->salt_buf_pc[3] = pc256[3];
18752 salt->salt_buf_pc[4] = pc256[4];
18753 salt->salt_buf_pc[5] = pc256[5];
18754 salt->salt_buf_pc[6] = pc256[6];
18755 salt->salt_buf_pc[7] = pc256[7];
18756
18757 digest[0] -= pc256[0];
18758 digest[1] -= pc256[1];
18759 digest[2] -= pc256[2];
18760 digest[3] -= pc256[3];
18761 digest[4] -= pc256[4];
18762 digest[5] -= pc256[5];
18763 digest[6] -= pc256[6];
18764 digest[7] -= pc256[7];
18765
18766 return (PARSER_OK);
18767 }
18768
18769 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18770 {
18771 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18772
18773 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18774
18775 u32 *digest = (u32 *) hash_buf->digest;
18776
18777 salt_t *salt = hash_buf->salt;
18778
18779 /**
18780 * parse line
18781 */
18782
18783 char *data_len_pos = input_buf + 1 + 10 + 1;
18784
18785 char *data_buf_pos = strchr (data_len_pos, '$');
18786
18787 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18788
18789 u32 data_len_len = data_buf_pos - data_len_pos;
18790
18791 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18792 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18793
18794 data_buf_pos++;
18795
18796 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18797
18798 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18799
18800 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18801
18802 u32 data_len = atoi (data_len_pos);
18803
18804 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18805
18806 /**
18807 * salt
18808 */
18809
18810 char *salt_pos = data_buf_pos;
18811
18812 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18813 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18814 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
18815 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
18816
18817 // this is actually the CT, which is also the hash later (if matched)
18818
18819 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
18820 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
18821 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
18822 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
18823
18824 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18825
18826 salt->salt_iter = 10 - 1;
18827
18828 /**
18829 * digest buf
18830 */
18831
18832 digest[0] = salt->salt_buf[4];
18833 digest[1] = salt->salt_buf[5];
18834 digest[2] = salt->salt_buf[6];
18835 digest[3] = salt->salt_buf[7];
18836
18837 return (PARSER_OK);
18838 }
18839
18840 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18841 {
18842 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
18843
18844 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18845
18846 u32 *digest = (u32 *) hash_buf->digest;
18847
18848 salt_t *salt = hash_buf->salt;
18849
18850 /**
18851 * parse line
18852 */
18853
18854 char *salt_pos = input_buf + 11 + 1;
18855
18856 char *iter_pos = strchr (salt_pos, ',');
18857
18858 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18859
18860 u32 salt_len = iter_pos - salt_pos;
18861
18862 if (salt_len != 20) return (PARSER_SALT_LENGTH);
18863
18864 iter_pos++;
18865
18866 char *hash_pos = strchr (iter_pos, ',');
18867
18868 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18869
18870 u32 iter_len = hash_pos - iter_pos;
18871
18872 if (iter_len > 5) return (PARSER_SALT_LENGTH);
18873
18874 hash_pos++;
18875
18876 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
18877
18878 if (hash_len != 64) return (PARSER_HASH_LENGTH);
18879
18880 /**
18881 * salt
18882 */
18883
18884 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18885 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18886 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
18887 salt->salt_buf[3] = 0x00018000;
18888
18889 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18890 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18891 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
18892 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
18893
18894 salt->salt_len = salt_len / 2;
18895
18896 salt->salt_iter = atoi (iter_pos) - 1;
18897
18898 /**
18899 * digest buf
18900 */
18901
18902 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18903 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18904 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18905 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18906 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18907 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
18908 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
18909 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
18910
18911 return (PARSER_OK);
18912 }
18913
18914 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18915 {
18916 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
18917
18918 u32 *digest = (u32 *) hash_buf->digest;
18919
18920 salt_t *salt = hash_buf->salt;
18921
18922 /**
18923 * parse line
18924 */
18925
18926 char *hash_pos = input_buf + 64;
18927 char *salt1_pos = input_buf + 128;
18928 char *salt2_pos = input_buf;
18929
18930 /**
18931 * salt
18932 */
18933
18934 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
18935 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
18936 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
18937 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
18938
18939 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
18940 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
18941 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
18942 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
18943
18944 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
18945 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
18946 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
18947 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
18948
18949 salt->salt_len = 48;
18950
18951 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
18952
18953 /**
18954 * digest buf
18955 */
18956
18957 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18958 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18959 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18960 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18961 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18962 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
18963 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
18964 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
18965
18966 return (PARSER_OK);
18967 }
18968
18969 /**
18970 * parallel running threads
18971 */
18972
18973 #ifdef WIN
18974
18975 BOOL WINAPI sigHandler_default (DWORD sig)
18976 {
18977 switch (sig)
18978 {
18979 case CTRL_CLOSE_EVENT:
18980
18981 /*
18982 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
18983 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
18984 * function otherwise it is too late (e.g. after returning from this function)
18985 */
18986
18987 myabort ();
18988
18989 SetConsoleCtrlHandler (NULL, TRUE);
18990
18991 hc_sleep (10);
18992
18993 return TRUE;
18994
18995 case CTRL_C_EVENT:
18996 case CTRL_LOGOFF_EVENT:
18997 case CTRL_SHUTDOWN_EVENT:
18998
18999 myabort ();
19000
19001 SetConsoleCtrlHandler (NULL, TRUE);
19002
19003 return TRUE;
19004 }
19005
19006 return FALSE;
19007 }
19008
19009 BOOL WINAPI sigHandler_benchmark (DWORD sig)
19010 {
19011 switch (sig)
19012 {
19013 case CTRL_CLOSE_EVENT:
19014
19015 myabort ();
19016
19017 SetConsoleCtrlHandler (NULL, TRUE);
19018
19019 hc_sleep (10);
19020
19021 return TRUE;
19022
19023 case CTRL_C_EVENT:
19024 case CTRL_LOGOFF_EVENT:
19025 case CTRL_SHUTDOWN_EVENT:
19026
19027 myquit ();
19028
19029 SetConsoleCtrlHandler (NULL, TRUE);
19030
19031 return TRUE;
19032 }
19033
19034 return FALSE;
19035 }
19036
19037 void hc_signal (BOOL WINAPI (callback) (DWORD))
19038 {
19039 if (callback == NULL)
19040 {
19041 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
19042 }
19043 else
19044 {
19045 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
19046 }
19047 }
19048
19049 #else
19050
19051 void sigHandler_default (int sig)
19052 {
19053 myabort ();
19054
19055 signal (sig, NULL);
19056 }
19057
19058 void sigHandler_benchmark (int sig)
19059 {
19060 myquit ();
19061
19062 signal (sig, NULL);
19063 }
19064
19065 void hc_signal (void (callback) (int))
19066 {
19067 if (callback == NULL) callback = SIG_DFL;
19068
19069 signal (SIGINT, callback);
19070 signal (SIGTERM, callback);
19071 signal (SIGABRT, callback);
19072 }
19073
19074 #endif
19075
19076 void status_display ();
19077
19078 void *thread_keypress (void *p)
19079 {
19080 int benchmark = *((int *) p);
19081
19082 uint quiet = data.quiet;
19083
19084 tty_break();
19085
19086 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
19087 {
19088 int ch = tty_getchar();
19089
19090 if (ch == -1) break;
19091
19092 if (ch == 0) continue;
19093
19094 #ifdef _POSIX
19095 if (ch != '\n')
19096 #endif
19097
19098 hc_thread_mutex_lock (mux_display);
19099
19100 log_info ("");
19101
19102 switch (ch)
19103 {
19104 case 's':
19105 case '\n':
19106
19107 log_info ("");
19108
19109 status_display ();
19110
19111 log_info ("");
19112
19113 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19114 if (quiet == 0) fflush (stdout);
19115
19116 break;
19117
19118 case 'b':
19119
19120 log_info ("");
19121
19122 bypass ();
19123
19124 log_info ("");
19125
19126 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19127 if (quiet == 0) fflush (stdout);
19128
19129 break;
19130
19131 case 'p':
19132
19133 log_info ("");
19134
19135 SuspendThreads ();
19136
19137 log_info ("");
19138
19139 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19140 if (quiet == 0) fflush (stdout);
19141
19142 break;
19143
19144 case 'r':
19145
19146 log_info ("");
19147
19148 ResumeThreads ();
19149
19150 log_info ("");
19151
19152 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19153 if (quiet == 0) fflush (stdout);
19154
19155 break;
19156
19157 case 'c':
19158
19159 log_info ("");
19160
19161 if (benchmark == 1) break;
19162
19163 stop_at_checkpoint ();
19164
19165 log_info ("");
19166
19167 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19168 if (quiet == 0) fflush (stdout);
19169
19170 break;
19171
19172 case 'q':
19173
19174 log_info ("");
19175
19176 if (benchmark == 1)
19177 {
19178 myquit ();
19179 }
19180 else
19181 {
19182 myabort ();
19183 }
19184
19185 break;
19186 }
19187
19188 hc_thread_mutex_unlock (mux_display);
19189 }
19190
19191 tty_fix();
19192
19193 return (p);
19194 }
19195
19196 /**
19197 * rules common
19198 */
19199
19200 bool class_num (const u8 c)
19201 {
19202 return ((c >= '0') && (c <= '9'));
19203 }
19204
19205 bool class_lower (const u8 c)
19206 {
19207 return ((c >= 'a') && (c <= 'z'));
19208 }
19209
19210 bool class_upper (const u8 c)
19211 {
19212 return ((c >= 'A') && (c <= 'Z'));
19213 }
19214
19215 bool class_alpha (const u8 c)
19216 {
19217 return (class_lower (c) || class_upper (c));
19218 }
19219
19220 int conv_ctoi (const u8 c)
19221 {
19222 if (class_num (c))
19223 {
19224 return c - '0';
19225 }
19226 else if (class_upper (c))
19227 {
19228 return c - 'A' + 10;
19229 }
19230
19231 return -1;
19232 }
19233
19234 int conv_itoc (const u8 c)
19235 {
19236 if (c < 10)
19237 {
19238 return c + '0';
19239 }
19240 else if (c < 37)
19241 {
19242 return c + 'A' - 10;
19243 }
19244
19245 return -1;
19246 }
19247
19248 /**
19249 * device rules
19250 */
19251
19252 #define INCR_POS if (++rule_pos == rule_len) return (-1)
19253 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
19254 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
19255 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
19256 #define MAX_KERNEL_RULES 255
19257 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
19258 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19259 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19260
19261 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
19262 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
19263 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19264 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19265
19266 int cpu_rule_to_kernel_rule (char rule_buf[BUFSIZ], uint rule_len, kernel_rule_t *rule)
19267 {
19268 uint rule_pos;
19269 uint rule_cnt;
19270
19271 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19272 {
19273 switch (rule_buf[rule_pos])
19274 {
19275 case ' ':
19276 rule_cnt--;
19277 break;
19278
19279 case RULE_OP_MANGLE_NOOP:
19280 SET_NAME (rule, rule_buf[rule_pos]);
19281 break;
19282
19283 case RULE_OP_MANGLE_LREST:
19284 SET_NAME (rule, rule_buf[rule_pos]);
19285 break;
19286
19287 case RULE_OP_MANGLE_UREST:
19288 SET_NAME (rule, rule_buf[rule_pos]);
19289 break;
19290
19291 case RULE_OP_MANGLE_LREST_UFIRST:
19292 SET_NAME (rule, rule_buf[rule_pos]);
19293 break;
19294
19295 case RULE_OP_MANGLE_UREST_LFIRST:
19296 SET_NAME (rule, rule_buf[rule_pos]);
19297 break;
19298
19299 case RULE_OP_MANGLE_TREST:
19300 SET_NAME (rule, rule_buf[rule_pos]);
19301 break;
19302
19303 case RULE_OP_MANGLE_TOGGLE_AT:
19304 SET_NAME (rule, rule_buf[rule_pos]);
19305 SET_P0_CONV (rule, rule_buf[rule_pos]);
19306 break;
19307
19308 case RULE_OP_MANGLE_REVERSE:
19309 SET_NAME (rule, rule_buf[rule_pos]);
19310 break;
19311
19312 case RULE_OP_MANGLE_DUPEWORD:
19313 SET_NAME (rule, rule_buf[rule_pos]);
19314 break;
19315
19316 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19317 SET_NAME (rule, rule_buf[rule_pos]);
19318 SET_P0_CONV (rule, rule_buf[rule_pos]);
19319 break;
19320
19321 case RULE_OP_MANGLE_REFLECT:
19322 SET_NAME (rule, rule_buf[rule_pos]);
19323 break;
19324
19325 case RULE_OP_MANGLE_ROTATE_LEFT:
19326 SET_NAME (rule, rule_buf[rule_pos]);
19327 break;
19328
19329 case RULE_OP_MANGLE_ROTATE_RIGHT:
19330 SET_NAME (rule, rule_buf[rule_pos]);
19331 break;
19332
19333 case RULE_OP_MANGLE_APPEND:
19334 SET_NAME (rule, rule_buf[rule_pos]);
19335 SET_P0 (rule, rule_buf[rule_pos]);
19336 break;
19337
19338 case RULE_OP_MANGLE_PREPEND:
19339 SET_NAME (rule, rule_buf[rule_pos]);
19340 SET_P0 (rule, rule_buf[rule_pos]);
19341 break;
19342
19343 case RULE_OP_MANGLE_DELETE_FIRST:
19344 SET_NAME (rule, rule_buf[rule_pos]);
19345 break;
19346
19347 case RULE_OP_MANGLE_DELETE_LAST:
19348 SET_NAME (rule, rule_buf[rule_pos]);
19349 break;
19350
19351 case RULE_OP_MANGLE_DELETE_AT:
19352 SET_NAME (rule, rule_buf[rule_pos]);
19353 SET_P0_CONV (rule, rule_buf[rule_pos]);
19354 break;
19355
19356 case RULE_OP_MANGLE_EXTRACT:
19357 SET_NAME (rule, rule_buf[rule_pos]);
19358 SET_P0_CONV (rule, rule_buf[rule_pos]);
19359 SET_P1_CONV (rule, rule_buf[rule_pos]);
19360 break;
19361
19362 case RULE_OP_MANGLE_OMIT:
19363 SET_NAME (rule, rule_buf[rule_pos]);
19364 SET_P0_CONV (rule, rule_buf[rule_pos]);
19365 SET_P1_CONV (rule, rule_buf[rule_pos]);
19366 break;
19367
19368 case RULE_OP_MANGLE_INSERT:
19369 SET_NAME (rule, rule_buf[rule_pos]);
19370 SET_P0_CONV (rule, rule_buf[rule_pos]);
19371 SET_P1 (rule, rule_buf[rule_pos]);
19372 break;
19373
19374 case RULE_OP_MANGLE_OVERSTRIKE:
19375 SET_NAME (rule, rule_buf[rule_pos]);
19376 SET_P0_CONV (rule, rule_buf[rule_pos]);
19377 SET_P1 (rule, rule_buf[rule_pos]);
19378 break;
19379
19380 case RULE_OP_MANGLE_TRUNCATE_AT:
19381 SET_NAME (rule, rule_buf[rule_pos]);
19382 SET_P0_CONV (rule, rule_buf[rule_pos]);
19383 break;
19384
19385 case RULE_OP_MANGLE_REPLACE:
19386 SET_NAME (rule, rule_buf[rule_pos]);
19387 SET_P0 (rule, rule_buf[rule_pos]);
19388 SET_P1 (rule, rule_buf[rule_pos]);
19389 break;
19390
19391 case RULE_OP_MANGLE_PURGECHAR:
19392 return (-1);
19393 break;
19394
19395 case RULE_OP_MANGLE_TOGGLECASE_REC:
19396 return (-1);
19397 break;
19398
19399 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19400 SET_NAME (rule, rule_buf[rule_pos]);
19401 SET_P0_CONV (rule, rule_buf[rule_pos]);
19402 break;
19403
19404 case RULE_OP_MANGLE_DUPECHAR_LAST:
19405 SET_NAME (rule, rule_buf[rule_pos]);
19406 SET_P0_CONV (rule, rule_buf[rule_pos]);
19407 break;
19408
19409 case RULE_OP_MANGLE_DUPECHAR_ALL:
19410 SET_NAME (rule, rule_buf[rule_pos]);
19411 break;
19412
19413 case RULE_OP_MANGLE_SWITCH_FIRST:
19414 SET_NAME (rule, rule_buf[rule_pos]);
19415 break;
19416
19417 case RULE_OP_MANGLE_SWITCH_LAST:
19418 SET_NAME (rule, rule_buf[rule_pos]);
19419 break;
19420
19421 case RULE_OP_MANGLE_SWITCH_AT:
19422 SET_NAME (rule, rule_buf[rule_pos]);
19423 SET_P0_CONV (rule, rule_buf[rule_pos]);
19424 SET_P1_CONV (rule, rule_buf[rule_pos]);
19425 break;
19426
19427 case RULE_OP_MANGLE_CHR_SHIFTL:
19428 SET_NAME (rule, rule_buf[rule_pos]);
19429 SET_P0_CONV (rule, rule_buf[rule_pos]);
19430 break;
19431
19432 case RULE_OP_MANGLE_CHR_SHIFTR:
19433 SET_NAME (rule, rule_buf[rule_pos]);
19434 SET_P0_CONV (rule, rule_buf[rule_pos]);
19435 break;
19436
19437 case RULE_OP_MANGLE_CHR_INCR:
19438 SET_NAME (rule, rule_buf[rule_pos]);
19439 SET_P0_CONV (rule, rule_buf[rule_pos]);
19440 break;
19441
19442 case RULE_OP_MANGLE_CHR_DECR:
19443 SET_NAME (rule, rule_buf[rule_pos]);
19444 SET_P0_CONV (rule, rule_buf[rule_pos]);
19445 break;
19446
19447 case RULE_OP_MANGLE_REPLACE_NP1:
19448 SET_NAME (rule, rule_buf[rule_pos]);
19449 SET_P0_CONV (rule, rule_buf[rule_pos]);
19450 break;
19451
19452 case RULE_OP_MANGLE_REPLACE_NM1:
19453 SET_NAME (rule, rule_buf[rule_pos]);
19454 SET_P0_CONV (rule, rule_buf[rule_pos]);
19455 break;
19456
19457 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19458 SET_NAME (rule, rule_buf[rule_pos]);
19459 SET_P0_CONV (rule, rule_buf[rule_pos]);
19460 break;
19461
19462 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19463 SET_NAME (rule, rule_buf[rule_pos]);
19464 SET_P0_CONV (rule, rule_buf[rule_pos]);
19465 break;
19466
19467 case RULE_OP_MANGLE_TITLE:
19468 SET_NAME (rule, rule_buf[rule_pos]);
19469 break;
19470
19471 default:
19472 return (-1);
19473 break;
19474 }
19475 }
19476
19477 if (rule_pos < rule_len) return (-1);
19478
19479 return (0);
19480 }
19481
19482 int kernel_rule_to_cpu_rule (char rule_buf[BUFSIZ], kernel_rule_t *rule)
19483 {
19484 uint rule_cnt;
19485 uint rule_pos;
19486 uint rule_len = BUFSIZ - 1; // maximum possible len
19487
19488 char rule_cmd;
19489
19490 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19491 {
19492 GET_NAME (rule);
19493
19494 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19495
19496 switch (rule_cmd)
19497 {
19498 case RULE_OP_MANGLE_NOOP:
19499 rule_buf[rule_pos] = rule_cmd;
19500 break;
19501
19502 case RULE_OP_MANGLE_LREST:
19503 rule_buf[rule_pos] = rule_cmd;
19504 break;
19505
19506 case RULE_OP_MANGLE_UREST:
19507 rule_buf[rule_pos] = rule_cmd;
19508 break;
19509
19510 case RULE_OP_MANGLE_LREST_UFIRST:
19511 rule_buf[rule_pos] = rule_cmd;
19512 break;
19513
19514 case RULE_OP_MANGLE_UREST_LFIRST:
19515 rule_buf[rule_pos] = rule_cmd;
19516 break;
19517
19518 case RULE_OP_MANGLE_TREST:
19519 rule_buf[rule_pos] = rule_cmd;
19520 break;
19521
19522 case RULE_OP_MANGLE_TOGGLE_AT:
19523 rule_buf[rule_pos] = rule_cmd;
19524 GET_P0_CONV (rule);
19525 break;
19526
19527 case RULE_OP_MANGLE_REVERSE:
19528 rule_buf[rule_pos] = rule_cmd;
19529 break;
19530
19531 case RULE_OP_MANGLE_DUPEWORD:
19532 rule_buf[rule_pos] = rule_cmd;
19533 break;
19534
19535 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19536 rule_buf[rule_pos] = rule_cmd;
19537 GET_P0_CONV (rule);
19538 break;
19539
19540 case RULE_OP_MANGLE_REFLECT:
19541 rule_buf[rule_pos] = rule_cmd;
19542 break;
19543
19544 case RULE_OP_MANGLE_ROTATE_LEFT:
19545 rule_buf[rule_pos] = rule_cmd;
19546 break;
19547
19548 case RULE_OP_MANGLE_ROTATE_RIGHT:
19549 rule_buf[rule_pos] = rule_cmd;
19550 break;
19551
19552 case RULE_OP_MANGLE_APPEND:
19553 rule_buf[rule_pos] = rule_cmd;
19554 GET_P0 (rule);
19555 break;
19556
19557 case RULE_OP_MANGLE_PREPEND:
19558 rule_buf[rule_pos] = rule_cmd;
19559 GET_P0 (rule);
19560 break;
19561
19562 case RULE_OP_MANGLE_DELETE_FIRST:
19563 rule_buf[rule_pos] = rule_cmd;
19564 break;
19565
19566 case RULE_OP_MANGLE_DELETE_LAST:
19567 rule_buf[rule_pos] = rule_cmd;
19568 break;
19569
19570 case RULE_OP_MANGLE_DELETE_AT:
19571 rule_buf[rule_pos] = rule_cmd;
19572 GET_P0_CONV (rule);
19573 break;
19574
19575 case RULE_OP_MANGLE_EXTRACT:
19576 rule_buf[rule_pos] = rule_cmd;
19577 GET_P0_CONV (rule);
19578 GET_P1_CONV (rule);
19579 break;
19580
19581 case RULE_OP_MANGLE_OMIT:
19582 rule_buf[rule_pos] = rule_cmd;
19583 GET_P0_CONV (rule);
19584 GET_P1_CONV (rule);
19585 break;
19586
19587 case RULE_OP_MANGLE_INSERT:
19588 rule_buf[rule_pos] = rule_cmd;
19589 GET_P0_CONV (rule);
19590 GET_P1 (rule);
19591 break;
19592
19593 case RULE_OP_MANGLE_OVERSTRIKE:
19594 rule_buf[rule_pos] = rule_cmd;
19595 GET_P0_CONV (rule);
19596 GET_P1 (rule);
19597 break;
19598
19599 case RULE_OP_MANGLE_TRUNCATE_AT:
19600 rule_buf[rule_pos] = rule_cmd;
19601 GET_P0_CONV (rule);
19602 break;
19603
19604 case RULE_OP_MANGLE_REPLACE:
19605 rule_buf[rule_pos] = rule_cmd;
19606 GET_P0 (rule);
19607 GET_P1 (rule);
19608 break;
19609
19610 case RULE_OP_MANGLE_PURGECHAR:
19611 return (-1);
19612 break;
19613
19614 case RULE_OP_MANGLE_TOGGLECASE_REC:
19615 return (-1);
19616 break;
19617
19618 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19619 rule_buf[rule_pos] = rule_cmd;
19620 GET_P0_CONV (rule);
19621 break;
19622
19623 case RULE_OP_MANGLE_DUPECHAR_LAST:
19624 rule_buf[rule_pos] = rule_cmd;
19625 GET_P0_CONV (rule);
19626 break;
19627
19628 case RULE_OP_MANGLE_DUPECHAR_ALL:
19629 rule_buf[rule_pos] = rule_cmd;
19630 break;
19631
19632 case RULE_OP_MANGLE_SWITCH_FIRST:
19633 rule_buf[rule_pos] = rule_cmd;
19634 break;
19635
19636 case RULE_OP_MANGLE_SWITCH_LAST:
19637 rule_buf[rule_pos] = rule_cmd;
19638 break;
19639
19640 case RULE_OP_MANGLE_SWITCH_AT:
19641 rule_buf[rule_pos] = rule_cmd;
19642 GET_P0_CONV (rule);
19643 GET_P1_CONV (rule);
19644 break;
19645
19646 case RULE_OP_MANGLE_CHR_SHIFTL:
19647 rule_buf[rule_pos] = rule_cmd;
19648 GET_P0_CONV (rule);
19649 break;
19650
19651 case RULE_OP_MANGLE_CHR_SHIFTR:
19652 rule_buf[rule_pos] = rule_cmd;
19653 GET_P0_CONV (rule);
19654 break;
19655
19656 case RULE_OP_MANGLE_CHR_INCR:
19657 rule_buf[rule_pos] = rule_cmd;
19658 GET_P0_CONV (rule);
19659 break;
19660
19661 case RULE_OP_MANGLE_CHR_DECR:
19662 rule_buf[rule_pos] = rule_cmd;
19663 GET_P0_CONV (rule);
19664 break;
19665
19666 case RULE_OP_MANGLE_REPLACE_NP1:
19667 rule_buf[rule_pos] = rule_cmd;
19668 GET_P0_CONV (rule);
19669 break;
19670
19671 case RULE_OP_MANGLE_REPLACE_NM1:
19672 rule_buf[rule_pos] = rule_cmd;
19673 GET_P0_CONV (rule);
19674 break;
19675
19676 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19677 rule_buf[rule_pos] = rule_cmd;
19678 GET_P0_CONV (rule);
19679 break;
19680
19681 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19682 rule_buf[rule_pos] = rule_cmd;
19683 GET_P0_CONV (rule);
19684 break;
19685
19686 case RULE_OP_MANGLE_TITLE:
19687 rule_buf[rule_pos] = rule_cmd;
19688 break;
19689
19690 case 0:
19691 return rule_pos - 1;
19692 break;
19693
19694 default:
19695 return (-1);
19696 break;
19697 }
19698 }
19699
19700 if (rule_cnt > 0)
19701 {
19702 return rule_pos;
19703 }
19704
19705 return (-1);
19706 }
19707
19708 /**
19709 * CPU rules : this is from hashcat sources, cpu based rules
19710 */
19711
19712 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19713 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19714
19715 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19716 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19717 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19718
19719 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19720 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19721 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19722
19723 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19724 {
19725 int pos;
19726
19727 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19728
19729 return (arr_len);
19730 }
19731
19732 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19733 {
19734 int pos;
19735
19736 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19737
19738 return (arr_len);
19739 }
19740
19741 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19742 {
19743 int pos;
19744
19745 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19746
19747 return (arr_len);
19748 }
19749
19750 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19751 {
19752 int l;
19753 int r;
19754
19755 for (l = 0; l < arr_len; l++)
19756 {
19757 r = arr_len - 1 - l;
19758
19759 if (l >= r) break;
19760
19761 MANGLE_SWITCH (arr, l, r);
19762 }
19763
19764 return (arr_len);
19765 }
19766
19767 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19768 {
19769 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19770
19771 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19772
19773 return (arr_len * 2);
19774 }
19775
19776 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19777 {
19778 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19779
19780 int orig_len = arr_len;
19781
19782 int i;
19783
19784 for (i = 0; i < times; i++)
19785 {
19786 memcpy (&arr[arr_len], arr, orig_len);
19787
19788 arr_len += orig_len;
19789 }
19790
19791 return (arr_len);
19792 }
19793
19794 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19795 {
19796 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19797
19798 mangle_double (arr, arr_len);
19799
19800 mangle_reverse (arr + arr_len, arr_len);
19801
19802 return (arr_len * 2);
19803 }
19804
19805 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19806 {
19807 int l;
19808 int r;
19809
19810 for (l = 0, r = arr_len - 1; r > 0; r--)
19811 {
19812 MANGLE_SWITCH (arr, l, r);
19813 }
19814
19815 return (arr_len);
19816 }
19817
19818 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19819 {
19820 int l;
19821 int r;
19822
19823 for (l = 0, r = arr_len - 1; l < r; l++)
19824 {
19825 MANGLE_SWITCH (arr, l, r);
19826 }
19827
19828 return (arr_len);
19829 }
19830
19831 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19832 {
19833 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19834
19835 arr[arr_len] = c;
19836
19837 return (arr_len + 1);
19838 }
19839
19840 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19841 {
19842 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19843
19844 int arr_pos;
19845
19846 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19847 {
19848 arr[arr_pos + 1] = arr[arr_pos];
19849 }
19850
19851 arr[0] = c;
19852
19853 return (arr_len + 1);
19854 }
19855
19856 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19857 {
19858 if (upos >= arr_len) return (arr_len);
19859
19860 int arr_pos;
19861
19862 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
19863 {
19864 arr[arr_pos] = arr[arr_pos + 1];
19865 }
19866
19867 return (arr_len - 1);
19868 }
19869
19870 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19871 {
19872 if (upos >= arr_len) return (arr_len);
19873
19874 if ((upos + ulen) > arr_len) return (arr_len);
19875
19876 int arr_pos;
19877
19878 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
19879 {
19880 arr[arr_pos] = arr[upos + arr_pos];
19881 }
19882
19883 return (ulen);
19884 }
19885
19886 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19887 {
19888 if (upos >= arr_len) return (arr_len);
19889
19890 if ((upos + ulen) >= arr_len) return (arr_len);
19891
19892 int arr_pos;
19893
19894 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
19895 {
19896 arr[arr_pos] = arr[arr_pos + ulen];
19897 }
19898
19899 return (arr_len - ulen);
19900 }
19901
19902 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19903 {
19904 if (upos >= arr_len) return (arr_len);
19905
19906 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19907
19908 int arr_pos;
19909
19910 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
19911 {
19912 arr[arr_pos + 1] = arr[arr_pos];
19913 }
19914
19915 arr[upos] = c;
19916
19917 return (arr_len + 1);
19918 }
19919
19920 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)
19921 {
19922 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
19923
19924 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
19925
19926 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
19927
19928 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
19929
19930 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
19931
19932 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
19933
19934 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
19935
19936 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
19937
19938 return (arr_len + arr2_cpy);
19939 }
19940
19941 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19942 {
19943 if (upos >= arr_len) return (arr_len);
19944
19945 arr[upos] = c;
19946
19947 return (arr_len);
19948 }
19949
19950 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19951 {
19952 if (upos >= arr_len) return (arr_len);
19953
19954 memset (arr + upos, 0, arr_len - upos);
19955
19956 return (upos);
19957 }
19958
19959 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
19960 {
19961 int arr_pos;
19962
19963 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
19964 {
19965 if (arr[arr_pos] != oldc) continue;
19966
19967 arr[arr_pos] = newc;
19968 }
19969
19970 return (arr_len);
19971 }
19972
19973 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
19974 {
19975 int arr_pos;
19976
19977 int ret_len;
19978
19979 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
19980 {
19981 if (arr[arr_pos] == c) continue;
19982
19983 arr[ret_len] = arr[arr_pos];
19984
19985 ret_len++;
19986 }
19987
19988 return (ret_len);
19989 }
19990
19991 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
19992 {
19993 if (ulen > arr_len) return (arr_len);
19994
19995 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19996
19997 char cs[100] = { 0 };
19998
19999 memcpy (cs, arr, ulen);
20000
20001 int i;
20002
20003 for (i = 0; i < ulen; i++)
20004 {
20005 char c = cs[i];
20006
20007 arr_len = mangle_insert (arr, arr_len, i, c);
20008 }
20009
20010 return (arr_len);
20011 }
20012
20013 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
20014 {
20015 if (ulen > arr_len) return (arr_len);
20016
20017 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20018
20019 int upos = arr_len - ulen;
20020
20021 int i;
20022
20023 for (i = 0; i < ulen; i++)
20024 {
20025 char c = arr[upos + i];
20026
20027 arr_len = mangle_append (arr, arr_len, c);
20028 }
20029
20030 return (arr_len);
20031 }
20032
20033 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20034 {
20035 if ( arr_len == 0) return (arr_len);
20036 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20037
20038 char c = arr[upos];
20039
20040 int i;
20041
20042 for (i = 0; i < ulen; i++)
20043 {
20044 arr_len = mangle_insert (arr, arr_len, upos, c);
20045 }
20046
20047 return (arr_len);
20048 }
20049
20050 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
20051 {
20052 if ( arr_len == 0) return (arr_len);
20053 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
20054
20055 int arr_pos;
20056
20057 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
20058 {
20059 int new_pos = arr_pos * 2;
20060
20061 arr[new_pos] = arr[arr_pos];
20062
20063 arr[new_pos + 1] = arr[arr_pos];
20064 }
20065
20066 return (arr_len * 2);
20067 }
20068
20069 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20070 {
20071 if (upos >= arr_len) return (arr_len);
20072 if (upos2 >= arr_len) return (arr_len);
20073
20074 MANGLE_SWITCH (arr, upos, upos2);
20075
20076 return (arr_len);
20077 }
20078
20079 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20080 {
20081 MANGLE_SWITCH (arr, upos, upos2);
20082
20083 return (arr_len);
20084 }
20085
20086 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
20087 {
20088 if (upos >= arr_len) return (arr_len);
20089
20090 arr[upos] <<= 1;
20091
20092 return (arr_len);
20093 }
20094
20095 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
20096 {
20097 if (upos >= arr_len) return (arr_len);
20098
20099 arr[upos] >>= 1;
20100
20101 return (arr_len);
20102 }
20103
20104 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
20105 {
20106 if (upos >= arr_len) return (arr_len);
20107
20108 arr[upos] += 1;
20109
20110 return (arr_len);
20111 }
20112
20113 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
20114 {
20115 if (upos >= arr_len) return (arr_len);
20116
20117 arr[upos] -= 1;
20118
20119 return (arr_len);
20120 }
20121
20122 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
20123 {
20124 int upper_next = 1;
20125
20126 int pos;
20127
20128 for (pos = 0; pos < arr_len; pos++)
20129 {
20130 if (arr[pos] == ' ')
20131 {
20132 upper_next = 1;
20133
20134 continue;
20135 }
20136
20137 if (upper_next)
20138 {
20139 upper_next = 0;
20140
20141 MANGLE_UPPER_AT (arr, pos);
20142 }
20143 else
20144 {
20145 MANGLE_LOWER_AT (arr, pos);
20146 }
20147 }
20148
20149 return (arr_len);
20150 }
20151
20152 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
20153 {
20154 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
20155
20156 u32 j;
20157
20158 u32 rule_pos = 0;
20159
20160 for (j = 0; j < rp_gen_num; j++)
20161 {
20162 u32 r = 0;
20163 u32 p1 = 0;
20164 u32 p2 = 0;
20165 u32 p3 = 0;
20166
20167 switch ((char) get_random_num (0, 9))
20168 {
20169 case 0:
20170 r = get_random_num (0, sizeof (grp_op_nop));
20171 rule_buf[rule_pos++] = grp_op_nop[r];
20172 break;
20173
20174 case 1:
20175 r = get_random_num (0, sizeof (grp_op_pos_p0));
20176 rule_buf[rule_pos++] = grp_op_pos_p0[r];
20177 p1 = get_random_num (0, sizeof (grp_pos));
20178 rule_buf[rule_pos++] = grp_pos[p1];
20179 break;
20180
20181 case 2:
20182 r = get_random_num (0, sizeof (grp_op_pos_p1));
20183 rule_buf[rule_pos++] = grp_op_pos_p1[r];
20184 p1 = get_random_num (1, 6);
20185 rule_buf[rule_pos++] = grp_pos[p1];
20186 break;
20187
20188 case 3:
20189 r = get_random_num (0, sizeof (grp_op_chr));
20190 rule_buf[rule_pos++] = grp_op_chr[r];
20191 p1 = get_random_num (0x20, 0x7e);
20192 rule_buf[rule_pos++] = (char) p1;
20193 break;
20194
20195 case 4:
20196 r = get_random_num (0, sizeof (grp_op_chr_chr));
20197 rule_buf[rule_pos++] = grp_op_chr_chr[r];
20198 p1 = get_random_num (0x20, 0x7e);
20199 rule_buf[rule_pos++] = (char) p1;
20200 p2 = get_random_num (0x20, 0x7e);
20201 while (p1 == p2)
20202 p2 = get_random_num (0x20, 0x7e);
20203 rule_buf[rule_pos++] = (char) p2;
20204 break;
20205
20206 case 5:
20207 r = get_random_num (0, sizeof (grp_op_pos_chr));
20208 rule_buf[rule_pos++] = grp_op_pos_chr[r];
20209 p1 = get_random_num (0, sizeof (grp_pos));
20210 rule_buf[rule_pos++] = grp_pos[p1];
20211 p2 = get_random_num (0x20, 0x7e);
20212 rule_buf[rule_pos++] = (char) p2;
20213 break;
20214
20215 case 6:
20216 r = get_random_num (0, sizeof (grp_op_pos_pos0));
20217 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
20218 p1 = get_random_num (0, sizeof (grp_pos));
20219 rule_buf[rule_pos++] = grp_pos[p1];
20220 p2 = get_random_num (0, sizeof (grp_pos));
20221 while (p1 == p2)
20222 p2 = get_random_num (0, sizeof (grp_pos));
20223 rule_buf[rule_pos++] = grp_pos[p2];
20224 break;
20225
20226 case 7:
20227 r = get_random_num (0, sizeof (grp_op_pos_pos1));
20228 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
20229 p1 = get_random_num (0, sizeof (grp_pos));
20230 rule_buf[rule_pos++] = grp_pos[p1];
20231 p2 = get_random_num (1, sizeof (grp_pos));
20232 while (p1 == p2)
20233 p2 = get_random_num (1, sizeof (grp_pos));
20234 rule_buf[rule_pos++] = grp_pos[p2];
20235 break;
20236
20237 case 8:
20238 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
20239 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
20240 p1 = get_random_num (0, sizeof (grp_pos));
20241 rule_buf[rule_pos++] = grp_pos[p1];
20242 p2 = get_random_num (1, sizeof (grp_pos));
20243 rule_buf[rule_pos++] = grp_pos[p1];
20244 p3 = get_random_num (0, sizeof (grp_pos));
20245 rule_buf[rule_pos++] = grp_pos[p3];
20246 break;
20247 }
20248 }
20249
20250 return (rule_pos);
20251 }
20252
20253 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
20254 {
20255 char mem[BLOCK_SIZE] = { 0 };
20256
20257 if (in == NULL) return (RULE_RC_REJECT_ERROR);
20258
20259 if (out == NULL) return (RULE_RC_REJECT_ERROR);
20260
20261 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20262
20263 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
20264
20265 int out_len = in_len;
20266 int mem_len = in_len;
20267
20268 memcpy (out, in, out_len);
20269
20270 int rule_pos;
20271
20272 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
20273 {
20274 int upos, upos2;
20275 int ulen;
20276
20277 switch (rule[rule_pos])
20278 {
20279 case ' ':
20280 break;
20281
20282 case RULE_OP_MANGLE_NOOP:
20283 break;
20284
20285 case RULE_OP_MANGLE_LREST:
20286 out_len = mangle_lrest (out, out_len);
20287 break;
20288
20289 case RULE_OP_MANGLE_UREST:
20290 out_len = mangle_urest (out, out_len);
20291 break;
20292
20293 case RULE_OP_MANGLE_LREST_UFIRST:
20294 out_len = mangle_lrest (out, out_len);
20295 if (out_len) MANGLE_UPPER_AT (out, 0);
20296 break;
20297
20298 case RULE_OP_MANGLE_UREST_LFIRST:
20299 out_len = mangle_urest (out, out_len);
20300 if (out_len) MANGLE_LOWER_AT (out, 0);
20301 break;
20302
20303 case RULE_OP_MANGLE_TREST:
20304 out_len = mangle_trest (out, out_len);
20305 break;
20306
20307 case RULE_OP_MANGLE_TOGGLE_AT:
20308 NEXT_RULEPOS (rule_pos);
20309 NEXT_RPTOI (rule, rule_pos, upos);
20310 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
20311 break;
20312
20313 case RULE_OP_MANGLE_REVERSE:
20314 out_len = mangle_reverse (out, out_len);
20315 break;
20316
20317 case RULE_OP_MANGLE_DUPEWORD:
20318 out_len = mangle_double (out, out_len);
20319 break;
20320
20321 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20322 NEXT_RULEPOS (rule_pos);
20323 NEXT_RPTOI (rule, rule_pos, ulen);
20324 out_len = mangle_double_times (out, out_len, ulen);
20325 break;
20326
20327 case RULE_OP_MANGLE_REFLECT:
20328 out_len = mangle_reflect (out, out_len);
20329 break;
20330
20331 case RULE_OP_MANGLE_ROTATE_LEFT:
20332 mangle_rotate_left (out, out_len);
20333 break;
20334
20335 case RULE_OP_MANGLE_ROTATE_RIGHT:
20336 mangle_rotate_right (out, out_len);
20337 break;
20338
20339 case RULE_OP_MANGLE_APPEND:
20340 NEXT_RULEPOS (rule_pos);
20341 out_len = mangle_append (out, out_len, rule[rule_pos]);
20342 break;
20343
20344 case RULE_OP_MANGLE_PREPEND:
20345 NEXT_RULEPOS (rule_pos);
20346 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
20347 break;
20348
20349 case RULE_OP_MANGLE_DELETE_FIRST:
20350 out_len = mangle_delete_at (out, out_len, 0);
20351 break;
20352
20353 case RULE_OP_MANGLE_DELETE_LAST:
20354 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
20355 break;
20356
20357 case RULE_OP_MANGLE_DELETE_AT:
20358 NEXT_RULEPOS (rule_pos);
20359 NEXT_RPTOI (rule, rule_pos, upos);
20360 out_len = mangle_delete_at (out, out_len, upos);
20361 break;
20362
20363 case RULE_OP_MANGLE_EXTRACT:
20364 NEXT_RULEPOS (rule_pos);
20365 NEXT_RPTOI (rule, rule_pos, upos);
20366 NEXT_RULEPOS (rule_pos);
20367 NEXT_RPTOI (rule, rule_pos, ulen);
20368 out_len = mangle_extract (out, out_len, upos, ulen);
20369 break;
20370
20371 case RULE_OP_MANGLE_OMIT:
20372 NEXT_RULEPOS (rule_pos);
20373 NEXT_RPTOI (rule, rule_pos, upos);
20374 NEXT_RULEPOS (rule_pos);
20375 NEXT_RPTOI (rule, rule_pos, ulen);
20376 out_len = mangle_omit (out, out_len, upos, ulen);
20377 break;
20378
20379 case RULE_OP_MANGLE_INSERT:
20380 NEXT_RULEPOS (rule_pos);
20381 NEXT_RPTOI (rule, rule_pos, upos);
20382 NEXT_RULEPOS (rule_pos);
20383 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
20384 break;
20385
20386 case RULE_OP_MANGLE_OVERSTRIKE:
20387 NEXT_RULEPOS (rule_pos);
20388 NEXT_RPTOI (rule, rule_pos, upos);
20389 NEXT_RULEPOS (rule_pos);
20390 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
20391 break;
20392
20393 case RULE_OP_MANGLE_TRUNCATE_AT:
20394 NEXT_RULEPOS (rule_pos);
20395 NEXT_RPTOI (rule, rule_pos, upos);
20396 out_len = mangle_truncate_at (out, out_len, upos);
20397 break;
20398
20399 case RULE_OP_MANGLE_REPLACE:
20400 NEXT_RULEPOS (rule_pos);
20401 NEXT_RULEPOS (rule_pos);
20402 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
20403 break;
20404
20405 case RULE_OP_MANGLE_PURGECHAR:
20406 NEXT_RULEPOS (rule_pos);
20407 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
20408 break;
20409
20410 case RULE_OP_MANGLE_TOGGLECASE_REC:
20411 /* todo */
20412 break;
20413
20414 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20415 NEXT_RULEPOS (rule_pos);
20416 NEXT_RPTOI (rule, rule_pos, ulen);
20417 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
20418 break;
20419
20420 case RULE_OP_MANGLE_DUPECHAR_LAST:
20421 NEXT_RULEPOS (rule_pos);
20422 NEXT_RPTOI (rule, rule_pos, ulen);
20423 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
20424 break;
20425
20426 case RULE_OP_MANGLE_DUPECHAR_ALL:
20427 out_len = mangle_dupechar (out, out_len);
20428 break;
20429
20430 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20431 NEXT_RULEPOS (rule_pos);
20432 NEXT_RPTOI (rule, rule_pos, ulen);
20433 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20434 break;
20435
20436 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20437 NEXT_RULEPOS (rule_pos);
20438 NEXT_RPTOI (rule, rule_pos, ulen);
20439 out_len = mangle_dupeblock_append (out, out_len, ulen);
20440 break;
20441
20442 case RULE_OP_MANGLE_SWITCH_FIRST:
20443 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20444 break;
20445
20446 case RULE_OP_MANGLE_SWITCH_LAST:
20447 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20448 break;
20449
20450 case RULE_OP_MANGLE_SWITCH_AT:
20451 NEXT_RULEPOS (rule_pos);
20452 NEXT_RPTOI (rule, rule_pos, upos);
20453 NEXT_RULEPOS (rule_pos);
20454 NEXT_RPTOI (rule, rule_pos, upos2);
20455 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20456 break;
20457
20458 case RULE_OP_MANGLE_CHR_SHIFTL:
20459 NEXT_RULEPOS (rule_pos);
20460 NEXT_RPTOI (rule, rule_pos, upos);
20461 mangle_chr_shiftl (out, out_len, upos);
20462 break;
20463
20464 case RULE_OP_MANGLE_CHR_SHIFTR:
20465 NEXT_RULEPOS (rule_pos);
20466 NEXT_RPTOI (rule, rule_pos, upos);
20467 mangle_chr_shiftr (out, out_len, upos);
20468 break;
20469
20470 case RULE_OP_MANGLE_CHR_INCR:
20471 NEXT_RULEPOS (rule_pos);
20472 NEXT_RPTOI (rule, rule_pos, upos);
20473 mangle_chr_incr (out, out_len, upos);
20474 break;
20475
20476 case RULE_OP_MANGLE_CHR_DECR:
20477 NEXT_RULEPOS (rule_pos);
20478 NEXT_RPTOI (rule, rule_pos, upos);
20479 mangle_chr_decr (out, out_len, upos);
20480 break;
20481
20482 case RULE_OP_MANGLE_REPLACE_NP1:
20483 NEXT_RULEPOS (rule_pos);
20484 NEXT_RPTOI (rule, rule_pos, upos);
20485 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20486 break;
20487
20488 case RULE_OP_MANGLE_REPLACE_NM1:
20489 NEXT_RULEPOS (rule_pos);
20490 NEXT_RPTOI (rule, rule_pos, upos);
20491 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20492 break;
20493
20494 case RULE_OP_MANGLE_TITLE:
20495 out_len = mangle_title (out, out_len);
20496 break;
20497
20498 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20499 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20500 NEXT_RULEPOS (rule_pos);
20501 NEXT_RPTOI (rule, rule_pos, upos);
20502 NEXT_RULEPOS (rule_pos);
20503 NEXT_RPTOI (rule, rule_pos, ulen);
20504 NEXT_RULEPOS (rule_pos);
20505 NEXT_RPTOI (rule, rule_pos, upos2);
20506 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20507 break;
20508
20509 case RULE_OP_MANGLE_APPEND_MEMORY:
20510 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20511 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20512 memcpy (out + out_len, mem, mem_len);
20513 out_len += mem_len;
20514 break;
20515
20516 case RULE_OP_MANGLE_PREPEND_MEMORY:
20517 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20518 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20519 memcpy (mem + mem_len, out, out_len);
20520 out_len += mem_len;
20521 memcpy (out, mem, out_len);
20522 break;
20523
20524 case RULE_OP_MEMORIZE_WORD:
20525 memcpy (mem, out, out_len);
20526 mem_len = out_len;
20527 break;
20528
20529 case RULE_OP_REJECT_LESS:
20530 NEXT_RULEPOS (rule_pos);
20531 NEXT_RPTOI (rule, rule_pos, upos);
20532 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20533 break;
20534
20535 case RULE_OP_REJECT_GREATER:
20536 NEXT_RULEPOS (rule_pos);
20537 NEXT_RPTOI (rule, rule_pos, upos);
20538 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20539 break;
20540
20541 case RULE_OP_REJECT_CONTAIN:
20542 NEXT_RULEPOS (rule_pos);
20543 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20544 break;
20545
20546 case RULE_OP_REJECT_NOT_CONTAIN:
20547 NEXT_RULEPOS (rule_pos);
20548 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20549 break;
20550
20551 case RULE_OP_REJECT_EQUAL_FIRST:
20552 NEXT_RULEPOS (rule_pos);
20553 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20554 break;
20555
20556 case RULE_OP_REJECT_EQUAL_LAST:
20557 NEXT_RULEPOS (rule_pos);
20558 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20559 break;
20560
20561 case RULE_OP_REJECT_EQUAL_AT:
20562 NEXT_RULEPOS (rule_pos);
20563 NEXT_RPTOI (rule, rule_pos, upos);
20564 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20565 NEXT_RULEPOS (rule_pos);
20566 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20567 break;
20568
20569 case RULE_OP_REJECT_CONTAINS:
20570 NEXT_RULEPOS (rule_pos);
20571 NEXT_RPTOI (rule, rule_pos, upos);
20572 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20573 NEXT_RULEPOS (rule_pos);
20574 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20575 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20576 break;
20577
20578 case RULE_OP_REJECT_MEMORY:
20579 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20580 break;
20581
20582 default:
20583 return (RULE_RC_SYNTAX_ERROR);
20584 break;
20585 }
20586 }
20587
20588 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20589
20590 return (out_len);
20591 }