Initial commit
[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 return 0;
4791 }
4792
4793 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)
4794 {
4795 uint outfile_autohex = data.outfile_autohex;
4796
4797 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4798
4799 FILE *debug_fp = NULL;
4800
4801 if (debug_file != NULL)
4802 {
4803 debug_fp = fopen (debug_file, "ab");
4804
4805 lock_file (debug_fp);
4806 }
4807 else
4808 {
4809 debug_fp = stderr;
4810 }
4811
4812 if (debug_fp == NULL)
4813 {
4814 log_info ("WARNING: Could not open debug-file for writing");
4815 }
4816 else
4817 {
4818 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4819 {
4820 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4821
4822 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4823 }
4824
4825 fwrite (rule_ptr, rule_len, 1, debug_fp);
4826
4827 if (debug_mode == 4)
4828 {
4829 fputc (':', debug_fp);
4830
4831 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4832 }
4833
4834 fputc ('\n', debug_fp);
4835
4836 if (debug_file != NULL) fclose (debug_fp);
4837 }
4838 }
4839
4840 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4841 {
4842 int needs_hexify = 0;
4843
4844 if (outfile_autohex == 1)
4845 {
4846 for (uint i = 0; i < plain_len; i++)
4847 {
4848 if (plain_ptr[i] < 0x20)
4849 {
4850 needs_hexify = 1;
4851
4852 break;
4853 }
4854
4855 if (plain_ptr[i] > 0x7f)
4856 {
4857 needs_hexify = 1;
4858
4859 break;
4860 }
4861 }
4862 }
4863
4864 if (needs_hexify == 1)
4865 {
4866 fprintf (fp, "$HEX[");
4867
4868 for (uint i = 0; i < plain_len; i++)
4869 {
4870 fprintf (fp, "%02x", plain_ptr[i]);
4871 }
4872
4873 fprintf (fp, "]");
4874 }
4875 else
4876 {
4877 fwrite (plain_ptr, plain_len, 1, fp);
4878 }
4879 }
4880
4881 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)
4882 {
4883 uint outfile_format = data.outfile_format;
4884
4885 char separator = data.separator;
4886
4887 if (outfile_format & OUTFILE_FMT_HASH)
4888 {
4889 fprintf (out_fp, "%s", out_buf);
4890
4891 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4892 {
4893 fputc (separator, out_fp);
4894 }
4895 }
4896 else if (data.username)
4897 {
4898 if (username != NULL)
4899 {
4900 for (uint i = 0; i < user_len; i++)
4901 {
4902 fprintf (out_fp, "%c", username[i]);
4903 }
4904
4905 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4906 {
4907 fputc (separator, out_fp);
4908 }
4909 }
4910 }
4911
4912 if (outfile_format & OUTFILE_FMT_PLAIN)
4913 {
4914 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4915
4916 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4917 {
4918 fputc (separator, out_fp);
4919 }
4920 }
4921
4922 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4923 {
4924 for (uint i = 0; i < plain_len; i++)
4925 {
4926 fprintf (out_fp, "%02x", plain_ptr[i]);
4927 }
4928
4929 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4930 {
4931 fputc (separator, out_fp);
4932 }
4933 }
4934
4935 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4936 {
4937 #ifdef _WIN
4938 __mingw_fprintf (out_fp, "%llu", crackpos);
4939 #endif
4940
4941 #ifdef _POSIX
4942 #ifdef __x86_64__
4943 fprintf (out_fp, "%lu", (unsigned long) crackpos);
4944 #else
4945 fprintf (out_fp, "%llu", crackpos);
4946 #endif
4947 #endif
4948 }
4949
4950 fputc ('\n', out_fp);
4951 }
4952
4953 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)
4954 {
4955 pot_t pot_key;
4956
4957 pot_key.hash.salt = hashes_buf->salt;
4958 pot_key.hash.digest = hashes_buf->digest;
4959
4960 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4961
4962 if (pot_ptr)
4963 {
4964 log_info_nn ("");
4965
4966 input_buf[input_len] = 0;
4967
4968 // user
4969 unsigned char *username = NULL;
4970 uint user_len = 0;
4971
4972 if (data.username)
4973 {
4974 user_t *user = hashes_buf->hash_info->user;
4975
4976 if (user)
4977 {
4978 username = (unsigned char *) (user->user_name);
4979
4980 user_len = user->user_len;
4981 }
4982 }
4983
4984 // do output the line
4985 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
4986 }
4987 }
4988
4989 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
4990 #define LM_MASKED_PLAIN "[notfound]"
4991
4992 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)
4993 {
4994 // left
4995
4996 pot_t pot_left_key;
4997
4998 pot_left_key.hash.salt = hash_left->salt;
4999 pot_left_key.hash.digest = hash_left->digest;
5000
5001 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5002
5003 // right
5004
5005 uint weak_hash_found = 0;
5006
5007 pot_t pot_right_key;
5008
5009 pot_right_key.hash.salt = hash_right->salt;
5010 pot_right_key.hash.digest = hash_right->digest;
5011
5012 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5013
5014 if (pot_right_ptr == NULL)
5015 {
5016 // special case, if "weak hash"
5017
5018 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5019 {
5020 weak_hash_found = 1;
5021
5022 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5023
5024 // in theory this is not needed, but we are paranoia:
5025
5026 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5027 pot_right_ptr->plain_len = 0;
5028 }
5029 }
5030
5031 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
5032 {
5033 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
5034
5035 return;
5036 }
5037
5038 // at least one half was found:
5039
5040 log_info_nn ("");
5041
5042 input_buf[input_len] = 0;
5043
5044 // user
5045
5046 unsigned char *username = NULL;
5047 uint user_len = 0;
5048
5049 if (data.username)
5050 {
5051 user_t *user = hash_left->hash_info->user;
5052
5053 if (user)
5054 {
5055 username = (unsigned char *) (user->user_name);
5056
5057 user_len = user->user_len;
5058 }
5059 }
5060
5061 // mask the part which was not found
5062
5063 uint left_part_masked = 0;
5064 uint right_part_masked = 0;
5065
5066 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
5067
5068 if (pot_left_ptr == NULL)
5069 {
5070 left_part_masked = 1;
5071
5072 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5073
5074 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5075
5076 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5077 pot_left_ptr->plain_len = mask_plain_len;
5078 }
5079
5080 if (pot_right_ptr == NULL)
5081 {
5082 right_part_masked = 1;
5083
5084 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5085
5086 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5087
5088 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5089 pot_right_ptr->plain_len = mask_plain_len;
5090 }
5091
5092 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5093
5094 pot_t pot_ptr;
5095
5096 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5097
5098 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5099
5100 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5101
5102 // do output the line
5103
5104 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5105
5106 if (weak_hash_found == 1) myfree (pot_right_ptr);
5107
5108 if (left_part_masked == 1) myfree (pot_left_ptr);
5109 if (right_part_masked == 1) myfree (pot_right_ptr);
5110 }
5111
5112 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)
5113 {
5114 pot_t pot_key;
5115
5116 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5117
5118 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5119
5120 if (pot_ptr == NULL)
5121 {
5122 log_info_nn ("");
5123
5124 input_buf[input_len] = 0;
5125
5126 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5127 }
5128 }
5129
5130 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)
5131 {
5132 // left
5133
5134 pot_t pot_left_key;
5135
5136 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5137
5138 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5139
5140 // right
5141
5142 pot_t pot_right_key;
5143
5144 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5145
5146 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5147
5148 uint weak_hash_found = 0;
5149
5150 if (pot_right_ptr == NULL)
5151 {
5152 // special case, if "weak hash"
5153
5154 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5155 {
5156 weak_hash_found = 1;
5157
5158 // we just need that pot_right_ptr is not a NULL pointer
5159
5160 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5161 }
5162 }
5163
5164 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5165 {
5166 if (weak_hash_found == 1) myfree (pot_right_ptr);
5167
5168 return;
5169 }
5170
5171 // ... at least one part was not cracked
5172
5173 log_info_nn ("");
5174
5175 input_buf[input_len] = 0;
5176
5177 // only show the hash part which is still not cracked
5178
5179 uint user_len = input_len - 32;
5180
5181 char *hash_output = (char *) mymalloc (33);
5182
5183 memcpy (hash_output, input_buf, input_len);
5184
5185 if (pot_left_ptr != NULL)
5186 {
5187 // only show right part (because left part was already found)
5188
5189 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5190
5191 hash_output[user_len + 16] = 0;
5192 }
5193
5194 if (pot_right_ptr != NULL)
5195 {
5196 // only show left part (because right part was already found)
5197
5198 memcpy (hash_output + user_len, input_buf + user_len, 16);
5199
5200 hash_output[user_len + 16] = 0;
5201 }
5202
5203 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5204
5205 myfree (hash_output);
5206
5207 if (weak_hash_found == 1) myfree (pot_right_ptr);
5208 }
5209
5210 uint setup_opencl_platforms_filter (char *opencl_platforms)
5211 {
5212 uint opencl_platforms_filter = 0;
5213
5214 if (opencl_platforms)
5215 {
5216 char *platforms = strdup (opencl_platforms);
5217
5218 char *next = strtok (platforms, ",");
5219
5220 do
5221 {
5222 int platform = atoi (next);
5223
5224 if (platform < 1 || platform > 32)
5225 {
5226 log_error ("ERROR: invalid OpenCL platform %u specified", platform);
5227
5228 exit (-1);
5229 }
5230
5231 opencl_platforms_filter |= 1 << (platform - 1);
5232
5233 } while ((next = strtok (NULL, ",")) != NULL);
5234
5235 free (platforms);
5236 }
5237 else
5238 {
5239 opencl_platforms_filter = -1;
5240 }
5241
5242 return opencl_platforms_filter;
5243 }
5244
5245 u32 setup_devices_filter (char *opencl_devices)
5246 {
5247 u32 devices_filter = 0;
5248
5249 if (opencl_devices)
5250 {
5251 char *devices = strdup (opencl_devices);
5252
5253 char *next = strtok (devices, ",");
5254
5255 do
5256 {
5257 int device_id = atoi (next);
5258
5259 if (device_id < 1 || device_id > 32)
5260 {
5261 log_error ("ERROR: invalid device_id %u specified", device_id);
5262
5263 exit (-1);
5264 }
5265
5266 devices_filter |= 1 << (device_id - 1);
5267
5268 } while ((next = strtok (NULL, ",")) != NULL);
5269
5270 free (devices);
5271 }
5272 else
5273 {
5274 devices_filter = -1;
5275 }
5276
5277 return devices_filter;
5278 }
5279
5280 cl_device_type setup_device_types_filter (char *opencl_device_types)
5281 {
5282 cl_device_type device_types_filter = 0;
5283
5284 if (opencl_device_types)
5285 {
5286 char *device_types = strdup (opencl_device_types);
5287
5288 char *next = strtok (device_types, ",");
5289
5290 do
5291 {
5292 int device_type = atoi (next);
5293
5294 if (device_type < 1 || device_type > 3)
5295 {
5296 log_error ("ERROR: invalid device_type %u specified", device_type);
5297
5298 exit (-1);
5299 }
5300
5301 device_types_filter |= 1 << device_type;
5302
5303 } while ((next = strtok (NULL, ",")) != NULL);
5304
5305 free (device_types);
5306 }
5307 else
5308 {
5309 // Do not use CPU by default, this often reduces GPU performance because
5310 // the CPU is too busy to handle GPU synchronization
5311
5312 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5313 }
5314
5315 return device_types_filter;
5316 }
5317
5318 u32 get_random_num (const u32 min, const u32 max)
5319 {
5320 if (min == max) return (min);
5321
5322 return ((rand () % (max - min)) + min);
5323 }
5324
5325 u32 mydivc32 (const u32 dividend, const u32 divisor)
5326 {
5327 u32 quotient = dividend / divisor;
5328
5329 if (dividend % divisor) quotient++;
5330
5331 return quotient;
5332 }
5333
5334 u64 mydivc64 (const u64 dividend, const u64 divisor)
5335 {
5336 u64 quotient = dividend / divisor;
5337
5338 if (dividend % divisor) quotient++;
5339
5340 return quotient;
5341 }
5342
5343 void format_timer_display (struct tm *tm, char *buf, size_t len)
5344 {
5345 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5346 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5347
5348 if (tm->tm_year - 70)
5349 {
5350 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5351 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5352
5353 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5354 }
5355 else if (tm->tm_yday)
5356 {
5357 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5358 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5359
5360 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5361 }
5362 else if (tm->tm_hour)
5363 {
5364 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5365 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5366
5367 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5368 }
5369 else if (tm->tm_min)
5370 {
5371 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5372 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5373
5374 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5375 }
5376 else
5377 {
5378 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5379
5380 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5381 }
5382 }
5383
5384 void format_speed_display (float val, char *buf, size_t len)
5385 {
5386 if (val <= 0)
5387 {
5388 buf[0] = '0';
5389 buf[1] = ' ';
5390 buf[2] = 0;
5391
5392 return;
5393 }
5394
5395 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5396
5397 uint level = 0;
5398
5399 while (val > 99999)
5400 {
5401 val /= 1000;
5402
5403 level++;
5404 }
5405
5406 /* generate output */
5407
5408 if (level == 0)
5409 {
5410 snprintf (buf, len - 1, "%.0f ", val);
5411 }
5412 else
5413 {
5414 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5415 }
5416 }
5417
5418 void lowercase (u8 *buf, int len)
5419 {
5420 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5421 }
5422
5423 void uppercase (u8 *buf, int len)
5424 {
5425 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5426 }
5427
5428 int fgetl (FILE *fp, char *line_buf)
5429 {
5430 int line_len = 0;
5431
5432 while (!feof (fp))
5433 {
5434 const int c = fgetc (fp);
5435
5436 if (c == EOF) break;
5437
5438 line_buf[line_len] = (char) c;
5439
5440 line_len++;
5441
5442 if (line_len == BUFSIZ) line_len--;
5443
5444 if (c == '\n') break;
5445 }
5446
5447 if (line_len == 0) return 0;
5448
5449 if (line_buf[line_len - 1] == '\n')
5450 {
5451 line_len--;
5452
5453 line_buf[line_len] = 0;
5454 }
5455
5456 if (line_len == 0) return 0;
5457
5458 if (line_buf[line_len - 1] == '\r')
5459 {
5460 line_len--;
5461
5462 line_buf[line_len] = 0;
5463 }
5464
5465 return (line_len);
5466 }
5467
5468 int in_superchop (char *buf)
5469 {
5470 int len = strlen (buf);
5471
5472 while (len)
5473 {
5474 if (buf[len - 1] == '\n')
5475 {
5476 len--;
5477
5478 continue;
5479 }
5480
5481 if (buf[len - 1] == '\r')
5482 {
5483 len--;
5484
5485 continue;
5486 }
5487
5488 break;
5489 }
5490
5491 buf[len] = 0;
5492
5493 return len;
5494 }
5495
5496 char **scan_directory (const char *path)
5497 {
5498 char *tmp_path = mystrdup (path);
5499
5500 size_t tmp_path_len = strlen (tmp_path);
5501
5502 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5503 {
5504 tmp_path[tmp_path_len - 1] = 0;
5505
5506 tmp_path_len = strlen (tmp_path);
5507 }
5508
5509 char **files = NULL;
5510
5511 int num_files = 0;
5512
5513 DIR *d = NULL;
5514
5515 if ((d = opendir (tmp_path)) != NULL)
5516 {
5517 #ifdef OSX
5518 struct dirent e;
5519
5520 for (;;) {
5521 memset (&e, 0, sizeof (e));
5522 struct dirent *de = NULL;
5523
5524 if (readdir_r (d, &e, &de) != 0)
5525 {
5526 log_error ("ERROR: readdir_r() failed");
5527
5528 break;
5529 }
5530
5531 if (de == NULL) break;
5532 #else
5533 struct dirent *de;
5534
5535 while ((de = readdir (d)) != NULL)
5536 {
5537 #endif
5538 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5539
5540 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5541
5542 char *path_file = (char *) mymalloc (path_size + 1);
5543
5544 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5545
5546 path_file[path_size] = 0;
5547
5548 DIR *d_test;
5549
5550 if ((d_test = opendir (path_file)) != NULL)
5551 {
5552 closedir (d_test);
5553
5554 myfree (path_file);
5555 }
5556 else
5557 {
5558 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5559
5560 num_files++;
5561
5562 files[num_files - 1] = path_file;
5563 }
5564 }
5565
5566 closedir (d);
5567 }
5568 else if (errno == ENOTDIR)
5569 {
5570 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5571
5572 num_files++;
5573
5574 files[num_files - 1] = mystrdup (path);
5575 }
5576
5577 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5578
5579 num_files++;
5580
5581 files[num_files - 1] = NULL;
5582
5583 myfree (tmp_path);
5584
5585 return (files);
5586 }
5587
5588 int count_dictionaries (char **dictionary_files)
5589 {
5590 if (dictionary_files == NULL) return 0;
5591
5592 int cnt = 0;
5593
5594 for (int d = 0; dictionary_files[d] != NULL; d++)
5595 {
5596 cnt++;
5597 }
5598
5599 return (cnt);
5600 }
5601
5602 char *stroptitype (const uint opti_type)
5603 {
5604 switch (opti_type)
5605 {
5606 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5607 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5608 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5609 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5610 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5611 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5612 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5613 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5614 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5615 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5616 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5617 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5618 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5619 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5620 case OPTI_TYPE_USES_BITS_8: return ((char *) OPTI_STR_USES_BITS_8); break;
5621 case OPTI_TYPE_USES_BITS_16: return ((char *) OPTI_STR_USES_BITS_16); break;
5622 case OPTI_TYPE_USES_BITS_32: return ((char *) OPTI_STR_USES_BITS_32); break;
5623 case OPTI_TYPE_USES_BITS_64: return ((char *) OPTI_STR_USES_BITS_64); break;
5624 }
5625
5626 return (NULL);
5627 }
5628
5629 char *strparser (const uint parser_status)
5630 {
5631 switch (parser_status)
5632 {
5633 case PARSER_OK: return ((char *) PA_000); break;
5634 case PARSER_COMMENT: return ((char *) PA_001); break;
5635 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5636 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5637 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5638 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5639 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5640 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5641 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5642 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5643 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5644 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5645 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5646 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5647 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5648 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5649 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5650 }
5651
5652 return ((char *) PA_255);
5653 }
5654
5655 char *strhashtype (const uint hash_mode)
5656 {
5657 switch (hash_mode)
5658 {
5659 case 0: return ((char *) HT_00000); break;
5660 case 10: return ((char *) HT_00010); break;
5661 case 11: return ((char *) HT_00011); break;
5662 case 12: return ((char *) HT_00012); break;
5663 case 20: return ((char *) HT_00020); break;
5664 case 21: return ((char *) HT_00021); break;
5665 case 22: return ((char *) HT_00022); break;
5666 case 23: return ((char *) HT_00023); break;
5667 case 30: return ((char *) HT_00030); break;
5668 case 40: return ((char *) HT_00040); break;
5669 case 50: return ((char *) HT_00050); break;
5670 case 60: return ((char *) HT_00060); break;
5671 case 100: return ((char *) HT_00100); break;
5672 case 101: return ((char *) HT_00101); break;
5673 case 110: return ((char *) HT_00110); break;
5674 case 111: return ((char *) HT_00111); break;
5675 case 112: return ((char *) HT_00112); break;
5676 case 120: return ((char *) HT_00120); break;
5677 case 121: return ((char *) HT_00121); break;
5678 case 122: return ((char *) HT_00122); break;
5679 case 124: return ((char *) HT_00124); break;
5680 case 130: return ((char *) HT_00130); break;
5681 case 131: return ((char *) HT_00131); break;
5682 case 132: return ((char *) HT_00132); break;
5683 case 133: return ((char *) HT_00133); break;
5684 case 140: return ((char *) HT_00140); break;
5685 case 141: return ((char *) HT_00141); break;
5686 case 150: return ((char *) HT_00150); break;
5687 case 160: return ((char *) HT_00160); break;
5688 case 190: return ((char *) HT_00190); break;
5689 case 200: return ((char *) HT_00200); break;
5690 case 300: return ((char *) HT_00300); break;
5691 case 400: return ((char *) HT_00400); break;
5692 case 500: return ((char *) HT_00500); break;
5693 case 501: return ((char *) HT_00501); break;
5694 case 900: return ((char *) HT_00900); break;
5695 case 910: return ((char *) HT_00910); break;
5696 case 1000: return ((char *) HT_01000); break;
5697 case 1100: return ((char *) HT_01100); break;
5698 case 1400: return ((char *) HT_01400); break;
5699 case 1410: return ((char *) HT_01410); break;
5700 case 1420: return ((char *) HT_01420); break;
5701 case 1421: return ((char *) HT_01421); break;
5702 case 1430: return ((char *) HT_01430); break;
5703 case 1440: return ((char *) HT_01440); break;
5704 case 1441: return ((char *) HT_01441); break;
5705 case 1450: return ((char *) HT_01450); break;
5706 case 1460: return ((char *) HT_01460); break;
5707 case 1500: return ((char *) HT_01500); break;
5708 case 1600: return ((char *) HT_01600); break;
5709 case 1700: return ((char *) HT_01700); break;
5710 case 1710: return ((char *) HT_01710); break;
5711 case 1711: return ((char *) HT_01711); break;
5712 case 1720: return ((char *) HT_01720); break;
5713 case 1722: return ((char *) HT_01722); break;
5714 case 1730: return ((char *) HT_01730); break;
5715 case 1731: return ((char *) HT_01731); break;
5716 case 1740: return ((char *) HT_01740); break;
5717 case 1750: return ((char *) HT_01750); break;
5718 case 1760: return ((char *) HT_01760); break;
5719 case 1800: return ((char *) HT_01800); break;
5720 case 2100: return ((char *) HT_02100); break;
5721 case 2400: return ((char *) HT_02400); break;
5722 case 2410: return ((char *) HT_02410); break;
5723 case 2500: return ((char *) HT_02500); break;
5724 case 2600: return ((char *) HT_02600); break;
5725 case 2611: return ((char *) HT_02611); break;
5726 case 2612: return ((char *) HT_02612); break;
5727 case 2711: return ((char *) HT_02711); break;
5728 case 2811: return ((char *) HT_02811); break;
5729 case 3000: return ((char *) HT_03000); break;
5730 case 3100: return ((char *) HT_03100); break;
5731 case 3200: return ((char *) HT_03200); break;
5732 case 3710: return ((char *) HT_03710); break;
5733 case 3711: return ((char *) HT_03711); break;
5734 case 3800: return ((char *) HT_03800); break;
5735 case 4300: return ((char *) HT_04300); break;
5736 case 4400: return ((char *) HT_04400); break;
5737 case 4500: return ((char *) HT_04500); break;
5738 case 4700: return ((char *) HT_04700); break;
5739 case 4800: return ((char *) HT_04800); break;
5740 case 4900: return ((char *) HT_04900); break;
5741 case 5000: return ((char *) HT_05000); break;
5742 case 5100: return ((char *) HT_05100); break;
5743 case 5200: return ((char *) HT_05200); break;
5744 case 5300: return ((char *) HT_05300); break;
5745 case 5400: return ((char *) HT_05400); break;
5746 case 5500: return ((char *) HT_05500); break;
5747 case 5600: return ((char *) HT_05600); break;
5748 case 5700: return ((char *) HT_05700); break;
5749 case 5800: return ((char *) HT_05800); break;
5750 case 6000: return ((char *) HT_06000); break;
5751 case 6100: return ((char *) HT_06100); break;
5752 case 6211: return ((char *) HT_06211); break;
5753 case 6212: return ((char *) HT_06212); break;
5754 case 6213: return ((char *) HT_06213); break;
5755 case 6221: return ((char *) HT_06221); break;
5756 case 6222: return ((char *) HT_06222); break;
5757 case 6223: return ((char *) HT_06223); break;
5758 case 6231: return ((char *) HT_06231); break;
5759 case 6232: return ((char *) HT_06232); break;
5760 case 6233: return ((char *) HT_06233); break;
5761 case 6241: return ((char *) HT_06241); break;
5762 case 6242: return ((char *) HT_06242); break;
5763 case 6243: return ((char *) HT_06243); break;
5764 case 6300: return ((char *) HT_06300); break;
5765 case 6400: return ((char *) HT_06400); break;
5766 case 6500: return ((char *) HT_06500); break;
5767 case 6600: return ((char *) HT_06600); break;
5768 case 6700: return ((char *) HT_06700); break;
5769 case 6800: return ((char *) HT_06800); break;
5770 case 6900: return ((char *) HT_06900); break;
5771 case 7100: return ((char *) HT_07100); break;
5772 case 7200: return ((char *) HT_07200); break;
5773 case 7300: return ((char *) HT_07300); break;
5774 case 7400: return ((char *) HT_07400); break;
5775 case 7500: return ((char *) HT_07500); break;
5776 case 7600: return ((char *) HT_07600); break;
5777 case 7700: return ((char *) HT_07700); break;
5778 case 7800: return ((char *) HT_07800); break;
5779 case 7900: return ((char *) HT_07900); break;
5780 case 8000: return ((char *) HT_08000); break;
5781 case 8100: return ((char *) HT_08100); break;
5782 case 8200: return ((char *) HT_08200); break;
5783 case 8300: return ((char *) HT_08300); break;
5784 case 8400: return ((char *) HT_08400); break;
5785 case 8500: return ((char *) HT_08500); break;
5786 case 8600: return ((char *) HT_08600); break;
5787 case 8700: return ((char *) HT_08700); break;
5788 case 8800: return ((char *) HT_08800); break;
5789 case 8900: return ((char *) HT_08900); break;
5790 case 9000: return ((char *) HT_09000); break;
5791 case 9100: return ((char *) HT_09100); break;
5792 case 9200: return ((char *) HT_09200); break;
5793 case 9300: return ((char *) HT_09300); break;
5794 case 9400: return ((char *) HT_09400); break;
5795 case 9500: return ((char *) HT_09500); break;
5796 case 9600: return ((char *) HT_09600); break;
5797 case 9700: return ((char *) HT_09700); break;
5798 case 9710: return ((char *) HT_09710); break;
5799 case 9720: return ((char *) HT_09720); break;
5800 case 9800: return ((char *) HT_09800); break;
5801 case 9810: return ((char *) HT_09810); break;
5802 case 9820: return ((char *) HT_09820); break;
5803 case 9900: return ((char *) HT_09900); break;
5804 case 10000: return ((char *) HT_10000); break;
5805 case 10100: return ((char *) HT_10100); break;
5806 case 10200: return ((char *) HT_10200); break;
5807 case 10300: return ((char *) HT_10300); break;
5808 case 10400: return ((char *) HT_10400); break;
5809 case 10410: return ((char *) HT_10410); break;
5810 case 10420: return ((char *) HT_10420); break;
5811 case 10500: return ((char *) HT_10500); break;
5812 case 10600: return ((char *) HT_10600); break;
5813 case 10700: return ((char *) HT_10700); break;
5814 case 10800: return ((char *) HT_10800); break;
5815 case 10900: return ((char *) HT_10900); break;
5816 case 11000: return ((char *) HT_11000); break;
5817 case 11100: return ((char *) HT_11100); break;
5818 case 11200: return ((char *) HT_11200); break;
5819 case 11300: return ((char *) HT_11300); break;
5820 case 11400: return ((char *) HT_11400); break;
5821 case 11500: return ((char *) HT_11500); break;
5822 case 11600: return ((char *) HT_11600); break;
5823 case 11700: return ((char *) HT_11700); break;
5824 case 11800: return ((char *) HT_11800); break;
5825 case 11900: return ((char *) HT_11900); break;
5826 case 12000: return ((char *) HT_12000); break;
5827 case 12100: return ((char *) HT_12100); break;
5828 case 12200: return ((char *) HT_12200); break;
5829 case 12300: return ((char *) HT_12300); break;
5830 case 12400: return ((char *) HT_12400); break;
5831 case 12500: return ((char *) HT_12500); break;
5832 case 12600: return ((char *) HT_12600); break;
5833 case 12700: return ((char *) HT_12700); break;
5834 case 12800: return ((char *) HT_12800); break;
5835 case 12900: return ((char *) HT_12900); break;
5836 case 13000: return ((char *) HT_13000); break;
5837 case 13100: return ((char *) HT_13100); break;
5838 }
5839
5840 return ((char *) "Unknown");
5841 }
5842
5843 char *strstatus (const uint devices_status)
5844 {
5845 switch (devices_status)
5846 {
5847 case STATUS_INIT: return ((char *) ST_0000); break;
5848 case STATUS_STARTING: return ((char *) ST_0001); break;
5849 case STATUS_RUNNING: return ((char *) ST_0002); break;
5850 case STATUS_PAUSED: return ((char *) ST_0003); break;
5851 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5852 case STATUS_CRACKED: return ((char *) ST_0005); break;
5853 case STATUS_ABORTED: return ((char *) ST_0006); break;
5854 case STATUS_QUIT: return ((char *) ST_0007); break;
5855 case STATUS_BYPASS: return ((char *) ST_0008); break;
5856 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5857 case STATUS_AUTOTUNE: return ((char *) ST_0010); break;
5858 }
5859
5860 return ((char *) "Unknown");
5861 }
5862
5863 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5864 {
5865 uint hash_type = data.hash_type;
5866 uint hash_mode = data.hash_mode;
5867 uint salt_type = data.salt_type;
5868 uint opts_type = data.opts_type;
5869 uint opti_type = data.opti_type;
5870 uint dgst_size = data.dgst_size;
5871
5872 char *hashfile = data.hashfile;
5873
5874 uint len = 4096;
5875
5876 uint digest_buf[64] = { 0 };
5877
5878 u64 *digest_buf64 = (u64 *) digest_buf;
5879
5880 char *digests_buf_ptr = (char *) data.digests_buf;
5881
5882 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5883
5884 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5885 {
5886 uint tt;
5887
5888 switch (hash_type)
5889 {
5890 case HASH_TYPE_DESCRYPT:
5891 FP (digest_buf[1], digest_buf[0], tt);
5892 break;
5893
5894 case HASH_TYPE_DESRACF:
5895 digest_buf[0] = rotl32 (digest_buf[0], 29);
5896 digest_buf[1] = rotl32 (digest_buf[1], 29);
5897
5898 FP (digest_buf[1], digest_buf[0], tt);
5899 break;
5900
5901 case HASH_TYPE_LM:
5902 FP (digest_buf[1], digest_buf[0], tt);
5903 break;
5904
5905 case HASH_TYPE_NETNTLM:
5906 digest_buf[0] = rotl32 (digest_buf[0], 29);
5907 digest_buf[1] = rotl32 (digest_buf[1], 29);
5908 digest_buf[2] = rotl32 (digest_buf[2], 29);
5909 digest_buf[3] = rotl32 (digest_buf[3], 29);
5910
5911 FP (digest_buf[1], digest_buf[0], tt);
5912 FP (digest_buf[3], digest_buf[2], tt);
5913 break;
5914
5915 case HASH_TYPE_BSDICRYPT:
5916 digest_buf[0] = rotl32 (digest_buf[0], 31);
5917 digest_buf[1] = rotl32 (digest_buf[1], 31);
5918
5919 FP (digest_buf[1], digest_buf[0], tt);
5920 break;
5921 }
5922 }
5923
5924 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5925 {
5926 switch (hash_type)
5927 {
5928 case HASH_TYPE_MD4:
5929 digest_buf[0] += MD4M_A;
5930 digest_buf[1] += MD4M_B;
5931 digest_buf[2] += MD4M_C;
5932 digest_buf[3] += MD4M_D;
5933 break;
5934
5935 case HASH_TYPE_MD5:
5936 digest_buf[0] += MD5M_A;
5937 digest_buf[1] += MD5M_B;
5938 digest_buf[2] += MD5M_C;
5939 digest_buf[3] += MD5M_D;
5940 break;
5941
5942 case HASH_TYPE_SHA1:
5943 digest_buf[0] += SHA1M_A;
5944 digest_buf[1] += SHA1M_B;
5945 digest_buf[2] += SHA1M_C;
5946 digest_buf[3] += SHA1M_D;
5947 digest_buf[4] += SHA1M_E;
5948 break;
5949
5950 case HASH_TYPE_SHA256:
5951 digest_buf[0] += SHA256M_A;
5952 digest_buf[1] += SHA256M_B;
5953 digest_buf[2] += SHA256M_C;
5954 digest_buf[3] += SHA256M_D;
5955 digest_buf[4] += SHA256M_E;
5956 digest_buf[5] += SHA256M_F;
5957 digest_buf[6] += SHA256M_G;
5958 digest_buf[7] += SHA256M_H;
5959 break;
5960
5961 case HASH_TYPE_SHA384:
5962 digest_buf64[0] += SHA384M_A;
5963 digest_buf64[1] += SHA384M_B;
5964 digest_buf64[2] += SHA384M_C;
5965 digest_buf64[3] += SHA384M_D;
5966 digest_buf64[4] += SHA384M_E;
5967 digest_buf64[5] += SHA384M_F;
5968 digest_buf64[6] += 0;
5969 digest_buf64[7] += 0;
5970 break;
5971
5972 case HASH_TYPE_SHA512:
5973 digest_buf64[0] += SHA512M_A;
5974 digest_buf64[1] += SHA512M_B;
5975 digest_buf64[2] += SHA512M_C;
5976 digest_buf64[3] += SHA512M_D;
5977 digest_buf64[4] += SHA512M_E;
5978 digest_buf64[5] += SHA512M_F;
5979 digest_buf64[6] += SHA512M_G;
5980 digest_buf64[7] += SHA512M_H;
5981 break;
5982 }
5983 }
5984
5985 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
5986 {
5987 if (dgst_size == DGST_SIZE_4_2)
5988 {
5989 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5990 }
5991 else if (dgst_size == DGST_SIZE_4_4)
5992 {
5993 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5994 }
5995 else if (dgst_size == DGST_SIZE_4_5)
5996 {
5997 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5998 }
5999 else if (dgst_size == DGST_SIZE_4_6)
6000 {
6001 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6002 }
6003 else if (dgst_size == DGST_SIZE_4_8)
6004 {
6005 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6006 }
6007 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
6008 {
6009 if (hash_type == HASH_TYPE_WHIRLPOOL)
6010 {
6011 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6012 }
6013 else if (hash_type == HASH_TYPE_SHA384)
6014 {
6015 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6016 }
6017 else if (hash_type == HASH_TYPE_SHA512)
6018 {
6019 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6020 }
6021 else if (hash_type == HASH_TYPE_GOST)
6022 {
6023 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6024 }
6025 }
6026 else if (dgst_size == DGST_SIZE_4_64)
6027 {
6028 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
6029 }
6030 else if (dgst_size == DGST_SIZE_8_25)
6031 {
6032 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
6033 }
6034 }
6035
6036 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
6037 | (data.salt_type == SALT_TYPE_EXTERN)
6038 | (data.salt_type == SALT_TYPE_EMBEDDED));
6039
6040 salt_t salt;
6041
6042 if (isSalted)
6043 {
6044 memset (&salt, 0, sizeof (salt_t));
6045
6046 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
6047
6048 char *ptr = (char *) salt.salt_buf;
6049
6050 uint len = salt.salt_len;
6051
6052 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6053 {
6054 uint tt;
6055
6056 switch (hash_type)
6057 {
6058 case HASH_TYPE_NETNTLM:
6059
6060 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
6061 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
6062
6063 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
6064
6065 break;
6066 }
6067 }
6068
6069 if (opts_type & OPTS_TYPE_ST_UNICODE)
6070 {
6071 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6072 {
6073 ptr[i] = ptr[j];
6074 }
6075
6076 len = len / 2;
6077 }
6078
6079 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6080 {
6081 uint max = salt.salt_len / 4;
6082
6083 if (len % 4) max++;
6084
6085 for (uint i = 0; i < max; i++)
6086 {
6087 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6088 }
6089 }
6090
6091 if (opts_type & OPTS_TYPE_ST_HEX)
6092 {
6093 char tmp[64] = { 0 };
6094
6095 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6096 {
6097 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6098 }
6099
6100 len = len * 2;
6101
6102 memcpy (ptr, tmp, len);
6103 }
6104
6105 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6106
6107 memset (ptr + len, 0, memset_size);
6108
6109 salt.salt_len = len;
6110 }
6111
6112 //
6113 // some modes require special encoding
6114 //
6115
6116 uint out_buf_plain[256] = { 0 };
6117 uint out_buf_salt[256] = { 0 };
6118
6119 char tmp_buf[1024] = { 0 };
6120
6121 char *ptr_plain = (char *) out_buf_plain;
6122 char *ptr_salt = (char *) out_buf_salt;
6123
6124 if (hash_mode == 22)
6125 {
6126 char username[30] = { 0 };
6127
6128 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6129
6130 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6131
6132 u16 *ptr = (u16 *) digest_buf;
6133
6134 tmp_buf[ 0] = sig[0];
6135 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6136 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6137 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6138 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6139 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6140 tmp_buf[ 6] = sig[1];
6141 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6142 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6143 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6144 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6145 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6146 tmp_buf[12] = sig[2];
6147 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6148 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6149 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6150 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6151 tmp_buf[17] = sig[3];
6152 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6153 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6154 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6155 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6156 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6157 tmp_buf[23] = sig[4];
6158 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6159 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6160 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6161 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6162 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6163 tmp_buf[29] = sig[5];
6164
6165 snprintf (out_buf, len-1, "%s:%s",
6166 tmp_buf,
6167 username);
6168 }
6169 else if (hash_mode == 23)
6170 {
6171 // do not show the \nskyper\n part in output
6172
6173 char *salt_buf_ptr = (char *) salt.salt_buf;
6174
6175 salt_buf_ptr[salt.salt_len - 8] = 0;
6176
6177 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6178 digest_buf[0],
6179 digest_buf[1],
6180 digest_buf[2],
6181 digest_buf[3],
6182 salt_buf_ptr);
6183 }
6184 else if (hash_mode == 101)
6185 {
6186 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6187
6188 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6189 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6190 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6191 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6192 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6193
6194 memcpy (tmp_buf, digest_buf, 20);
6195
6196 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6197
6198 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6199 }
6200 else if (hash_mode == 111)
6201 {
6202 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6203
6204 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6205 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6206 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6207 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6208 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6209
6210 memcpy (tmp_buf, digest_buf, 20);
6211 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6212
6213 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6214
6215 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6216 }
6217 else if (hash_mode == 122)
6218 {
6219 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6220 (char *) salt.salt_buf,
6221 digest_buf[0],
6222 digest_buf[1],
6223 digest_buf[2],
6224 digest_buf[3],
6225 digest_buf[4]);
6226 }
6227 else if (hash_mode == 124)
6228 {
6229 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6230 (char *) salt.salt_buf,
6231 digest_buf[0],
6232 digest_buf[1],
6233 digest_buf[2],
6234 digest_buf[3],
6235 digest_buf[4]);
6236 }
6237 else if (hash_mode == 131)
6238 {
6239 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6240 (char *) salt.salt_buf,
6241 0, 0, 0, 0, 0,
6242 digest_buf[0],
6243 digest_buf[1],
6244 digest_buf[2],
6245 digest_buf[3],
6246 digest_buf[4]);
6247 }
6248 else if (hash_mode == 132)
6249 {
6250 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6251 (char *) salt.salt_buf,
6252 digest_buf[0],
6253 digest_buf[1],
6254 digest_buf[2],
6255 digest_buf[3],
6256 digest_buf[4]);
6257 }
6258 else if (hash_mode == 133)
6259 {
6260 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6261
6262 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6263 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6264 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6265 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6266 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6267
6268 memcpy (tmp_buf, digest_buf, 20);
6269
6270 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6271
6272 snprintf (out_buf, len-1, "%s", ptr_plain);
6273 }
6274 else if (hash_mode == 141)
6275 {
6276 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6277
6278 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6279
6280 memset (tmp_buf, 0, sizeof (tmp_buf));
6281
6282 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6283
6284 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6285 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6286 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6287 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6288 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6289
6290 memcpy (tmp_buf, digest_buf, 20);
6291
6292 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6293
6294 ptr_plain[27] = 0;
6295
6296 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6297 }
6298 else if (hash_mode == 400)
6299 {
6300 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6301
6302 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6303 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6304 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6305 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6306
6307 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6308
6309 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6310 }
6311 else if (hash_mode == 500)
6312 {
6313 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6314
6315 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6316 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6317 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6318 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6319
6320 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6321
6322 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6323 {
6324 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6325 }
6326 else
6327 {
6328 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6329 }
6330 }
6331 else if (hash_mode == 501)
6332 {
6333 uint digest_idx = salt.digests_offset + digest_pos;
6334
6335 hashinfo_t **hashinfo_ptr = data.hash_info;
6336 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6337
6338 snprintf (out_buf, len-1, "%s", hash_buf);
6339 }
6340 else if (hash_mode == 1421)
6341 {
6342 u8 *salt_ptr = (u8 *) salt.salt_buf;
6343
6344 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6345 salt_ptr[0],
6346 salt_ptr[1],
6347 salt_ptr[2],
6348 salt_ptr[3],
6349 salt_ptr[4],
6350 salt_ptr[5],
6351 digest_buf[0],
6352 digest_buf[1],
6353 digest_buf[2],
6354 digest_buf[3],
6355 digest_buf[4],
6356 digest_buf[5],
6357 digest_buf[6],
6358 digest_buf[7]);
6359 }
6360 else if (hash_mode == 1441)
6361 {
6362 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6363
6364 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6365
6366 memset (tmp_buf, 0, sizeof (tmp_buf));
6367
6368 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6369
6370 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6371 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6372 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6373 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6374 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6375 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6376 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6377 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6378
6379 memcpy (tmp_buf, digest_buf, 32);
6380
6381 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6382
6383 ptr_plain[43] = 0;
6384
6385 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6386 }
6387 else if (hash_mode == 1500)
6388 {
6389 out_buf[0] = salt.salt_sign[0] & 0xff;
6390 out_buf[1] = salt.salt_sign[1] & 0xff;
6391 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6392 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6393 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6394
6395 memset (tmp_buf, 0, sizeof (tmp_buf));
6396
6397 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6398
6399 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6400 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6401
6402 memcpy (tmp_buf, digest_buf, 8);
6403
6404 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6405
6406 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6407
6408 out_buf[13] = 0;
6409 }
6410 else if (hash_mode == 1600)
6411 {
6412 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6413
6414 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6415 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6416 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6417 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6418
6419 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6420
6421 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6422 {
6423 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6424 }
6425 else
6426 {
6427 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6428 }
6429 }
6430 else if (hash_mode == 1711)
6431 {
6432 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6433
6434 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6435 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6436 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6437 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6438 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6439 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6440 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6441 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6442
6443 memcpy (tmp_buf, digest_buf, 64);
6444 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6445
6446 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6447
6448 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6449 }
6450 else if (hash_mode == 1722)
6451 {
6452 uint *ptr = digest_buf;
6453
6454 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6455 (unsigned char *) salt.salt_buf,
6456 ptr[ 1], ptr[ 0],
6457 ptr[ 3], ptr[ 2],
6458 ptr[ 5], ptr[ 4],
6459 ptr[ 7], ptr[ 6],
6460 ptr[ 9], ptr[ 8],
6461 ptr[11], ptr[10],
6462 ptr[13], ptr[12],
6463 ptr[15], ptr[14]);
6464 }
6465 else if (hash_mode == 1731)
6466 {
6467 uint *ptr = digest_buf;
6468
6469 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6470 (unsigned char *) salt.salt_buf,
6471 ptr[ 1], ptr[ 0],
6472 ptr[ 3], ptr[ 2],
6473 ptr[ 5], ptr[ 4],
6474 ptr[ 7], ptr[ 6],
6475 ptr[ 9], ptr[ 8],
6476 ptr[11], ptr[10],
6477 ptr[13], ptr[12],
6478 ptr[15], ptr[14]);
6479 }
6480 else if (hash_mode == 1800)
6481 {
6482 // temp workaround
6483
6484 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6485 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6486 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6487 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6488 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6489 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6490 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6491 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6492
6493 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6494
6495 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6496 {
6497 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6498 }
6499 else
6500 {
6501 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6502 }
6503 }
6504 else if (hash_mode == 2100)
6505 {
6506 uint pos = 0;
6507
6508 snprintf (out_buf + pos, len-1, "%s%i#",
6509 SIGNATURE_DCC2,
6510 salt.salt_iter + 1);
6511
6512 uint signature_len = strlen (out_buf);
6513
6514 pos += signature_len;
6515 len -= signature_len;
6516
6517 char *salt_ptr = (char *) salt.salt_buf;
6518
6519 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6520
6521 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6522 byte_swap_32 (digest_buf[0]),
6523 byte_swap_32 (digest_buf[1]),
6524 byte_swap_32 (digest_buf[2]),
6525 byte_swap_32 (digest_buf[3]));
6526 }
6527 else if ((hash_mode == 2400) || (hash_mode == 2410))
6528 {
6529 memcpy (tmp_buf, digest_buf, 16);
6530
6531 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6532
6533 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6534 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6535 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6536 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6537
6538 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6539 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6540 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6541 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6542
6543 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6544 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6545 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6546 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6547
6548 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6549 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6550 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6551 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6552
6553 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6554 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6555 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6556 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6557
6558 out_buf[16] = 0;
6559 }
6560 else if (hash_mode == 2500)
6561 {
6562 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6563
6564 wpa_t *wpa = &wpas[salt_pos];
6565
6566 uint pke[25] = { 0 };
6567
6568 char *pke_ptr = (char *) pke;
6569
6570 for (uint i = 0; i < 25; i++)
6571 {
6572 pke[i] = byte_swap_32 (wpa->pke[i]);
6573 }
6574
6575 unsigned char mac1[6] = { 0 };
6576 unsigned char mac2[6] = { 0 };
6577
6578 memcpy (mac1, pke_ptr + 23, 6);
6579 memcpy (mac2, pke_ptr + 29, 6);
6580
6581 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6582 (char *) salt.salt_buf,
6583 mac1[0],
6584 mac1[1],
6585 mac1[2],
6586 mac1[3],
6587 mac1[4],
6588 mac1[5],
6589 mac2[0],
6590 mac2[1],
6591 mac2[2],
6592 mac2[3],
6593 mac2[4],
6594 mac2[5]);
6595 }
6596 else if (hash_mode == 4400)
6597 {
6598 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6599 byte_swap_32 (digest_buf[0]),
6600 byte_swap_32 (digest_buf[1]),
6601 byte_swap_32 (digest_buf[2]),
6602 byte_swap_32 (digest_buf[3]));
6603 }
6604 else if (hash_mode == 4700)
6605 {
6606 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6607 byte_swap_32 (digest_buf[0]),
6608 byte_swap_32 (digest_buf[1]),
6609 byte_swap_32 (digest_buf[2]),
6610 byte_swap_32 (digest_buf[3]),
6611 byte_swap_32 (digest_buf[4]));
6612 }
6613 else if (hash_mode == 4800)
6614 {
6615 u8 chap_id_byte = (u8) salt.salt_buf[4];
6616
6617 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6618 digest_buf[0],
6619 digest_buf[1],
6620 digest_buf[2],
6621 digest_buf[3],
6622 byte_swap_32 (salt.salt_buf[0]),
6623 byte_swap_32 (salt.salt_buf[1]),
6624 byte_swap_32 (salt.salt_buf[2]),
6625 byte_swap_32 (salt.salt_buf[3]),
6626 chap_id_byte);
6627 }
6628 else if (hash_mode == 4900)
6629 {
6630 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6631 byte_swap_32 (digest_buf[0]),
6632 byte_swap_32 (digest_buf[1]),
6633 byte_swap_32 (digest_buf[2]),
6634 byte_swap_32 (digest_buf[3]),
6635 byte_swap_32 (digest_buf[4]));
6636 }
6637 else if (hash_mode == 5100)
6638 {
6639 snprintf (out_buf, len-1, "%08x%08x",
6640 digest_buf[0],
6641 digest_buf[1]);
6642 }
6643 else if (hash_mode == 5200)
6644 {
6645 snprintf (out_buf, len-1, "%s", hashfile);
6646 }
6647 else if (hash_mode == 5300)
6648 {
6649 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6650
6651 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6652
6653 int buf_len = len -1;
6654
6655 // msg_buf
6656
6657 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6658
6659 for (uint i = 0; i < ikepsk_msg_len; i++)
6660 {
6661 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6662 {
6663 snprintf (out_buf, buf_len, ":");
6664
6665 buf_len--;
6666 out_buf++;
6667 }
6668
6669 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6670
6671 buf_len -= 8;
6672 out_buf += 8;
6673 }
6674
6675 // nr_buf
6676
6677 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6678
6679 for (uint i = 0; i < ikepsk_nr_len; i++)
6680 {
6681 if ((i == 0) || (i == 5))
6682 {
6683 snprintf (out_buf, buf_len, ":");
6684
6685 buf_len--;
6686 out_buf++;
6687 }
6688
6689 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6690
6691 buf_len -= 8;
6692 out_buf += 8;
6693 }
6694
6695 // digest_buf
6696
6697 for (uint i = 0; i < 4; i++)
6698 {
6699 if (i == 0)
6700 {
6701 snprintf (out_buf, buf_len, ":");
6702
6703 buf_len--;
6704 out_buf++;
6705 }
6706
6707 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6708
6709 buf_len -= 8;
6710 out_buf += 8;
6711 }
6712 }
6713 else if (hash_mode == 5400)
6714 {
6715 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6716
6717 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6718
6719 int buf_len = len -1;
6720
6721 // msg_buf
6722
6723 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6724
6725 for (uint i = 0; i < ikepsk_msg_len; i++)
6726 {
6727 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6728 {
6729 snprintf (out_buf, buf_len, ":");
6730
6731 buf_len--;
6732 out_buf++;
6733 }
6734
6735 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6736
6737 buf_len -= 8;
6738 out_buf += 8;
6739 }
6740
6741 // nr_buf
6742
6743 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6744
6745 for (uint i = 0; i < ikepsk_nr_len; i++)
6746 {
6747 if ((i == 0) || (i == 5))
6748 {
6749 snprintf (out_buf, buf_len, ":");
6750
6751 buf_len--;
6752 out_buf++;
6753 }
6754
6755 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6756
6757 buf_len -= 8;
6758 out_buf += 8;
6759 }
6760
6761 // digest_buf
6762
6763 for (uint i = 0; i < 5; i++)
6764 {
6765 if (i == 0)
6766 {
6767 snprintf (out_buf, buf_len, ":");
6768
6769 buf_len--;
6770 out_buf++;
6771 }
6772
6773 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6774
6775 buf_len -= 8;
6776 out_buf += 8;
6777 }
6778 }
6779 else if (hash_mode == 5500)
6780 {
6781 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6782
6783 netntlm_t *netntlm = &netntlms[salt_pos];
6784
6785 char user_buf[64] = { 0 };
6786 char domain_buf[64] = { 0 };
6787 char srvchall_buf[1024] = { 0 };
6788 char clichall_buf[1024] = { 0 };
6789
6790 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6791 {
6792 char *ptr = (char *) netntlm->userdomain_buf;
6793
6794 user_buf[i] = ptr[j];
6795 }
6796
6797 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6798 {
6799 char *ptr = (char *) netntlm->userdomain_buf;
6800
6801 domain_buf[i] = ptr[netntlm->user_len + j];
6802 }
6803
6804 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6805 {
6806 u8 *ptr = (u8 *) netntlm->chall_buf;
6807
6808 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6809 }
6810
6811 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6812 {
6813 u8 *ptr = (u8 *) netntlm->chall_buf;
6814
6815 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6816 }
6817
6818 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6819 user_buf,
6820 domain_buf,
6821 srvchall_buf,
6822 digest_buf[0],
6823 digest_buf[1],
6824 digest_buf[2],
6825 digest_buf[3],
6826 byte_swap_32 (salt.salt_buf_pc[0]),
6827 byte_swap_32 (salt.salt_buf_pc[1]),
6828 clichall_buf);
6829 }
6830 else if (hash_mode == 5600)
6831 {
6832 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6833
6834 netntlm_t *netntlm = &netntlms[salt_pos];
6835
6836 char user_buf[64] = { 0 };
6837 char domain_buf[64] = { 0 };
6838 char srvchall_buf[1024] = { 0 };
6839 char clichall_buf[1024] = { 0 };
6840
6841 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6842 {
6843 char *ptr = (char *) netntlm->userdomain_buf;
6844
6845 user_buf[i] = ptr[j];
6846 }
6847
6848 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6849 {
6850 char *ptr = (char *) netntlm->userdomain_buf;
6851
6852 domain_buf[i] = ptr[netntlm->user_len + j];
6853 }
6854
6855 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6856 {
6857 u8 *ptr = (u8 *) netntlm->chall_buf;
6858
6859 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6860 }
6861
6862 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6863 {
6864 u8 *ptr = (u8 *) netntlm->chall_buf;
6865
6866 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6867 }
6868
6869 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6870 user_buf,
6871 domain_buf,
6872 srvchall_buf,
6873 digest_buf[0],
6874 digest_buf[1],
6875 digest_buf[2],
6876 digest_buf[3],
6877 clichall_buf);
6878 }
6879 else if (hash_mode == 5700)
6880 {
6881 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6882
6883 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6884 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6885 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6886 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6887 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6888 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6889 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6890 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6891
6892 memcpy (tmp_buf, digest_buf, 32);
6893
6894 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6895
6896 ptr_plain[43] = 0;
6897
6898 snprintf (out_buf, len-1, "%s", ptr_plain);
6899 }
6900 else if (hash_mode == 5800)
6901 {
6902 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6903 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6904 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6905 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6906 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6907
6908 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6909 digest_buf[0],
6910 digest_buf[1],
6911 digest_buf[2],
6912 digest_buf[3],
6913 digest_buf[4]);
6914 }
6915 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6916 {
6917 snprintf (out_buf, len-1, "%s", hashfile);
6918 }
6919 else if (hash_mode == 6300)
6920 {
6921 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6922
6923 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6924 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6925 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6926 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6927
6928 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6929
6930 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6931 }
6932 else if (hash_mode == 6400)
6933 {
6934 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6935
6936 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6937 }
6938 else if (hash_mode == 6500)
6939 {
6940 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6941
6942 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6943 }
6944 else if (hash_mode == 6600)
6945 {
6946 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6947
6948 agilekey_t *agilekey = &agilekeys[salt_pos];
6949
6950 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6951 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6952
6953 uint buf_len = len - 1;
6954
6955 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6956 buf_len -= 22;
6957
6958 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6959 {
6960 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6961
6962 buf_len -= 2;
6963 }
6964 }
6965 else if (hash_mode == 6700)
6966 {
6967 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6968
6969 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6970 }
6971 else if (hash_mode == 6800)
6972 {
6973 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6974 }
6975 else if (hash_mode == 7100)
6976 {
6977 uint *ptr = digest_buf;
6978
6979 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6980
6981 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6982
6983 uint esalt[8] = { 0 };
6984
6985 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6986 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6987 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6988 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6989 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6990 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6991 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6992 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6993
6994 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",
6995 SIGNATURE_SHA512OSX,
6996 salt.salt_iter + 1,
6997 esalt[ 0], esalt[ 1],
6998 esalt[ 2], esalt[ 3],
6999 esalt[ 4], esalt[ 5],
7000 esalt[ 6], esalt[ 7],
7001 ptr [ 1], ptr [ 0],
7002 ptr [ 3], ptr [ 2],
7003 ptr [ 5], ptr [ 4],
7004 ptr [ 7], ptr [ 6],
7005 ptr [ 9], ptr [ 8],
7006 ptr [11], ptr [10],
7007 ptr [13], ptr [12],
7008 ptr [15], ptr [14]);
7009 }
7010 else if (hash_mode == 7200)
7011 {
7012 uint *ptr = digest_buf;
7013
7014 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
7015
7016 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
7017
7018 uint len_used = 0;
7019
7020 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
7021
7022 len_used = strlen (out_buf);
7023
7024 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
7025
7026 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
7027 {
7028 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
7029 }
7030
7031 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",
7032 ptr [ 1], ptr [ 0],
7033 ptr [ 3], ptr [ 2],
7034 ptr [ 5], ptr [ 4],
7035 ptr [ 7], ptr [ 6],
7036 ptr [ 9], ptr [ 8],
7037 ptr [11], ptr [10],
7038 ptr [13], ptr [12],
7039 ptr [15], ptr [14]);
7040 }
7041 else if (hash_mode == 7300)
7042 {
7043 rakp_t *rakps = (rakp_t *) data.esalts_buf;
7044
7045 rakp_t *rakp = &rakps[salt_pos];
7046
7047 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
7048 {
7049 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
7050 }
7051
7052 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
7053 digest_buf[0],
7054 digest_buf[1],
7055 digest_buf[2],
7056 digest_buf[3],
7057 digest_buf[4]);
7058 }
7059 else if (hash_mode == 7400)
7060 {
7061 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7062
7063 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7064 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7065 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7066 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7067 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7068 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7069 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7070 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7071
7072 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7073
7074 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7075 {
7076 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7077 }
7078 else
7079 {
7080 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7081 }
7082 }
7083 else if (hash_mode == 7500)
7084 {
7085 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7086
7087 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7088
7089 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7090 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7091
7092 char data[128] = { 0 };
7093
7094 char *ptr_data = data;
7095
7096 for (uint i = 0; i < 36; i++, ptr_data += 2)
7097 {
7098 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7099 }
7100
7101 for (uint i = 0; i < 16; i++, ptr_data += 2)
7102 {
7103 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7104 }
7105
7106 *ptr_data = 0;
7107
7108 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7109 SIGNATURE_KRB5PA,
7110 (char *) krb5pa->user,
7111 (char *) krb5pa->realm,
7112 (char *) krb5pa->salt,
7113 data);
7114 }
7115 else if (hash_mode == 7700)
7116 {
7117 snprintf (out_buf, len-1, "%s$%08X%08X",
7118 (char *) salt.salt_buf,
7119 digest_buf[0],
7120 digest_buf[1]);
7121 }
7122 else if (hash_mode == 7800)
7123 {
7124 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7125 (char *) salt.salt_buf,
7126 digest_buf[0],
7127 digest_buf[1],
7128 digest_buf[2],
7129 digest_buf[3],
7130 digest_buf[4]);
7131 }
7132 else if (hash_mode == 7900)
7133 {
7134 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7135
7136 // ugly hack start
7137
7138 char *tmp = (char *) salt.salt_buf_pc;
7139
7140 ptr_plain[42] = tmp[0];
7141
7142 // ugly hack end
7143
7144 ptr_plain[43] = 0;
7145
7146 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7147 }
7148 else if (hash_mode == 8000)
7149 {
7150 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7151 (unsigned char *) salt.salt_buf,
7152 digest_buf[0],
7153 digest_buf[1],
7154 digest_buf[2],
7155 digest_buf[3],
7156 digest_buf[4],
7157 digest_buf[5],
7158 digest_buf[6],
7159 digest_buf[7]);
7160 }
7161 else if (hash_mode == 8100)
7162 {
7163 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7164 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7165
7166 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7167 (unsigned char *) salt.salt_buf,
7168 digest_buf[0],
7169 digest_buf[1],
7170 digest_buf[2],
7171 digest_buf[3],
7172 digest_buf[4]);
7173 }
7174 else if (hash_mode == 8200)
7175 {
7176 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7177
7178 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7179
7180 char data_buf[4096] = { 0 };
7181
7182 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7183 {
7184 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7185 }
7186
7187 data_buf[cloudkey->data_len * 2] = 0;
7188
7189 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7190 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7191 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7192 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7193 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7194 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7195 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7196 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7197
7198 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7199 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7200 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7201 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7202
7203 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7204 digest_buf[0],
7205 digest_buf[1],
7206 digest_buf[2],
7207 digest_buf[3],
7208 digest_buf[4],
7209 digest_buf[5],
7210 digest_buf[6],
7211 digest_buf[7],
7212 salt.salt_buf[0],
7213 salt.salt_buf[1],
7214 salt.salt_buf[2],
7215 salt.salt_buf[3],
7216 salt.salt_iter + 1,
7217 data_buf);
7218 }
7219 else if (hash_mode == 8300)
7220 {
7221 char digest_buf_c[34] = { 0 };
7222
7223 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7224
7225 digest_buf_c[32] = 0;
7226
7227 // domain
7228
7229 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7230
7231 char domain_buf_c[33] = { 0 };
7232
7233 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7234
7235 for (uint i = 0; i < salt_pc_len; i++)
7236 {
7237 const char next = domain_buf_c[i];
7238
7239 domain_buf_c[i] = '.';
7240
7241 i += next;
7242 }
7243
7244 domain_buf_c[salt_pc_len] = 0;
7245
7246 // final
7247
7248 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7249 }
7250 else if (hash_mode == 8500)
7251 {
7252 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7253 }
7254 else if (hash_mode == 2612)
7255 {
7256 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7257 SIGNATURE_PHPS,
7258 (char *) salt.salt_buf,
7259 digest_buf[0],
7260 digest_buf[1],
7261 digest_buf[2],
7262 digest_buf[3]);
7263 }
7264 else if (hash_mode == 3711)
7265 {
7266 char *salt_ptr = (char *) salt.salt_buf;
7267
7268 salt_ptr[salt.salt_len - 1] = 0;
7269
7270 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7271 SIGNATURE_MEDIAWIKI_B,
7272 salt_ptr,
7273 digest_buf[0],
7274 digest_buf[1],
7275 digest_buf[2],
7276 digest_buf[3]);
7277 }
7278 else if (hash_mode == 8800)
7279 {
7280 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7281
7282 androidfde_t *androidfde = &androidfdes[salt_pos];
7283
7284 char tmp[3073] = { 0 };
7285
7286 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7287 {
7288 sprintf (tmp + j, "%08x", androidfde->data[i]);
7289 }
7290
7291 tmp[3072] = 0;
7292
7293 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7294 SIGNATURE_ANDROIDFDE,
7295 byte_swap_32 (salt.salt_buf[0]),
7296 byte_swap_32 (salt.salt_buf[1]),
7297 byte_swap_32 (salt.salt_buf[2]),
7298 byte_swap_32 (salt.salt_buf[3]),
7299 byte_swap_32 (digest_buf[0]),
7300 byte_swap_32 (digest_buf[1]),
7301 byte_swap_32 (digest_buf[2]),
7302 byte_swap_32 (digest_buf[3]),
7303 tmp);
7304 }
7305 else if (hash_mode == 8900)
7306 {
7307 uint N = salt.scrypt_N;
7308 uint r = salt.scrypt_r;
7309 uint p = salt.scrypt_p;
7310
7311 char base64_salt[32] = { 0 };
7312
7313 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7314
7315 memset (tmp_buf, 0, 46);
7316
7317 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7318 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7319 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7320 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7321 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7322 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7323 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7324 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7325 digest_buf[8] = 0; // needed for base64_encode ()
7326
7327 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7328
7329 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7330 SIGNATURE_SCRYPT,
7331 N,
7332 r,
7333 p,
7334 base64_salt,
7335 tmp_buf);
7336 }
7337 else if (hash_mode == 9000)
7338 {
7339 snprintf (out_buf, len-1, "%s", hashfile);
7340 }
7341 else if (hash_mode == 9200)
7342 {
7343 // salt
7344
7345 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7346
7347 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7348
7349 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7350
7351 // hash
7352
7353 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7354 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7355 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7356 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7357 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7358 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7359 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7360 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7361 digest_buf[8] = 0; // needed for base64_encode ()
7362
7363 char tmp_buf[64] = { 0 };
7364
7365 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7366 tmp_buf[43] = 0; // cut it here
7367
7368 // output
7369
7370 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7371 }
7372 else if (hash_mode == 9300)
7373 {
7374 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7375 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7376 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7377 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7378 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7379 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7380 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7381 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7382 digest_buf[8] = 0; // needed for base64_encode ()
7383
7384 char tmp_buf[64] = { 0 };
7385
7386 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7387 tmp_buf[43] = 0; // cut it here
7388
7389 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7390
7391 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7392 }
7393 else if (hash_mode == 9400)
7394 {
7395 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7396
7397 office2007_t *office2007 = &office2007s[salt_pos];
7398
7399 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7400 SIGNATURE_OFFICE2007,
7401 2007,
7402 20,
7403 office2007->keySize,
7404 16,
7405 salt.salt_buf[0],
7406 salt.salt_buf[1],
7407 salt.salt_buf[2],
7408 salt.salt_buf[3],
7409 office2007->encryptedVerifier[0],
7410 office2007->encryptedVerifier[1],
7411 office2007->encryptedVerifier[2],
7412 office2007->encryptedVerifier[3],
7413 office2007->encryptedVerifierHash[0],
7414 office2007->encryptedVerifierHash[1],
7415 office2007->encryptedVerifierHash[2],
7416 office2007->encryptedVerifierHash[3],
7417 office2007->encryptedVerifierHash[4]);
7418 }
7419 else if (hash_mode == 9500)
7420 {
7421 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7422
7423 office2010_t *office2010 = &office2010s[salt_pos];
7424
7425 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,
7426
7427 salt.salt_buf[0],
7428 salt.salt_buf[1],
7429 salt.salt_buf[2],
7430 salt.salt_buf[3],
7431 office2010->encryptedVerifier[0],
7432 office2010->encryptedVerifier[1],
7433 office2010->encryptedVerifier[2],
7434 office2010->encryptedVerifier[3],
7435 office2010->encryptedVerifierHash[0],
7436 office2010->encryptedVerifierHash[1],
7437 office2010->encryptedVerifierHash[2],
7438 office2010->encryptedVerifierHash[3],
7439 office2010->encryptedVerifierHash[4],
7440 office2010->encryptedVerifierHash[5],
7441 office2010->encryptedVerifierHash[6],
7442 office2010->encryptedVerifierHash[7]);
7443 }
7444 else if (hash_mode == 9600)
7445 {
7446 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7447
7448 office2013_t *office2013 = &office2013s[salt_pos];
7449
7450 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,
7451
7452 salt.salt_buf[0],
7453 salt.salt_buf[1],
7454 salt.salt_buf[2],
7455 salt.salt_buf[3],
7456 office2013->encryptedVerifier[0],
7457 office2013->encryptedVerifier[1],
7458 office2013->encryptedVerifier[2],
7459 office2013->encryptedVerifier[3],
7460 office2013->encryptedVerifierHash[0],
7461 office2013->encryptedVerifierHash[1],
7462 office2013->encryptedVerifierHash[2],
7463 office2013->encryptedVerifierHash[3],
7464 office2013->encryptedVerifierHash[4],
7465 office2013->encryptedVerifierHash[5],
7466 office2013->encryptedVerifierHash[6],
7467 office2013->encryptedVerifierHash[7]);
7468 }
7469 else if (hash_mode == 9700)
7470 {
7471 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7472
7473 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7474
7475 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7476 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7477 byte_swap_32 (salt.salt_buf[0]),
7478 byte_swap_32 (salt.salt_buf[1]),
7479 byte_swap_32 (salt.salt_buf[2]),
7480 byte_swap_32 (salt.salt_buf[3]),
7481 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7482 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7483 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7484 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7485 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7486 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7487 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7488 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7489 }
7490 else if (hash_mode == 9710)
7491 {
7492 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7493
7494 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7495
7496 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7497 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7498 byte_swap_32 (salt.salt_buf[0]),
7499 byte_swap_32 (salt.salt_buf[1]),
7500 byte_swap_32 (salt.salt_buf[2]),
7501 byte_swap_32 (salt.salt_buf[3]),
7502 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7503 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7504 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7505 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7506 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7507 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7508 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7509 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7510 }
7511 else if (hash_mode == 9720)
7512 {
7513 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7514
7515 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7516
7517 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7518
7519 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7520 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7521 byte_swap_32 (salt.salt_buf[0]),
7522 byte_swap_32 (salt.salt_buf[1]),
7523 byte_swap_32 (salt.salt_buf[2]),
7524 byte_swap_32 (salt.salt_buf[3]),
7525 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7526 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7527 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7528 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7529 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7530 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7531 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7532 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7533 rc4key[0],
7534 rc4key[1],
7535 rc4key[2],
7536 rc4key[3],
7537 rc4key[4]);
7538 }
7539 else if (hash_mode == 9800)
7540 {
7541 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7542
7543 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7544
7545 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7546 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7547 salt.salt_buf[0],
7548 salt.salt_buf[1],
7549 salt.salt_buf[2],
7550 salt.salt_buf[3],
7551 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7552 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7553 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7554 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7555 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7556 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7557 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7558 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7559 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7560 }
7561 else if (hash_mode == 9810)
7562 {
7563 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7564
7565 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7566
7567 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7568 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7569 salt.salt_buf[0],
7570 salt.salt_buf[1],
7571 salt.salt_buf[2],
7572 salt.salt_buf[3],
7573 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7574 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7575 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7576 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7577 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7578 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7579 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7580 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7581 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7582 }
7583 else if (hash_mode == 9820)
7584 {
7585 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7586
7587 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7588
7589 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7590
7591 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7592 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7593 salt.salt_buf[0],
7594 salt.salt_buf[1],
7595 salt.salt_buf[2],
7596 salt.salt_buf[3],
7597 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7598 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7599 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7600 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7601 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7602 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7603 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7604 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7605 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7606 rc4key[0],
7607 rc4key[1],
7608 rc4key[2],
7609 rc4key[3],
7610 rc4key[4]);
7611 }
7612 else if (hash_mode == 10000)
7613 {
7614 // salt
7615
7616 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7617
7618 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7619
7620 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7621
7622 // hash
7623
7624 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7625 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7626 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7627 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7628 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7629 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7630 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7631 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7632 digest_buf[8] = 0; // needed for base64_encode ()
7633
7634 char tmp_buf[64] = { 0 };
7635
7636 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7637
7638 // output
7639
7640 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7641 }
7642 else if (hash_mode == 10100)
7643 {
7644 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7645 digest_buf[0],
7646 digest_buf[1],
7647 2,
7648 4,
7649 byte_swap_32 (salt.salt_buf[0]),
7650 byte_swap_32 (salt.salt_buf[1]),
7651 byte_swap_32 (salt.salt_buf[2]),
7652 byte_swap_32 (salt.salt_buf[3]));
7653 }
7654 else if (hash_mode == 10200)
7655 {
7656 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7657
7658 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7659
7660 // challenge
7661
7662 char challenge[100] = { 0 };
7663
7664 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7665
7666 // response
7667
7668 char tmp_buf[100] = { 0 };
7669
7670 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7671 (char *) cram_md5->user,
7672 digest_buf[0],
7673 digest_buf[1],
7674 digest_buf[2],
7675 digest_buf[3]);
7676
7677 char response[100] = { 0 };
7678
7679 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7680
7681 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7682 }
7683 else if (hash_mode == 10300)
7684 {
7685 char tmp_buf[100] = { 0 };
7686
7687 memcpy (tmp_buf + 0, digest_buf, 20);
7688 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7689
7690 uint tmp_len = 20 + salt.salt_len;
7691
7692 // base64 encode it
7693
7694 char base64_encoded[100] = { 0 };
7695
7696 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7697
7698 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7699 }
7700 else if (hash_mode == 10400)
7701 {
7702 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7703
7704 pdf_t *pdf = &pdfs[salt_pos];
7705
7706 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",
7707
7708 pdf->V,
7709 pdf->R,
7710 40,
7711 pdf->P,
7712 pdf->enc_md,
7713 pdf->id_len,
7714 byte_swap_32 (pdf->id_buf[0]),
7715 byte_swap_32 (pdf->id_buf[1]),
7716 byte_swap_32 (pdf->id_buf[2]),
7717 byte_swap_32 (pdf->id_buf[3]),
7718 pdf->u_len,
7719 byte_swap_32 (pdf->u_buf[0]),
7720 byte_swap_32 (pdf->u_buf[1]),
7721 byte_swap_32 (pdf->u_buf[2]),
7722 byte_swap_32 (pdf->u_buf[3]),
7723 byte_swap_32 (pdf->u_buf[4]),
7724 byte_swap_32 (pdf->u_buf[5]),
7725 byte_swap_32 (pdf->u_buf[6]),
7726 byte_swap_32 (pdf->u_buf[7]),
7727 pdf->o_len,
7728 byte_swap_32 (pdf->o_buf[0]),
7729 byte_swap_32 (pdf->o_buf[1]),
7730 byte_swap_32 (pdf->o_buf[2]),
7731 byte_swap_32 (pdf->o_buf[3]),
7732 byte_swap_32 (pdf->o_buf[4]),
7733 byte_swap_32 (pdf->o_buf[5]),
7734 byte_swap_32 (pdf->o_buf[6]),
7735 byte_swap_32 (pdf->o_buf[7])
7736 );
7737 }
7738 else if (hash_mode == 10410)
7739 {
7740 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7741
7742 pdf_t *pdf = &pdfs[salt_pos];
7743
7744 snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x",
7745
7746 pdf->V,
7747 pdf->R,
7748 40,
7749 pdf->P,
7750 pdf->enc_md,
7751 pdf->id_len,
7752 byte_swap_32 (pdf->id_buf[0]),
7753 byte_swap_32 (pdf->id_buf[1]),
7754 byte_swap_32 (pdf->id_buf[2]),
7755 byte_swap_32 (pdf->id_buf[3]),
7756 pdf->u_len,
7757 byte_swap_32 (pdf->u_buf[0]),
7758 byte_swap_32 (pdf->u_buf[1]),
7759 byte_swap_32 (pdf->u_buf[2]),
7760 byte_swap_32 (pdf->u_buf[3]),
7761 byte_swap_32 (pdf->u_buf[4]),
7762 byte_swap_32 (pdf->u_buf[5]),
7763 byte_swap_32 (pdf->u_buf[6]),
7764 byte_swap_32 (pdf->u_buf[7]),
7765 pdf->o_len,
7766 byte_swap_32 (pdf->o_buf[0]),
7767 byte_swap_32 (pdf->o_buf[1]),
7768 byte_swap_32 (pdf->o_buf[2]),
7769 byte_swap_32 (pdf->o_buf[3]),
7770 byte_swap_32 (pdf->o_buf[4]),
7771 byte_swap_32 (pdf->o_buf[5]),
7772 byte_swap_32 (pdf->o_buf[6]),
7773 byte_swap_32 (pdf->o_buf[7])
7774 );
7775 }
7776 else if (hash_mode == 10420)
7777 {
7778 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7779
7780 pdf_t *pdf = &pdfs[salt_pos];
7781
7782 u8 *rc4key = (u8 *) pdf->rc4key;
7783
7784 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",
7785
7786 pdf->V,
7787 pdf->R,
7788 40,
7789 pdf->P,
7790 pdf->enc_md,
7791 pdf->id_len,
7792 byte_swap_32 (pdf->id_buf[0]),
7793 byte_swap_32 (pdf->id_buf[1]),
7794 byte_swap_32 (pdf->id_buf[2]),
7795 byte_swap_32 (pdf->id_buf[3]),
7796 pdf->u_len,
7797 byte_swap_32 (pdf->u_buf[0]),
7798 byte_swap_32 (pdf->u_buf[1]),
7799 byte_swap_32 (pdf->u_buf[2]),
7800 byte_swap_32 (pdf->u_buf[3]),
7801 byte_swap_32 (pdf->u_buf[4]),
7802 byte_swap_32 (pdf->u_buf[5]),
7803 byte_swap_32 (pdf->u_buf[6]),
7804 byte_swap_32 (pdf->u_buf[7]),
7805 pdf->o_len,
7806 byte_swap_32 (pdf->o_buf[0]),
7807 byte_swap_32 (pdf->o_buf[1]),
7808 byte_swap_32 (pdf->o_buf[2]),
7809 byte_swap_32 (pdf->o_buf[3]),
7810 byte_swap_32 (pdf->o_buf[4]),
7811 byte_swap_32 (pdf->o_buf[5]),
7812 byte_swap_32 (pdf->o_buf[6]),
7813 byte_swap_32 (pdf->o_buf[7]),
7814 rc4key[0],
7815 rc4key[1],
7816 rc4key[2],
7817 rc4key[3],
7818 rc4key[4]
7819 );
7820 }
7821 else if (hash_mode == 10500)
7822 {
7823 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7824
7825 pdf_t *pdf = &pdfs[salt_pos];
7826
7827 if (pdf->id_len == 32)
7828 {
7829 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",
7830
7831 pdf->V,
7832 pdf->R,
7833 128,
7834 pdf->P,
7835 pdf->enc_md,
7836 pdf->id_len,
7837 byte_swap_32 (pdf->id_buf[0]),
7838 byte_swap_32 (pdf->id_buf[1]),
7839 byte_swap_32 (pdf->id_buf[2]),
7840 byte_swap_32 (pdf->id_buf[3]),
7841 byte_swap_32 (pdf->id_buf[4]),
7842 byte_swap_32 (pdf->id_buf[5]),
7843 byte_swap_32 (pdf->id_buf[6]),
7844 byte_swap_32 (pdf->id_buf[7]),
7845 pdf->u_len,
7846 byte_swap_32 (pdf->u_buf[0]),
7847 byte_swap_32 (pdf->u_buf[1]),
7848 byte_swap_32 (pdf->u_buf[2]),
7849 byte_swap_32 (pdf->u_buf[3]),
7850 byte_swap_32 (pdf->u_buf[4]),
7851 byte_swap_32 (pdf->u_buf[5]),
7852 byte_swap_32 (pdf->u_buf[6]),
7853 byte_swap_32 (pdf->u_buf[7]),
7854 pdf->o_len,
7855 byte_swap_32 (pdf->o_buf[0]),
7856 byte_swap_32 (pdf->o_buf[1]),
7857 byte_swap_32 (pdf->o_buf[2]),
7858 byte_swap_32 (pdf->o_buf[3]),
7859 byte_swap_32 (pdf->o_buf[4]),
7860 byte_swap_32 (pdf->o_buf[5]),
7861 byte_swap_32 (pdf->o_buf[6]),
7862 byte_swap_32 (pdf->o_buf[7])
7863 );
7864 }
7865 else
7866 {
7867 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",
7868
7869 pdf->V,
7870 pdf->R,
7871 128,
7872 pdf->P,
7873 pdf->enc_md,
7874 pdf->id_len,
7875 byte_swap_32 (pdf->id_buf[0]),
7876 byte_swap_32 (pdf->id_buf[1]),
7877 byte_swap_32 (pdf->id_buf[2]),
7878 byte_swap_32 (pdf->id_buf[3]),
7879 pdf->u_len,
7880 byte_swap_32 (pdf->u_buf[0]),
7881 byte_swap_32 (pdf->u_buf[1]),
7882 byte_swap_32 (pdf->u_buf[2]),
7883 byte_swap_32 (pdf->u_buf[3]),
7884 byte_swap_32 (pdf->u_buf[4]),
7885 byte_swap_32 (pdf->u_buf[5]),
7886 byte_swap_32 (pdf->u_buf[6]),
7887 byte_swap_32 (pdf->u_buf[7]),
7888 pdf->o_len,
7889 byte_swap_32 (pdf->o_buf[0]),
7890 byte_swap_32 (pdf->o_buf[1]),
7891 byte_swap_32 (pdf->o_buf[2]),
7892 byte_swap_32 (pdf->o_buf[3]),
7893 byte_swap_32 (pdf->o_buf[4]),
7894 byte_swap_32 (pdf->o_buf[5]),
7895 byte_swap_32 (pdf->o_buf[6]),
7896 byte_swap_32 (pdf->o_buf[7])
7897 );
7898 }
7899 }
7900 else if (hash_mode == 10600)
7901 {
7902 uint digest_idx = salt.digests_offset + digest_pos;
7903
7904 hashinfo_t **hashinfo_ptr = data.hash_info;
7905 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7906
7907 snprintf (out_buf, len-1, "%s", hash_buf);
7908 }
7909 else if (hash_mode == 10700)
7910 {
7911 uint digest_idx = salt.digests_offset + digest_pos;
7912
7913 hashinfo_t **hashinfo_ptr = data.hash_info;
7914 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7915
7916 snprintf (out_buf, len-1, "%s", hash_buf);
7917 }
7918 else if (hash_mode == 10900)
7919 {
7920 uint digest_idx = salt.digests_offset + digest_pos;
7921
7922 hashinfo_t **hashinfo_ptr = data.hash_info;
7923 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7924
7925 snprintf (out_buf, len-1, "%s", hash_buf);
7926 }
7927 else if (hash_mode == 11100)
7928 {
7929 u32 salt_challenge = salt.salt_buf[0];
7930
7931 salt_challenge = byte_swap_32 (salt_challenge);
7932
7933 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7934
7935 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7936 SIGNATURE_POSTGRESQL_AUTH,
7937 user_name,
7938 salt_challenge,
7939 digest_buf[0],
7940 digest_buf[1],
7941 digest_buf[2],
7942 digest_buf[3]);
7943 }
7944 else if (hash_mode == 11200)
7945 {
7946 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7947 SIGNATURE_MYSQL_AUTH,
7948 (unsigned char *) salt.salt_buf,
7949 digest_buf[0],
7950 digest_buf[1],
7951 digest_buf[2],
7952 digest_buf[3],
7953 digest_buf[4]);
7954 }
7955 else if (hash_mode == 11300)
7956 {
7957 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7958
7959 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7960
7961 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7962 const uint ckey_len = bitcoin_wallet->ckey_len;
7963 const uint public_key_len = bitcoin_wallet->public_key_len;
7964
7965 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7966 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7967 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7968
7969 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7970 {
7971 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
7972
7973 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7974 }
7975
7976 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7977 {
7978 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
7979
7980 sprintf (ckey_buf + j, "%02x", ptr[i]);
7981 }
7982
7983 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7984 {
7985 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
7986
7987 sprintf (public_key_buf + j, "%02x", ptr[i]);
7988 }
7989
7990 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
7991 SIGNATURE_BITCOIN_WALLET,
7992 cry_master_len * 2,
7993 cry_master_buf,
7994 salt.salt_len,
7995 (unsigned char *) salt.salt_buf,
7996 salt.salt_iter + 1,
7997 ckey_len * 2,
7998 ckey_buf,
7999 public_key_len * 2,
8000 public_key_buf
8001 );
8002
8003 free (cry_master_buf);
8004 free (ckey_buf);
8005 free (public_key_buf);
8006 }
8007 else if (hash_mode == 11400)
8008 {
8009 uint digest_idx = salt.digests_offset + digest_pos;
8010
8011 hashinfo_t **hashinfo_ptr = data.hash_info;
8012 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8013
8014 snprintf (out_buf, len-1, "%s", hash_buf);
8015 }
8016 else if (hash_mode == 11600)
8017 {
8018 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
8019
8020 seven_zip_t *seven_zip = &seven_zips[salt_pos];
8021
8022 const uint data_len = seven_zip->data_len;
8023
8024 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
8025
8026 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
8027 {
8028 const u8 *ptr = (const u8 *) seven_zip->data_buf;
8029
8030 sprintf (data_buf + j, "%02x", ptr[i]);
8031 }
8032
8033 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
8034 SIGNATURE_SEVEN_ZIP,
8035 0,
8036 salt.salt_sign[0],
8037 0,
8038 (char *) seven_zip->salt_buf,
8039 seven_zip->iv_len,
8040 seven_zip->iv_buf[0],
8041 seven_zip->iv_buf[1],
8042 seven_zip->iv_buf[2],
8043 seven_zip->iv_buf[3],
8044 seven_zip->crc,
8045 seven_zip->data_len,
8046 seven_zip->unpack_size,
8047 data_buf);
8048
8049 free (data_buf);
8050 }
8051 else if (hash_mode == 11700)
8052 {
8053 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8054 digest_buf[0],
8055 digest_buf[1],
8056 digest_buf[2],
8057 digest_buf[3],
8058 digest_buf[4],
8059 digest_buf[5],
8060 digest_buf[6],
8061 digest_buf[7]);
8062 }
8063 else if (hash_mode == 11800)
8064 {
8065 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8066 digest_buf[ 0],
8067 digest_buf[ 1],
8068 digest_buf[ 2],
8069 digest_buf[ 3],
8070 digest_buf[ 4],
8071 digest_buf[ 5],
8072 digest_buf[ 6],
8073 digest_buf[ 7],
8074 digest_buf[ 8],
8075 digest_buf[ 9],
8076 digest_buf[10],
8077 digest_buf[11],
8078 digest_buf[12],
8079 digest_buf[13],
8080 digest_buf[14],
8081 digest_buf[15]);
8082 }
8083 else if (hash_mode == 11900)
8084 {
8085 uint digest_idx = salt.digests_offset + digest_pos;
8086
8087 hashinfo_t **hashinfo_ptr = data.hash_info;
8088 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8089
8090 snprintf (out_buf, len-1, "%s", hash_buf);
8091 }
8092 else if (hash_mode == 12000)
8093 {
8094 uint digest_idx = salt.digests_offset + digest_pos;
8095
8096 hashinfo_t **hashinfo_ptr = data.hash_info;
8097 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8098
8099 snprintf (out_buf, len-1, "%s", hash_buf);
8100 }
8101 else if (hash_mode == 12100)
8102 {
8103 uint digest_idx = salt.digests_offset + digest_pos;
8104
8105 hashinfo_t **hashinfo_ptr = data.hash_info;
8106 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8107
8108 snprintf (out_buf, len-1, "%s", hash_buf);
8109 }
8110 else if (hash_mode == 12200)
8111 {
8112 uint *ptr_digest = digest_buf;
8113 uint *ptr_salt = salt.salt_buf;
8114
8115 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8116 SIGNATURE_ECRYPTFS,
8117 ptr_salt[0],
8118 ptr_salt[1],
8119 ptr_digest[0],
8120 ptr_digest[1]);
8121 }
8122 else if (hash_mode == 12300)
8123 {
8124 uint *ptr_digest = digest_buf;
8125 uint *ptr_salt = salt.salt_buf;
8126
8127 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",
8128 ptr_digest[ 0], ptr_digest[ 1],
8129 ptr_digest[ 2], ptr_digest[ 3],
8130 ptr_digest[ 4], ptr_digest[ 5],
8131 ptr_digest[ 6], ptr_digest[ 7],
8132 ptr_digest[ 8], ptr_digest[ 9],
8133 ptr_digest[10], ptr_digest[11],
8134 ptr_digest[12], ptr_digest[13],
8135 ptr_digest[14], ptr_digest[15],
8136 ptr_salt[0],
8137 ptr_salt[1],
8138 ptr_salt[2],
8139 ptr_salt[3]);
8140 }
8141 else if (hash_mode == 12400)
8142 {
8143 // encode iteration count
8144
8145 char salt_iter[5] = { 0 };
8146
8147 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8148 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8149 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8150 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8151 salt_iter[4] = 0;
8152
8153 // encode salt
8154
8155 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8156 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8157 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8158 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8159 ptr_salt[4] = 0;
8160
8161 // encode digest
8162
8163 memset (tmp_buf, 0, sizeof (tmp_buf));
8164
8165 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8166 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8167
8168 memcpy (tmp_buf, digest_buf, 8);
8169
8170 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8171
8172 ptr_plain[11] = 0;
8173
8174 // fill the resulting buffer
8175
8176 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8177 }
8178 else if (hash_mode == 12500)
8179 {
8180 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8181 SIGNATURE_RAR3,
8182 byte_swap_32 (salt.salt_buf[0]),
8183 byte_swap_32 (salt.salt_buf[1]),
8184 salt.salt_buf[2],
8185 salt.salt_buf[3],
8186 salt.salt_buf[4],
8187 salt.salt_buf[5]);
8188 }
8189 else if (hash_mode == 12600)
8190 {
8191 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8192 digest_buf[0] + salt.salt_buf_pc[0],
8193 digest_buf[1] + salt.salt_buf_pc[1],
8194 digest_buf[2] + salt.salt_buf_pc[2],
8195 digest_buf[3] + salt.salt_buf_pc[3],
8196 digest_buf[4] + salt.salt_buf_pc[4],
8197 digest_buf[5] + salt.salt_buf_pc[5],
8198 digest_buf[6] + salt.salt_buf_pc[6],
8199 digest_buf[7] + salt.salt_buf_pc[7]);
8200 }
8201 else if (hash_mode == 12700)
8202 {
8203 uint digest_idx = salt.digests_offset + digest_pos;
8204
8205 hashinfo_t **hashinfo_ptr = data.hash_info;
8206 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8207
8208 snprintf (out_buf, len-1, "%s", hash_buf);
8209 }
8210 else if (hash_mode == 12800)
8211 {
8212 const u8 *ptr = (const u8 *) salt.salt_buf;
8213
8214 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",
8215 SIGNATURE_MS_DRSR,
8216 ptr[0],
8217 ptr[1],
8218 ptr[2],
8219 ptr[3],
8220 ptr[4],
8221 ptr[5],
8222 ptr[6],
8223 ptr[7],
8224 ptr[8],
8225 ptr[9],
8226 salt.salt_iter + 1,
8227 byte_swap_32 (digest_buf[0]),
8228 byte_swap_32 (digest_buf[1]),
8229 byte_swap_32 (digest_buf[2]),
8230 byte_swap_32 (digest_buf[3]),
8231 byte_swap_32 (digest_buf[4]),
8232 byte_swap_32 (digest_buf[5]),
8233 byte_swap_32 (digest_buf[6]),
8234 byte_swap_32 (digest_buf[7])
8235 );
8236 }
8237 else if (hash_mode == 12900)
8238 {
8239 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",
8240 salt.salt_buf[ 4],
8241 salt.salt_buf[ 5],
8242 salt.salt_buf[ 6],
8243 salt.salt_buf[ 7],
8244 salt.salt_buf[ 8],
8245 salt.salt_buf[ 9],
8246 salt.salt_buf[10],
8247 salt.salt_buf[11],
8248 byte_swap_32 (digest_buf[0]),
8249 byte_swap_32 (digest_buf[1]),
8250 byte_swap_32 (digest_buf[2]),
8251 byte_swap_32 (digest_buf[3]),
8252 byte_swap_32 (digest_buf[4]),
8253 byte_swap_32 (digest_buf[5]),
8254 byte_swap_32 (digest_buf[6]),
8255 byte_swap_32 (digest_buf[7]),
8256 salt.salt_buf[ 0],
8257 salt.salt_buf[ 1],
8258 salt.salt_buf[ 2],
8259 salt.salt_buf[ 3]
8260 );
8261 }
8262 else if (hash_mode == 13000)
8263 {
8264 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8265
8266 rar5_t *rar5 = &rar5s[salt_pos];
8267
8268 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8269 salt.salt_buf[0],
8270 salt.salt_buf[1],
8271 salt.salt_buf[2],
8272 salt.salt_buf[3],
8273 salt.salt_sign[0],
8274 rar5->iv[0],
8275 rar5->iv[1],
8276 rar5->iv[2],
8277 rar5->iv[3],
8278 byte_swap_32 (digest_buf[0]),
8279 byte_swap_32 (digest_buf[1])
8280 );
8281 }
8282 else if (hash_mode == 13100)
8283 {
8284 krb5tgs_t *krb5tgss = (krb5tgs_t *) data.esalts_buf;
8285
8286 krb5tgs_t *krb5tgs = &krb5tgss[salt_pos];
8287
8288 u8 *ptr_checksum = (u8 *) krb5tgs->checksum;
8289 u8 *ptr_edata2 = (u8 *) krb5tgs->edata2;
8290
8291 char data[256] = { 0 };
8292
8293 char *ptr_data = data;
8294
8295 for (uint i = 0; i < 16; i++, ptr_data += 2)
8296 sprintf (ptr_data, "%02x", ptr_checksum[i]);
8297
8298 /* skip '$' */
8299 ptr_data++;
8300
8301 for (uint i = 0; i < 32; i++, ptr_data += 2)
8302 sprintf (ptr_data, "%02x", ptr_edata2[i]);
8303
8304 *ptr_data = 0;
8305
8306 snprintf (out_buf, len-1, "%s$%s$%s$%s",
8307 SIGNATURE_KRB5TGS,
8308 (char *) krb5tgs->account_info,
8309 data,
8310 data + 33);
8311 }
8312 else
8313 {
8314 if (hash_type == HASH_TYPE_MD4)
8315 {
8316 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8317 digest_buf[0],
8318 digest_buf[1],
8319 digest_buf[2],
8320 digest_buf[3]);
8321 }
8322 else if (hash_type == HASH_TYPE_MD5)
8323 {
8324 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8325 digest_buf[0],
8326 digest_buf[1],
8327 digest_buf[2],
8328 digest_buf[3]);
8329 }
8330 else if (hash_type == HASH_TYPE_SHA1)
8331 {
8332 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8333 digest_buf[0],
8334 digest_buf[1],
8335 digest_buf[2],
8336 digest_buf[3],
8337 digest_buf[4]);
8338 }
8339 else if (hash_type == HASH_TYPE_SHA256)
8340 {
8341 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8342 digest_buf[0],
8343 digest_buf[1],
8344 digest_buf[2],
8345 digest_buf[3],
8346 digest_buf[4],
8347 digest_buf[5],
8348 digest_buf[6],
8349 digest_buf[7]);
8350 }
8351 else if (hash_type == HASH_TYPE_SHA384)
8352 {
8353 uint *ptr = digest_buf;
8354
8355 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8356 ptr[ 1], ptr[ 0],
8357 ptr[ 3], ptr[ 2],
8358 ptr[ 5], ptr[ 4],
8359 ptr[ 7], ptr[ 6],
8360 ptr[ 9], ptr[ 8],
8361 ptr[11], ptr[10]);
8362 }
8363 else if (hash_type == HASH_TYPE_SHA512)
8364 {
8365 uint *ptr = digest_buf;
8366
8367 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8368 ptr[ 1], ptr[ 0],
8369 ptr[ 3], ptr[ 2],
8370 ptr[ 5], ptr[ 4],
8371 ptr[ 7], ptr[ 6],
8372 ptr[ 9], ptr[ 8],
8373 ptr[11], ptr[10],
8374 ptr[13], ptr[12],
8375 ptr[15], ptr[14]);
8376 }
8377 else if (hash_type == HASH_TYPE_LM)
8378 {
8379 snprintf (out_buf, len-1, "%08x%08x",
8380 digest_buf[0],
8381 digest_buf[1]);
8382 }
8383 else if (hash_type == HASH_TYPE_ORACLEH)
8384 {
8385 snprintf (out_buf, len-1, "%08X%08X",
8386 digest_buf[0],
8387 digest_buf[1]);
8388 }
8389 else if (hash_type == HASH_TYPE_BCRYPT)
8390 {
8391 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8392 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8393
8394 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8395
8396 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8397 }
8398 else if (hash_type == HASH_TYPE_KECCAK)
8399 {
8400 uint *ptr = digest_buf;
8401
8402 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",
8403 ptr[ 1], ptr[ 0],
8404 ptr[ 3], ptr[ 2],
8405 ptr[ 5], ptr[ 4],
8406 ptr[ 7], ptr[ 6],
8407 ptr[ 9], ptr[ 8],
8408 ptr[11], ptr[10],
8409 ptr[13], ptr[12],
8410 ptr[15], ptr[14],
8411 ptr[17], ptr[16],
8412 ptr[19], ptr[18],
8413 ptr[21], ptr[20],
8414 ptr[23], ptr[22],
8415 ptr[25], ptr[24],
8416 ptr[27], ptr[26],
8417 ptr[29], ptr[28],
8418 ptr[31], ptr[30],
8419 ptr[33], ptr[32],
8420 ptr[35], ptr[34],
8421 ptr[37], ptr[36],
8422 ptr[39], ptr[38],
8423 ptr[41], ptr[30],
8424 ptr[43], ptr[42],
8425 ptr[45], ptr[44],
8426 ptr[47], ptr[46],
8427 ptr[49], ptr[48]
8428 );
8429
8430 out_buf[salt.keccak_mdlen * 2] = 0;
8431 }
8432 else if (hash_type == HASH_TYPE_RIPEMD160)
8433 {
8434 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8435 digest_buf[0],
8436 digest_buf[1],
8437 digest_buf[2],
8438 digest_buf[3],
8439 digest_buf[4]);
8440 }
8441 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8442 {
8443 digest_buf[ 0] = digest_buf[ 0];
8444 digest_buf[ 1] = digest_buf[ 1];
8445 digest_buf[ 2] = digest_buf[ 2];
8446 digest_buf[ 3] = digest_buf[ 3];
8447 digest_buf[ 4] = digest_buf[ 4];
8448 digest_buf[ 5] = digest_buf[ 5];
8449 digest_buf[ 6] = digest_buf[ 6];
8450 digest_buf[ 7] = digest_buf[ 7];
8451 digest_buf[ 8] = digest_buf[ 8];
8452 digest_buf[ 9] = digest_buf[ 9];
8453 digest_buf[10] = digest_buf[10];
8454 digest_buf[11] = digest_buf[11];
8455 digest_buf[12] = digest_buf[12];
8456 digest_buf[13] = digest_buf[13];
8457 digest_buf[14] = digest_buf[14];
8458 digest_buf[15] = digest_buf[15];
8459
8460 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8461 digest_buf[ 0],
8462 digest_buf[ 1],
8463 digest_buf[ 2],
8464 digest_buf[ 3],
8465 digest_buf[ 4],
8466 digest_buf[ 5],
8467 digest_buf[ 6],
8468 digest_buf[ 7],
8469 digest_buf[ 8],
8470 digest_buf[ 9],
8471 digest_buf[10],
8472 digest_buf[11],
8473 digest_buf[12],
8474 digest_buf[13],
8475 digest_buf[14],
8476 digest_buf[15]);
8477 }
8478 else if (hash_type == HASH_TYPE_GOST)
8479 {
8480 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8481 digest_buf[0],
8482 digest_buf[1],
8483 digest_buf[2],
8484 digest_buf[3],
8485 digest_buf[4],
8486 digest_buf[5],
8487 digest_buf[6],
8488 digest_buf[7]);
8489 }
8490 else if (hash_type == HASH_TYPE_MYSQL)
8491 {
8492 snprintf (out_buf, len-1, "%08x%08x",
8493 digest_buf[0],
8494 digest_buf[1]);
8495 }
8496 else if (hash_type == HASH_TYPE_LOTUS5)
8497 {
8498 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8499 digest_buf[0],
8500 digest_buf[1],
8501 digest_buf[2],
8502 digest_buf[3]);
8503 }
8504 else if (hash_type == HASH_TYPE_LOTUS6)
8505 {
8506 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8507 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8508 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8509 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8510
8511 char buf[16] = { 0 };
8512
8513 memcpy (buf + 0, salt.salt_buf, 5);
8514 memcpy (buf + 5, digest_buf, 9);
8515
8516 buf[3] -= -4;
8517
8518 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
8519
8520 tmp_buf[18] = salt.salt_buf_pc[7];
8521 tmp_buf[19] = 0;
8522
8523 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8524 }
8525 else if (hash_type == HASH_TYPE_LOTUS8)
8526 {
8527 char buf[52] = { 0 };
8528
8529 // salt
8530
8531 memcpy (buf + 0, salt.salt_buf, 16);
8532
8533 buf[3] -= -4;
8534
8535 // iteration
8536
8537 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8538
8539 // chars
8540
8541 buf[26] = salt.salt_buf_pc[0];
8542 buf[27] = salt.salt_buf_pc[1];
8543
8544 // digest
8545
8546 memcpy (buf + 28, digest_buf, 8);
8547
8548 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
8549
8550 tmp_buf[49] = 0;
8551
8552 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8553 }
8554 else if (hash_type == HASH_TYPE_CRC32)
8555 {
8556 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8557 }
8558 }
8559
8560 if (salt_type == SALT_TYPE_INTERN)
8561 {
8562 size_t pos = strlen (out_buf);
8563
8564 out_buf[pos] = data.separator;
8565
8566 char *ptr = (char *) salt.salt_buf;
8567
8568 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8569
8570 out_buf[pos + 1 + salt.salt_len] = 0;
8571 }
8572 }
8573
8574 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8575 {
8576 memset (hccap, 0, sizeof (hccap_t));
8577
8578 salt_t *salt = &data.salts_buf[salt_pos];
8579
8580 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8581
8582 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8583 wpa_t *wpa = &wpas[salt_pos];
8584
8585 hccap->keyver = wpa->keyver;
8586
8587 hccap->eapol_size = wpa->eapol_size;
8588
8589 if (wpa->keyver != 1)
8590 {
8591 uint eapol_tmp[64] = { 0 };
8592
8593 for (uint i = 0; i < 64; i++)
8594 {
8595 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8596 }
8597
8598 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8599 }
8600 else
8601 {
8602 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8603 }
8604
8605 uint pke_tmp[25] = { 0 };
8606
8607 for (int i = 5; i < 25; i++)
8608 {
8609 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8610 }
8611
8612 char *pke_ptr = (char *) pke_tmp;
8613
8614 memcpy (hccap->mac1, pke_ptr + 23, 6);
8615 memcpy (hccap->mac2, pke_ptr + 29, 6);
8616 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8617 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8618
8619 char *digests_buf_ptr = (char *) data.digests_buf;
8620
8621 uint dgst_size = data.dgst_size;
8622
8623 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8624
8625 if (wpa->keyver != 1)
8626 {
8627 uint digest_tmp[4] = { 0 };
8628
8629 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8630 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8631 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8632 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8633
8634 memcpy (hccap->keymic, digest_tmp, 16);
8635 }
8636 else
8637 {
8638 memcpy (hccap->keymic, digest_ptr, 16);
8639 }
8640 }
8641
8642 void SuspendThreads ()
8643 {
8644 if (data.devices_status == STATUS_RUNNING)
8645 {
8646 hc_timer_set (&data.timer_paused);
8647
8648 data.devices_status = STATUS_PAUSED;
8649
8650 log_info ("Paused");
8651 }
8652 }
8653
8654 void ResumeThreads ()
8655 {
8656 if (data.devices_status == STATUS_PAUSED)
8657 {
8658 float ms_paused;
8659
8660 hc_timer_get (data.timer_paused, ms_paused);
8661
8662 data.ms_paused += ms_paused;
8663
8664 data.devices_status = STATUS_RUNNING;
8665
8666 log_info ("Resumed");
8667 }
8668 }
8669
8670 void bypass ()
8671 {
8672 if (data.devices_status != STATUS_RUNNING) return;
8673
8674 data.devices_status = STATUS_BYPASS;
8675
8676 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8677 }
8678
8679 void stop_at_checkpoint ()
8680 {
8681 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8682 {
8683 if (data.devices_status != STATUS_RUNNING) return;
8684 }
8685
8686 // this feature only makes sense if --restore-disable was not specified
8687
8688 if (data.restore_disable == 1)
8689 {
8690 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8691
8692 return;
8693 }
8694
8695 // check if monitoring of Restore Point updates should be enabled or disabled
8696
8697 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8698 {
8699 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8700
8701 // save the current restore point value
8702
8703 data.checkpoint_cur_words = get_lowest_words_done ();
8704
8705 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8706 }
8707 else
8708 {
8709 data.devices_status = STATUS_RUNNING;
8710
8711 // reset the global value for checkpoint checks
8712
8713 data.checkpoint_cur_words = 0;
8714
8715 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8716 }
8717 }
8718
8719 void myabort ()
8720 {
8721 if (data.devices_status == STATUS_INIT) return;
8722 if (data.devices_status == STATUS_STARTING) return;
8723
8724 data.devices_status = STATUS_ABORTED;
8725 }
8726
8727 void myquit ()
8728 {
8729 if (data.devices_status == STATUS_INIT) return;
8730 if (data.devices_status == STATUS_STARTING) return;
8731
8732 data.devices_status = STATUS_QUIT;
8733 }
8734
8735 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
8736 {
8737 FILE *fp = fopen (kernel_file, "rb");
8738
8739 if (fp != NULL)
8740 {
8741 struct stat st;
8742
8743 memset (&st, 0, sizeof (st));
8744
8745 stat (kernel_file, &st);
8746
8747 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
8748
8749 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
8750
8751 if (num_read != (size_t) st.st_size)
8752 {
8753 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8754
8755 exit (-1);
8756 }
8757
8758 fclose (fp);
8759
8760 buf[st.st_size] = 0;
8761
8762 for (int i = 0; i < num_devices; i++)
8763 {
8764 kernel_lengths[i] = (size_t) st.st_size;
8765
8766 kernel_sources[i] = buf;
8767 }
8768 }
8769 else
8770 {
8771 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8772
8773 exit (-1);
8774 }
8775
8776 return;
8777 }
8778
8779 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
8780 {
8781 if (binary_size > 0)
8782 {
8783 FILE *fp = fopen (dst, "wb");
8784
8785 lock_file (fp);
8786 fwrite (binary, sizeof (u8), binary_size, fp);
8787
8788 fflush (fp);
8789 fclose (fp);
8790 }
8791 }
8792
8793 /**
8794 * restore
8795 */
8796
8797 restore_data_t *init_restore (int argc, char **argv)
8798 {
8799 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8800
8801 if (data.restore_disable == 0)
8802 {
8803 FILE *fp = fopen (data.eff_restore_file, "rb");
8804
8805 if (fp)
8806 {
8807 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8808
8809 if (nread != 1)
8810 {
8811 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8812
8813 exit (-1);
8814 }
8815
8816 fclose (fp);
8817
8818 if (rd->pid)
8819 {
8820 char pidbin[BUFSIZ] = { 0 };
8821
8822 int pidbin_len = -1;
8823
8824 #ifdef _POSIX
8825 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8826
8827 FILE *fd = fopen (pidbin, "rb");
8828
8829 if (fd)
8830 {
8831 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8832
8833 pidbin[pidbin_len] = 0;
8834
8835 fclose (fd);
8836
8837 char *argv0_r = strrchr (argv[0], '/');
8838
8839 char *pidbin_r = strrchr (pidbin, '/');
8840
8841 if (argv0_r == NULL) argv0_r = argv[0];
8842
8843 if (pidbin_r == NULL) pidbin_r = pidbin;
8844
8845 if (strcmp (argv0_r, pidbin_r) == 0)
8846 {
8847 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8848
8849 exit (-1);
8850 }
8851 }
8852
8853 #elif _WIN
8854 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8855
8856 char pidbin2[BUFSIZ] = { 0 };
8857
8858 int pidbin2_len = -1;
8859
8860 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8861 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8862
8863 pidbin[pidbin_len] = 0;
8864 pidbin2[pidbin2_len] = 0;
8865
8866 if (pidbin2_len)
8867 {
8868 if (strcmp (pidbin, pidbin2) == 0)
8869 {
8870 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8871
8872 exit (-1);
8873 }
8874 }
8875 #endif
8876 }
8877
8878 if (rd->version_bin < RESTORE_MIN)
8879 {
8880 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8881
8882 exit (-1);
8883 }
8884 }
8885 }
8886
8887 memset (rd, 0, sizeof (restore_data_t));
8888
8889 rd->version_bin = VERSION_BIN;
8890
8891 #ifdef _POSIX
8892 rd->pid = getpid ();
8893 #elif _WIN
8894 rd->pid = GetCurrentProcessId ();
8895 #endif
8896
8897 if (getcwd (rd->cwd, 255) == NULL)
8898 {
8899 myfree (rd);
8900
8901 return (NULL);
8902 }
8903
8904 rd->argc = argc;
8905 rd->argv = argv;
8906
8907 return (rd);
8908 }
8909
8910 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8911 {
8912 FILE *fp = fopen (eff_restore_file, "rb");
8913
8914 if (fp == NULL)
8915 {
8916 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8917
8918 exit (-1);
8919 }
8920
8921 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8922 {
8923 log_error ("ERROR: cannot read %s", eff_restore_file);
8924
8925 exit (-1);
8926 }
8927
8928 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8929
8930 for (uint i = 0; i < rd->argc; i++)
8931 {
8932 char buf[BUFSIZ] = { 0 };
8933
8934 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8935 {
8936 log_error ("ERROR: cannot read %s", eff_restore_file);
8937
8938 exit (-1);
8939 }
8940
8941 size_t len = strlen (buf);
8942
8943 if (len) buf[len - 1] = 0;
8944
8945 rd->argv[i] = mystrdup (buf);
8946 }
8947
8948 fclose (fp);
8949
8950 char new_cwd[1024] = { 0 };
8951
8952 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8953
8954 if (nwd == NULL)
8955 {
8956 log_error ("Restore file is corrupted");
8957 }
8958
8959 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8960 {
8961 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8962 {
8963 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8964
8965 exit (-1);
8966 }
8967
8968 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8969 }
8970
8971 if (chdir (rd->cwd))
8972 {
8973 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8974
8975 exit (-1);
8976 }
8977 }
8978
8979 u64 get_lowest_words_done ()
8980 {
8981 u64 words_cur = -1;
8982
8983 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8984 {
8985 hc_device_param_t *device_param = &data.devices_param[device_id];
8986
8987 if (device_param->skipped) continue;
8988
8989 const u64 words_done = device_param->words_done;
8990
8991 if (words_done < words_cur) words_cur = words_done;
8992 }
8993
8994 // It's possible that a device's workload isn't finished right after a restore-case.
8995 // In that case, this function would return 0 and overwrite the real restore point
8996 // There's also data.words_cur which is set to rd->words_cur but it changes while
8997 // the attack is running therefore we should stick to rd->words_cur.
8998 // Note that -s influences rd->words_cur we should keep a close look on that.
8999
9000 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
9001
9002 return words_cur;
9003 }
9004
9005 void write_restore (const char *new_restore_file, restore_data_t *rd)
9006 {
9007 u64 words_cur = get_lowest_words_done ();
9008
9009 rd->words_cur = words_cur;
9010
9011 FILE *fp = fopen (new_restore_file, "wb");
9012
9013 if (fp == NULL)
9014 {
9015 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
9016
9017 exit (-1);
9018 }
9019
9020 if (setvbuf (fp, NULL, _IONBF, 0))
9021 {
9022 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
9023
9024 exit (-1);
9025 }
9026
9027 fwrite (rd, sizeof (restore_data_t), 1, fp);
9028
9029 for (uint i = 0; i < rd->argc; i++)
9030 {
9031 fprintf (fp, "%s", rd->argv[i]);
9032 fputc ('\n', fp);
9033 }
9034
9035 fflush (fp);
9036
9037 fsync (fileno (fp));
9038
9039 fclose (fp);
9040 }
9041
9042 void cycle_restore ()
9043 {
9044 const char *eff_restore_file = data.eff_restore_file;
9045 const char *new_restore_file = data.new_restore_file;
9046
9047 restore_data_t *rd = data.rd;
9048
9049 write_restore (new_restore_file, rd);
9050
9051 struct stat st;
9052
9053 memset (&st, 0, sizeof(st));
9054
9055 if (stat (eff_restore_file, &st) == 0)
9056 {
9057 if (unlink (eff_restore_file))
9058 {
9059 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
9060 }
9061 }
9062
9063 if (rename (new_restore_file, eff_restore_file))
9064 {
9065 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
9066 }
9067 }
9068
9069 void check_checkpoint ()
9070 {
9071 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
9072
9073 u64 words_cur = get_lowest_words_done ();
9074
9075 if (words_cur != data.checkpoint_cur_words)
9076 {
9077 myabort ();
9078 }
9079 }
9080
9081 /**
9082 * tuning db
9083 */
9084
9085 void tuning_db_destroy (tuning_db_t *tuning_db)
9086 {
9087 int i;
9088
9089 for (i = 0; i < tuning_db->alias_cnt; i++)
9090 {
9091 tuning_db_alias_t *alias = &tuning_db->alias_buf[i];
9092
9093 myfree (alias->device_name);
9094 myfree (alias->alias_name);
9095 }
9096
9097 for (i = 0; i < tuning_db->entry_cnt; i++)
9098 {
9099 tuning_db_entry_t *entry = &tuning_db->entry_buf[i];
9100
9101 myfree (entry->device_name);
9102 }
9103
9104 myfree (tuning_db->alias_buf);
9105 myfree (tuning_db->entry_buf);
9106
9107 myfree (tuning_db);
9108 }
9109
9110 tuning_db_t *tuning_db_alloc (FILE *fp)
9111 {
9112 tuning_db_t *tuning_db = (tuning_db_t *) mymalloc (sizeof (tuning_db_t));
9113
9114 int num_lines = count_lines (fp);
9115
9116 // a bit over-allocated
9117
9118 tuning_db->alias_buf = (tuning_db_alias_t *) mycalloc (num_lines + 1, sizeof (tuning_db_alias_t));
9119 tuning_db->alias_cnt = 0;
9120
9121 tuning_db->entry_buf = (tuning_db_entry_t *) mycalloc (num_lines + 1, sizeof (tuning_db_entry_t));
9122 tuning_db->entry_cnt = 0;
9123
9124 return tuning_db;
9125 }
9126
9127 tuning_db_t *tuning_db_init (const char *tuning_db_file)
9128 {
9129 FILE *fp = fopen (tuning_db_file, "rb");
9130
9131 if (fp == NULL)
9132 {
9133 log_error ("%s: %s", tuning_db_file, strerror (errno));
9134
9135 exit (-1);
9136 }
9137
9138 tuning_db_t *tuning_db = tuning_db_alloc (fp);
9139
9140 rewind (fp);
9141
9142 int line_num = 0;
9143
9144 while (!feof (fp))
9145 {
9146 char buf[BUFSIZ];
9147
9148 char *line_buf = fgets (buf, sizeof (buf) - 1, fp);
9149
9150 if (line_buf == NULL) break;
9151
9152 line_num++;
9153
9154 const int line_len = in_superchop (line_buf);
9155
9156 if (line_len == 0) continue;
9157
9158 if (line_buf[0] == '#') continue;
9159
9160 // start processing
9161
9162 char *token_ptr[7] = { NULL };
9163
9164 int token_cnt = 0;
9165
9166 char *next = strtok (line_buf, "\t ");
9167
9168 token_ptr[token_cnt] = next;
9169
9170 token_cnt++;
9171
9172 while ((next = strtok (NULL, "\t ")) != NULL)
9173 {
9174 token_ptr[token_cnt] = next;
9175
9176 token_cnt++;
9177 }
9178
9179 if (token_cnt == 2)
9180 {
9181 char *device_name = token_ptr[0];
9182 char *alias_name = token_ptr[1];
9183
9184 tuning_db_alias_t *alias = &tuning_db->alias_buf[tuning_db->alias_cnt];
9185
9186 alias->device_name = mystrdup (device_name);
9187 alias->alias_name = mystrdup (alias_name);
9188
9189 tuning_db->alias_cnt++;
9190 }
9191 else if (token_cnt == 6)
9192 {
9193 if ((token_ptr[1][0] != '0') &&
9194 (token_ptr[1][0] != '1') &&
9195 (token_ptr[1][0] != '3') &&
9196 (token_ptr[1][0] != '*'))
9197 {
9198 log_info ("WARNING: Tuning-db: Invalid attack_mode '%c' in Line '%u'", token_ptr[1][0], line_num);
9199
9200 continue;
9201 }
9202
9203 if ((token_ptr[3][0] != '1') &&
9204 (token_ptr[3][0] != '2') &&
9205 (token_ptr[3][0] != '4') &&
9206 (token_ptr[3][0] != '8') &&
9207 (token_ptr[3][0] != 'N'))
9208 {
9209 log_info ("WARNING: Tuning-db: Invalid vector_width '%c' in Line '%u'", token_ptr[3][0], line_num);
9210
9211 continue;
9212 }
9213
9214 char *device_name = token_ptr[0];
9215
9216 int attack_mode = -1;
9217 int hash_type = -1;
9218 int vector_width = -1;
9219 int kernel_accel = -1;
9220 int kernel_loops = -1;
9221
9222 if (token_ptr[1][0] != '*') attack_mode = atoi (token_ptr[1]);
9223 if (token_ptr[2][0] != '*') hash_type = atoi (token_ptr[2]);
9224 if (token_ptr[3][0] != 'N') vector_width = atoi (token_ptr[3]);
9225
9226 if (token_ptr[4][0] != 'A')
9227 {
9228 kernel_accel = atoi (token_ptr[4]);
9229
9230 if ((kernel_accel < 1) || (kernel_accel > 1024))
9231 {
9232 log_info ("WARNING: Tuning-db: Invalid kernel_accel '%d' in Line '%u'", kernel_accel, line_num);
9233
9234 continue;
9235 }
9236 }
9237 else
9238 {
9239 kernel_accel = 0;
9240 }
9241
9242 if (token_ptr[5][0] != 'A')
9243 {
9244 kernel_loops = atoi (token_ptr[5]);
9245
9246 if ((kernel_loops < 1) || (kernel_loops > 1024))
9247 {
9248 log_info ("WARNING: Tuning-db: Invalid kernel_loops '%d' in Line '%u'", kernel_loops, line_num);
9249
9250 continue;
9251 }
9252 }
9253 else
9254 {
9255 kernel_loops = 0;
9256 }
9257
9258 tuning_db_entry_t *entry = &tuning_db->entry_buf[tuning_db->entry_cnt];
9259
9260 entry->device_name = mystrdup (device_name);
9261 entry->attack_mode = attack_mode;
9262 entry->hash_type = hash_type;
9263 entry->vector_width = vector_width;
9264 entry->kernel_accel = kernel_accel;
9265 entry->kernel_loops = kernel_loops;
9266
9267 tuning_db->entry_cnt++;
9268 }
9269 else
9270 {
9271 log_info ("WARNING: Tuning-db: Invalid number of token in Line '%u'", line_num);
9272
9273 continue;
9274 }
9275 }
9276
9277 fclose (fp);
9278
9279 // todo: print loaded 'cnt' message
9280
9281 // sort the database
9282
9283 qsort (tuning_db->alias_buf, tuning_db->alias_cnt, sizeof (tuning_db_alias_t), sort_by_tuning_db_alias);
9284 qsort (tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9285
9286 return tuning_db;
9287 }
9288
9289 tuning_db_entry_t *tuning_db_search (tuning_db_t *tuning_db, char *device_name, int attack_mode, int hash_type)
9290 {
9291 static tuning_db_entry_t s;
9292
9293 // first we need to convert all spaces in the device_name to underscore
9294
9295 char *device_name_nospace = strdup (device_name);
9296
9297 int device_name_length = strlen (device_name_nospace);
9298
9299 int i;
9300
9301 for (i = 0; i < device_name_length; i++)
9302 {
9303 if (device_name_nospace[i] == ' ') device_name_nospace[i] = '_';
9304 }
9305
9306 // find out if there's an alias configured
9307
9308 tuning_db_alias_t a;
9309
9310 a.device_name = device_name_nospace;
9311
9312 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);
9313
9314 char *alias_name = (alias == NULL) ? NULL : alias->alias_name;
9315
9316 // attack-mode 6 and 7 are attack-mode 1 basically
9317
9318 if (attack_mode == 6) attack_mode = 1;
9319 if (attack_mode == 7) attack_mode = 1;
9320
9321 // bsearch is not ideal but fast enough
9322
9323 s.device_name = device_name_nospace;
9324 s.attack_mode = attack_mode;
9325 s.hash_type = hash_type;
9326
9327 tuning_db_entry_t *entry = NULL;
9328
9329 // this will produce all 2^3 combinations required
9330
9331 for (i = 0; i < 8; i++)
9332 {
9333 s.device_name = (i & 1) ? "*" : device_name_nospace;
9334 s.attack_mode = (i & 2) ? -1 : attack_mode;
9335 s.hash_type = (i & 4) ? -1 : hash_type;
9336
9337 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9338
9339 if (entry != NULL) break;
9340
9341 // in non-wildcard mode also check the alias_name
9342
9343 if (((i & 1) == 0) && (alias_name != NULL))
9344 {
9345 s.device_name = alias_name;
9346
9347 entry = bsearch (&s, tuning_db->entry_buf, tuning_db->entry_cnt, sizeof (tuning_db_entry_t), sort_by_tuning_db_entry);
9348
9349 if (entry != NULL) break;
9350 }
9351 }
9352
9353 // free converted device_name
9354
9355 myfree (device_name_nospace);
9356
9357 return entry;
9358 }
9359
9360 /**
9361 * parser
9362 */
9363
9364 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9365 {
9366 u8 tmp[256] = { 0 };
9367
9368 if (salt_len > sizeof (tmp))
9369 {
9370 return UINT_MAX;
9371 }
9372
9373 memcpy (tmp, in, salt_len);
9374
9375 if (data.opts_type & OPTS_TYPE_ST_HEX)
9376 {
9377 if ((salt_len % 2) == 0)
9378 {
9379 u32 new_salt_len = salt_len / 2;
9380
9381 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9382 {
9383 u8 p0 = tmp[j + 0];
9384 u8 p1 = tmp[j + 1];
9385
9386 tmp[i] = hex_convert (p1) << 0;
9387 tmp[i] |= hex_convert (p0) << 4;
9388 }
9389
9390 salt_len = new_salt_len;
9391 }
9392 else
9393 {
9394 return UINT_MAX;
9395 }
9396 }
9397 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9398 {
9399 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9400 }
9401
9402 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9403
9404 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9405 {
9406 if (salt_len < 20)
9407 {
9408 u32 *tmp_uint = (u32 *) tmp;
9409
9410 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9411 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9412 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9413 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9414 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9415 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9416 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9417 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9418 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9419 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9420
9421 salt_len = salt_len * 2;
9422 }
9423 else
9424 {
9425 return UINT_MAX;
9426 }
9427 }
9428
9429 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9430 {
9431 lowercase (tmp, salt_len);
9432 }
9433
9434 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9435 {
9436 uppercase (tmp, salt_len);
9437 }
9438
9439 u32 len = salt_len;
9440
9441 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9442 {
9443 tmp[len++] = 0x80;
9444 }
9445
9446 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9447 {
9448 tmp[len++] = 0x01;
9449 }
9450
9451 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9452 {
9453 u32 *tmp_uint = (uint *) tmp;
9454
9455 u32 max = len / 4;
9456
9457 if (len % 4) max++;
9458
9459 for (u32 i = 0; i < max; i++)
9460 {
9461 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9462 }
9463
9464 // Important: we may need to increase the length of memcpy since
9465 // we don't want to "loose" some swapped bytes (could happen if
9466 // they do not perfectly fit in the 4-byte blocks)
9467 // Memcpy does always copy the bytes in the BE order, but since
9468 // we swapped them, some important bytes could be in positions
9469 // we normally skip with the original len
9470
9471 if (len % 4) len += 4 - (len % 4);
9472 }
9473
9474 memcpy (out, tmp, len);
9475
9476 return (salt_len);
9477 }
9478
9479 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9480 {
9481 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9482
9483 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9484
9485 u32 *digest = (u32 *) hash_buf->digest;
9486
9487 salt_t *salt = hash_buf->salt;
9488
9489 memcpy ((char *) salt->salt_sign, input_buf, 6);
9490
9491 char *iter_pos = input_buf + 4;
9492
9493 salt->salt_iter = 1 << atoi (iter_pos);
9494
9495 char *salt_pos = strchr (iter_pos, '$');
9496
9497 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9498
9499 salt_pos++;
9500
9501 uint salt_len = 16;
9502
9503 salt->salt_len = salt_len;
9504
9505 u8 tmp_buf[100] = { 0 };
9506
9507 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9508
9509 char *salt_buf_ptr = (char *) salt->salt_buf;
9510
9511 memcpy (salt_buf_ptr, tmp_buf, 16);
9512
9513 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9514 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9515 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9516 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9517
9518 char *hash_pos = salt_pos + 22;
9519
9520 memset (tmp_buf, 0, sizeof (tmp_buf));
9521
9522 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9523
9524 memcpy (digest, tmp_buf, 24);
9525
9526 digest[0] = byte_swap_32 (digest[0]);
9527 digest[1] = byte_swap_32 (digest[1]);
9528 digest[2] = byte_swap_32 (digest[2]);
9529 digest[3] = byte_swap_32 (digest[3]);
9530 digest[4] = byte_swap_32 (digest[4]);
9531 digest[5] = byte_swap_32 (digest[5]);
9532
9533 digest[5] &= ~0xff; // its just 23 not 24 !
9534
9535 return (PARSER_OK);
9536 }
9537
9538 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9539 {
9540 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9541
9542 u32 *digest = (u32 *) hash_buf->digest;
9543
9544 u8 tmp_buf[100] = { 0 };
9545
9546 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
9547
9548 memcpy (digest, tmp_buf, 32);
9549
9550 digest[0] = byte_swap_32 (digest[0]);
9551 digest[1] = byte_swap_32 (digest[1]);
9552 digest[2] = byte_swap_32 (digest[2]);
9553 digest[3] = byte_swap_32 (digest[3]);
9554 digest[4] = byte_swap_32 (digest[4]);
9555 digest[5] = byte_swap_32 (digest[5]);
9556 digest[6] = byte_swap_32 (digest[6]);
9557 digest[7] = byte_swap_32 (digest[7]);
9558
9559 digest[0] -= SHA256M_A;
9560 digest[1] -= SHA256M_B;
9561 digest[2] -= SHA256M_C;
9562 digest[3] -= SHA256M_D;
9563 digest[4] -= SHA256M_E;
9564 digest[5] -= SHA256M_F;
9565 digest[6] -= SHA256M_G;
9566 digest[7] -= SHA256M_H;
9567
9568 return (PARSER_OK);
9569 }
9570
9571 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9572 {
9573 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9574
9575 u32 *digest = (u32 *) hash_buf->digest;
9576
9577 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9578 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9579
9580 digest[0] = byte_swap_32 (digest[0]);
9581 digest[1] = byte_swap_32 (digest[1]);
9582
9583 uint tt;
9584
9585 IP (digest[0], digest[1], tt);
9586
9587 digest[0] = digest[0];
9588 digest[1] = digest[1];
9589 digest[2] = 0;
9590 digest[3] = 0;
9591
9592 return (PARSER_OK);
9593 }
9594
9595 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9596 {
9597 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9598
9599 u32 *digest = (u32 *) hash_buf->digest;
9600
9601 salt_t *salt = hash_buf->salt;
9602
9603 char *hash_pos = input_buf + 8;
9604
9605 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
9606 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
9607 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
9608 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
9609 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
9610
9611 digest[0] -= SHA1M_A;
9612 digest[1] -= SHA1M_B;
9613 digest[2] -= SHA1M_C;
9614 digest[3] -= SHA1M_D;
9615 digest[4] -= SHA1M_E;
9616
9617 uint salt_len = 8;
9618
9619 char *salt_buf_ptr = (char *) salt->salt_buf;
9620
9621 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9622
9623 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9624
9625 salt->salt_len = salt_len;
9626
9627 return (PARSER_OK);
9628 }
9629
9630 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9631 {
9632 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9633
9634 u64 *digest = (u64 *) hash_buf->digest;
9635
9636 salt_t *salt = hash_buf->salt;
9637
9638 char *hash_pos = input_buf + 8;
9639
9640 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
9641 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
9642 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
9643 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
9644 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
9645 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
9646 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
9647 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
9648
9649 digest[0] -= SHA512M_A;
9650 digest[1] -= SHA512M_B;
9651 digest[2] -= SHA512M_C;
9652 digest[3] -= SHA512M_D;
9653 digest[4] -= SHA512M_E;
9654 digest[5] -= SHA512M_F;
9655 digest[6] -= SHA512M_G;
9656 digest[7] -= SHA512M_H;
9657
9658 uint salt_len = 8;
9659
9660 char *salt_buf_ptr = (char *) salt->salt_buf;
9661
9662 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9663
9664 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9665
9666 salt->salt_len = salt_len;
9667
9668 return (PARSER_OK);
9669 }
9670
9671 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9672 {
9673 if (data.opts_type & OPTS_TYPE_ST_HEX)
9674 {
9675 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9676 }
9677 else
9678 {
9679 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9680 }
9681
9682 u32 *digest = (u32 *) hash_buf->digest;
9683
9684 salt_t *salt = hash_buf->salt;
9685
9686 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9687 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9688 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9689 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9690
9691 digest[0] = byte_swap_32 (digest[0]);
9692 digest[1] = byte_swap_32 (digest[1]);
9693 digest[2] = byte_swap_32 (digest[2]);
9694 digest[3] = byte_swap_32 (digest[3]);
9695
9696 digest[0] -= MD5M_A;
9697 digest[1] -= MD5M_B;
9698 digest[2] -= MD5M_C;
9699 digest[3] -= MD5M_D;
9700
9701 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9702
9703 uint salt_len = input_len - 32 - 1;
9704
9705 char *salt_buf = input_buf + 32 + 1;
9706
9707 char *salt_buf_ptr = (char *) salt->salt_buf;
9708
9709 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9710
9711 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9712
9713 salt->salt_len = salt_len;
9714
9715 return (PARSER_OK);
9716 }
9717
9718 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9719 {
9720 if (data.opts_type & OPTS_TYPE_ST_HEX)
9721 {
9722 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9723 }
9724 else
9725 {
9726 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9727 }
9728
9729 // unscramble
9730
9731 char clean_input_buf[32] = { 0 };
9732
9733 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9734 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9735
9736 for (int i = 0, j = 0, k = 0; i < 30; i++)
9737 {
9738 if (i == pos[j])
9739 {
9740 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9741
9742 j++;
9743 }
9744 else
9745 {
9746 clean_input_buf[k] = input_buf[i];
9747
9748 k++;
9749 }
9750 }
9751
9752 // base64 decode
9753
9754 u32 *digest = (u32 *) hash_buf->digest;
9755
9756 salt_t *salt = hash_buf->salt;
9757
9758 u32 a, b, c, d, e, f;
9759
9760 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9761 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9762 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9763 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9764 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9765 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9766
9767 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9768 | (((d << 12) | (e << 6) | (f)) << 0);
9769
9770 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9771 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9772 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9773 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9774 e = base64_to_int (clean_input_buf[10] & 0x7f);
9775 f = base64_to_int (clean_input_buf[11] & 0x7f);
9776
9777 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9778 | (((d << 12) | (e << 6) | (f)) << 0);
9779
9780 a = base64_to_int (clean_input_buf[12] & 0x7f);
9781 b = base64_to_int (clean_input_buf[13] & 0x7f);
9782 c = base64_to_int (clean_input_buf[14] & 0x7f);
9783 d = base64_to_int (clean_input_buf[15] & 0x7f);
9784 e = base64_to_int (clean_input_buf[16] & 0x7f);
9785 f = base64_to_int (clean_input_buf[17] & 0x7f);
9786
9787 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9788 | (((d << 12) | (e << 6) | (f)) << 0);
9789
9790 a = base64_to_int (clean_input_buf[18] & 0x7f);
9791 b = base64_to_int (clean_input_buf[19] & 0x7f);
9792 c = base64_to_int (clean_input_buf[20] & 0x7f);
9793 d = base64_to_int (clean_input_buf[21] & 0x7f);
9794 e = base64_to_int (clean_input_buf[22] & 0x7f);
9795 f = base64_to_int (clean_input_buf[23] & 0x7f);
9796
9797 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
9798 | (((d << 12) | (e << 6) | (f)) << 0);
9799
9800 digest[0] = byte_swap_32 (digest[0]);
9801 digest[1] = byte_swap_32 (digest[1]);
9802 digest[2] = byte_swap_32 (digest[2]);
9803 digest[3] = byte_swap_32 (digest[3]);
9804
9805 digest[0] -= MD5M_A;
9806 digest[1] -= MD5M_B;
9807 digest[2] -= MD5M_C;
9808 digest[3] -= MD5M_D;
9809
9810 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
9811
9812 uint salt_len = input_len - 30 - 1;
9813
9814 char *salt_buf = input_buf + 30 + 1;
9815
9816 char *salt_buf_ptr = (char *) salt->salt_buf;
9817
9818 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9819
9820 // max. salt length: salt_buf[32] => 32 - 22 (":Administration Tools:") = 10
9821 if (salt_len > 10) return (PARSER_SALT_LENGTH);
9822
9823 salt->salt_len = salt_len;
9824
9825 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9826
9827 salt->salt_len += 22;
9828
9829 return (PARSER_OK);
9830 }
9831
9832 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9833 {
9834 if (data.opts_type & OPTS_TYPE_ST_HEX)
9835 {
9836 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9837 }
9838 else
9839 {
9840 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9841 }
9842
9843 u32 *digest = (u32 *) hash_buf->digest;
9844
9845 salt_t *salt = hash_buf->salt;
9846
9847 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9848 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9849 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9850 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9851 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
9852
9853 digest[0] -= SHA1M_A;
9854 digest[1] -= SHA1M_B;
9855 digest[2] -= SHA1M_C;
9856 digest[3] -= SHA1M_D;
9857 digest[4] -= SHA1M_E;
9858
9859 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9860
9861 uint salt_len = input_len - 40 - 1;
9862
9863 char *salt_buf = input_buf + 40 + 1;
9864
9865 char *salt_buf_ptr = (char *) salt->salt_buf;
9866
9867 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9868
9869 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9870
9871 salt->salt_len = salt_len;
9872
9873 return (PARSER_OK);
9874 }
9875
9876 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9877 {
9878 if (data.opts_type & OPTS_TYPE_ST_HEX)
9879 {
9880 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9881 }
9882 else
9883 {
9884 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9885 }
9886
9887 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9888
9889 char *iter_pos = input_buf + 6;
9890
9891 salt_t *salt = hash_buf->salt;
9892
9893 uint iter = atoi (iter_pos);
9894
9895 if (iter < 1)
9896 {
9897 iter = ROUNDS_DCC2;
9898 }
9899
9900 salt->salt_iter = iter - 1;
9901
9902 char *salt_pos = strchr (iter_pos, '#');
9903
9904 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9905
9906 salt_pos++;
9907
9908 char *digest_pos = strchr (salt_pos, '#');
9909
9910 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9911
9912 digest_pos++;
9913
9914 uint salt_len = digest_pos - salt_pos - 1;
9915
9916 u32 *digest = (u32 *) hash_buf->digest;
9917
9918 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
9919 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
9920 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
9921 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
9922
9923 char *salt_buf_ptr = (char *) salt->salt_buf;
9924
9925 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9926
9927 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9928
9929 salt->salt_len = salt_len;
9930
9931 return (PARSER_OK);
9932 }
9933
9934 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9935 {
9936 u32 *digest = (u32 *) hash_buf->digest;
9937
9938 salt_t *salt = hash_buf->salt;
9939
9940 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9941
9942 hccap_t in;
9943
9944 memcpy (&in, input_buf, input_len);
9945
9946 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9947
9948 memcpy (digest, in.keymic, 16);
9949
9950 /*
9951 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9952 The phrase "Pairwise key expansion"
9953 Access Point Address (referred to as Authenticator Address AA)
9954 Supplicant Address (referred to as Supplicant Address SA)
9955 Access Point Nonce (referred to as Authenticator Anonce)
9956 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9957 */
9958
9959 uint salt_len = strlen (in.essid);
9960
9961 memcpy (salt->salt_buf, in.essid, salt_len);
9962
9963 salt->salt_len = salt_len;
9964
9965 salt->salt_iter = ROUNDS_WPA2 - 1;
9966
9967 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
9968
9969 memcpy (pke_ptr, "Pairwise key expansion", 23);
9970
9971 if (memcmp (in.mac1, in.mac2, 6) < 0)
9972 {
9973 memcpy (pke_ptr + 23, in.mac1, 6);
9974 memcpy (pke_ptr + 29, in.mac2, 6);
9975 }
9976 else
9977 {
9978 memcpy (pke_ptr + 23, in.mac2, 6);
9979 memcpy (pke_ptr + 29, in.mac1, 6);
9980 }
9981
9982 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
9983 {
9984 memcpy (pke_ptr + 35, in.nonce1, 32);
9985 memcpy (pke_ptr + 67, in.nonce2, 32);
9986 }
9987 else
9988 {
9989 memcpy (pke_ptr + 35, in.nonce2, 32);
9990 memcpy (pke_ptr + 67, in.nonce1, 32);
9991 }
9992
9993 for (int i = 0; i < 25; i++)
9994 {
9995 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
9996 }
9997
9998 wpa->keyver = in.keyver;
9999
10000 if (wpa->keyver > 255)
10001 {
10002 log_info ("ATTENTION!");
10003 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10004 log_info (" This could be due to a recent aircrack-ng bug.");
10005 log_info (" The key version was automatically reset to a reasonable value.");
10006 log_info ("");
10007
10008 wpa->keyver &= 0xff;
10009 }
10010
10011 wpa->eapol_size = in.eapol_size;
10012
10013 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10014
10015 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10016
10017 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10018
10019 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10020
10021 if (wpa->keyver == 1)
10022 {
10023 // nothing to do
10024 }
10025 else
10026 {
10027 digest[0] = byte_swap_32 (digest[0]);
10028 digest[1] = byte_swap_32 (digest[1]);
10029 digest[2] = byte_swap_32 (digest[2]);
10030 digest[3] = byte_swap_32 (digest[3]);
10031
10032 for (int i = 0; i < 64; i++)
10033 {
10034 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10035 }
10036 }
10037
10038 salt->salt_buf[10] = digest[1];
10039 salt->salt_buf[11] = digest[2];
10040
10041 return (PARSER_OK);
10042 }
10043
10044 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10045 {
10046 u32 *digest = (u32 *) hash_buf->digest;
10047
10048 salt_t *salt = hash_buf->salt;
10049
10050 if (input_len == 0)
10051 {
10052 log_error ("Password Safe v2 container not specified");
10053
10054 exit (-1);
10055 }
10056
10057 FILE *fp = fopen (input_buf, "rb");
10058
10059 if (fp == NULL)
10060 {
10061 log_error ("%s: %s", input_buf, strerror (errno));
10062
10063 exit (-1);
10064 }
10065
10066 psafe2_hdr buf;
10067
10068 memset (&buf, 0, sizeof (psafe2_hdr));
10069
10070 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10071
10072 fclose (fp);
10073
10074 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10075
10076 salt->salt_buf[0] = buf.random[0];
10077 salt->salt_buf[1] = buf.random[1];
10078
10079 salt->salt_len = 8;
10080 salt->salt_iter = 1000;
10081
10082 digest[0] = byte_swap_32 (buf.hash[0]);
10083 digest[1] = byte_swap_32 (buf.hash[1]);
10084 digest[2] = byte_swap_32 (buf.hash[2]);
10085 digest[3] = byte_swap_32 (buf.hash[3]);
10086 digest[4] = byte_swap_32 (buf.hash[4]);
10087
10088 return (PARSER_OK);
10089 }
10090
10091 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10092 {
10093 u32 *digest = (u32 *) hash_buf->digest;
10094
10095 salt_t *salt = hash_buf->salt;
10096
10097 if (input_len == 0)
10098 {
10099 log_error (".psafe3 not specified");
10100
10101 exit (-1);
10102 }
10103
10104 FILE *fp = fopen (input_buf, "rb");
10105
10106 if (fp == NULL)
10107 {
10108 log_error ("%s: %s", input_buf, strerror (errno));
10109
10110 exit (-1);
10111 }
10112
10113 psafe3_t in;
10114
10115 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10116
10117 fclose (fp);
10118
10119 data.hashfile = input_buf; // we will need this in case it gets cracked
10120
10121 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10122
10123 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10124
10125 salt->salt_iter = in.iterations + 1;
10126
10127 salt->salt_buf[0] = in.salt_buf[0];
10128 salt->salt_buf[1] = in.salt_buf[1];
10129 salt->salt_buf[2] = in.salt_buf[2];
10130 salt->salt_buf[3] = in.salt_buf[3];
10131 salt->salt_buf[4] = in.salt_buf[4];
10132 salt->salt_buf[5] = in.salt_buf[5];
10133 salt->salt_buf[6] = in.salt_buf[6];
10134 salt->salt_buf[7] = in.salt_buf[7];
10135
10136 salt->salt_len = 32;
10137
10138 digest[0] = in.hash_buf[0];
10139 digest[1] = in.hash_buf[1];
10140 digest[2] = in.hash_buf[2];
10141 digest[3] = in.hash_buf[3];
10142 digest[4] = in.hash_buf[4];
10143 digest[5] = in.hash_buf[5];
10144 digest[6] = in.hash_buf[6];
10145 digest[7] = in.hash_buf[7];
10146
10147 digest[0] = byte_swap_32 (digest[0]);
10148 digest[1] = byte_swap_32 (digest[1]);
10149 digest[2] = byte_swap_32 (digest[2]);
10150 digest[3] = byte_swap_32 (digest[3]);
10151 digest[4] = byte_swap_32 (digest[4]);
10152 digest[5] = byte_swap_32 (digest[5]);
10153 digest[6] = byte_swap_32 (digest[6]);
10154 digest[7] = byte_swap_32 (digest[7]);
10155
10156 return (PARSER_OK);
10157 }
10158
10159 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10160 {
10161 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10162
10163 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10164
10165 u32 *digest = (u32 *) hash_buf->digest;
10166
10167 salt_t *salt = hash_buf->salt;
10168
10169 char *iter_pos = input_buf + 3;
10170
10171 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10172
10173 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10174
10175 memcpy ((char *) salt->salt_sign, input_buf, 4);
10176
10177 salt->salt_iter = salt_iter;
10178
10179 char *salt_pos = iter_pos + 1;
10180
10181 uint salt_len = 8;
10182
10183 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10184
10185 salt->salt_len = salt_len;
10186
10187 char *hash_pos = salt_pos + salt_len;
10188
10189 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10190
10191 return (PARSER_OK);
10192 }
10193
10194 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10195 {
10196 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10197
10198 u32 *digest = (u32 *) hash_buf->digest;
10199
10200 salt_t *salt = hash_buf->salt;
10201
10202 char *salt_pos = input_buf + 3;
10203
10204 uint iterations_len = 0;
10205
10206 if (memcmp (salt_pos, "rounds=", 7) == 0)
10207 {
10208 salt_pos += 7;
10209
10210 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10211
10212 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10213 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10214
10215 salt_pos[0] = 0x0;
10216
10217 salt->salt_iter = atoi (salt_pos - iterations_len);
10218
10219 salt_pos += 1;
10220
10221 iterations_len += 8;
10222 }
10223 else
10224 {
10225 salt->salt_iter = ROUNDS_MD5CRYPT;
10226 }
10227
10228 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10229
10230 char *hash_pos = strchr (salt_pos, '$');
10231
10232 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10233
10234 uint salt_len = hash_pos - salt_pos;
10235
10236 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10237
10238 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10239
10240 salt->salt_len = salt_len;
10241
10242 hash_pos++;
10243
10244 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10245
10246 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10247
10248 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10249
10250 return (PARSER_OK);
10251 }
10252
10253 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10254 {
10255 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10256
10257 u32 *digest = (u32 *) hash_buf->digest;
10258
10259 salt_t *salt = hash_buf->salt;
10260
10261 char *salt_pos = input_buf + 6;
10262
10263 uint iterations_len = 0;
10264
10265 if (memcmp (salt_pos, "rounds=", 7) == 0)
10266 {
10267 salt_pos += 7;
10268
10269 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10270
10271 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10272 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10273
10274 salt_pos[0] = 0x0;
10275
10276 salt->salt_iter = atoi (salt_pos - iterations_len);
10277
10278 salt_pos += 1;
10279
10280 iterations_len += 8;
10281 }
10282 else
10283 {
10284 salt->salt_iter = ROUNDS_MD5CRYPT;
10285 }
10286
10287 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10288
10289 char *hash_pos = strchr (salt_pos, '$');
10290
10291 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10292
10293 uint salt_len = hash_pos - salt_pos;
10294
10295 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10296
10297 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10298
10299 salt->salt_len = salt_len;
10300
10301 hash_pos++;
10302
10303 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10304
10305 return (PARSER_OK);
10306 }
10307
10308 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10309 {
10310 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10311
10312 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10313
10314 u32 *digest = (u32 *) hash_buf->digest;
10315
10316 salt_t *salt = hash_buf->salt;
10317
10318 char *salt_pos = input_buf + 14;
10319
10320 char *hash_pos = strchr (salt_pos, '*');
10321
10322 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10323
10324 hash_pos++;
10325
10326 uint salt_len = hash_pos - salt_pos - 1;
10327
10328 char *salt_buf_ptr = (char *) salt->salt_buf;
10329
10330 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10331
10332 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10333
10334 salt->salt_len = salt_len;
10335
10336 u8 tmp_buf[100] = { 0 };
10337
10338 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10339
10340 memcpy (digest, tmp_buf, 20);
10341
10342 digest[0] = byte_swap_32 (digest[0]);
10343 digest[1] = byte_swap_32 (digest[1]);
10344 digest[2] = byte_swap_32 (digest[2]);
10345 digest[3] = byte_swap_32 (digest[3]);
10346 digest[4] = byte_swap_32 (digest[4]);
10347
10348 digest[0] -= SHA1M_A;
10349 digest[1] -= SHA1M_B;
10350 digest[2] -= SHA1M_C;
10351 digest[3] -= SHA1M_D;
10352 digest[4] -= SHA1M_E;
10353
10354 return (PARSER_OK);
10355 }
10356
10357 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10358 {
10359 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10360
10361 unsigned char c12 = itoa64_to_int (input_buf[12]);
10362
10363 if (c12 & 3) return (PARSER_HASH_VALUE);
10364
10365 u32 *digest = (u32 *) hash_buf->digest;
10366
10367 salt_t *salt = hash_buf->salt;
10368
10369 // for ascii_digest
10370 salt->salt_sign[0] = input_buf[0];
10371 salt->salt_sign[1] = input_buf[1];
10372
10373 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10374 | itoa64_to_int (input_buf[1]) << 6;
10375
10376 salt->salt_len = 2;
10377
10378 u8 tmp_buf[100] = { 0 };
10379
10380 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10381
10382 memcpy (digest, tmp_buf, 8);
10383
10384 uint tt;
10385
10386 IP (digest[0], digest[1], tt);
10387
10388 digest[2] = 0;
10389 digest[3] = 0;
10390
10391 return (PARSER_OK);
10392 }
10393
10394 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10395 {
10396 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10397
10398 u32 *digest = (u32 *) hash_buf->digest;
10399
10400 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10401 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10402 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10403 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10404
10405 digest[0] = byte_swap_32 (digest[0]);
10406 digest[1] = byte_swap_32 (digest[1]);
10407 digest[2] = byte_swap_32 (digest[2]);
10408 digest[3] = byte_swap_32 (digest[3]);
10409
10410 digest[0] -= MD4M_A;
10411 digest[1] -= MD4M_B;
10412 digest[2] -= MD4M_C;
10413 digest[3] -= MD4M_D;
10414
10415 return (PARSER_OK);
10416 }
10417
10418 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10419 {
10420 if (data.opts_type & OPTS_TYPE_ST_HEX)
10421 {
10422 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10423 }
10424 else
10425 {
10426 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10427 }
10428
10429 u32 *digest = (u32 *) hash_buf->digest;
10430
10431 salt_t *salt = hash_buf->salt;
10432
10433 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10434 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10435 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10436 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10437
10438 digest[0] = byte_swap_32 (digest[0]);
10439 digest[1] = byte_swap_32 (digest[1]);
10440 digest[2] = byte_swap_32 (digest[2]);
10441 digest[3] = byte_swap_32 (digest[3]);
10442
10443 digest[0] -= MD4M_A;
10444 digest[1] -= MD4M_B;
10445 digest[2] -= MD4M_C;
10446 digest[3] -= MD4M_D;
10447
10448 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10449
10450 uint salt_len = input_len - 32 - 1;
10451
10452 char *salt_buf = input_buf + 32 + 1;
10453
10454 char *salt_buf_ptr = (char *) salt->salt_buf;
10455
10456 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10457
10458 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10459
10460 salt->salt_len = salt_len;
10461
10462 return (PARSER_OK);
10463 }
10464
10465 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10466 {
10467 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10468
10469 u32 *digest = (u32 *) hash_buf->digest;
10470
10471 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10472 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10473 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10474 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10475
10476 digest[0] = byte_swap_32 (digest[0]);
10477 digest[1] = byte_swap_32 (digest[1]);
10478 digest[2] = byte_swap_32 (digest[2]);
10479 digest[3] = byte_swap_32 (digest[3]);
10480
10481 digest[0] -= MD5M_A;
10482 digest[1] -= MD5M_B;
10483 digest[2] -= MD5M_C;
10484 digest[3] -= MD5M_D;
10485
10486 return (PARSER_OK);
10487 }
10488
10489 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10490 {
10491 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10492
10493 u32 *digest = (u32 *) hash_buf->digest;
10494
10495 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
10496 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
10497 digest[2] = 0;
10498 digest[3] = 0;
10499
10500 digest[0] = byte_swap_32 (digest[0]);
10501 digest[1] = byte_swap_32 (digest[1]);
10502
10503 return (PARSER_OK);
10504 }
10505
10506 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10507 {
10508 if (data.opts_type & OPTS_TYPE_ST_HEX)
10509 {
10510 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10511 }
10512 else
10513 {
10514 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10515 }
10516
10517 u32 *digest = (u32 *) hash_buf->digest;
10518
10519 salt_t *salt = hash_buf->salt;
10520
10521 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10522 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10523 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10524 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10525
10526 digest[0] = byte_swap_32 (digest[0]);
10527 digest[1] = byte_swap_32 (digest[1]);
10528 digest[2] = byte_swap_32 (digest[2]);
10529 digest[3] = byte_swap_32 (digest[3]);
10530
10531 digest[0] -= MD5M_A;
10532 digest[1] -= MD5M_B;
10533 digest[2] -= MD5M_C;
10534 digest[3] -= MD5M_D;
10535
10536 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10537
10538 uint salt_len = input_len - 32 - 1;
10539
10540 char *salt_buf = input_buf + 32 + 1;
10541
10542 char *salt_buf_ptr = (char *) salt->salt_buf;
10543
10544 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10545
10546 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10547
10548 salt->salt_len = salt_len;
10549
10550 return (PARSER_OK);
10551 }
10552
10553 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10554 {
10555 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10556
10557 u32 *digest = (u32 *) hash_buf->digest;
10558
10559 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10560 | itoa64_to_int (input_buf[ 1]) << 6
10561 | itoa64_to_int (input_buf[ 2]) << 12
10562 | itoa64_to_int (input_buf[ 3]) << 18;
10563 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10564 | itoa64_to_int (input_buf[ 5]) << 6
10565 | itoa64_to_int (input_buf[ 6]) << 12
10566 | itoa64_to_int (input_buf[ 7]) << 18;
10567 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10568 | itoa64_to_int (input_buf[ 9]) << 6
10569 | itoa64_to_int (input_buf[10]) << 12
10570 | itoa64_to_int (input_buf[11]) << 18;
10571 digest[3] = itoa64_to_int (input_buf[12]) << 0
10572 | itoa64_to_int (input_buf[13]) << 6
10573 | itoa64_to_int (input_buf[14]) << 12
10574 | itoa64_to_int (input_buf[15]) << 18;
10575
10576 digest[0] -= MD5M_A;
10577 digest[1] -= MD5M_B;
10578 digest[2] -= MD5M_C;
10579 digest[3] -= MD5M_D;
10580
10581 digest[0] &= 0x00ffffff;
10582 digest[1] &= 0x00ffffff;
10583 digest[2] &= 0x00ffffff;
10584 digest[3] &= 0x00ffffff;
10585
10586 return (PARSER_OK);
10587 }
10588
10589 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10590 {
10591 if (data.opts_type & OPTS_TYPE_ST_HEX)
10592 {
10593 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10594 }
10595 else
10596 {
10597 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10598 }
10599
10600 u32 *digest = (u32 *) hash_buf->digest;
10601
10602 salt_t *salt = hash_buf->salt;
10603
10604 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10605 | itoa64_to_int (input_buf[ 1]) << 6
10606 | itoa64_to_int (input_buf[ 2]) << 12
10607 | itoa64_to_int (input_buf[ 3]) << 18;
10608 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10609 | itoa64_to_int (input_buf[ 5]) << 6
10610 | itoa64_to_int (input_buf[ 6]) << 12
10611 | itoa64_to_int (input_buf[ 7]) << 18;
10612 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10613 | itoa64_to_int (input_buf[ 9]) << 6
10614 | itoa64_to_int (input_buf[10]) << 12
10615 | itoa64_to_int (input_buf[11]) << 18;
10616 digest[3] = itoa64_to_int (input_buf[12]) << 0
10617 | itoa64_to_int (input_buf[13]) << 6
10618 | itoa64_to_int (input_buf[14]) << 12
10619 | itoa64_to_int (input_buf[15]) << 18;
10620
10621 digest[0] -= MD5M_A;
10622 digest[1] -= MD5M_B;
10623 digest[2] -= MD5M_C;
10624 digest[3] -= MD5M_D;
10625
10626 digest[0] &= 0x00ffffff;
10627 digest[1] &= 0x00ffffff;
10628 digest[2] &= 0x00ffffff;
10629 digest[3] &= 0x00ffffff;
10630
10631 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10632
10633 uint salt_len = input_len - 16 - 1;
10634
10635 char *salt_buf = input_buf + 16 + 1;
10636
10637 char *salt_buf_ptr = (char *) salt->salt_buf;
10638
10639 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10640
10641 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10642
10643 salt->salt_len = salt_len;
10644
10645 return (PARSER_OK);
10646 }
10647
10648 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
10649 {
10650 key[0] = (nthash[0] >> 0);
10651 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10652 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10653 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10654 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10655 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10656 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10657 key[7] = (nthash[6] << 1);
10658
10659 key[0] |= 0x01;
10660 key[1] |= 0x01;
10661 key[2] |= 0x01;
10662 key[3] |= 0x01;
10663 key[4] |= 0x01;
10664 key[5] |= 0x01;
10665 key[6] |= 0x01;
10666 key[7] |= 0x01;
10667 }
10668
10669 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10670 {
10671 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10672
10673 u32 *digest = (u32 *) hash_buf->digest;
10674
10675 salt_t *salt = hash_buf->salt;
10676
10677 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10678
10679 /**
10680 * parse line
10681 */
10682
10683 char *user_pos = input_buf;
10684
10685 char *unused_pos = strchr (user_pos, ':');
10686
10687 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10688
10689 uint user_len = unused_pos - user_pos;
10690
10691 if (user_len > 60) return (PARSER_SALT_LENGTH);
10692
10693 unused_pos++;
10694
10695 char *domain_pos = strchr (unused_pos, ':');
10696
10697 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10698
10699 uint unused_len = domain_pos - unused_pos;
10700
10701 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10702
10703 domain_pos++;
10704
10705 char *srvchall_pos = strchr (domain_pos, ':');
10706
10707 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10708
10709 uint domain_len = srvchall_pos - domain_pos;
10710
10711 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10712
10713 srvchall_pos++;
10714
10715 char *hash_pos = strchr (srvchall_pos, ':');
10716
10717 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10718
10719 uint srvchall_len = hash_pos - srvchall_pos;
10720
10721 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10722
10723 hash_pos++;
10724
10725 char *clichall_pos = strchr (hash_pos, ':');
10726
10727 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10728
10729 uint hash_len = clichall_pos - hash_pos;
10730
10731 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10732
10733 clichall_pos++;
10734
10735 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10736
10737 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10738
10739 /**
10740 * store some data for later use
10741 */
10742
10743 netntlm->user_len = user_len * 2;
10744 netntlm->domain_len = domain_len * 2;
10745 netntlm->srvchall_len = srvchall_len / 2;
10746 netntlm->clichall_len = clichall_len / 2;
10747
10748 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10749 char *chall_ptr = (char *) netntlm->chall_buf;
10750
10751 /**
10752 * handle username and domainname
10753 */
10754
10755 for (uint i = 0; i < user_len; i++)
10756 {
10757 *userdomain_ptr++ = user_pos[i];
10758 *userdomain_ptr++ = 0;
10759 }
10760
10761 for (uint i = 0; i < domain_len; i++)
10762 {
10763 *userdomain_ptr++ = domain_pos[i];
10764 *userdomain_ptr++ = 0;
10765 }
10766
10767 /**
10768 * handle server challenge encoding
10769 */
10770
10771 for (uint i = 0; i < srvchall_len; i += 2)
10772 {
10773 const char p0 = srvchall_pos[i + 0];
10774 const char p1 = srvchall_pos[i + 1];
10775
10776 *chall_ptr++ = hex_convert (p1) << 0
10777 | hex_convert (p0) << 4;
10778 }
10779
10780 /**
10781 * handle client challenge encoding
10782 */
10783
10784 for (uint i = 0; i < clichall_len; i += 2)
10785 {
10786 const char p0 = clichall_pos[i + 0];
10787 const char p1 = clichall_pos[i + 1];
10788
10789 *chall_ptr++ = hex_convert (p1) << 0
10790 | hex_convert (p0) << 4;
10791 }
10792
10793 /**
10794 * store data
10795 */
10796
10797 char *salt_buf_ptr = (char *) salt->salt_buf;
10798
10799 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10800
10801 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10802
10803 salt->salt_len = salt_len;
10804
10805 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10806 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10807 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10808 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10809
10810 digest[0] = byte_swap_32 (digest[0]);
10811 digest[1] = byte_swap_32 (digest[1]);
10812 digest[2] = byte_swap_32 (digest[2]);
10813 digest[3] = byte_swap_32 (digest[3]);
10814
10815 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10816
10817 uint digest_tmp[2] = { 0 };
10818
10819 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10820 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
10821
10822 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10823 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10824
10825 /* special case 2: ESS */
10826
10827 if (srvchall_len == 48)
10828 {
10829 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10830 {
10831 uint w[16] = { 0 };
10832
10833 w[ 0] = netntlm->chall_buf[6];
10834 w[ 1] = netntlm->chall_buf[7];
10835 w[ 2] = netntlm->chall_buf[0];
10836 w[ 3] = netntlm->chall_buf[1];
10837 w[ 4] = 0x80;
10838 w[14] = 16 * 8;
10839
10840 uint dgst[4] = { 0 };
10841
10842 dgst[0] = MAGIC_A;
10843 dgst[1] = MAGIC_B;
10844 dgst[2] = MAGIC_C;
10845 dgst[3] = MAGIC_D;
10846
10847 md5_64 (w, dgst);
10848
10849 salt->salt_buf[0] = dgst[0];
10850 salt->salt_buf[1] = dgst[1];
10851 }
10852 }
10853
10854 /* precompute netntlmv1 exploit start */
10855
10856 for (uint i = 0; i < 0x10000; i++)
10857 {
10858 uint key_md4[2] = { i, 0 };
10859 uint key_des[2] = { 0, 0 };
10860
10861 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
10862
10863 uint Kc[16] = { 0 };
10864 uint Kd[16] = { 0 };
10865
10866 _des_keysetup (key_des, Kc, Kd, c_skb);
10867
10868 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10869
10870 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10871
10872 if (data3[0] != digest_tmp[0]) continue;
10873 if (data3[1] != digest_tmp[1]) continue;
10874
10875 salt->salt_buf[2] = i;
10876
10877 salt->salt_len = 24;
10878
10879 break;
10880 }
10881
10882 salt->salt_buf_pc[0] = digest_tmp[0];
10883 salt->salt_buf_pc[1] = digest_tmp[1];
10884
10885 /* precompute netntlmv1 exploit stop */
10886
10887 u32 tt;
10888
10889 IP (digest[0], digest[1], tt);
10890 IP (digest[2], digest[3], tt);
10891
10892 digest[0] = rotr32 (digest[0], 29);
10893 digest[1] = rotr32 (digest[1], 29);
10894 digest[2] = rotr32 (digest[2], 29);
10895 digest[3] = rotr32 (digest[3], 29);
10896
10897 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10898
10899 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
10900 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
10901
10902 return (PARSER_OK);
10903 }
10904
10905 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10906 {
10907 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10908
10909 u32 *digest = (u32 *) hash_buf->digest;
10910
10911 salt_t *salt = hash_buf->salt;
10912
10913 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10914
10915 /**
10916 * parse line
10917 */
10918
10919 char *user_pos = input_buf;
10920
10921 char *unused_pos = strchr (user_pos, ':');
10922
10923 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10924
10925 uint user_len = unused_pos - user_pos;
10926
10927 if (user_len > 60) return (PARSER_SALT_LENGTH);
10928
10929 unused_pos++;
10930
10931 char *domain_pos = strchr (unused_pos, ':');
10932
10933 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10934
10935 uint unused_len = domain_pos - unused_pos;
10936
10937 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10938
10939 domain_pos++;
10940
10941 char *srvchall_pos = strchr (domain_pos, ':');
10942
10943 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10944
10945 uint domain_len = srvchall_pos - domain_pos;
10946
10947 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10948
10949 srvchall_pos++;
10950
10951 char *hash_pos = strchr (srvchall_pos, ':');
10952
10953 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10954
10955 uint srvchall_len = hash_pos - srvchall_pos;
10956
10957 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
10958
10959 hash_pos++;
10960
10961 char *clichall_pos = strchr (hash_pos, ':');
10962
10963 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10964
10965 uint hash_len = clichall_pos - hash_pos;
10966
10967 if (hash_len != 32) return (PARSER_HASH_LENGTH);
10968
10969 clichall_pos++;
10970
10971 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10972
10973 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
10974
10975 if (clichall_len % 2) return (PARSER_SALT_VALUE);
10976
10977 /**
10978 * store some data for later use
10979 */
10980
10981 netntlm->user_len = user_len * 2;
10982 netntlm->domain_len = domain_len * 2;
10983 netntlm->srvchall_len = srvchall_len / 2;
10984 netntlm->clichall_len = clichall_len / 2;
10985
10986 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10987 char *chall_ptr = (char *) netntlm->chall_buf;
10988
10989 /**
10990 * handle username and domainname
10991 */
10992
10993 for (uint i = 0; i < user_len; i++)
10994 {
10995 *userdomain_ptr++ = toupper (user_pos[i]);
10996 *userdomain_ptr++ = 0;
10997 }
10998
10999 for (uint i = 0; i < domain_len; i++)
11000 {
11001 *userdomain_ptr++ = domain_pos[i];
11002 *userdomain_ptr++ = 0;
11003 }
11004
11005 *userdomain_ptr++ = 0x80;
11006
11007 /**
11008 * handle server challenge encoding
11009 */
11010
11011 for (uint i = 0; i < srvchall_len; i += 2)
11012 {
11013 const char p0 = srvchall_pos[i + 0];
11014 const char p1 = srvchall_pos[i + 1];
11015
11016 *chall_ptr++ = hex_convert (p1) << 0
11017 | hex_convert (p0) << 4;
11018 }
11019
11020 /**
11021 * handle client challenge encoding
11022 */
11023
11024 for (uint i = 0; i < clichall_len; i += 2)
11025 {
11026 const char p0 = clichall_pos[i + 0];
11027 const char p1 = clichall_pos[i + 1];
11028
11029 *chall_ptr++ = hex_convert (p1) << 0
11030 | hex_convert (p0) << 4;
11031 }
11032
11033 *chall_ptr++ = 0x80;
11034
11035 /**
11036 * handle hash itself
11037 */
11038
11039 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11040 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11041 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11042 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11043
11044 digest[0] = byte_swap_32 (digest[0]);
11045 digest[1] = byte_swap_32 (digest[1]);
11046 digest[2] = byte_swap_32 (digest[2]);
11047 digest[3] = byte_swap_32 (digest[3]);
11048
11049 /**
11050 * reuse challange data as salt_buf, its the buffer that is most likely unique
11051 */
11052
11053 salt->salt_buf[0] = 0;
11054 salt->salt_buf[1] = 0;
11055 salt->salt_buf[2] = 0;
11056 salt->salt_buf[3] = 0;
11057 salt->salt_buf[4] = 0;
11058 salt->salt_buf[5] = 0;
11059 salt->salt_buf[6] = 0;
11060 salt->salt_buf[7] = 0;
11061
11062 uint *uptr;
11063
11064 uptr = (uint *) netntlm->userdomain_buf;
11065
11066 for (uint i = 0; i < 16; i += 16)
11067 {
11068 md5_64 (uptr, salt->salt_buf);
11069 }
11070
11071 uptr = (uint *) netntlm->chall_buf;
11072
11073 for (uint i = 0; i < 256; i += 16)
11074 {
11075 md5_64 (uptr, salt->salt_buf);
11076 }
11077
11078 salt->salt_len = 16;
11079
11080 return (PARSER_OK);
11081 }
11082
11083 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11084 {
11085 if (data.opts_type & OPTS_TYPE_ST_HEX)
11086 {
11087 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11088 }
11089 else
11090 {
11091 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11092 }
11093
11094 u32 *digest = (u32 *) hash_buf->digest;
11095
11096 salt_t *salt = hash_buf->salt;
11097
11098 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11099 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11100 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11101 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11102
11103 digest[0] = byte_swap_32 (digest[0]);
11104 digest[1] = byte_swap_32 (digest[1]);
11105 digest[2] = byte_swap_32 (digest[2]);
11106 digest[3] = byte_swap_32 (digest[3]);
11107
11108 digest[0] -= MD5M_A;
11109 digest[1] -= MD5M_B;
11110 digest[2] -= MD5M_C;
11111 digest[3] -= MD5M_D;
11112
11113 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11114
11115 uint salt_len = input_len - 32 - 1;
11116
11117 char *salt_buf = input_buf + 32 + 1;
11118
11119 char *salt_buf_ptr = (char *) salt->salt_buf;
11120
11121 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11122
11123 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11124
11125 salt->salt_len = salt_len;
11126
11127 return (PARSER_OK);
11128 }
11129
11130 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11131 {
11132 if (data.opts_type & OPTS_TYPE_ST_HEX)
11133 {
11134 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11135 }
11136 else
11137 {
11138 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11139 }
11140
11141 u32 *digest = (u32 *) hash_buf->digest;
11142
11143 salt_t *salt = hash_buf->salt;
11144
11145 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11146 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11147 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11148 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11149
11150 digest[0] = byte_swap_32 (digest[0]);
11151 digest[1] = byte_swap_32 (digest[1]);
11152 digest[2] = byte_swap_32 (digest[2]);
11153 digest[3] = byte_swap_32 (digest[3]);
11154
11155 digest[0] -= MD5M_A;
11156 digest[1] -= MD5M_B;
11157 digest[2] -= MD5M_C;
11158 digest[3] -= MD5M_D;
11159
11160 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11161
11162 uint salt_len = input_len - 32 - 1;
11163
11164 char *salt_buf = input_buf + 32 + 1;
11165
11166 char *salt_buf_ptr = (char *) salt->salt_buf;
11167
11168 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11169
11170 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11171
11172 salt->salt_len = salt_len;
11173
11174 return (PARSER_OK);
11175 }
11176
11177 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11178 {
11179 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11180
11181 u32 *digest = (u32 *) hash_buf->digest;
11182
11183 salt_t *salt = hash_buf->salt;
11184
11185 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11186 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11187 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11188 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11189
11190 digest[0] = byte_swap_32 (digest[0]);
11191 digest[1] = byte_swap_32 (digest[1]);
11192 digest[2] = byte_swap_32 (digest[2]);
11193 digest[3] = byte_swap_32 (digest[3]);
11194
11195 digest[0] -= MD5M_A;
11196 digest[1] -= MD5M_B;
11197 digest[2] -= MD5M_C;
11198 digest[3] -= MD5M_D;
11199
11200 /**
11201 * This is a virtual salt. While the algorithm is basically not salted
11202 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11203 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11204 */
11205
11206 char *salt_buf_ptr = (char *) salt->salt_buf;
11207
11208 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11209
11210 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11211
11212 salt->salt_len = salt_len;
11213
11214 return (PARSER_OK);
11215 }
11216
11217 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11218 {
11219 if (data.opts_type & OPTS_TYPE_ST_HEX)
11220 {
11221 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11222 }
11223 else
11224 {
11225 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11226 }
11227
11228 u32 *digest = (u32 *) hash_buf->digest;
11229
11230 salt_t *salt = hash_buf->salt;
11231
11232 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11233 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11234 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11235 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11236
11237 digest[0] = byte_swap_32 (digest[0]);
11238 digest[1] = byte_swap_32 (digest[1]);
11239 digest[2] = byte_swap_32 (digest[2]);
11240 digest[3] = byte_swap_32 (digest[3]);
11241
11242 digest[0] -= MD5M_A;
11243 digest[1] -= MD5M_B;
11244 digest[2] -= MD5M_C;
11245 digest[3] -= MD5M_D;
11246
11247 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11248
11249 uint salt_len = input_len - 32 - 1;
11250
11251 char *salt_buf = input_buf + 32 + 1;
11252
11253 char *salt_buf_ptr = (char *) salt->salt_buf;
11254
11255 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11256
11257 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11258
11259 salt->salt_len = salt_len;
11260
11261 return (PARSER_OK);
11262 }
11263
11264 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11265 {
11266 if (data.opts_type & OPTS_TYPE_ST_HEX)
11267 {
11268 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11269 }
11270 else
11271 {
11272 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11273 }
11274
11275 u32 *digest = (u32 *) hash_buf->digest;
11276
11277 salt_t *salt = hash_buf->salt;
11278
11279 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11280 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11281 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11282 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11283
11284 digest[0] = byte_swap_32 (digest[0]);
11285 digest[1] = byte_swap_32 (digest[1]);
11286 digest[2] = byte_swap_32 (digest[2]);
11287 digest[3] = byte_swap_32 (digest[3]);
11288
11289 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11290
11291 uint salt_len = input_len - 32 - 1;
11292
11293 char *salt_buf = input_buf + 32 + 1;
11294
11295 char *salt_buf_ptr = (char *) salt->salt_buf;
11296
11297 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11298
11299 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11300
11301 salt->salt_len = salt_len;
11302
11303 return (PARSER_OK);
11304 }
11305
11306 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11307 {
11308 if (data.opts_type & OPTS_TYPE_ST_HEX)
11309 {
11310 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11311 }
11312 else
11313 {
11314 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11315 }
11316
11317 u32 *digest = (u32 *) hash_buf->digest;
11318
11319 salt_t *salt = hash_buf->salt;
11320
11321 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11322 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11323 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11324 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11325
11326 digest[0] = byte_swap_32 (digest[0]);
11327 digest[1] = byte_swap_32 (digest[1]);
11328 digest[2] = byte_swap_32 (digest[2]);
11329 digest[3] = byte_swap_32 (digest[3]);
11330
11331 digest[0] -= MD4M_A;
11332 digest[1] -= MD4M_B;
11333 digest[2] -= MD4M_C;
11334 digest[3] -= MD4M_D;
11335
11336 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11337
11338 uint salt_len = input_len - 32 - 1;
11339
11340 char *salt_buf = input_buf + 32 + 1;
11341
11342 char *salt_buf_ptr = (char *) salt->salt_buf;
11343
11344 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11345
11346 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11347
11348 salt->salt_len = salt_len;
11349
11350 return (PARSER_OK);
11351 }
11352
11353 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11354 {
11355 if (data.opts_type & OPTS_TYPE_ST_HEX)
11356 {
11357 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11358 }
11359 else
11360 {
11361 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11362 }
11363
11364 u32 *digest = (u32 *) hash_buf->digest;
11365
11366 salt_t *salt = hash_buf->salt;
11367
11368 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11369 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11370 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11371 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11372
11373 digest[0] = byte_swap_32 (digest[0]);
11374 digest[1] = byte_swap_32 (digest[1]);
11375 digest[2] = byte_swap_32 (digest[2]);
11376 digest[3] = byte_swap_32 (digest[3]);
11377
11378 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11379
11380 uint salt_len = input_len - 32 - 1;
11381
11382 char *salt_buf = input_buf + 32 + 1;
11383
11384 uint salt_pc_block[16] = { 0 };
11385
11386 char *salt_pc_block_ptr = (char *) salt_pc_block;
11387
11388 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11389
11390 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11391
11392 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11393
11394 salt_pc_block[14] = salt_len * 8;
11395
11396 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
11397
11398 md5_64 (salt_pc_block, salt_pc_digest);
11399
11400 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11401 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11402 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11403 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11404
11405 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11406
11407 memcpy (salt_buf_ptr, salt_buf, salt_len);
11408
11409 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11410
11411 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11412 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11413 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11414 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11415
11416 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11417
11418 return (PARSER_OK);
11419 }
11420
11421 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11422 {
11423 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11424
11425 u32 *digest = (u32 *) hash_buf->digest;
11426
11427 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11428 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11429 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11430 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11431 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11432
11433 digest[0] -= SHA1M_A;
11434 digest[1] -= SHA1M_B;
11435 digest[2] -= SHA1M_C;
11436 digest[3] -= SHA1M_D;
11437 digest[4] -= SHA1M_E;
11438
11439 return (PARSER_OK);
11440 }
11441
11442 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11443 {
11444 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11445
11446 u32 *digest = (u32 *) hash_buf->digest;
11447
11448 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11449 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11450 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11451 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11452 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11453
11454 return (PARSER_OK);
11455 }
11456
11457 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11458 {
11459 if (data.opts_type & OPTS_TYPE_ST_HEX)
11460 {
11461 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11462 }
11463 else
11464 {
11465 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11466 }
11467
11468 u32 *digest = (u32 *) hash_buf->digest;
11469
11470 salt_t *salt = hash_buf->salt;
11471
11472 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11473 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11474 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11475 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11476 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11477
11478 digest[0] -= SHA1M_A;
11479 digest[1] -= SHA1M_B;
11480 digest[2] -= SHA1M_C;
11481 digest[3] -= SHA1M_D;
11482 digest[4] -= SHA1M_E;
11483
11484 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11485
11486 uint salt_len = input_len - 40 - 1;
11487
11488 char *salt_buf = input_buf + 40 + 1;
11489
11490 char *salt_buf_ptr = (char *) salt->salt_buf;
11491
11492 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11493
11494 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11495
11496 salt->salt_len = salt_len;
11497
11498 return (PARSER_OK);
11499 }
11500
11501 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11502 {
11503 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11504
11505 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11506
11507 u32 *digest = (u32 *) hash_buf->digest;
11508
11509 u8 tmp_buf[100] = { 0 };
11510
11511 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
11512
11513 memcpy (digest, tmp_buf, 20);
11514
11515 digest[0] = byte_swap_32 (digest[0]);
11516 digest[1] = byte_swap_32 (digest[1]);
11517 digest[2] = byte_swap_32 (digest[2]);
11518 digest[3] = byte_swap_32 (digest[3]);
11519 digest[4] = byte_swap_32 (digest[4]);
11520
11521 digest[0] -= SHA1M_A;
11522 digest[1] -= SHA1M_B;
11523 digest[2] -= SHA1M_C;
11524 digest[3] -= SHA1M_D;
11525 digest[4] -= SHA1M_E;
11526
11527 return (PARSER_OK);
11528 }
11529
11530 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11531 {
11532 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11533
11534 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11535
11536 u32 *digest = (u32 *) hash_buf->digest;
11537
11538 salt_t *salt = hash_buf->salt;
11539
11540 u8 tmp_buf[100] = { 0 };
11541
11542 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
11543
11544 memcpy (digest, tmp_buf, 20);
11545
11546 salt->salt_len = tmp_len - 20;
11547
11548 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11549
11550 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11551 {
11552 char *ptr = (char *) salt->salt_buf;
11553
11554 ptr[salt->salt_len] = 0x80;
11555 }
11556
11557 digest[0] = byte_swap_32 (digest[0]);
11558 digest[1] = byte_swap_32 (digest[1]);
11559 digest[2] = byte_swap_32 (digest[2]);
11560 digest[3] = byte_swap_32 (digest[3]);
11561 digest[4] = byte_swap_32 (digest[4]);
11562
11563 digest[0] -= SHA1M_A;
11564 digest[1] -= SHA1M_B;
11565 digest[2] -= SHA1M_C;
11566 digest[3] -= SHA1M_D;
11567 digest[4] -= SHA1M_E;
11568
11569 return (PARSER_OK);
11570 }
11571
11572 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11573 {
11574 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11575
11576 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11577
11578 u32 *digest = (u32 *) hash_buf->digest;
11579
11580 salt_t *salt = hash_buf->salt;
11581
11582 char *salt_buf = input_buf + 6;
11583
11584 uint salt_len = 8;
11585
11586 char *salt_buf_ptr = (char *) salt->salt_buf;
11587
11588 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11589
11590 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11591
11592 salt->salt_len = salt_len;
11593
11594 char *hash_pos = input_buf + 6 + 8 + 40;
11595
11596 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11597 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11598 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11599 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11600 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11601
11602 digest[0] -= SHA1M_A;
11603 digest[1] -= SHA1M_B;
11604 digest[2] -= SHA1M_C;
11605 digest[3] -= SHA1M_D;
11606 digest[4] -= SHA1M_E;
11607
11608 return (PARSER_OK);
11609 }
11610
11611 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11612 {
11613 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11614
11615 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11616
11617 u32 *digest = (u32 *) hash_buf->digest;
11618
11619 salt_t *salt = hash_buf->salt;
11620
11621 char *salt_buf = input_buf + 6;
11622
11623 uint salt_len = 8;
11624
11625 char *salt_buf_ptr = (char *) salt->salt_buf;
11626
11627 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11628
11629 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11630
11631 salt->salt_len = salt_len;
11632
11633 char *hash_pos = input_buf + 6 + 8;
11634
11635 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11636 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11637 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11638 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11639 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11640
11641 digest[0] -= SHA1M_A;
11642 digest[1] -= SHA1M_B;
11643 digest[2] -= SHA1M_C;
11644 digest[3] -= SHA1M_D;
11645 digest[4] -= SHA1M_E;
11646
11647 return (PARSER_OK);
11648 }
11649
11650 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11651 {
11652 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11653
11654 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11655
11656 u64 *digest = (u64 *) hash_buf->digest;
11657
11658 salt_t *salt = hash_buf->salt;
11659
11660 char *salt_buf = input_buf + 6;
11661
11662 uint salt_len = 8;
11663
11664 char *salt_buf_ptr = (char *) salt->salt_buf;
11665
11666 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11667
11668 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11669
11670 salt->salt_len = salt_len;
11671
11672 char *hash_pos = input_buf + 6 + 8;
11673
11674 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
11675 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
11676 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
11677 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
11678 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
11679 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
11680 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
11681 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
11682
11683 digest[0] -= SHA512M_A;
11684 digest[1] -= SHA512M_B;
11685 digest[2] -= SHA512M_C;
11686 digest[3] -= SHA512M_D;
11687 digest[4] -= SHA512M_E;
11688 digest[5] -= SHA512M_F;
11689 digest[6] -= SHA512M_G;
11690 digest[7] -= SHA512M_H;
11691
11692 return (PARSER_OK);
11693 }
11694
11695 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11696 {
11697 if (data.opts_type & OPTS_TYPE_ST_HEX)
11698 {
11699 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11700 }
11701 else
11702 {
11703 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11704 }
11705
11706 u32 *digest = (u32 *) hash_buf->digest;
11707
11708 salt_t *salt = hash_buf->salt;
11709
11710 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11711 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11712 digest[2] = 0;
11713 digest[3] = 0;
11714
11715 digest[0] = byte_swap_32 (digest[0]);
11716 digest[1] = byte_swap_32 (digest[1]);
11717
11718 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11719
11720 uint salt_len = input_len - 16 - 1;
11721
11722 char *salt_buf = input_buf + 16 + 1;
11723
11724 char *salt_buf_ptr = (char *) salt->salt_buf;
11725
11726 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11727
11728 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11729
11730 salt->salt_len = salt_len;
11731
11732 return (PARSER_OK);
11733 }
11734
11735 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11736 {
11737 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11738
11739 u32 *digest = (u32 *) hash_buf->digest;
11740
11741 salt_t *salt = hash_buf->salt;
11742
11743 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11744 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11745 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11746 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11747 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11748
11749 digest[0] -= SHA1M_A;
11750 digest[1] -= SHA1M_B;
11751 digest[2] -= SHA1M_C;
11752 digest[3] -= SHA1M_D;
11753 digest[4] -= SHA1M_E;
11754
11755 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11756
11757 uint salt_len = input_len - 40 - 1;
11758
11759 char *salt_buf = input_buf + 40 + 1;
11760
11761 char *salt_buf_ptr = (char *) salt->salt_buf;
11762
11763 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11764
11765 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11766
11767 salt->salt_len = salt_len;
11768
11769 return (PARSER_OK);
11770 }
11771
11772 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11773 {
11774 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11775
11776 u32 *digest = (u32 *) hash_buf->digest;
11777
11778 salt_t *salt = hash_buf->salt;
11779
11780 char *hash_pos = input_buf;
11781
11782 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11783 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11784 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
11785 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
11786 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
11787 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
11788 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
11789 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
11790 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
11791 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
11792 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
11793 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
11794 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
11795 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
11796 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
11797 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
11798
11799 char *salt_pos = input_buf + 128;
11800
11801 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
11802 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
11803 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
11804 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
11805
11806 salt->salt_iter = ROUNDS_ORACLET - 1;
11807 salt->salt_len = 16;
11808
11809 return (PARSER_OK);
11810 }
11811
11812 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11813 {
11814 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11815
11816 u32 *digest = (u32 *) hash_buf->digest;
11817
11818 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11819 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11820 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11821 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11822 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11823 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11824 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11825 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11826
11827 digest[0] -= SHA256M_A;
11828 digest[1] -= SHA256M_B;
11829 digest[2] -= SHA256M_C;
11830 digest[3] -= SHA256M_D;
11831 digest[4] -= SHA256M_E;
11832 digest[5] -= SHA256M_F;
11833 digest[6] -= SHA256M_G;
11834 digest[7] -= SHA256M_H;
11835
11836 return (PARSER_OK);
11837 }
11838
11839 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11840 {
11841 if (data.opts_type & OPTS_TYPE_ST_HEX)
11842 {
11843 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11844 }
11845 else
11846 {
11847 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11848 }
11849
11850 u32 *digest = (u32 *) hash_buf->digest;
11851
11852 salt_t *salt = hash_buf->salt;
11853
11854 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11855 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11856 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11857 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11858 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11859 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11860 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11861 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11862
11863 digest[0] -= SHA256M_A;
11864 digest[1] -= SHA256M_B;
11865 digest[2] -= SHA256M_C;
11866 digest[3] -= SHA256M_D;
11867 digest[4] -= SHA256M_E;
11868 digest[5] -= SHA256M_F;
11869 digest[6] -= SHA256M_G;
11870 digest[7] -= SHA256M_H;
11871
11872 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11873
11874 uint salt_len = input_len - 64 - 1;
11875
11876 char *salt_buf = input_buf + 64 + 1;
11877
11878 char *salt_buf_ptr = (char *) salt->salt_buf;
11879
11880 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11881
11882 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11883
11884 salt->salt_len = salt_len;
11885
11886 return (PARSER_OK);
11887 }
11888
11889 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11890 {
11891 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11892
11893 u64 *digest = (u64 *) hash_buf->digest;
11894
11895 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11896 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11897 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11898 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11899 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11900 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11901 digest[6] = 0;
11902 digest[7] = 0;
11903
11904 digest[0] -= SHA384M_A;
11905 digest[1] -= SHA384M_B;
11906 digest[2] -= SHA384M_C;
11907 digest[3] -= SHA384M_D;
11908 digest[4] -= SHA384M_E;
11909 digest[5] -= SHA384M_F;
11910 digest[6] -= 0;
11911 digest[7] -= 0;
11912
11913 return (PARSER_OK);
11914 }
11915
11916 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11917 {
11918 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
11919
11920 u64 *digest = (u64 *) hash_buf->digest;
11921
11922 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11923 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11924 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11925 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11926 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11927 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11928 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11929 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11930
11931 digest[0] -= SHA512M_A;
11932 digest[1] -= SHA512M_B;
11933 digest[2] -= SHA512M_C;
11934 digest[3] -= SHA512M_D;
11935 digest[4] -= SHA512M_E;
11936 digest[5] -= SHA512M_F;
11937 digest[6] -= SHA512M_G;
11938 digest[7] -= SHA512M_H;
11939
11940 return (PARSER_OK);
11941 }
11942
11943 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11944 {
11945 if (data.opts_type & OPTS_TYPE_ST_HEX)
11946 {
11947 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
11948 }
11949 else
11950 {
11951 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
11952 }
11953
11954 u64 *digest = (u64 *) hash_buf->digest;
11955
11956 salt_t *salt = hash_buf->salt;
11957
11958 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11959 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11960 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11961 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11962 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11963 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11964 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11965 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11966
11967 digest[0] -= SHA512M_A;
11968 digest[1] -= SHA512M_B;
11969 digest[2] -= SHA512M_C;
11970 digest[3] -= SHA512M_D;
11971 digest[4] -= SHA512M_E;
11972 digest[5] -= SHA512M_F;
11973 digest[6] -= SHA512M_G;
11974 digest[7] -= SHA512M_H;
11975
11976 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11977
11978 uint salt_len = input_len - 128 - 1;
11979
11980 char *salt_buf = input_buf + 128 + 1;
11981
11982 char *salt_buf_ptr = (char *) salt->salt_buf;
11983
11984 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11985
11986 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11987
11988 salt->salt_len = salt_len;
11989
11990 return (PARSER_OK);
11991 }
11992
11993 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11994 {
11995 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
11996
11997 u64 *digest = (u64 *) hash_buf->digest;
11998
11999 salt_t *salt = hash_buf->salt;
12000
12001 char *salt_pos = input_buf + 3;
12002
12003 uint iterations_len = 0;
12004
12005 if (memcmp (salt_pos, "rounds=", 7) == 0)
12006 {
12007 salt_pos += 7;
12008
12009 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12010
12011 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12012 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12013
12014 salt_pos[0] = 0x0;
12015
12016 salt->salt_iter = atoi (salt_pos - iterations_len);
12017
12018 salt_pos += 1;
12019
12020 iterations_len += 8;
12021 }
12022 else
12023 {
12024 salt->salt_iter = ROUNDS_SHA512CRYPT;
12025 }
12026
12027 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12028
12029 char *hash_pos = strchr (salt_pos, '$');
12030
12031 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12032
12033 uint salt_len = hash_pos - salt_pos;
12034
12035 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12036
12037 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12038
12039 salt->salt_len = salt_len;
12040
12041 hash_pos++;
12042
12043 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12044
12045 return (PARSER_OK);
12046 }
12047
12048 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12049 {
12050 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12051
12052 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12053
12054 u64 *digest = (u64 *) hash_buf->digest;
12055
12056 salt_t *salt = hash_buf->salt;
12057
12058 uint keccak_mdlen = input_len / 2;
12059
12060 for (uint i = 0; i < keccak_mdlen / 8; i++)
12061 {
12062 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12063
12064 digest[i] = byte_swap_64 (digest[i]);
12065 }
12066
12067 salt->keccak_mdlen = keccak_mdlen;
12068
12069 return (PARSER_OK);
12070 }
12071
12072 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12073 {
12074 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12075
12076 u32 *digest = (u32 *) hash_buf->digest;
12077
12078 salt_t *salt = hash_buf->salt;
12079
12080 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12081
12082 /**
12083 * Parse that strange long line
12084 */
12085
12086 char *in_off[9];
12087
12088 size_t in_len[9] = { 0 };
12089
12090 in_off[0] = strtok (input_buf, ":");
12091
12092 in_len[0] = strlen (in_off[0]);
12093
12094 size_t i;
12095
12096 for (i = 1; i < 9; i++)
12097 {
12098 in_off[i] = strtok (NULL, ":");
12099
12100 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12101
12102 in_len[i] = strlen (in_off[i]);
12103 }
12104
12105 char *ptr = (char *) ikepsk->msg_buf;
12106
12107 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12108 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12109 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12110 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12111 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12112 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12113
12114 *ptr = 0x80;
12115
12116 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12117
12118 ptr = (char *) ikepsk->nr_buf;
12119
12120 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12121 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12122
12123 *ptr = 0x80;
12124
12125 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12126
12127 /**
12128 * Store to database
12129 */
12130
12131 ptr = in_off[8];
12132
12133 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12134 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12135 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12136 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12137
12138 digest[0] = byte_swap_32 (digest[0]);
12139 digest[1] = byte_swap_32 (digest[1]);
12140 digest[2] = byte_swap_32 (digest[2]);
12141 digest[3] = byte_swap_32 (digest[3]);
12142
12143 salt->salt_len = 32;
12144
12145 salt->salt_buf[0] = ikepsk->nr_buf[0];
12146 salt->salt_buf[1] = ikepsk->nr_buf[1];
12147 salt->salt_buf[2] = ikepsk->nr_buf[2];
12148 salt->salt_buf[3] = ikepsk->nr_buf[3];
12149 salt->salt_buf[4] = ikepsk->nr_buf[4];
12150 salt->salt_buf[5] = ikepsk->nr_buf[5];
12151 salt->salt_buf[6] = ikepsk->nr_buf[6];
12152 salt->salt_buf[7] = ikepsk->nr_buf[7];
12153
12154 return (PARSER_OK);
12155 }
12156
12157 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12158 {
12159 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12160
12161 u32 *digest = (u32 *) hash_buf->digest;
12162
12163 salt_t *salt = hash_buf->salt;
12164
12165 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12166
12167 /**
12168 * Parse that strange long line
12169 */
12170
12171 char *in_off[9];
12172
12173 size_t in_len[9] = { 0 };
12174
12175 in_off[0] = strtok (input_buf, ":");
12176
12177 in_len[0] = strlen (in_off[0]);
12178
12179 size_t i;
12180
12181 for (i = 1; i < 9; i++)
12182 {
12183 in_off[i] = strtok (NULL, ":");
12184
12185 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12186
12187 in_len[i] = strlen (in_off[i]);
12188 }
12189
12190 char *ptr = (char *) ikepsk->msg_buf;
12191
12192 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12193 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12194 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12195 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12196 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12197 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12198
12199 *ptr = 0x80;
12200
12201 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12202
12203 ptr = (char *) ikepsk->nr_buf;
12204
12205 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12206 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12207
12208 *ptr = 0x80;
12209
12210 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12211
12212 /**
12213 * Store to database
12214 */
12215
12216 ptr = in_off[8];
12217
12218 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12219 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12220 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12221 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12222 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12223
12224 salt->salt_len = 32;
12225
12226 salt->salt_buf[0] = ikepsk->nr_buf[0];
12227 salt->salt_buf[1] = ikepsk->nr_buf[1];
12228 salt->salt_buf[2] = ikepsk->nr_buf[2];
12229 salt->salt_buf[3] = ikepsk->nr_buf[3];
12230 salt->salt_buf[4] = ikepsk->nr_buf[4];
12231 salt->salt_buf[5] = ikepsk->nr_buf[5];
12232 salt->salt_buf[6] = ikepsk->nr_buf[6];
12233 salt->salt_buf[7] = ikepsk->nr_buf[7];
12234
12235 return (PARSER_OK);
12236 }
12237
12238 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12239 {
12240 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12241
12242 u32 *digest = (u32 *) hash_buf->digest;
12243
12244 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12245 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12246 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12247 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12248 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12249
12250 digest[0] = byte_swap_32 (digest[0]);
12251 digest[1] = byte_swap_32 (digest[1]);
12252 digest[2] = byte_swap_32 (digest[2]);
12253 digest[3] = byte_swap_32 (digest[3]);
12254 digest[4] = byte_swap_32 (digest[4]);
12255
12256 return (PARSER_OK);
12257 }
12258
12259 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12260 {
12261 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12262
12263 u32 *digest = (u32 *) hash_buf->digest;
12264
12265 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12266 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12267 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12268 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12269 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12270 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12271 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12272 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12273 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12274 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12275 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12276 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12277 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12278 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12279 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12280 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12281
12282 return (PARSER_OK);
12283 }
12284
12285 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12286 {
12287 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12288
12289 u32 *digest = (u32 *) hash_buf->digest;
12290
12291 salt_t *salt = hash_buf->salt;
12292
12293 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12294 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12295 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12296 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12297 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12298
12299 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12300
12301 uint salt_len = input_len - 40 - 1;
12302
12303 char *salt_buf = input_buf + 40 + 1;
12304
12305 char *salt_buf_ptr = (char *) salt->salt_buf;
12306
12307 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12308
12309 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12310
12311 salt->salt_len = salt_len;
12312
12313 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12314
12315 return (PARSER_OK);
12316 }
12317
12318 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12319 {
12320 u32 *digest = (u32 *) hash_buf->digest;
12321
12322 salt_t *salt = hash_buf->salt;
12323
12324 tc_t *tc = (tc_t *) hash_buf->esalt;
12325
12326 if (input_len == 0)
12327 {
12328 log_error ("TrueCrypt container not specified");
12329
12330 exit (-1);
12331 }
12332
12333 FILE *fp = fopen (input_buf, "rb");
12334
12335 if (fp == NULL)
12336 {
12337 log_error ("%s: %s", input_buf, strerror (errno));
12338
12339 exit (-1);
12340 }
12341
12342 char buf[512] = { 0 };
12343
12344 int n = fread (buf, 1, sizeof (buf), fp);
12345
12346 fclose (fp);
12347
12348 if (n != 512) return (PARSER_TC_FILE_SIZE);
12349
12350 memcpy (tc->salt_buf, buf, 64);
12351
12352 memcpy (tc->data_buf, buf + 64, 512 - 64);
12353
12354 salt->salt_buf[0] = tc->salt_buf[0];
12355
12356 salt->salt_len = 4;
12357
12358 salt->salt_iter = 1000 - 1;
12359
12360 digest[0] = tc->data_buf[0];
12361
12362 return (PARSER_OK);
12363 }
12364
12365 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12366 {
12367 u32 *digest = (u32 *) hash_buf->digest;
12368
12369 salt_t *salt = hash_buf->salt;
12370
12371 tc_t *tc = (tc_t *) hash_buf->esalt;
12372
12373 if (input_len == 0)
12374 {
12375 log_error ("TrueCrypt container not specified");
12376
12377 exit (-1);
12378 }
12379
12380 FILE *fp = fopen (input_buf, "rb");
12381
12382 if (fp == NULL)
12383 {
12384 log_error ("%s: %s", input_buf, strerror (errno));
12385
12386 exit (-1);
12387 }
12388
12389 char buf[512] = { 0 };
12390
12391 int n = fread (buf, 1, sizeof (buf), fp);
12392
12393 fclose (fp);
12394
12395 if (n != 512) return (PARSER_TC_FILE_SIZE);
12396
12397 memcpy (tc->salt_buf, buf, 64);
12398
12399 memcpy (tc->data_buf, buf + 64, 512 - 64);
12400
12401 salt->salt_buf[0] = tc->salt_buf[0];
12402
12403 salt->salt_len = 4;
12404
12405 salt->salt_iter = 2000 - 1;
12406
12407 digest[0] = tc->data_buf[0];
12408
12409 return (PARSER_OK);
12410 }
12411
12412 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12413 {
12414 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12415
12416 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12417
12418 u32 *digest = (u32 *) hash_buf->digest;
12419
12420 salt_t *salt = hash_buf->salt;
12421
12422 char *salt_pos = input_buf + 6;
12423
12424 char *hash_pos = strchr (salt_pos, '$');
12425
12426 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12427
12428 uint salt_len = hash_pos - salt_pos;
12429
12430 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12431
12432 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12433
12434 salt->salt_len = salt_len;
12435
12436 salt->salt_iter = 1000;
12437
12438 hash_pos++;
12439
12440 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12441
12442 return (PARSER_OK);
12443 }
12444
12445 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12446 {
12447 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12448
12449 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12450
12451 u32 *digest = (u32 *) hash_buf->digest;
12452
12453 salt_t *salt = hash_buf->salt;
12454
12455 char *iter_pos = input_buf + 7;
12456
12457 char *salt_pos = strchr (iter_pos, '$');
12458
12459 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12460
12461 salt_pos++;
12462
12463 char *hash_pos = strchr (salt_pos, '$');
12464
12465 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12466
12467 uint salt_len = hash_pos - salt_pos;
12468
12469 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12470
12471 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12472
12473 salt->salt_len = salt_len;
12474
12475 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12476
12477 salt->salt_sign[0] = atoi (salt_iter);
12478
12479 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12480
12481 hash_pos++;
12482
12483 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12484
12485 digest[0] = byte_swap_32 (digest[0]);
12486 digest[1] = byte_swap_32 (digest[1]);
12487 digest[2] = byte_swap_32 (digest[2]);
12488 digest[3] = byte_swap_32 (digest[3]);
12489 digest[4] = byte_swap_32 (digest[4]);
12490
12491 return (PARSER_OK);
12492 }
12493
12494 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12495 {
12496 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12497
12498 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12499
12500 u32 *digest = (u32 *) hash_buf->digest;
12501
12502 salt_t *salt = hash_buf->salt;
12503
12504 char *iter_pos = input_buf + 9;
12505
12506 char *salt_pos = strchr (iter_pos, '$');
12507
12508 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12509
12510 salt_pos++;
12511
12512 char *hash_pos = strchr (salt_pos, '$');
12513
12514 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12515
12516 uint salt_len = hash_pos - salt_pos;
12517
12518 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12519
12520 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12521
12522 salt->salt_len = salt_len;
12523
12524 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12525
12526 salt->salt_sign[0] = atoi (salt_iter);
12527
12528 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12529
12530 hash_pos++;
12531
12532 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12533
12534 digest[0] = byte_swap_32 (digest[0]);
12535 digest[1] = byte_swap_32 (digest[1]);
12536 digest[2] = byte_swap_32 (digest[2]);
12537 digest[3] = byte_swap_32 (digest[3]);
12538 digest[4] = byte_swap_32 (digest[4]);
12539 digest[5] = byte_swap_32 (digest[5]);
12540 digest[6] = byte_swap_32 (digest[6]);
12541 digest[7] = byte_swap_32 (digest[7]);
12542
12543 return (PARSER_OK);
12544 }
12545
12546 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12547 {
12548 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12549
12550 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12551
12552 u64 *digest = (u64 *) hash_buf->digest;
12553
12554 salt_t *salt = hash_buf->salt;
12555
12556 char *iter_pos = input_buf + 9;
12557
12558 char *salt_pos = strchr (iter_pos, '$');
12559
12560 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12561
12562 salt_pos++;
12563
12564 char *hash_pos = strchr (salt_pos, '$');
12565
12566 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12567
12568 uint salt_len = hash_pos - salt_pos;
12569
12570 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12571
12572 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12573
12574 salt->salt_len = salt_len;
12575
12576 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12577
12578 salt->salt_sign[0] = atoi (salt_iter);
12579
12580 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12581
12582 hash_pos++;
12583
12584 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12585
12586 digest[0] = byte_swap_64 (digest[0]);
12587 digest[1] = byte_swap_64 (digest[1]);
12588 digest[2] = byte_swap_64 (digest[2]);
12589 digest[3] = byte_swap_64 (digest[3]);
12590 digest[4] = byte_swap_64 (digest[4]);
12591 digest[5] = byte_swap_64 (digest[5]);
12592 digest[6] = byte_swap_64 (digest[6]);
12593 digest[7] = byte_swap_64 (digest[7]);
12594
12595 return (PARSER_OK);
12596 }
12597
12598 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12599 {
12600 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12601
12602 u32 *digest = (u32 *) hash_buf->digest;
12603
12604 salt_t *salt = hash_buf->salt;
12605
12606 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12607
12608 /**
12609 * parse line
12610 */
12611
12612 char *iterations_pos = input_buf;
12613
12614 char *saltbuf_pos = strchr (iterations_pos, ':');
12615
12616 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12617
12618 uint iterations_len = saltbuf_pos - iterations_pos;
12619
12620 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12621
12622 saltbuf_pos++;
12623
12624 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12625
12626 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12627
12628 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12629
12630 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12631
12632 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12633
12634 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12635
12636 cipherbuf_pos++;
12637
12638 /**
12639 * pbkdf2 iterations
12640 */
12641
12642 salt->salt_iter = atoi (iterations_pos) - 1;
12643
12644 /**
12645 * handle salt encoding
12646 */
12647
12648 char *saltbuf_ptr = (char *) salt->salt_buf;
12649
12650 for (uint i = 0; i < saltbuf_len; i += 2)
12651 {
12652 const char p0 = saltbuf_pos[i + 0];
12653 const char p1 = saltbuf_pos[i + 1];
12654
12655 *saltbuf_ptr++ = hex_convert (p1) << 0
12656 | hex_convert (p0) << 4;
12657 }
12658
12659 salt->salt_len = saltbuf_len / 2;
12660
12661 /**
12662 * handle cipher encoding
12663 */
12664
12665 uint *tmp = (uint *) mymalloc (32);
12666
12667 char *cipherbuf_ptr = (char *) tmp;
12668
12669 for (uint i = 2016; i < cipherbuf_len; i += 2)
12670 {
12671 const char p0 = cipherbuf_pos[i + 0];
12672 const char p1 = cipherbuf_pos[i + 1];
12673
12674 *cipherbuf_ptr++ = hex_convert (p1) << 0
12675 | hex_convert (p0) << 4;
12676 }
12677
12678 // iv is stored at salt_buf 4 (length 16)
12679 // data is stored at salt_buf 8 (length 16)
12680
12681 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12682 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12683 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12684 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12685
12686 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12687 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12688 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12689 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12690
12691 free (tmp);
12692
12693 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12694 {
12695 const char p0 = cipherbuf_pos[j + 0];
12696 const char p1 = cipherbuf_pos[j + 1];
12697
12698 agilekey->cipher[i] = hex_convert (p1) << 0
12699 | hex_convert (p0) << 4;
12700 }
12701
12702 /**
12703 * digest buf
12704 */
12705
12706 digest[0] = 0x10101010;
12707 digest[1] = 0x10101010;
12708 digest[2] = 0x10101010;
12709 digest[3] = 0x10101010;
12710
12711 return (PARSER_OK);
12712 }
12713
12714 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12715 {
12716 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12717
12718 u32 *digest = (u32 *) hash_buf->digest;
12719
12720 salt_t *salt = hash_buf->salt;
12721
12722 char *hashbuf_pos = input_buf;
12723
12724 char *iterations_pos = strchr (hashbuf_pos, ':');
12725
12726 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12727
12728 uint hash_len = iterations_pos - hashbuf_pos;
12729
12730 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12731
12732 iterations_pos++;
12733
12734 char *saltbuf_pos = strchr (iterations_pos, ':');
12735
12736 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12737
12738 uint iterations_len = saltbuf_pos - iterations_pos;
12739
12740 saltbuf_pos++;
12741
12742 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12743
12744 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12745
12746 char *salt_buf_ptr = (char *) salt->salt_buf;
12747
12748 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12749
12750 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12751
12752 salt->salt_len = salt_len;
12753
12754 salt->salt_iter = atoi (iterations_pos) - 1;
12755
12756 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
12757 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
12758 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
12759 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
12760
12761 return (PARSER_OK);
12762 }
12763
12764 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12765 {
12766 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12767
12768 u32 *digest = (u32 *) hash_buf->digest;
12769
12770 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12771 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12772 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12773 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12774 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12775 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12776 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12777 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12778
12779 digest[0] = byte_swap_32 (digest[0]);
12780 digest[1] = byte_swap_32 (digest[1]);
12781 digest[2] = byte_swap_32 (digest[2]);
12782 digest[3] = byte_swap_32 (digest[3]);
12783 digest[4] = byte_swap_32 (digest[4]);
12784 digest[5] = byte_swap_32 (digest[5]);
12785 digest[6] = byte_swap_32 (digest[6]);
12786 digest[7] = byte_swap_32 (digest[7]);
12787
12788 return (PARSER_OK);
12789 }
12790
12791 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12792 {
12793 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12794
12795 u32 *digest = (u32 *) hash_buf->digest;
12796
12797 salt_t *salt = hash_buf->salt;
12798
12799 char *salt_pos = input_buf + 3;
12800
12801 uint iterations_len = 0;
12802
12803 if (memcmp (salt_pos, "rounds=", 7) == 0)
12804 {
12805 salt_pos += 7;
12806
12807 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12808
12809 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12810 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12811
12812 salt_pos[0] = 0x0;
12813
12814 salt->salt_iter = atoi (salt_pos - iterations_len);
12815
12816 salt_pos += 1;
12817
12818 iterations_len += 8;
12819 }
12820 else
12821 {
12822 salt->salt_iter = ROUNDS_SHA256CRYPT;
12823 }
12824
12825 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12826
12827 char *hash_pos = strchr (salt_pos, '$');
12828
12829 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12830
12831 uint salt_len = hash_pos - salt_pos;
12832
12833 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12834
12835 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12836
12837 salt->salt_len = salt_len;
12838
12839 hash_pos++;
12840
12841 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12842
12843 return (PARSER_OK);
12844 }
12845
12846 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12847 {
12848 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12849
12850 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12851
12852 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12853
12854 u64 *digest = (u64 *) hash_buf->digest;
12855
12856 salt_t *salt = hash_buf->salt;
12857
12858 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12859
12860 char *iter_pos = input_buf + 4;
12861
12862 char *salt_pos = strchr (iter_pos, '$');
12863
12864 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12865
12866 salt_pos++;
12867
12868 char *hash_pos = strchr (salt_pos, '$');
12869
12870 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12871
12872 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12873
12874 hash_pos++;
12875
12876 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12877 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12878 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12879 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12880 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12881 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12882 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12883 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12884
12885 uint salt_len = hash_pos - salt_pos - 1;
12886
12887 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12888
12889 salt->salt_len = salt_len / 2;
12890
12891 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12892 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12893 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12894 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12895 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
12896 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
12897 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
12898 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
12899
12900 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12901 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12902 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12903 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12904 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12905 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12906 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12907 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12908 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12909 pbkdf2_sha512->salt_buf[9] = 0x80;
12910
12911 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12912
12913 salt->salt_iter = atoi (iter_pos) - 1;
12914
12915 return (PARSER_OK);
12916 }
12917
12918 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12919 {
12920 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12921
12922 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12923
12924 u32 *digest = (u32 *) hash_buf->digest;
12925
12926 salt_t *salt = hash_buf->salt;
12927
12928 char *salt_pos = input_buf + 14;
12929
12930 char *hash_pos = strchr (salt_pos, '*');
12931
12932 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12933
12934 hash_pos++;
12935
12936 uint salt_len = hash_pos - salt_pos - 1;
12937
12938 char *salt_buf_ptr = (char *) salt->salt_buf;
12939
12940 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
12941
12942 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12943
12944 salt->salt_len = salt_len;
12945
12946 u8 tmp_buf[100] = { 0 };
12947
12948 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
12949
12950 memcpy (digest, tmp_buf, 32);
12951
12952 digest[0] = byte_swap_32 (digest[0]);
12953 digest[1] = byte_swap_32 (digest[1]);
12954 digest[2] = byte_swap_32 (digest[2]);
12955 digest[3] = byte_swap_32 (digest[3]);
12956 digest[4] = byte_swap_32 (digest[4]);
12957 digest[5] = byte_swap_32 (digest[5]);
12958 digest[6] = byte_swap_32 (digest[6]);
12959 digest[7] = byte_swap_32 (digest[7]);
12960
12961 digest[0] -= SHA256M_A;
12962 digest[1] -= SHA256M_B;
12963 digest[2] -= SHA256M_C;
12964 digest[3] -= SHA256M_D;
12965 digest[4] -= SHA256M_E;
12966 digest[5] -= SHA256M_F;
12967 digest[6] -= SHA256M_G;
12968 digest[7] -= SHA256M_H;
12969
12970 return (PARSER_OK);
12971 }
12972
12973 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12974 {
12975 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
12976
12977 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12978
12979 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
12980
12981 u64 *digest = (u64 *) hash_buf->digest;
12982
12983 salt_t *salt = hash_buf->salt;
12984
12985 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12986
12987 char *iter_pos = input_buf + 19;
12988
12989 char *salt_pos = strchr (iter_pos, '.');
12990
12991 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12992
12993 salt_pos++;
12994
12995 char *hash_pos = strchr (salt_pos, '.');
12996
12997 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12998
12999 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13000
13001 hash_pos++;
13002
13003 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13004 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13005 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13006 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13007 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13008 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13009 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13010 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13011
13012 uint salt_len = hash_pos - salt_pos - 1;
13013
13014 salt_len /= 2;
13015
13016 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13017
13018 uint i;
13019
13020 for (i = 0; i < salt_len; i++)
13021 {
13022 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13023 }
13024
13025 salt_buf_ptr[salt_len + 3] = 0x01;
13026 salt_buf_ptr[salt_len + 4] = 0x80;
13027
13028 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13029
13030 salt->salt_len = salt_len;
13031
13032 salt->salt_iter = atoi (iter_pos) - 1;
13033
13034 return (PARSER_OK);
13035 }
13036
13037 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13038 {
13039 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13040
13041 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13042
13043 u64 *digest = (u64 *) hash_buf->digest;
13044
13045 salt_t *salt = hash_buf->salt;
13046
13047 u8 tmp_buf[120] = { 0 };
13048
13049 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13050
13051 memcpy (digest, tmp_buf, 64);
13052
13053 digest[0] = byte_swap_64 (digest[0]);
13054 digest[1] = byte_swap_64 (digest[1]);
13055 digest[2] = byte_swap_64 (digest[2]);
13056 digest[3] = byte_swap_64 (digest[3]);
13057 digest[4] = byte_swap_64 (digest[4]);
13058 digest[5] = byte_swap_64 (digest[5]);
13059 digest[6] = byte_swap_64 (digest[6]);
13060 digest[7] = byte_swap_64 (digest[7]);
13061
13062 digest[0] -= SHA512M_A;
13063 digest[1] -= SHA512M_B;
13064 digest[2] -= SHA512M_C;
13065 digest[3] -= SHA512M_D;
13066 digest[4] -= SHA512M_E;
13067 digest[5] -= SHA512M_F;
13068 digest[6] -= SHA512M_G;
13069 digest[7] -= SHA512M_H;
13070
13071 salt->salt_len = tmp_len - 64;
13072
13073 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13074
13075 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13076 {
13077 char *ptr = (char *) salt->salt_buf;
13078
13079 ptr[salt->salt_len] = 0x80;
13080 }
13081
13082 return (PARSER_OK);
13083 }
13084
13085 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13086 {
13087 if (data.opts_type & OPTS_TYPE_ST_HEX)
13088 {
13089 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13090 }
13091 else
13092 {
13093 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13094 }
13095
13096 u32 *digest = (u32 *) hash_buf->digest;
13097
13098 salt_t *salt = hash_buf->salt;
13099
13100 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13101 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13102 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13103 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13104
13105 digest[0] = byte_swap_32 (digest[0]);
13106 digest[1] = byte_swap_32 (digest[1]);
13107 digest[2] = byte_swap_32 (digest[2]);
13108 digest[3] = byte_swap_32 (digest[3]);
13109
13110 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13111
13112 uint salt_len = input_len - 32 - 1;
13113
13114 char *salt_buf = input_buf + 32 + 1;
13115
13116 char *salt_buf_ptr = (char *) salt->salt_buf;
13117
13118 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13119
13120 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13121
13122 salt->salt_len = salt_len;
13123
13124 return (PARSER_OK);
13125 }
13126
13127 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13128 {
13129 if (data.opts_type & OPTS_TYPE_ST_HEX)
13130 {
13131 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13132 }
13133 else
13134 {
13135 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13136 }
13137
13138 u32 *digest = (u32 *) hash_buf->digest;
13139
13140 salt_t *salt = hash_buf->salt;
13141
13142 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13143 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13144 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13145 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13146 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13147
13148 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13149
13150 uint salt_len = input_len - 40 - 1;
13151
13152 char *salt_buf = input_buf + 40 + 1;
13153
13154 char *salt_buf_ptr = (char *) salt->salt_buf;
13155
13156 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13157
13158 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13159
13160 salt->salt_len = salt_len;
13161
13162 return (PARSER_OK);
13163 }
13164
13165 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13166 {
13167 if (data.opts_type & OPTS_TYPE_ST_HEX)
13168 {
13169 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13170 }
13171 else
13172 {
13173 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13174 }
13175
13176 u32 *digest = (u32 *) hash_buf->digest;
13177
13178 salt_t *salt = hash_buf->salt;
13179
13180 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13181 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13182 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13183 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13184 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13185 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13186 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13187 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13188
13189 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13190
13191 uint salt_len = input_len - 64 - 1;
13192
13193 char *salt_buf = input_buf + 64 + 1;
13194
13195 char *salt_buf_ptr = (char *) salt->salt_buf;
13196
13197 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13198
13199 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13200
13201 salt->salt_len = salt_len;
13202
13203 return (PARSER_OK);
13204 }
13205
13206 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13207 {
13208 if (data.opts_type & OPTS_TYPE_ST_HEX)
13209 {
13210 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13211 }
13212 else
13213 {
13214 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13215 }
13216
13217 u64 *digest = (u64 *) hash_buf->digest;
13218
13219 salt_t *salt = hash_buf->salt;
13220
13221 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
13222 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
13223 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
13224 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
13225 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
13226 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
13227 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
13228 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
13229
13230 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13231
13232 uint salt_len = input_len - 128 - 1;
13233
13234 char *salt_buf = input_buf + 128 + 1;
13235
13236 char *salt_buf_ptr = (char *) salt->salt_buf;
13237
13238 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13239
13240 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13241
13242 salt->salt_len = salt_len;
13243
13244 return (PARSER_OK);
13245 }
13246
13247 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13248 {
13249 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13250
13251 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13252
13253 u32 *digest = (u32 *) hash_buf->digest;
13254
13255 salt_t *salt = hash_buf->salt;
13256
13257 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13258
13259 /**
13260 * parse line
13261 */
13262
13263 char *user_pos = input_buf + 10 + 1;
13264
13265 char *realm_pos = strchr (user_pos, '$');
13266
13267 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13268
13269 uint user_len = realm_pos - user_pos;
13270
13271 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13272
13273 realm_pos++;
13274
13275 char *salt_pos = strchr (realm_pos, '$');
13276
13277 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13278
13279 uint realm_len = salt_pos - realm_pos;
13280
13281 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13282
13283 salt_pos++;
13284
13285 char *data_pos = strchr (salt_pos, '$');
13286
13287 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13288
13289 uint salt_len = data_pos - salt_pos;
13290
13291 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13292
13293 data_pos++;
13294
13295 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13296
13297 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13298
13299 /**
13300 * copy data
13301 */
13302
13303 memcpy (krb5pa->user, user_pos, user_len);
13304 memcpy (krb5pa->realm, realm_pos, realm_len);
13305 memcpy (krb5pa->salt, salt_pos, salt_len);
13306
13307 char *timestamp_ptr = (char *) krb5pa->timestamp;
13308
13309 for (uint i = 0; i < (36 * 2); i += 2)
13310 {
13311 const char p0 = data_pos[i + 0];
13312 const char p1 = data_pos[i + 1];
13313
13314 *timestamp_ptr++ = hex_convert (p1) << 0
13315 | hex_convert (p0) << 4;
13316 }
13317
13318 char *checksum_ptr = (char *) krb5pa->checksum;
13319
13320 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13321 {
13322 const char p0 = data_pos[i + 0];
13323 const char p1 = data_pos[i + 1];
13324
13325 *checksum_ptr++ = hex_convert (p1) << 0
13326 | hex_convert (p0) << 4;
13327 }
13328
13329 /**
13330 * copy some data to generic buffers to make sorting happy
13331 */
13332
13333 salt->salt_buf[0] = krb5pa->timestamp[0];
13334 salt->salt_buf[1] = krb5pa->timestamp[1];
13335 salt->salt_buf[2] = krb5pa->timestamp[2];
13336 salt->salt_buf[3] = krb5pa->timestamp[3];
13337 salt->salt_buf[4] = krb5pa->timestamp[4];
13338 salt->salt_buf[5] = krb5pa->timestamp[5];
13339 salt->salt_buf[6] = krb5pa->timestamp[6];
13340 salt->salt_buf[7] = krb5pa->timestamp[7];
13341 salt->salt_buf[8] = krb5pa->timestamp[8];
13342
13343 salt->salt_len = 36;
13344
13345 digest[0] = krb5pa->checksum[0];
13346 digest[1] = krb5pa->checksum[1];
13347 digest[2] = krb5pa->checksum[2];
13348 digest[3] = krb5pa->checksum[3];
13349
13350 return (PARSER_OK);
13351 }
13352
13353 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13354 {
13355 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13356
13357 u32 *digest = (u32 *) hash_buf->digest;
13358
13359 salt_t *salt = hash_buf->salt;
13360
13361 /**
13362 * parse line
13363 */
13364
13365 char *salt_pos = input_buf;
13366
13367 char *hash_pos = strchr (salt_pos, '$');
13368
13369 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13370
13371 uint salt_len = hash_pos - salt_pos;
13372
13373 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13374
13375 hash_pos++;
13376
13377 uint hash_len = input_len - 1 - salt_len;
13378
13379 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13380
13381 /**
13382 * valid some data
13383 */
13384
13385 uint user_len = 0;
13386
13387 for (uint i = 0; i < salt_len; i++)
13388 {
13389 if (salt_pos[i] == ' ') continue;
13390
13391 user_len++;
13392 }
13393
13394 // SAP user names cannot be longer than 12 characters
13395 if (user_len > 12) return (PARSER_SALT_LENGTH);
13396
13397 // SAP user name cannot start with ! or ?
13398 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13399
13400 /**
13401 * copy data
13402 */
13403
13404 char *salt_buf_ptr = (char *) salt->salt_buf;
13405
13406 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13407
13408 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13409
13410 salt->salt_len = salt_len;
13411
13412 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
13413 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
13414 digest[2] = 0;
13415 digest[3] = 0;
13416
13417 digest[0] = byte_swap_32 (digest[0]);
13418 digest[1] = byte_swap_32 (digest[1]);
13419
13420 return (PARSER_OK);
13421 }
13422
13423 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13424 {
13425 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13426
13427 u32 *digest = (u32 *) hash_buf->digest;
13428
13429 salt_t *salt = hash_buf->salt;
13430
13431 /**
13432 * parse line
13433 */
13434
13435 char *salt_pos = input_buf;
13436
13437 char *hash_pos = strchr (salt_pos, '$');
13438
13439 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13440
13441 uint salt_len = hash_pos - salt_pos;
13442
13443 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13444
13445 hash_pos++;
13446
13447 uint hash_len = input_len - 1 - salt_len;
13448
13449 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13450
13451 /**
13452 * valid some data
13453 */
13454
13455 uint user_len = 0;
13456
13457 for (uint i = 0; i < salt_len; i++)
13458 {
13459 if (salt_pos[i] == ' ') continue;
13460
13461 user_len++;
13462 }
13463
13464 // SAP user names cannot be longer than 12 characters
13465 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
13466 // so far nobody complained so we stay with this because it helps in optimization
13467 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
13468
13469 if (user_len > 12) return (PARSER_SALT_LENGTH);
13470
13471 // SAP user name cannot start with ! or ?
13472 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13473
13474 /**
13475 * copy data
13476 */
13477
13478 char *salt_buf_ptr = (char *) salt->salt_buf;
13479
13480 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13481
13482 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13483
13484 salt->salt_len = salt_len;
13485
13486 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13487 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13488 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13489 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13490 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13491
13492 return (PARSER_OK);
13493 }
13494
13495 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13496 {
13497 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13498
13499 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13500
13501 u64 *digest = (u64 *) hash_buf->digest;
13502
13503 salt_t *salt = hash_buf->salt;
13504
13505 char *iter_pos = input_buf + 3;
13506
13507 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13508
13509 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13510
13511 memcpy ((char *) salt->salt_sign, input_buf, 4);
13512
13513 salt->salt_iter = salt_iter;
13514
13515 char *salt_pos = iter_pos + 1;
13516
13517 uint salt_len = 8;
13518
13519 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13520
13521 salt->salt_len = salt_len;
13522
13523 char *hash_pos = salt_pos + salt_len;
13524
13525 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13526
13527 // ugly hack start
13528
13529 char *tmp = (char *) salt->salt_buf_pc;
13530
13531 tmp[0] = hash_pos[42];
13532
13533 // ugly hack end
13534
13535 digest[ 0] = byte_swap_64 (digest[ 0]);
13536 digest[ 1] = byte_swap_64 (digest[ 1]);
13537 digest[ 2] = byte_swap_64 (digest[ 2]);
13538 digest[ 3] = byte_swap_64 (digest[ 3]);
13539 digest[ 4] = 0;
13540 digest[ 5] = 0;
13541 digest[ 6] = 0;
13542 digest[ 7] = 0;
13543
13544 return (PARSER_OK);
13545 }
13546
13547 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13548 {
13549 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13550
13551 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13552
13553 u32 *digest = (u32 *) hash_buf->digest;
13554
13555 salt_t *salt = hash_buf->salt;
13556
13557 char *salt_buf = input_buf + 6;
13558
13559 uint salt_len = 16;
13560
13561 char *salt_buf_ptr = (char *) salt->salt_buf;
13562
13563 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13564
13565 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13566
13567 salt->salt_len = salt_len;
13568
13569 char *hash_pos = input_buf + 6 + 16;
13570
13571 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13572 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13573 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13574 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13575 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13576 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
13577 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
13578 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
13579
13580 return (PARSER_OK);
13581 }
13582
13583 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13584 {
13585 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13586
13587 u32 *digest = (u32 *) hash_buf->digest;
13588
13589 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13590 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13591 digest[2] = 0;
13592 digest[3] = 0;
13593
13594 return (PARSER_OK);
13595 }
13596
13597 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13598 {
13599 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13600
13601 u32 *digest = (u32 *) hash_buf->digest;
13602
13603 salt_t *salt = hash_buf->salt;
13604
13605 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13606
13607 char *saltbuf_pos = input_buf;
13608
13609 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13610
13611 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13612
13613 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13614
13615 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13616 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13617
13618 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13619
13620 hashbuf_pos++;
13621
13622 uint hashbuf_len = input_len - saltbuf_len - 1;
13623
13624 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13625
13626 char *salt_ptr = (char *) saltbuf_pos;
13627 char *rakp_ptr = (char *) rakp->salt_buf;
13628
13629 uint i;
13630 uint j;
13631
13632 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13633 {
13634 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
13635 }
13636
13637 rakp_ptr[j] = 0x80;
13638
13639 rakp->salt_len = j;
13640
13641 for (i = 0; i < 64; i++)
13642 {
13643 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13644 }
13645
13646 salt->salt_buf[0] = rakp->salt_buf[0];
13647 salt->salt_buf[1] = rakp->salt_buf[1];
13648 salt->salt_buf[2] = rakp->salt_buf[2];
13649 salt->salt_buf[3] = rakp->salt_buf[3];
13650 salt->salt_buf[4] = rakp->salt_buf[4];
13651 salt->salt_buf[5] = rakp->salt_buf[5];
13652 salt->salt_buf[6] = rakp->salt_buf[6];
13653 salt->salt_buf[7] = rakp->salt_buf[7];
13654
13655 salt->salt_len = 32; // muss min. 32 haben
13656
13657 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13658 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13659 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13660 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13661 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13662
13663 return (PARSER_OK);
13664 }
13665
13666 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13667 {
13668 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13669
13670 u32 *digest = (u32 *) hash_buf->digest;
13671
13672 salt_t *salt = hash_buf->salt;
13673
13674 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13675
13676 char *salt_pos = input_buf + 1;
13677
13678 memcpy (salt->salt_buf, salt_pos, 8);
13679
13680 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13681 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13682
13683 salt->salt_len = 8;
13684
13685 char *hash_pos = salt_pos + 8;
13686
13687 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13688 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13689 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13690 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13691 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13692
13693 digest[0] -= SHA1M_A;
13694 digest[1] -= SHA1M_B;
13695 digest[2] -= SHA1M_C;
13696 digest[3] -= SHA1M_D;
13697 digest[4] -= SHA1M_E;
13698
13699 return (PARSER_OK);
13700 }
13701
13702 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13703 {
13704 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13705
13706 u32 *digest = (u32 *) hash_buf->digest;
13707
13708 salt_t *salt = hash_buf->salt;
13709
13710 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13711 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13712 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13713 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13714
13715 digest[0] = byte_swap_32 (digest[0]);
13716 digest[1] = byte_swap_32 (digest[1]);
13717 digest[2] = byte_swap_32 (digest[2]);
13718 digest[3] = byte_swap_32 (digest[3]);
13719
13720 digest[0] -= MD5M_A;
13721 digest[1] -= MD5M_B;
13722 digest[2] -= MD5M_C;
13723 digest[3] -= MD5M_D;
13724
13725 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13726
13727 char *salt_buf_ptr = input_buf + 32 + 1;
13728
13729 u32 *salt_buf = salt->salt_buf;
13730
13731 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
13732 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
13733 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
13734 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
13735
13736 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13737 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13738 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13739 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13740
13741 salt->salt_len = 16 + 1;
13742
13743 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13744
13745 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13746
13747 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
13748
13749 return (PARSER_OK);
13750 }
13751
13752 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13753 {
13754 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13755
13756 u32 *digest = (u32 *) hash_buf->digest;
13757
13758 salt_t *salt = hash_buf->salt;
13759
13760 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13761
13762 /**
13763 * parse line
13764 */
13765
13766 char *hashbuf_pos = input_buf;
13767
13768 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13769
13770 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13771
13772 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13773
13774 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13775
13776 saltbuf_pos++;
13777
13778 char *iteration_pos = strchr (saltbuf_pos, ':');
13779
13780 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13781
13782 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13783
13784 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13785
13786 iteration_pos++;
13787
13788 char *databuf_pos = strchr (iteration_pos, ':');
13789
13790 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13791
13792 const uint iteration_len = databuf_pos - iteration_pos;
13793
13794 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13795 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13796
13797 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13798
13799 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13800 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13801
13802 databuf_pos++;
13803
13804 // digest
13805
13806 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13807 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13808 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13809 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13810 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13811 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
13812 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
13813 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
13814
13815 // salt
13816
13817 char *saltbuf_ptr = (char *) salt->salt_buf;
13818
13819 for (uint i = 0; i < saltbuf_len; i += 2)
13820 {
13821 const char p0 = saltbuf_pos[i + 0];
13822 const char p1 = saltbuf_pos[i + 1];
13823
13824 *saltbuf_ptr++ = hex_convert (p1) << 0
13825 | hex_convert (p0) << 4;
13826 }
13827
13828 salt->salt_buf[4] = 0x01000000;
13829 salt->salt_buf[5] = 0x80;
13830
13831 salt->salt_len = saltbuf_len / 2;
13832
13833 // iteration
13834
13835 salt->salt_iter = atoi (iteration_pos) - 1;
13836
13837 // data
13838
13839 char *databuf_ptr = (char *) cloudkey->data_buf;
13840
13841 for (uint i = 0; i < databuf_len; i += 2)
13842 {
13843 const char p0 = databuf_pos[i + 0];
13844 const char p1 = databuf_pos[i + 1];
13845
13846 *databuf_ptr++ = hex_convert (p1) << 0
13847 | hex_convert (p0) << 4;
13848 }
13849
13850 *databuf_ptr++ = 0x80;
13851
13852 for (uint i = 0; i < 512; i++)
13853 {
13854 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13855 }
13856
13857 cloudkey->data_len = databuf_len / 2;
13858
13859 return (PARSER_OK);
13860 }
13861
13862 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13863 {
13864 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13865
13866 u32 *digest = (u32 *) hash_buf->digest;
13867
13868 salt_t *salt = hash_buf->salt;
13869
13870 /**
13871 * parse line
13872 */
13873
13874 char *hashbuf_pos = input_buf;
13875
13876 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13877
13878 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13879
13880 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13881
13882 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13883
13884 domainbuf_pos++;
13885
13886 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13887
13888 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13889
13890 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13891
13892 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13893
13894 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13895
13896 saltbuf_pos++;
13897
13898 char *iteration_pos = strchr (saltbuf_pos, ':');
13899
13900 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13901
13902 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13903
13904 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13905
13906 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13907
13908 iteration_pos++;
13909
13910 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13911
13912 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13913 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13914
13915 // ok, the plan for this algorithm is the following:
13916 // we have 2 salts here, the domain-name and a random salt
13917 // while both are used in the initial transformation,
13918 // only the random salt is used in the following iterations
13919 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13920 // and one that includes only the real salt (stored into salt_buf[]).
13921 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13922
13923 u8 tmp_buf[100] = { 0 };
13924
13925 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
13926
13927 memcpy (digest, tmp_buf, 20);
13928
13929 digest[0] = byte_swap_32 (digest[0]);
13930 digest[1] = byte_swap_32 (digest[1]);
13931 digest[2] = byte_swap_32 (digest[2]);
13932 digest[3] = byte_swap_32 (digest[3]);
13933 digest[4] = byte_swap_32 (digest[4]);
13934
13935 // domain
13936
13937 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13938
13939 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
13940
13941 char *len_ptr = NULL;
13942
13943 for (uint i = 0; i < domainbuf_len; i++)
13944 {
13945 if (salt_buf_pc_ptr[i] == '.')
13946 {
13947 len_ptr = &salt_buf_pc_ptr[i];
13948
13949 *len_ptr = 0;
13950 }
13951 else
13952 {
13953 *len_ptr += 1;
13954 }
13955 }
13956
13957 salt->salt_buf_pc[7] = domainbuf_len;
13958
13959 // "real" salt
13960
13961 char *salt_buf_ptr = (char *) salt->salt_buf;
13962
13963 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
13964
13965 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13966
13967 salt->salt_len = salt_len;
13968
13969 // iteration
13970
13971 salt->salt_iter = atoi (iteration_pos);
13972
13973 return (PARSER_OK);
13974 }
13975
13976 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13977 {
13978 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
13979
13980 u32 *digest = (u32 *) hash_buf->digest;
13981
13982 salt_t *salt = hash_buf->salt;
13983
13984 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13985 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13986 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13987 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13988 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13989
13990 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13991
13992 uint salt_len = input_len - 40 - 1;
13993
13994 char *salt_buf = input_buf + 40 + 1;
13995
13996 char *salt_buf_ptr = (char *) salt->salt_buf;
13997
13998 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13999
14000 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14001
14002 salt->salt_len = salt_len;
14003
14004 return (PARSER_OK);
14005 }
14006
14007 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14008 {
14009 const u8 ascii_to_ebcdic[] =
14010 {
14011 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14012 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14013 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14014 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14015 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14016 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14017 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14018 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14019 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14020 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14021 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14022 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14023 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14024 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14025 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14026 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14027 };
14028
14029 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14030
14031 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14032
14033 u32 *digest = (u32 *) hash_buf->digest;
14034
14035 salt_t *salt = hash_buf->salt;
14036
14037 char *salt_pos = input_buf + 6 + 1;
14038
14039 char *digest_pos = strchr (salt_pos, '*');
14040
14041 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14042
14043 uint salt_len = digest_pos - salt_pos;
14044
14045 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14046
14047 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14048
14049 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14050
14051 digest_pos++;
14052
14053 char *salt_buf_ptr = (char *) salt->salt_buf;
14054 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14055
14056 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14057
14058 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14059
14060 salt->salt_len = salt_len;
14061
14062 for (uint i = 0; i < salt_len; i++)
14063 {
14064 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14065 }
14066 for (uint i = salt_len; i < 8; i++)
14067 {
14068 salt_buf_pc_ptr[i] = 0x40;
14069 }
14070
14071 uint tt;
14072
14073 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14074
14075 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14076 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14077
14078 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14079 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14080
14081 digest[0] = byte_swap_32 (digest[0]);
14082 digest[1] = byte_swap_32 (digest[1]);
14083
14084 IP (digest[0], digest[1], tt);
14085
14086 digest[0] = rotr32 (digest[0], 29);
14087 digest[1] = rotr32 (digest[1], 29);
14088 digest[2] = 0;
14089 digest[3] = 0;
14090
14091 return (PARSER_OK);
14092 }
14093
14094 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14095 {
14096 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14097
14098 u32 *digest = (u32 *) hash_buf->digest;
14099
14100 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14101 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14102 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14103 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14104
14105 digest[0] = byte_swap_32 (digest[0]);
14106 digest[1] = byte_swap_32 (digest[1]);
14107 digest[2] = byte_swap_32 (digest[2]);
14108 digest[3] = byte_swap_32 (digest[3]);
14109
14110 return (PARSER_OK);
14111 }
14112
14113 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14114 {
14115 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14116
14117 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14118
14119 u32 *digest = (u32 *) hash_buf->digest;
14120
14121 salt_t *salt = hash_buf->salt;
14122
14123 u8 tmp_buf[120] = { 0 };
14124
14125 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14126
14127 tmp_buf[3] += -4; // dont ask!
14128
14129 memcpy (salt->salt_buf, tmp_buf, 5);
14130
14131 salt->salt_len = 5;
14132
14133 memcpy (digest, tmp_buf + 5, 9);
14134
14135 // yes, only 9 byte are needed to crack, but 10 to display
14136
14137 salt->salt_buf_pc[7] = input_buf[20];
14138
14139 return (PARSER_OK);
14140 }
14141
14142 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14143 {
14144 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14145
14146 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14147
14148 u32 *digest = (u32 *) hash_buf->digest;
14149
14150 salt_t *salt = hash_buf->salt;
14151
14152 u8 tmp_buf[120] = { 0 };
14153
14154 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14155
14156 tmp_buf[3] += -4; // dont ask!
14157
14158 // salt
14159
14160 memcpy (salt->salt_buf, tmp_buf, 16);
14161
14162 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)
14163
14164 // iteration
14165
14166 char tmp_iter_buf[11] = { 0 };
14167
14168 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14169
14170 tmp_iter_buf[10] = 0;
14171
14172 salt->salt_iter = atoi (tmp_iter_buf);
14173
14174 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14175 {
14176 return (PARSER_SALT_ITERATION);
14177 }
14178
14179 salt->salt_iter--; // first round in init
14180
14181 // 2 additional bytes for display only
14182
14183 salt->salt_buf_pc[0] = tmp_buf[26];
14184 salt->salt_buf_pc[1] = tmp_buf[27];
14185
14186 // digest
14187
14188 memcpy (digest, tmp_buf + 28, 8);
14189
14190 digest[0] = byte_swap_32 (digest[0]);
14191 digest[1] = byte_swap_32 (digest[1]);
14192 digest[2] = 0;
14193 digest[3] = 0;
14194
14195 return (PARSER_OK);
14196 }
14197
14198 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14199 {
14200 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14201
14202 u32 *digest = (u32 *) hash_buf->digest;
14203
14204 salt_t *salt = hash_buf->salt;
14205
14206 char *salt_buf_pos = input_buf;
14207
14208 char *hash_buf_pos = salt_buf_pos + 6;
14209
14210 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
14211 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
14212 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
14213 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
14214 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
14215 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
14216 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
14217 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
14218
14219 digest[0] -= SHA256M_A;
14220 digest[1] -= SHA256M_B;
14221 digest[2] -= SHA256M_C;
14222 digest[3] -= SHA256M_D;
14223 digest[4] -= SHA256M_E;
14224 digest[5] -= SHA256M_F;
14225 digest[6] -= SHA256M_G;
14226 digest[7] -= SHA256M_H;
14227
14228 char *salt_buf_ptr = (char *) salt->salt_buf;
14229
14230 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14231
14232 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14233
14234 salt->salt_len = salt_len;
14235
14236 return (PARSER_OK);
14237 }
14238
14239 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14240 {
14241 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14242
14243 u32 *digest = (u32 *) hash_buf->digest;
14244
14245 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14246
14247 salt_t *salt = hash_buf->salt;
14248
14249 char *salt_buf = input_buf + 6;
14250
14251 char *digest_buf = strchr (salt_buf, '$');
14252
14253 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14254
14255 uint salt_len = digest_buf - salt_buf;
14256
14257 digest_buf++; // skip the '$' symbol
14258
14259 char *salt_buf_ptr = (char *) salt->salt_buf;
14260
14261 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14262
14263 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14264
14265 salt->salt_len = salt_len;
14266
14267 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14268 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14269 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14270 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14271
14272 digest[0] = byte_swap_32 (digest[0]);
14273 digest[1] = byte_swap_32 (digest[1]);
14274 digest[2] = byte_swap_32 (digest[2]);
14275 digest[3] = byte_swap_32 (digest[3]);
14276
14277 digest[0] -= MD5M_A;
14278 digest[1] -= MD5M_B;
14279 digest[2] -= MD5M_C;
14280 digest[3] -= MD5M_D;
14281
14282 return (PARSER_OK);
14283 }
14284
14285 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14286 {
14287 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14288
14289 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14290
14291 u32 *digest = (u32 *) hash_buf->digest;
14292
14293 salt_t *salt = hash_buf->salt;
14294
14295 char *salt_buf = input_buf + 3;
14296
14297 char *digest_buf = strchr (salt_buf, '$');
14298
14299 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14300
14301 uint salt_len = digest_buf - salt_buf;
14302
14303 digest_buf++; // skip the '$' symbol
14304
14305 char *salt_buf_ptr = (char *) salt->salt_buf;
14306
14307 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14308
14309 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14310
14311 salt_buf_ptr[salt_len] = 0x2d;
14312
14313 salt->salt_len = salt_len + 1;
14314
14315 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14316 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14317 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14318 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14319
14320 digest[0] = byte_swap_32 (digest[0]);
14321 digest[1] = byte_swap_32 (digest[1]);
14322 digest[2] = byte_swap_32 (digest[2]);
14323 digest[3] = byte_swap_32 (digest[3]);
14324
14325 digest[0] -= MD5M_A;
14326 digest[1] -= MD5M_B;
14327 digest[2] -= MD5M_C;
14328 digest[3] -= MD5M_D;
14329
14330 return (PARSER_OK);
14331 }
14332
14333 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14334 {
14335 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14336
14337 u32 *digest = (u32 *) hash_buf->digest;
14338
14339 u8 tmp_buf[100] = { 0 };
14340
14341 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
14342
14343 memcpy (digest, tmp_buf, 20);
14344
14345 digest[0] = byte_swap_32 (digest[0]);
14346 digest[1] = byte_swap_32 (digest[1]);
14347 digest[2] = byte_swap_32 (digest[2]);
14348 digest[3] = byte_swap_32 (digest[3]);
14349 digest[4] = byte_swap_32 (digest[4]);
14350
14351 digest[0] -= SHA1M_A;
14352 digest[1] -= SHA1M_B;
14353 digest[2] -= SHA1M_C;
14354 digest[3] -= SHA1M_D;
14355 digest[4] -= SHA1M_E;
14356
14357 return (PARSER_OK);
14358 }
14359
14360 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14361 {
14362 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14363
14364 u32 *digest = (u32 *) hash_buf->digest;
14365
14366 salt_t *salt = hash_buf->salt;
14367
14368 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14369 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14370 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14371 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14372
14373 digest[0] = byte_swap_32 (digest[0]);
14374 digest[1] = byte_swap_32 (digest[1]);
14375 digest[2] = byte_swap_32 (digest[2]);
14376 digest[3] = byte_swap_32 (digest[3]);
14377
14378 digest[0] -= MD5M_A;
14379 digest[1] -= MD5M_B;
14380 digest[2] -= MD5M_C;
14381 digest[3] -= MD5M_D;
14382
14383 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14384
14385 uint salt_len = input_len - 32 - 1;
14386
14387 char *salt_buf = input_buf + 32 + 1;
14388
14389 char *salt_buf_ptr = (char *) salt->salt_buf;
14390
14391 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14392
14393 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14394
14395 /*
14396 * add static "salt" part
14397 */
14398
14399 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14400
14401 salt_len += 8;
14402
14403 salt->salt_len = salt_len;
14404
14405 return (PARSER_OK);
14406 }
14407
14408 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14409 {
14410 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14411
14412 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14413
14414 u32 *digest = (u32 *) hash_buf->digest;
14415
14416 salt_t *salt = hash_buf->salt;
14417
14418 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14419
14420 /**
14421 * parse line
14422 */
14423
14424 char *saltlen_pos = input_buf + 1 + 3 + 1;
14425
14426 char *saltbuf_pos = strchr (saltlen_pos, '$');
14427
14428 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14429
14430 uint saltlen_len = saltbuf_pos - saltlen_pos;
14431
14432 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14433
14434 saltbuf_pos++;
14435
14436 char *keylen_pos = strchr (saltbuf_pos, '$');
14437
14438 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14439
14440 uint saltbuf_len = keylen_pos - saltbuf_pos;
14441
14442 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14443
14444 keylen_pos++;
14445
14446 char *keybuf_pos = strchr (keylen_pos, '$');
14447
14448 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14449
14450 uint keylen_len = keybuf_pos - keylen_pos;
14451
14452 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14453
14454 keybuf_pos++;
14455
14456 char *databuf_pos = strchr (keybuf_pos, '$');
14457
14458 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14459
14460 uint keybuf_len = databuf_pos - keybuf_pos;
14461
14462 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14463
14464 databuf_pos++;
14465
14466 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14467
14468 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14469
14470 /**
14471 * copy data
14472 */
14473
14474 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
14475 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
14476 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
14477 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
14478
14479 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
14480 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
14481 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
14482 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
14483
14484 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14485 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14486 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14487 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14488
14489 salt->salt_len = 16;
14490 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14491
14492 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14493 {
14494 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
14495 }
14496
14497 return (PARSER_OK);
14498 }
14499
14500 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14501 {
14502 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14503
14504 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14505
14506 u32 *digest = (u32 *) hash_buf->digest;
14507
14508 salt_t *salt = hash_buf->salt;
14509
14510 /**
14511 * parse line
14512 */
14513
14514 // first is the N salt parameter
14515
14516 char *N_pos = input_buf + 6;
14517
14518 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14519
14520 N_pos++;
14521
14522 salt->scrypt_N = atoi (N_pos);
14523
14524 // r
14525
14526 char *r_pos = strchr (N_pos, ':');
14527
14528 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14529
14530 r_pos++;
14531
14532 salt->scrypt_r = atoi (r_pos);
14533
14534 // p
14535
14536 char *p_pos = strchr (r_pos, ':');
14537
14538 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14539
14540 p_pos++;
14541
14542 salt->scrypt_p = atoi (p_pos);
14543
14544 // salt
14545
14546 char *saltbuf_pos = strchr (p_pos, ':');
14547
14548 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14549
14550 saltbuf_pos++;
14551
14552 char *hash_pos = strchr (saltbuf_pos, ':');
14553
14554 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14555
14556 hash_pos++;
14557
14558 // base64 decode
14559
14560 u8 tmp_buf[33] = { 0 };
14561
14562 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14563
14564 char *salt_buf_ptr = (char *) salt->salt_buf;
14565
14566 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14567
14568 salt->salt_len = tmp_len;
14569 salt->salt_iter = 1;
14570
14571 // digest - base64 decode
14572
14573 memset (tmp_buf, 0, sizeof (tmp_buf));
14574
14575 tmp_len = input_len - (hash_pos - input_buf);
14576
14577 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14578
14579 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
14580
14581 memcpy (digest, tmp_buf, 32);
14582
14583 return (PARSER_OK);
14584 }
14585
14586 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14587 {
14588 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14589
14590 u32 *digest = (u32 *) hash_buf->digest;
14591
14592 salt_t *salt = hash_buf->salt;
14593
14594 /**
14595 * parse line
14596 */
14597
14598 char decrypted[76] = { 0 }; // iv + hash
14599
14600 juniper_decrypt_hash (input_buf, decrypted);
14601
14602 char *md5crypt_hash = decrypted + 12;
14603
14604 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14605
14606 salt->salt_iter = ROUNDS_MD5CRYPT;
14607
14608 char *salt_pos = md5crypt_hash + 3;
14609
14610 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14611
14612 salt->salt_len = hash_pos - salt_pos; // should be 8
14613
14614 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14615
14616 hash_pos++;
14617
14618 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14619
14620 return (PARSER_OK);
14621 }
14622
14623 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14624 {
14625 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14626
14627 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14628
14629 u32 *digest = (u32 *) hash_buf->digest;
14630
14631 salt_t *salt = hash_buf->salt;
14632
14633 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14634
14635 /**
14636 * parse line
14637 */
14638
14639 // first is *raw* salt
14640
14641 char *salt_pos = input_buf + 3;
14642
14643 char *hash_pos = strchr (salt_pos, '$');
14644
14645 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14646
14647 uint salt_len = hash_pos - salt_pos;
14648
14649 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14650
14651 hash_pos++;
14652
14653 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14654
14655 memcpy (salt_buf_ptr, salt_pos, 14);
14656
14657 salt_buf_ptr[17] = 0x01;
14658 salt_buf_ptr[18] = 0x80;
14659
14660 // add some stuff to normal salt to make sorted happy
14661
14662 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14663 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14664 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14665 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14666
14667 salt->salt_len = salt_len;
14668 salt->salt_iter = ROUNDS_CISCO8 - 1;
14669
14670 // base64 decode hash
14671
14672 u8 tmp_buf[100] = { 0 };
14673
14674 uint hash_len = input_len - 3 - salt_len - 1;
14675
14676 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14677
14678 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14679
14680 memcpy (digest, tmp_buf, 32);
14681
14682 digest[0] = byte_swap_32 (digest[0]);
14683 digest[1] = byte_swap_32 (digest[1]);
14684 digest[2] = byte_swap_32 (digest[2]);
14685 digest[3] = byte_swap_32 (digest[3]);
14686 digest[4] = byte_swap_32 (digest[4]);
14687 digest[5] = byte_swap_32 (digest[5]);
14688 digest[6] = byte_swap_32 (digest[6]);
14689 digest[7] = byte_swap_32 (digest[7]);
14690
14691 return (PARSER_OK);
14692 }
14693
14694 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14695 {
14696 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14697
14698 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14699
14700 u32 *digest = (u32 *) hash_buf->digest;
14701
14702 salt_t *salt = hash_buf->salt;
14703
14704 /**
14705 * parse line
14706 */
14707
14708 // first is *raw* salt
14709
14710 char *salt_pos = input_buf + 3;
14711
14712 char *hash_pos = strchr (salt_pos, '$');
14713
14714 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14715
14716 uint salt_len = hash_pos - salt_pos;
14717
14718 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14719
14720 salt->salt_len = salt_len;
14721 hash_pos++;
14722
14723 char *salt_buf_ptr = (char *) salt->salt_buf;
14724
14725 memcpy (salt_buf_ptr, salt_pos, salt_len);
14726 salt_buf_ptr[salt_len] = 0;
14727
14728 // base64 decode hash
14729
14730 u8 tmp_buf[100] = { 0 };
14731
14732 uint hash_len = input_len - 3 - salt_len - 1;
14733
14734 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14735
14736 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14737
14738 memcpy (digest, tmp_buf, 32);
14739
14740 // fixed:
14741 salt->scrypt_N = 16384;
14742 salt->scrypt_r = 1;
14743 salt->scrypt_p = 1;
14744 salt->salt_iter = 1;
14745
14746 return (PARSER_OK);
14747 }
14748
14749 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14750 {
14751 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14752
14753 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14754
14755 u32 *digest = (u32 *) hash_buf->digest;
14756
14757 salt_t *salt = hash_buf->salt;
14758
14759 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14760
14761 /**
14762 * parse line
14763 */
14764
14765 char *version_pos = input_buf + 8 + 1;
14766
14767 char *verifierHashSize_pos = strchr (version_pos, '*');
14768
14769 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14770
14771 u32 version_len = verifierHashSize_pos - version_pos;
14772
14773 if (version_len != 4) return (PARSER_SALT_LENGTH);
14774
14775 verifierHashSize_pos++;
14776
14777 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14778
14779 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14780
14781 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14782
14783 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14784
14785 keySize_pos++;
14786
14787 char *saltSize_pos = strchr (keySize_pos, '*');
14788
14789 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14790
14791 u32 keySize_len = saltSize_pos - keySize_pos;
14792
14793 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14794
14795 saltSize_pos++;
14796
14797 char *osalt_pos = strchr (saltSize_pos, '*');
14798
14799 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14800
14801 u32 saltSize_len = osalt_pos - saltSize_pos;
14802
14803 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14804
14805 osalt_pos++;
14806
14807 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14808
14809 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14810
14811 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14812
14813 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14814
14815 encryptedVerifier_pos++;
14816
14817 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14818
14819 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14820
14821 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14822
14823 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14824
14825 encryptedVerifierHash_pos++;
14826
14827 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;
14828
14829 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14830
14831 const uint version = atoi (version_pos);
14832
14833 if (version != 2007) return (PARSER_SALT_VALUE);
14834
14835 const uint verifierHashSize = atoi (verifierHashSize_pos);
14836
14837 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14838
14839 const uint keySize = atoi (keySize_pos);
14840
14841 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14842
14843 office2007->keySize = keySize;
14844
14845 const uint saltSize = atoi (saltSize_pos);
14846
14847 if (saltSize != 16) return (PARSER_SALT_VALUE);
14848
14849 /**
14850 * salt
14851 */
14852
14853 salt->salt_len = 16;
14854 salt->salt_iter = ROUNDS_OFFICE2007;
14855
14856 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
14857 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
14858 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
14859 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
14860
14861 /**
14862 * esalt
14863 */
14864
14865 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
14866 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
14867 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
14868 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
14869
14870 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
14871 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
14872 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
14873 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
14874 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
14875
14876 /**
14877 * digest
14878 */
14879
14880 digest[0] = office2007->encryptedVerifierHash[0];
14881 digest[1] = office2007->encryptedVerifierHash[1];
14882 digest[2] = office2007->encryptedVerifierHash[2];
14883 digest[3] = office2007->encryptedVerifierHash[3];
14884
14885 return (PARSER_OK);
14886 }
14887
14888 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14889 {
14890 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14891
14892 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14893
14894 u32 *digest = (u32 *) hash_buf->digest;
14895
14896 salt_t *salt = hash_buf->salt;
14897
14898 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14899
14900 /**
14901 * parse line
14902 */
14903
14904 char *version_pos = input_buf + 8 + 1;
14905
14906 char *spinCount_pos = strchr (version_pos, '*');
14907
14908 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14909
14910 u32 version_len = spinCount_pos - version_pos;
14911
14912 if (version_len != 4) return (PARSER_SALT_LENGTH);
14913
14914 spinCount_pos++;
14915
14916 char *keySize_pos = strchr (spinCount_pos, '*');
14917
14918 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14919
14920 u32 spinCount_len = keySize_pos - spinCount_pos;
14921
14922 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14923
14924 keySize_pos++;
14925
14926 char *saltSize_pos = strchr (keySize_pos, '*');
14927
14928 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14929
14930 u32 keySize_len = saltSize_pos - keySize_pos;
14931
14932 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14933
14934 saltSize_pos++;
14935
14936 char *osalt_pos = strchr (saltSize_pos, '*');
14937
14938 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14939
14940 u32 saltSize_len = osalt_pos - saltSize_pos;
14941
14942 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14943
14944 osalt_pos++;
14945
14946 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14947
14948 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14949
14950 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14951
14952 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14953
14954 encryptedVerifier_pos++;
14955
14956 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14957
14958 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14959
14960 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14961
14962 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14963
14964 encryptedVerifierHash_pos++;
14965
14966 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;
14967
14968 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14969
14970 const uint version = atoi (version_pos);
14971
14972 if (version != 2010) return (PARSER_SALT_VALUE);
14973
14974 const uint spinCount = atoi (spinCount_pos);
14975
14976 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14977
14978 const uint keySize = atoi (keySize_pos);
14979
14980 if (keySize != 128) return (PARSER_SALT_VALUE);
14981
14982 const uint saltSize = atoi (saltSize_pos);
14983
14984 if (saltSize != 16) return (PARSER_SALT_VALUE);
14985
14986 /**
14987 * salt
14988 */
14989
14990 salt->salt_len = 16;
14991 salt->salt_iter = spinCount;
14992
14993 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
14994 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
14995 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
14996 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
14997
14998 /**
14999 * esalt
15000 */
15001
15002 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15003 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15004 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15005 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15006
15007 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15008 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15009 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15010 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15011 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15012 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15013 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15014 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15015
15016 /**
15017 * digest
15018 */
15019
15020 digest[0] = office2010->encryptedVerifierHash[0];
15021 digest[1] = office2010->encryptedVerifierHash[1];
15022 digest[2] = office2010->encryptedVerifierHash[2];
15023 digest[3] = office2010->encryptedVerifierHash[3];
15024
15025 return (PARSER_OK);
15026 }
15027
15028 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15029 {
15030 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15031
15032 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15033
15034 u32 *digest = (u32 *) hash_buf->digest;
15035
15036 salt_t *salt = hash_buf->salt;
15037
15038 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15039
15040 /**
15041 * parse line
15042 */
15043
15044 char *version_pos = input_buf + 8 + 1;
15045
15046 char *spinCount_pos = strchr (version_pos, '*');
15047
15048 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15049
15050 u32 version_len = spinCount_pos - version_pos;
15051
15052 if (version_len != 4) return (PARSER_SALT_LENGTH);
15053
15054 spinCount_pos++;
15055
15056 char *keySize_pos = strchr (spinCount_pos, '*');
15057
15058 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15059
15060 u32 spinCount_len = keySize_pos - spinCount_pos;
15061
15062 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15063
15064 keySize_pos++;
15065
15066 char *saltSize_pos = strchr (keySize_pos, '*');
15067
15068 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15069
15070 u32 keySize_len = saltSize_pos - keySize_pos;
15071
15072 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15073
15074 saltSize_pos++;
15075
15076 char *osalt_pos = strchr (saltSize_pos, '*');
15077
15078 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15079
15080 u32 saltSize_len = osalt_pos - saltSize_pos;
15081
15082 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15083
15084 osalt_pos++;
15085
15086 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15087
15088 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15089
15090 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15091
15092 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15093
15094 encryptedVerifier_pos++;
15095
15096 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15097
15098 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15099
15100 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15101
15102 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15103
15104 encryptedVerifierHash_pos++;
15105
15106 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;
15107
15108 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15109
15110 const uint version = atoi (version_pos);
15111
15112 if (version != 2013) return (PARSER_SALT_VALUE);
15113
15114 const uint spinCount = atoi (spinCount_pos);
15115
15116 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15117
15118 const uint keySize = atoi (keySize_pos);
15119
15120 if (keySize != 256) return (PARSER_SALT_VALUE);
15121
15122 const uint saltSize = atoi (saltSize_pos);
15123
15124 if (saltSize != 16) return (PARSER_SALT_VALUE);
15125
15126 /**
15127 * salt
15128 */
15129
15130 salt->salt_len = 16;
15131 salt->salt_iter = spinCount;
15132
15133 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15134 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15135 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15136 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15137
15138 /**
15139 * esalt
15140 */
15141
15142 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15143 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15144 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15145 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15146
15147 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15148 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15149 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15150 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15151 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15152 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15153 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15154 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15155
15156 /**
15157 * digest
15158 */
15159
15160 digest[0] = office2013->encryptedVerifierHash[0];
15161 digest[1] = office2013->encryptedVerifierHash[1];
15162 digest[2] = office2013->encryptedVerifierHash[2];
15163 digest[3] = office2013->encryptedVerifierHash[3];
15164
15165 return (PARSER_OK);
15166 }
15167
15168 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15169 {
15170 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15171
15172 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15173
15174 u32 *digest = (u32 *) hash_buf->digest;
15175
15176 salt_t *salt = hash_buf->salt;
15177
15178 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15179
15180 /**
15181 * parse line
15182 */
15183
15184 char *version_pos = input_buf + 11;
15185
15186 char *osalt_pos = strchr (version_pos, '*');
15187
15188 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15189
15190 u32 version_len = osalt_pos - version_pos;
15191
15192 if (version_len != 1) return (PARSER_SALT_LENGTH);
15193
15194 osalt_pos++;
15195
15196 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15197
15198 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15199
15200 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15201
15202 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15203
15204 encryptedVerifier_pos++;
15205
15206 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15207
15208 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15209
15210 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15211
15212 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15213
15214 encryptedVerifierHash_pos++;
15215
15216 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15217
15218 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15219
15220 const uint version = *version_pos - 0x30;
15221
15222 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15223
15224 /**
15225 * esalt
15226 */
15227
15228 oldoffice01->version = version;
15229
15230 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15231 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15232 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15233 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15234
15235 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15236 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15237 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15238 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15239
15240 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15241 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15242 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15243 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15244
15245 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15246 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15247 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15248 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15249
15250 /**
15251 * salt
15252 */
15253
15254 salt->salt_len = 16;
15255
15256 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15257 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15258 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15259 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15260
15261 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15262 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15263 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15264 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15265
15266 // this is a workaround as office produces multiple documents with the same salt
15267
15268 salt->salt_len += 32;
15269
15270 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15271 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15272 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15273 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15274 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15275 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15276 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15277 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15278
15279 /**
15280 * digest
15281 */
15282
15283 digest[0] = oldoffice01->encryptedVerifierHash[0];
15284 digest[1] = oldoffice01->encryptedVerifierHash[1];
15285 digest[2] = oldoffice01->encryptedVerifierHash[2];
15286 digest[3] = oldoffice01->encryptedVerifierHash[3];
15287
15288 return (PARSER_OK);
15289 }
15290
15291 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15292 {
15293 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15294 }
15295
15296 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15297 {
15298 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15299
15300 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15301
15302 u32 *digest = (u32 *) hash_buf->digest;
15303
15304 salt_t *salt = hash_buf->salt;
15305
15306 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15307
15308 /**
15309 * parse line
15310 */
15311
15312 char *version_pos = input_buf + 11;
15313
15314 char *osalt_pos = strchr (version_pos, '*');
15315
15316 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15317
15318 u32 version_len = osalt_pos - version_pos;
15319
15320 if (version_len != 1) return (PARSER_SALT_LENGTH);
15321
15322 osalt_pos++;
15323
15324 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15325
15326 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15327
15328 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15329
15330 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15331
15332 encryptedVerifier_pos++;
15333
15334 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15335
15336 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15337
15338 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15339
15340 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15341
15342 encryptedVerifierHash_pos++;
15343
15344 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15345
15346 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15347
15348 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15349
15350 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15351
15352 rc4key_pos++;
15353
15354 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15355
15356 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15357
15358 const uint version = *version_pos - 0x30;
15359
15360 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15361
15362 /**
15363 * esalt
15364 */
15365
15366 oldoffice01->version = version;
15367
15368 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15369 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15370 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15371 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15372
15373 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15374 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15375 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15376 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15377
15378 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15379 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15380 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15381 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15382
15383 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15384 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15385 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15386 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15387
15388 oldoffice01->rc4key[1] = 0;
15389 oldoffice01->rc4key[0] = 0;
15390
15391 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15392 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15393 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15394 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15395 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15396 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15397 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15398 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15399 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15400 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15401
15402 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15403 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15404
15405 /**
15406 * salt
15407 */
15408
15409 salt->salt_len = 16;
15410
15411 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15412 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15413 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15414 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15415
15416 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15417 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15418 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15419 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15420
15421 // this is a workaround as office produces multiple documents with the same salt
15422
15423 salt->salt_len += 32;
15424
15425 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15426 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15427 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15428 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15429 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15430 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15431 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15432 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15433
15434 /**
15435 * digest
15436 */
15437
15438 digest[0] = oldoffice01->rc4key[0];
15439 digest[1] = oldoffice01->rc4key[1];
15440 digest[2] = 0;
15441 digest[3] = 0;
15442
15443 return (PARSER_OK);
15444 }
15445
15446 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15447 {
15448 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15449
15450 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15451
15452 u32 *digest = (u32 *) hash_buf->digest;
15453
15454 salt_t *salt = hash_buf->salt;
15455
15456 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15457
15458 /**
15459 * parse line
15460 */
15461
15462 char *version_pos = input_buf + 11;
15463
15464 char *osalt_pos = strchr (version_pos, '*');
15465
15466 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15467
15468 u32 version_len = osalt_pos - version_pos;
15469
15470 if (version_len != 1) return (PARSER_SALT_LENGTH);
15471
15472 osalt_pos++;
15473
15474 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15475
15476 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15477
15478 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15479
15480 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15481
15482 encryptedVerifier_pos++;
15483
15484 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15485
15486 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15487
15488 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15489
15490 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15491
15492 encryptedVerifierHash_pos++;
15493
15494 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15495
15496 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15497
15498 const uint version = *version_pos - 0x30;
15499
15500 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15501
15502 /**
15503 * esalt
15504 */
15505
15506 oldoffice34->version = version;
15507
15508 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15509 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15510 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15511 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15512
15513 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15514 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15515 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15516 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15517
15518 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15519 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15520 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15521 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15522 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15523
15524 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15525 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15526 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15527 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15528 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15529
15530 /**
15531 * salt
15532 */
15533
15534 salt->salt_len = 16;
15535
15536 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15537 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15538 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15539 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15540
15541 // this is a workaround as office produces multiple documents with the same salt
15542
15543 salt->salt_len += 32;
15544
15545 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15546 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15547 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15548 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15549 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15550 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15551 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15552 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15553
15554 /**
15555 * digest
15556 */
15557
15558 digest[0] = oldoffice34->encryptedVerifierHash[0];
15559 digest[1] = oldoffice34->encryptedVerifierHash[1];
15560 digest[2] = oldoffice34->encryptedVerifierHash[2];
15561 digest[3] = oldoffice34->encryptedVerifierHash[3];
15562
15563 return (PARSER_OK);
15564 }
15565
15566 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15567 {
15568 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15569
15570 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15571 }
15572
15573 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15574 {
15575 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15576
15577 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15578
15579 u32 *digest = (u32 *) hash_buf->digest;
15580
15581 salt_t *salt = hash_buf->salt;
15582
15583 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15584
15585 /**
15586 * parse line
15587 */
15588
15589 char *version_pos = input_buf + 11;
15590
15591 char *osalt_pos = strchr (version_pos, '*');
15592
15593 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15594
15595 u32 version_len = osalt_pos - version_pos;
15596
15597 if (version_len != 1) return (PARSER_SALT_LENGTH);
15598
15599 osalt_pos++;
15600
15601 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15602
15603 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15604
15605 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15606
15607 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15608
15609 encryptedVerifier_pos++;
15610
15611 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15612
15613 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15614
15615 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15616
15617 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15618
15619 encryptedVerifierHash_pos++;
15620
15621 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15622
15623 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15624
15625 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15626
15627 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15628
15629 rc4key_pos++;
15630
15631 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15632
15633 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15634
15635 const uint version = *version_pos - 0x30;
15636
15637 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15638
15639 /**
15640 * esalt
15641 */
15642
15643 oldoffice34->version = version;
15644
15645 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15646 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15647 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15648 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15649
15650 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15651 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15652 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15653 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15654
15655 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15656 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15657 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15658 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15659 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15660
15661 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15662 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15663 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15664 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15665 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15666
15667 oldoffice34->rc4key[1] = 0;
15668 oldoffice34->rc4key[0] = 0;
15669
15670 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15671 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15672 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15673 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15674 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15675 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15676 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15677 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15678 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15679 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15680
15681 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15682 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15683
15684 /**
15685 * salt
15686 */
15687
15688 salt->salt_len = 16;
15689
15690 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15691 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15692 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15693 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15694
15695 // this is a workaround as office produces multiple documents with the same salt
15696
15697 salt->salt_len += 32;
15698
15699 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15700 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15701 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15702 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15703 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15704 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15705 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15706 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15707
15708 /**
15709 * digest
15710 */
15711
15712 digest[0] = oldoffice34->rc4key[0];
15713 digest[1] = oldoffice34->rc4key[1];
15714 digest[2] = 0;
15715 digest[3] = 0;
15716
15717 return (PARSER_OK);
15718 }
15719
15720 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15721 {
15722 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15723
15724 u32 *digest = (u32 *) hash_buf->digest;
15725
15726 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15727 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15728 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15729 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15730
15731 digest[0] = byte_swap_32 (digest[0]);
15732 digest[1] = byte_swap_32 (digest[1]);
15733 digest[2] = byte_swap_32 (digest[2]);
15734 digest[3] = byte_swap_32 (digest[3]);
15735
15736 return (PARSER_OK);
15737 }
15738
15739 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15740 {
15741 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15742
15743 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15744
15745 u32 *digest = (u32 *) hash_buf->digest;
15746
15747 salt_t *salt = hash_buf->salt;
15748
15749 char *signature_pos = input_buf;
15750
15751 char *salt_pos = strchr (signature_pos, '$');
15752
15753 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15754
15755 u32 signature_len = salt_pos - signature_pos;
15756
15757 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15758
15759 salt_pos++;
15760
15761 char *hash_pos = strchr (salt_pos, '$');
15762
15763 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15764
15765 u32 salt_len = hash_pos - salt_pos;
15766
15767 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15768
15769 hash_pos++;
15770
15771 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
15772
15773 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15774
15775 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
15776 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
15777 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
15778 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
15779 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
15780
15781 digest[0] -= SHA1M_A;
15782 digest[1] -= SHA1M_B;
15783 digest[2] -= SHA1M_C;
15784 digest[3] -= SHA1M_D;
15785 digest[4] -= SHA1M_E;
15786
15787 char *salt_buf_ptr = (char *) salt->salt_buf;
15788
15789 memcpy (salt_buf_ptr, salt_pos, salt_len);
15790
15791 salt->salt_len = salt_len;
15792
15793 return (PARSER_OK);
15794 }
15795
15796 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15797 {
15798 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15799
15800 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15801
15802 u32 *digest = (u32 *) hash_buf->digest;
15803
15804 salt_t *salt = hash_buf->salt;
15805
15806 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15807
15808 /**
15809 * parse line
15810 */
15811
15812 char *iter_pos = input_buf + 14;
15813
15814 const int iter = atoi (iter_pos);
15815
15816 if (iter < 1) return (PARSER_SALT_ITERATION);
15817
15818 salt->salt_iter = iter - 1;
15819
15820 char *salt_pos = strchr (iter_pos, '$');
15821
15822 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15823
15824 salt_pos++;
15825
15826 char *hash_pos = strchr (salt_pos, '$');
15827
15828 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15829
15830 const uint salt_len = hash_pos - salt_pos;
15831
15832 hash_pos++;
15833
15834 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15835
15836 memcpy (salt_buf_ptr, salt_pos, salt_len);
15837
15838 salt->salt_len = salt_len;
15839
15840 salt_buf_ptr[salt_len + 3] = 0x01;
15841 salt_buf_ptr[salt_len + 4] = 0x80;
15842
15843 // add some stuff to normal salt to make sorted happy
15844
15845 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15846 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15847 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15848 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15849 salt->salt_buf[4] = salt->salt_iter;
15850
15851 // base64 decode hash
15852
15853 u8 tmp_buf[100] = { 0 };
15854
15855 uint hash_len = input_len - (hash_pos - input_buf);
15856
15857 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15858
15859 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15860
15861 memcpy (digest, tmp_buf, 32);
15862
15863 digest[0] = byte_swap_32 (digest[0]);
15864 digest[1] = byte_swap_32 (digest[1]);
15865 digest[2] = byte_swap_32 (digest[2]);
15866 digest[3] = byte_swap_32 (digest[3]);
15867 digest[4] = byte_swap_32 (digest[4]);
15868 digest[5] = byte_swap_32 (digest[5]);
15869 digest[6] = byte_swap_32 (digest[6]);
15870 digest[7] = byte_swap_32 (digest[7]);
15871
15872 return (PARSER_OK);
15873 }
15874
15875 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15876 {
15877 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15878
15879 u32 *digest = (u32 *) hash_buf->digest;
15880
15881 salt_t *salt = hash_buf->salt;
15882
15883 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15884 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15885 digest[2] = 0;
15886 digest[3] = 0;
15887
15888 digest[0] = byte_swap_32 (digest[0]);
15889 digest[1] = byte_swap_32 (digest[1]);
15890
15891 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15892 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15893 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15894
15895 char iter_c = input_buf[17];
15896 char iter_d = input_buf[19];
15897
15898 // atm only defaults, let's see if there's more request
15899 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15900 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15901
15902 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15903
15904 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
15905 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
15906 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
15907 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
15908
15909 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15910 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15911 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15912 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15913
15914 salt->salt_len = 16;
15915
15916 return (PARSER_OK);
15917 }
15918
15919 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15920 {
15921 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
15922
15923 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15924
15925 u32 *digest = (u32 *) hash_buf->digest;
15926
15927 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
15928
15929 salt_t *salt = hash_buf->salt;
15930
15931 char *salt_pos = input_buf + 10;
15932
15933 char *hash_pos = strchr (salt_pos, '$');
15934
15935 uint salt_len = hash_pos - salt_pos;
15936
15937 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15938
15939 hash_pos++;
15940
15941 uint hash_len = input_len - 10 - salt_len - 1;
15942
15943 // base64 decode salt
15944
15945 u8 tmp_buf[100] = { 0 };
15946
15947 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
15948
15949 if (salt_len > 55) return (PARSER_SALT_LENGTH);
15950
15951 tmp_buf[salt_len] = 0x80;
15952
15953 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
15954
15955 salt->salt_len = salt_len;
15956
15957 // base64 decode salt
15958
15959 memset (tmp_buf, 0, sizeof (tmp_buf));
15960
15961 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15962
15963 uint user_len = hash_len - 32;
15964
15965 const u8 *tmp_hash = tmp_buf + user_len;
15966
15967 user_len--; // skip the trailing space
15968
15969 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
15970 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
15971 digest[2] = hex_to_u32 (&tmp_hash[16]);
15972 digest[3] = hex_to_u32 (&tmp_hash[24]);
15973
15974 digest[0] = byte_swap_32 (digest[0]);
15975 digest[1] = byte_swap_32 (digest[1]);
15976 digest[2] = byte_swap_32 (digest[2]);
15977 digest[3] = byte_swap_32 (digest[3]);
15978
15979 // store username for host only (output hash if cracked)
15980
15981 memset (cram_md5->user, 0, sizeof (cram_md5->user));
15982 memcpy (cram_md5->user, tmp_buf, user_len);
15983
15984 return (PARSER_OK);
15985 }
15986
15987 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15988 {
15989 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
15990
15991 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15992
15993 u32 *digest = (u32 *) hash_buf->digest;
15994
15995 salt_t *salt = hash_buf->salt;
15996
15997 char *iter_pos = input_buf + 10;
15998
15999 u32 iter = atoi (iter_pos);
16000
16001 if (iter < 1)
16002 {
16003 return (PARSER_SALT_ITERATION);
16004 }
16005
16006 iter--; // first iteration is special
16007
16008 salt->salt_iter = iter;
16009
16010 char *base64_pos = strchr (iter_pos, '}');
16011
16012 if (base64_pos == NULL)
16013 {
16014 return (PARSER_SIGNATURE_UNMATCHED);
16015 }
16016
16017 base64_pos++;
16018
16019 // base64 decode salt
16020
16021 u32 base64_len = input_len - (base64_pos - input_buf);
16022
16023 u8 tmp_buf[100] = { 0 };
16024
16025 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16026
16027 if (decoded_len < 24)
16028 {
16029 return (PARSER_SALT_LENGTH);
16030 }
16031
16032 // copy the salt
16033
16034 uint salt_len = decoded_len - 20;
16035
16036 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16037 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16038
16039 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16040
16041 salt->salt_len = salt_len;
16042
16043 // set digest
16044
16045 u32 *digest_ptr = (u32*) tmp_buf;
16046
16047 digest[0] = byte_swap_32 (digest_ptr[0]);
16048 digest[1] = byte_swap_32 (digest_ptr[1]);
16049 digest[2] = byte_swap_32 (digest_ptr[2]);
16050 digest[3] = byte_swap_32 (digest_ptr[3]);
16051 digest[4] = byte_swap_32 (digest_ptr[4]);
16052
16053 return (PARSER_OK);
16054 }
16055
16056 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16057 {
16058 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16059
16060 u32 *digest = (u32 *) hash_buf->digest;
16061
16062 salt_t *salt = hash_buf->salt;
16063
16064 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16065 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16066 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16067 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16068 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16069
16070 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16071
16072 uint salt_len = input_len - 40 - 1;
16073
16074 char *salt_buf = input_buf + 40 + 1;
16075
16076 char *salt_buf_ptr = (char *) salt->salt_buf;
16077
16078 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16079
16080 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16081
16082 salt->salt_len = salt_len;
16083
16084 return (PARSER_OK);
16085 }
16086
16087 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16088 {
16089 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16090
16091 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16092
16093 u32 *digest = (u32 *) hash_buf->digest;
16094
16095 salt_t *salt = hash_buf->salt;
16096
16097 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16098
16099 /**
16100 * parse line
16101 */
16102
16103 char *V_pos = input_buf + 5;
16104
16105 char *R_pos = strchr (V_pos, '*');
16106
16107 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16108
16109 u32 V_len = R_pos - V_pos;
16110
16111 R_pos++;
16112
16113 char *bits_pos = strchr (R_pos, '*');
16114
16115 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16116
16117 u32 R_len = bits_pos - R_pos;
16118
16119 bits_pos++;
16120
16121 char *P_pos = strchr (bits_pos, '*');
16122
16123 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16124
16125 u32 bits_len = P_pos - bits_pos;
16126
16127 P_pos++;
16128
16129 char *enc_md_pos = strchr (P_pos, '*');
16130
16131 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16132
16133 u32 P_len = enc_md_pos - P_pos;
16134
16135 enc_md_pos++;
16136
16137 char *id_len_pos = strchr (enc_md_pos, '*');
16138
16139 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16140
16141 u32 enc_md_len = id_len_pos - enc_md_pos;
16142
16143 id_len_pos++;
16144
16145 char *id_buf_pos = strchr (id_len_pos, '*');
16146
16147 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16148
16149 u32 id_len_len = id_buf_pos - id_len_pos;
16150
16151 id_buf_pos++;
16152
16153 char *u_len_pos = strchr (id_buf_pos, '*');
16154
16155 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16156
16157 u32 id_buf_len = u_len_pos - id_buf_pos;
16158
16159 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16160
16161 u_len_pos++;
16162
16163 char *u_buf_pos = strchr (u_len_pos, '*');
16164
16165 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16166
16167 u32 u_len_len = u_buf_pos - u_len_pos;
16168
16169 u_buf_pos++;
16170
16171 char *o_len_pos = strchr (u_buf_pos, '*');
16172
16173 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16174
16175 u32 u_buf_len = o_len_pos - u_buf_pos;
16176
16177 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16178
16179 o_len_pos++;
16180
16181 char *o_buf_pos = strchr (o_len_pos, '*');
16182
16183 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16184
16185 u32 o_len_len = o_buf_pos - o_len_pos;
16186
16187 o_buf_pos++;
16188
16189 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;
16190
16191 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16192
16193 // validate data
16194
16195 const int V = atoi (V_pos);
16196 const int R = atoi (R_pos);
16197 const int P = atoi (P_pos);
16198
16199 if (V != 1) return (PARSER_SALT_VALUE);
16200 if (R != 2) return (PARSER_SALT_VALUE);
16201
16202 const int enc_md = atoi (enc_md_pos);
16203
16204 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16205
16206 const int id_len = atoi (id_len_pos);
16207 const int u_len = atoi (u_len_pos);
16208 const int o_len = atoi (o_len_pos);
16209
16210 if (id_len != 16) return (PARSER_SALT_VALUE);
16211 if (u_len != 32) return (PARSER_SALT_VALUE);
16212 if (o_len != 32) return (PARSER_SALT_VALUE);
16213
16214 const int bits = atoi (bits_pos);
16215
16216 if (bits != 40) return (PARSER_SALT_VALUE);
16217
16218 // copy data to esalt
16219
16220 pdf->V = V;
16221 pdf->R = R;
16222 pdf->P = P;
16223
16224 pdf->enc_md = enc_md;
16225
16226 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16227 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16228 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16229 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16230 pdf->id_len = id_len;
16231
16232 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16233 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16234 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16235 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16236 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16237 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16238 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16239 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16240 pdf->u_len = u_len;
16241
16242 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16243 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16244 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16245 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16246 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16247 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16248 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16249 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16250 pdf->o_len = o_len;
16251
16252 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16253 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16254 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16255 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16256
16257 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16258 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16259 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16260 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16261 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16262 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16263 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16264 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16265
16266 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16267 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16268 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16269 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16270 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16271 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16272 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16273 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16274
16275 // we use ID for salt, maybe needs to change, we will see...
16276
16277 salt->salt_buf[0] = pdf->id_buf[0];
16278 salt->salt_buf[1] = pdf->id_buf[1];
16279 salt->salt_buf[2] = pdf->id_buf[2];
16280 salt->salt_buf[3] = pdf->id_buf[3];
16281 salt->salt_len = pdf->id_len;
16282
16283 digest[0] = pdf->u_buf[0];
16284 digest[1] = pdf->u_buf[1];
16285 digest[2] = pdf->u_buf[2];
16286 digest[3] = pdf->u_buf[3];
16287
16288 return (PARSER_OK);
16289 }
16290
16291 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16292 {
16293 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16294 }
16295
16296 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16297 {
16298 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16299
16300 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16301
16302 u32 *digest = (u32 *) hash_buf->digest;
16303
16304 salt_t *salt = hash_buf->salt;
16305
16306 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16307
16308 /**
16309 * parse line
16310 */
16311
16312 char *V_pos = input_buf + 5;
16313
16314 char *R_pos = strchr (V_pos, '*');
16315
16316 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16317
16318 u32 V_len = R_pos - V_pos;
16319
16320 R_pos++;
16321
16322 char *bits_pos = strchr (R_pos, '*');
16323
16324 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16325
16326 u32 R_len = bits_pos - R_pos;
16327
16328 bits_pos++;
16329
16330 char *P_pos = strchr (bits_pos, '*');
16331
16332 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16333
16334 u32 bits_len = P_pos - bits_pos;
16335
16336 P_pos++;
16337
16338 char *enc_md_pos = strchr (P_pos, '*');
16339
16340 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16341
16342 u32 P_len = enc_md_pos - P_pos;
16343
16344 enc_md_pos++;
16345
16346 char *id_len_pos = strchr (enc_md_pos, '*');
16347
16348 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16349
16350 u32 enc_md_len = id_len_pos - enc_md_pos;
16351
16352 id_len_pos++;
16353
16354 char *id_buf_pos = strchr (id_len_pos, '*');
16355
16356 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16357
16358 u32 id_len_len = id_buf_pos - id_len_pos;
16359
16360 id_buf_pos++;
16361
16362 char *u_len_pos = strchr (id_buf_pos, '*');
16363
16364 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16365
16366 u32 id_buf_len = u_len_pos - id_buf_pos;
16367
16368 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16369
16370 u_len_pos++;
16371
16372 char *u_buf_pos = strchr (u_len_pos, '*');
16373
16374 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16375
16376 u32 u_len_len = u_buf_pos - u_len_pos;
16377
16378 u_buf_pos++;
16379
16380 char *o_len_pos = strchr (u_buf_pos, '*');
16381
16382 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16383
16384 u32 u_buf_len = o_len_pos - u_buf_pos;
16385
16386 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16387
16388 o_len_pos++;
16389
16390 char *o_buf_pos = strchr (o_len_pos, '*');
16391
16392 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16393
16394 u32 o_len_len = o_buf_pos - o_len_pos;
16395
16396 o_buf_pos++;
16397
16398 char *rc4key_pos = strchr (o_buf_pos, ':');
16399
16400 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16401
16402 u32 o_buf_len = rc4key_pos - o_buf_pos;
16403
16404 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16405
16406 rc4key_pos++;
16407
16408 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;
16409
16410 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16411
16412 // validate data
16413
16414 const int V = atoi (V_pos);
16415 const int R = atoi (R_pos);
16416 const int P = atoi (P_pos);
16417
16418 if (V != 1) return (PARSER_SALT_VALUE);
16419 if (R != 2) return (PARSER_SALT_VALUE);
16420
16421 const int enc_md = atoi (enc_md_pos);
16422
16423 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16424
16425 const int id_len = atoi (id_len_pos);
16426 const int u_len = atoi (u_len_pos);
16427 const int o_len = atoi (o_len_pos);
16428
16429 if (id_len != 16) return (PARSER_SALT_VALUE);
16430 if (u_len != 32) return (PARSER_SALT_VALUE);
16431 if (o_len != 32) return (PARSER_SALT_VALUE);
16432
16433 const int bits = atoi (bits_pos);
16434
16435 if (bits != 40) return (PARSER_SALT_VALUE);
16436
16437 // copy data to esalt
16438
16439 pdf->V = V;
16440 pdf->R = R;
16441 pdf->P = P;
16442
16443 pdf->enc_md = enc_md;
16444
16445 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16446 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16447 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16448 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16449 pdf->id_len = id_len;
16450
16451 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16452 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16453 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16454 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16455 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16456 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16457 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16458 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16459 pdf->u_len = u_len;
16460
16461 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16462 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16463 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16464 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16465 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16466 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16467 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16468 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16469 pdf->o_len = o_len;
16470
16471 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16472 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16473 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16474 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16475
16476 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16477 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16478 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16479 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16480 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16481 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16482 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16483 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16484
16485 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16486 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16487 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16488 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16489 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16490 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16491 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16492 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16493
16494 pdf->rc4key[1] = 0;
16495 pdf->rc4key[0] = 0;
16496
16497 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16498 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16499 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16500 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16501 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16502 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16503 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16504 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16505 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16506 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16507
16508 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16509 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16510
16511 // we use ID for salt, maybe needs to change, we will see...
16512
16513 salt->salt_buf[0] = pdf->id_buf[0];
16514 salt->salt_buf[1] = pdf->id_buf[1];
16515 salt->salt_buf[2] = pdf->id_buf[2];
16516 salt->salt_buf[3] = pdf->id_buf[3];
16517 salt->salt_buf[4] = pdf->u_buf[0];
16518 salt->salt_buf[5] = pdf->u_buf[1];
16519 salt->salt_buf[6] = pdf->o_buf[0];
16520 salt->salt_buf[7] = pdf->o_buf[1];
16521 salt->salt_len = pdf->id_len + 16;
16522
16523 digest[0] = pdf->rc4key[0];
16524 digest[1] = pdf->rc4key[1];
16525 digest[2] = 0;
16526 digest[3] = 0;
16527
16528 return (PARSER_OK);
16529 }
16530
16531 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16532 {
16533 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16534
16535 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16536
16537 u32 *digest = (u32 *) hash_buf->digest;
16538
16539 salt_t *salt = hash_buf->salt;
16540
16541 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16542
16543 /**
16544 * parse line
16545 */
16546
16547 char *V_pos = input_buf + 5;
16548
16549 char *R_pos = strchr (V_pos, '*');
16550
16551 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16552
16553 u32 V_len = R_pos - V_pos;
16554
16555 R_pos++;
16556
16557 char *bits_pos = strchr (R_pos, '*');
16558
16559 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16560
16561 u32 R_len = bits_pos - R_pos;
16562
16563 bits_pos++;
16564
16565 char *P_pos = strchr (bits_pos, '*');
16566
16567 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16568
16569 u32 bits_len = P_pos - bits_pos;
16570
16571 P_pos++;
16572
16573 char *enc_md_pos = strchr (P_pos, '*');
16574
16575 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16576
16577 u32 P_len = enc_md_pos - P_pos;
16578
16579 enc_md_pos++;
16580
16581 char *id_len_pos = strchr (enc_md_pos, '*');
16582
16583 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16584
16585 u32 enc_md_len = id_len_pos - enc_md_pos;
16586
16587 id_len_pos++;
16588
16589 char *id_buf_pos = strchr (id_len_pos, '*');
16590
16591 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16592
16593 u32 id_len_len = id_buf_pos - id_len_pos;
16594
16595 id_buf_pos++;
16596
16597 char *u_len_pos = strchr (id_buf_pos, '*');
16598
16599 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16600
16601 u32 id_buf_len = u_len_pos - id_buf_pos;
16602
16603 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16604
16605 u_len_pos++;
16606
16607 char *u_buf_pos = strchr (u_len_pos, '*');
16608
16609 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16610
16611 u32 u_len_len = u_buf_pos - u_len_pos;
16612
16613 u_buf_pos++;
16614
16615 char *o_len_pos = strchr (u_buf_pos, '*');
16616
16617 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16618
16619 u32 u_buf_len = o_len_pos - u_buf_pos;
16620
16621 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16622
16623 o_len_pos++;
16624
16625 char *o_buf_pos = strchr (o_len_pos, '*');
16626
16627 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16628
16629 u32 o_len_len = o_buf_pos - o_len_pos;
16630
16631 o_buf_pos++;
16632
16633 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;
16634
16635 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16636
16637 // validate data
16638
16639 const int V = atoi (V_pos);
16640 const int R = atoi (R_pos);
16641 const int P = atoi (P_pos);
16642
16643 int vr_ok = 0;
16644
16645 if ((V == 2) && (R == 3)) vr_ok = 1;
16646 if ((V == 4) && (R == 4)) vr_ok = 1;
16647
16648 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16649
16650 const int id_len = atoi (id_len_pos);
16651 const int u_len = atoi (u_len_pos);
16652 const int o_len = atoi (o_len_pos);
16653
16654 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16655
16656 if (u_len != 32) return (PARSER_SALT_VALUE);
16657 if (o_len != 32) return (PARSER_SALT_VALUE);
16658
16659 const int bits = atoi (bits_pos);
16660
16661 if (bits != 128) return (PARSER_SALT_VALUE);
16662
16663 int enc_md = 1;
16664
16665 if (R >= 4)
16666 {
16667 enc_md = atoi (enc_md_pos);
16668 }
16669
16670 // copy data to esalt
16671
16672 pdf->V = V;
16673 pdf->R = R;
16674 pdf->P = P;
16675
16676 pdf->enc_md = enc_md;
16677
16678 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16679 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16680 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16681 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16682
16683 if (id_len == 32)
16684 {
16685 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
16686 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
16687 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
16688 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
16689 }
16690
16691 pdf->id_len = id_len;
16692
16693 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16694 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16695 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16696 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16697 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16698 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16699 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16700 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16701 pdf->u_len = u_len;
16702
16703 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16704 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16705 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16706 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16707 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16708 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16709 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16710 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16711 pdf->o_len = o_len;
16712
16713 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16714 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16715 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16716 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16717
16718 if (id_len == 32)
16719 {
16720 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16721 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16722 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16723 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16724 }
16725
16726 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16727 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16728 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16729 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16730 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16731 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16732 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16733 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16734
16735 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16736 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16737 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16738 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16739 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16740 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16741 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16742 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16743
16744 // precompute rc4 data for later use
16745
16746 uint padding[8] =
16747 {
16748 0x5e4ebf28,
16749 0x418a754e,
16750 0x564e0064,
16751 0x0801faff,
16752 0xb6002e2e,
16753 0x803e68d0,
16754 0xfea90c2f,
16755 0x7a695364
16756 };
16757
16758 // md5
16759
16760 uint salt_pc_block[32] = { 0 };
16761
16762 char *salt_pc_ptr = (char *) salt_pc_block;
16763
16764 memcpy (salt_pc_ptr, padding, 32);
16765 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16766
16767 uint salt_pc_digest[4] = { 0 };
16768
16769 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16770
16771 pdf->rc4data[0] = salt_pc_digest[0];
16772 pdf->rc4data[1] = salt_pc_digest[1];
16773
16774 // we use ID for salt, maybe needs to change, we will see...
16775
16776 salt->salt_buf[0] = pdf->id_buf[0];
16777 salt->salt_buf[1] = pdf->id_buf[1];
16778 salt->salt_buf[2] = pdf->id_buf[2];
16779 salt->salt_buf[3] = pdf->id_buf[3];
16780 salt->salt_buf[4] = pdf->u_buf[0];
16781 salt->salt_buf[5] = pdf->u_buf[1];
16782 salt->salt_buf[6] = pdf->o_buf[0];
16783 salt->salt_buf[7] = pdf->o_buf[1];
16784 salt->salt_len = pdf->id_len + 16;
16785
16786 salt->salt_iter = ROUNDS_PDF14;
16787
16788 digest[0] = pdf->u_buf[0];
16789 digest[1] = pdf->u_buf[1];
16790 digest[2] = 0;
16791 digest[3] = 0;
16792
16793 return (PARSER_OK);
16794 }
16795
16796 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16797 {
16798 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16799
16800 if (ret != PARSER_OK)
16801 {
16802 return ret;
16803 }
16804
16805 u32 *digest = (u32 *) hash_buf->digest;
16806
16807 salt_t *salt = hash_buf->salt;
16808
16809 digest[0] -= SHA256M_A;
16810 digest[1] -= SHA256M_B;
16811 digest[2] -= SHA256M_C;
16812 digest[3] -= SHA256M_D;
16813 digest[4] -= SHA256M_E;
16814 digest[5] -= SHA256M_F;
16815 digest[6] -= SHA256M_G;
16816 digest[7] -= SHA256M_H;
16817
16818 salt->salt_buf[2] = 0x80;
16819
16820 return (PARSER_OK);
16821 }
16822
16823 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16824 {
16825 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16826
16827 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16828
16829 u32 *digest = (u32 *) hash_buf->digest;
16830
16831 salt_t *salt = hash_buf->salt;
16832
16833 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16834
16835 /**
16836 * parse line
16837 */
16838
16839 char *V_pos = input_buf + 5;
16840
16841 char *R_pos = strchr (V_pos, '*');
16842
16843 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16844
16845 u32 V_len = R_pos - V_pos;
16846
16847 R_pos++;
16848
16849 char *bits_pos = strchr (R_pos, '*');
16850
16851 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16852
16853 u32 R_len = bits_pos - R_pos;
16854
16855 bits_pos++;
16856
16857 char *P_pos = strchr (bits_pos, '*');
16858
16859 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16860
16861 u32 bits_len = P_pos - bits_pos;
16862
16863 P_pos++;
16864
16865 char *enc_md_pos = strchr (P_pos, '*');
16866
16867 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16868
16869 u32 P_len = enc_md_pos - P_pos;
16870
16871 enc_md_pos++;
16872
16873 char *id_len_pos = strchr (enc_md_pos, '*');
16874
16875 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16876
16877 u32 enc_md_len = id_len_pos - enc_md_pos;
16878
16879 id_len_pos++;
16880
16881 char *id_buf_pos = strchr (id_len_pos, '*');
16882
16883 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16884
16885 u32 id_len_len = id_buf_pos - id_len_pos;
16886
16887 id_buf_pos++;
16888
16889 char *u_len_pos = strchr (id_buf_pos, '*');
16890
16891 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16892
16893 u32 id_buf_len = u_len_pos - id_buf_pos;
16894
16895 u_len_pos++;
16896
16897 char *u_buf_pos = strchr (u_len_pos, '*');
16898
16899 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16900
16901 u32 u_len_len = u_buf_pos - u_len_pos;
16902
16903 u_buf_pos++;
16904
16905 char *o_len_pos = strchr (u_buf_pos, '*');
16906
16907 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16908
16909 u32 u_buf_len = o_len_pos - u_buf_pos;
16910
16911 o_len_pos++;
16912
16913 char *o_buf_pos = strchr (o_len_pos, '*');
16914
16915 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16916
16917 u32 o_len_len = o_buf_pos - o_len_pos;
16918
16919 o_buf_pos++;
16920
16921 char *last = strchr (o_buf_pos, '*');
16922
16923 if (last == NULL) last = input_buf + input_len;
16924
16925 u32 o_buf_len = last - o_buf_pos;
16926
16927 // validate data
16928
16929 const int V = atoi (V_pos);
16930 const int R = atoi (R_pos);
16931
16932 int vr_ok = 0;
16933
16934 if ((V == 5) && (R == 5)) vr_ok = 1;
16935 if ((V == 5) && (R == 6)) vr_ok = 1;
16936
16937 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16938
16939 const int bits = atoi (bits_pos);
16940
16941 if (bits != 256) return (PARSER_SALT_VALUE);
16942
16943 int enc_md = atoi (enc_md_pos);
16944
16945 if (enc_md != 1) return (PARSER_SALT_VALUE);
16946
16947 const uint id_len = atoi (id_len_pos);
16948 const uint u_len = atoi (u_len_pos);
16949 const uint o_len = atoi (o_len_pos);
16950
16951 if (V_len > 6) return (PARSER_SALT_LENGTH);
16952 if (R_len > 6) return (PARSER_SALT_LENGTH);
16953 if (P_len > 6) return (PARSER_SALT_LENGTH);
16954 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
16955 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
16956 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
16957 if (bits_len > 6) return (PARSER_SALT_LENGTH);
16958 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
16959
16960 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
16961 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
16962 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
16963
16964 // copy data to esalt
16965
16966 if (u_len < 40) return (PARSER_SALT_VALUE);
16967
16968 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
16969 {
16970 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
16971 }
16972
16973 salt->salt_buf[0] = pdf->u_buf[8];
16974 salt->salt_buf[1] = pdf->u_buf[9];
16975
16976 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16977 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16978
16979 salt->salt_len = 8;
16980 salt->salt_iter = ROUNDS_PDF17L8;
16981
16982 digest[0] = pdf->u_buf[0];
16983 digest[1] = pdf->u_buf[1];
16984 digest[2] = pdf->u_buf[2];
16985 digest[3] = pdf->u_buf[3];
16986 digest[4] = pdf->u_buf[4];
16987 digest[5] = pdf->u_buf[5];
16988 digest[6] = pdf->u_buf[6];
16989 digest[7] = pdf->u_buf[7];
16990
16991 return (PARSER_OK);
16992 }
16993
16994 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16995 {
16996 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
16997
16998 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
16999
17000 u32 *digest = (u32 *) hash_buf->digest;
17001
17002 salt_t *salt = hash_buf->salt;
17003
17004 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17005
17006 /**
17007 * parse line
17008 */
17009
17010 // iterations
17011
17012 char *iter_pos = input_buf + 7;
17013
17014 u32 iter = atoi (iter_pos);
17015
17016 if (iter < 1) return (PARSER_SALT_ITERATION);
17017 if (iter > 999999) return (PARSER_SALT_ITERATION);
17018
17019 // first is *raw* salt
17020
17021 char *salt_pos = strchr (iter_pos, ':');
17022
17023 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17024
17025 salt_pos++;
17026
17027 char *hash_pos = strchr (salt_pos, ':');
17028
17029 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17030
17031 u32 salt_len = hash_pos - salt_pos;
17032
17033 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17034
17035 hash_pos++;
17036
17037 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17038
17039 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17040
17041 // decode salt
17042
17043 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17044
17045 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17046
17047 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17048
17049 salt_buf_ptr[salt_len + 3] = 0x01;
17050 salt_buf_ptr[salt_len + 4] = 0x80;
17051
17052 salt->salt_len = salt_len;
17053 salt->salt_iter = iter - 1;
17054
17055 // decode hash
17056
17057 u8 tmp_buf[100] = { 0 };
17058
17059 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17060
17061 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17062
17063 memcpy (digest, tmp_buf, 16);
17064
17065 digest[0] = byte_swap_32 (digest[0]);
17066 digest[1] = byte_swap_32 (digest[1]);
17067 digest[2] = byte_swap_32 (digest[2]);
17068 digest[3] = byte_swap_32 (digest[3]);
17069
17070 // add some stuff to normal salt to make sorted happy
17071
17072 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17073 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17074 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17075 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17076 salt->salt_buf[4] = salt->salt_iter;
17077
17078 return (PARSER_OK);
17079 }
17080
17081 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17082 {
17083 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17084
17085 u32 *digest = (u32 *) hash_buf->digest;
17086
17087 salt_t *salt = hash_buf->salt;
17088
17089 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17090 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17091 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17092 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17093
17094 digest[0] = byte_swap_32 (digest[0]);
17095 digest[1] = byte_swap_32 (digest[1]);
17096 digest[2] = byte_swap_32 (digest[2]);
17097 digest[3] = byte_swap_32 (digest[3]);
17098
17099 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17100
17101 uint salt_len = input_len - 32 - 1;
17102
17103 char *salt_buf = input_buf + 32 + 1;
17104
17105 char *salt_buf_ptr = (char *) salt->salt_buf;
17106
17107 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17108
17109 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17110
17111 salt->salt_len = salt_len;
17112
17113 return (PARSER_OK);
17114 }
17115
17116 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17117 {
17118 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17119
17120 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17121
17122 u32 *digest = (u32 *) hash_buf->digest;
17123
17124 salt_t *salt = hash_buf->salt;
17125
17126 char *user_pos = input_buf + 10;
17127
17128 char *salt_pos = strchr (user_pos, '*');
17129
17130 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17131
17132 salt_pos++;
17133
17134 char *hash_pos = strchr (salt_pos, '*');
17135
17136 hash_pos++;
17137
17138 uint hash_len = input_len - (hash_pos - input_buf);
17139
17140 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17141
17142 uint user_len = salt_pos - user_pos - 1;
17143
17144 uint salt_len = hash_pos - salt_pos - 1;
17145
17146 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17147
17148 /*
17149 * store digest
17150 */
17151
17152 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17153 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17154 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17155 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17156
17157 digest[0] = byte_swap_32 (digest[0]);
17158 digest[1] = byte_swap_32 (digest[1]);
17159 digest[2] = byte_swap_32 (digest[2]);
17160 digest[3] = byte_swap_32 (digest[3]);
17161
17162 digest[0] -= MD5M_A;
17163 digest[1] -= MD5M_B;
17164 digest[2] -= MD5M_C;
17165 digest[3] -= MD5M_D;
17166
17167 /*
17168 * store salt
17169 */
17170
17171 char *salt_buf_ptr = (char *) salt->salt_buf;
17172
17173 // first 4 bytes are the "challenge"
17174
17175 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
17176 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
17177 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
17178 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
17179
17180 // append the user name
17181
17182 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17183
17184 salt->salt_len = 4 + user_len;
17185
17186 return (PARSER_OK);
17187 }
17188
17189 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17190 {
17191 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17192
17193 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17194
17195 u32 *digest = (u32 *) hash_buf->digest;
17196
17197 salt_t *salt = hash_buf->salt;
17198
17199 char *salt_pos = input_buf + 9;
17200
17201 char *hash_pos = strchr (salt_pos, '*');
17202
17203 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17204
17205 hash_pos++;
17206
17207 uint hash_len = input_len - (hash_pos - input_buf);
17208
17209 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17210
17211 uint salt_len = hash_pos - salt_pos - 1;
17212
17213 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17214
17215 /*
17216 * store digest
17217 */
17218
17219 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17220 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17221 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17222 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17223 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
17224
17225 /*
17226 * store salt
17227 */
17228
17229 char *salt_buf_ptr = (char *) salt->salt_buf;
17230
17231 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17232
17233 salt->salt_len = salt_len;
17234
17235 return (PARSER_OK);
17236 }
17237
17238 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17239 {
17240 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17241
17242 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17243
17244 u32 *digest = (u32 *) hash_buf->digest;
17245
17246 salt_t *salt = hash_buf->salt;
17247
17248 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17249
17250 /**
17251 * parse line
17252 */
17253
17254 char *cry_master_len_pos = input_buf + 9;
17255
17256 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17257
17258 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17259
17260 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17261
17262 cry_master_buf_pos++;
17263
17264 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17265
17266 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17267
17268 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17269
17270 cry_salt_len_pos++;
17271
17272 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17273
17274 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17275
17276 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17277
17278 cry_salt_buf_pos++;
17279
17280 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17281
17282 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17283
17284 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17285
17286 cry_rounds_pos++;
17287
17288 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17289
17290 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17291
17292 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17293
17294 ckey_len_pos++;
17295
17296 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17297
17298 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17299
17300 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
17301
17302 ckey_buf_pos++;
17303
17304 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17305
17306 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17307
17308 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17309
17310 public_key_len_pos++;
17311
17312 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17313
17314 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17315
17316 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
17317
17318 public_key_buf_pos++;
17319
17320 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;
17321
17322 const uint cry_master_len = atoi (cry_master_len_pos);
17323 const uint cry_salt_len = atoi (cry_salt_len_pos);
17324 const uint ckey_len = atoi (ckey_len_pos);
17325 const uint public_key_len = atoi (public_key_len_pos);
17326
17327 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17328 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17329 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17330 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17331
17332 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
17333 {
17334 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
17335
17336 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17337 }
17338
17339 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
17340 {
17341 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
17342
17343 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17344 }
17345
17346 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
17347 {
17348 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
17349
17350 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17351 }
17352
17353 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17354 bitcoin_wallet->ckey_len = ckey_len / 2;
17355 bitcoin_wallet->public_key_len = public_key_len / 2;
17356
17357 /*
17358 * store digest (should be unique enought, hopefully)
17359 */
17360
17361 digest[0] = bitcoin_wallet->cry_master_buf[0];
17362 digest[1] = bitcoin_wallet->cry_master_buf[1];
17363 digest[2] = bitcoin_wallet->cry_master_buf[2];
17364 digest[3] = bitcoin_wallet->cry_master_buf[3];
17365
17366 /*
17367 * store salt
17368 */
17369
17370 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17371
17372 const uint cry_rounds = atoi (cry_rounds_pos);
17373
17374 salt->salt_iter = cry_rounds - 1;
17375
17376 char *salt_buf_ptr = (char *) salt->salt_buf;
17377
17378 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17379
17380 salt->salt_len = salt_len;
17381
17382 return (PARSER_OK);
17383 }
17384
17385 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17386 {
17387 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17388
17389 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17390
17391 u32 *digest = (u32 *) hash_buf->digest;
17392
17393 salt_t *salt = hash_buf->salt;
17394
17395 sip_t *sip = (sip_t *) hash_buf->esalt;
17396
17397 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17398
17399 char *temp_input_buf = (char *) mymalloc (input_len + 1);
17400
17401 memcpy (temp_input_buf, input_buf, input_len);
17402
17403 // URI_server:
17404
17405 char *URI_server_pos = temp_input_buf + 6;
17406
17407 char *URI_client_pos = strchr (URI_server_pos, '*');
17408
17409 if (URI_client_pos == NULL)
17410 {
17411 myfree (temp_input_buf);
17412
17413 return (PARSER_SEPARATOR_UNMATCHED);
17414 }
17415
17416 URI_client_pos[0] = 0;
17417 URI_client_pos++;
17418
17419 uint URI_server_len = strlen (URI_server_pos);
17420
17421 if (URI_server_len > 512)
17422 {
17423 myfree (temp_input_buf);
17424
17425 return (PARSER_SALT_LENGTH);
17426 }
17427
17428 // URI_client:
17429
17430 char *user_pos = strchr (URI_client_pos, '*');
17431
17432 if (user_pos == NULL)
17433 {
17434 myfree (temp_input_buf);
17435
17436 return (PARSER_SEPARATOR_UNMATCHED);
17437 }
17438
17439 user_pos[0] = 0;
17440 user_pos++;
17441
17442 uint URI_client_len = strlen (URI_client_pos);
17443
17444 if (URI_client_len > 512)
17445 {
17446 myfree (temp_input_buf);
17447
17448 return (PARSER_SALT_LENGTH);
17449 }
17450
17451 // user:
17452
17453 char *realm_pos = strchr (user_pos, '*');
17454
17455 if (realm_pos == NULL)
17456 {
17457 myfree (temp_input_buf);
17458
17459 return (PARSER_SEPARATOR_UNMATCHED);
17460 }
17461
17462 realm_pos[0] = 0;
17463 realm_pos++;
17464
17465 uint user_len = strlen (user_pos);
17466
17467 if (user_len > 116)
17468 {
17469 myfree (temp_input_buf);
17470
17471 return (PARSER_SALT_LENGTH);
17472 }
17473
17474 // realm:
17475
17476 char *method_pos = strchr (realm_pos, '*');
17477
17478 if (method_pos == NULL)
17479 {
17480 myfree (temp_input_buf);
17481
17482 return (PARSER_SEPARATOR_UNMATCHED);
17483 }
17484
17485 method_pos[0] = 0;
17486 method_pos++;
17487
17488 uint realm_len = strlen (realm_pos);
17489
17490 if (realm_len > 116)
17491 {
17492 myfree (temp_input_buf);
17493
17494 return (PARSER_SALT_LENGTH);
17495 }
17496
17497 // method:
17498
17499 char *URI_prefix_pos = strchr (method_pos, '*');
17500
17501 if (URI_prefix_pos == NULL)
17502 {
17503 myfree (temp_input_buf);
17504
17505 return (PARSER_SEPARATOR_UNMATCHED);
17506 }
17507
17508 URI_prefix_pos[0] = 0;
17509 URI_prefix_pos++;
17510
17511 uint method_len = strlen (method_pos);
17512
17513 if (method_len > 246)
17514 {
17515 myfree (temp_input_buf);
17516
17517 return (PARSER_SALT_LENGTH);
17518 }
17519
17520 // URI_prefix:
17521
17522 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17523
17524 if (URI_resource_pos == NULL)
17525 {
17526 myfree (temp_input_buf);
17527
17528 return (PARSER_SEPARATOR_UNMATCHED);
17529 }
17530
17531 URI_resource_pos[0] = 0;
17532 URI_resource_pos++;
17533
17534 uint URI_prefix_len = strlen (URI_prefix_pos);
17535
17536 if (URI_prefix_len > 245)
17537 {
17538 myfree (temp_input_buf);
17539
17540 return (PARSER_SALT_LENGTH);
17541 }
17542
17543 // URI_resource:
17544
17545 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17546
17547 if (URI_suffix_pos == NULL)
17548 {
17549 myfree (temp_input_buf);
17550
17551 return (PARSER_SEPARATOR_UNMATCHED);
17552 }
17553
17554 URI_suffix_pos[0] = 0;
17555 URI_suffix_pos++;
17556
17557 uint URI_resource_len = strlen (URI_resource_pos);
17558
17559 if (URI_resource_len < 1 || URI_resource_len > 246)
17560 {
17561 myfree (temp_input_buf);
17562
17563 return (PARSER_SALT_LENGTH);
17564 }
17565
17566 // URI_suffix:
17567
17568 char *nonce_pos = strchr (URI_suffix_pos, '*');
17569
17570 if (nonce_pos == NULL)
17571 {
17572 myfree (temp_input_buf);
17573
17574 return (PARSER_SEPARATOR_UNMATCHED);
17575 }
17576
17577 nonce_pos[0] = 0;
17578 nonce_pos++;
17579
17580 uint URI_suffix_len = strlen (URI_suffix_pos);
17581
17582 if (URI_suffix_len > 245)
17583 {
17584 myfree (temp_input_buf);
17585
17586 return (PARSER_SALT_LENGTH);
17587 }
17588
17589 // nonce:
17590
17591 char *nonce_client_pos = strchr (nonce_pos, '*');
17592
17593 if (nonce_client_pos == NULL)
17594 {
17595 myfree (temp_input_buf);
17596
17597 return (PARSER_SEPARATOR_UNMATCHED);
17598 }
17599
17600 nonce_client_pos[0] = 0;
17601 nonce_client_pos++;
17602
17603 uint nonce_len = strlen (nonce_pos);
17604
17605 if (nonce_len < 1 || nonce_len > 50)
17606 {
17607 myfree (temp_input_buf);
17608
17609 return (PARSER_SALT_LENGTH);
17610 }
17611
17612 // nonce_client:
17613
17614 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17615
17616 if (nonce_count_pos == NULL)
17617 {
17618 myfree (temp_input_buf);
17619
17620 return (PARSER_SEPARATOR_UNMATCHED);
17621 }
17622
17623 nonce_count_pos[0] = 0;
17624 nonce_count_pos++;
17625
17626 uint nonce_client_len = strlen (nonce_client_pos);
17627
17628 if (nonce_client_len > 50)
17629 {
17630 myfree (temp_input_buf);
17631
17632 return (PARSER_SALT_LENGTH);
17633 }
17634
17635 // nonce_count:
17636
17637 char *qop_pos = strchr (nonce_count_pos, '*');
17638
17639 if (qop_pos == NULL)
17640 {
17641 myfree (temp_input_buf);
17642
17643 return (PARSER_SEPARATOR_UNMATCHED);
17644 }
17645
17646 qop_pos[0] = 0;
17647 qop_pos++;
17648
17649 uint nonce_count_len = strlen (nonce_count_pos);
17650
17651 if (nonce_count_len > 50)
17652 {
17653 myfree (temp_input_buf);
17654
17655 return (PARSER_SALT_LENGTH);
17656 }
17657
17658 // qop:
17659
17660 char *directive_pos = strchr (qop_pos, '*');
17661
17662 if (directive_pos == NULL)
17663 {
17664 myfree (temp_input_buf);
17665
17666 return (PARSER_SEPARATOR_UNMATCHED);
17667 }
17668
17669 directive_pos[0] = 0;
17670 directive_pos++;
17671
17672 uint qop_len = strlen (qop_pos);
17673
17674 if (qop_len > 50)
17675 {
17676 myfree (temp_input_buf);
17677
17678 return (PARSER_SALT_LENGTH);
17679 }
17680
17681 // directive
17682
17683 char *digest_pos = strchr (directive_pos, '*');
17684
17685 if (digest_pos == NULL)
17686 {
17687 myfree (temp_input_buf);
17688
17689 return (PARSER_SEPARATOR_UNMATCHED);
17690 }
17691
17692 digest_pos[0] = 0;
17693 digest_pos++;
17694
17695 uint directive_len = strlen (directive_pos);
17696
17697 if (directive_len != 3)
17698 {
17699 myfree (temp_input_buf);
17700
17701 return (PARSER_SALT_LENGTH);
17702 }
17703
17704 if (memcmp (directive_pos, "MD5", 3))
17705 {
17706 log_info ("ERROR: only the MD5 directive is currently supported\n");
17707
17708 myfree (temp_input_buf);
17709
17710 return (PARSER_SIP_AUTH_DIRECTIVE);
17711 }
17712
17713 /*
17714 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17715 */
17716
17717 uint md5_len = 0;
17718
17719 uint md5_max_len = 4 * 64;
17720
17721 uint md5_remaining_len = md5_max_len;
17722
17723 uint tmp_md5_buf[64] = { 0 };
17724
17725 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17726
17727 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17728
17729 md5_len += method_len + 1;
17730 tmp_md5_ptr += method_len + 1;
17731
17732 if (URI_prefix_len > 0)
17733 {
17734 md5_remaining_len = md5_max_len - md5_len;
17735
17736 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17737
17738 md5_len += URI_prefix_len + 1;
17739 tmp_md5_ptr += URI_prefix_len + 1;
17740 }
17741
17742 md5_remaining_len = md5_max_len - md5_len;
17743
17744 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17745
17746 md5_len += URI_resource_len;
17747 tmp_md5_ptr += URI_resource_len;
17748
17749 if (URI_suffix_len > 0)
17750 {
17751 md5_remaining_len = md5_max_len - md5_len;
17752
17753 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17754
17755 md5_len += 1 + URI_suffix_len;
17756 }
17757
17758 uint tmp_digest[4] = { 0 };
17759
17760 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17761
17762 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17763 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17764 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17765 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17766
17767 /*
17768 * esalt
17769 */
17770
17771 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17772
17773 uint esalt_len = 0;
17774
17775 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17776
17777 // there are 2 possibilities for the esalt:
17778
17779 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17780 {
17781 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17782
17783 if (esalt_len > max_esalt_len)
17784 {
17785 myfree (temp_input_buf);
17786
17787 return (PARSER_SALT_LENGTH);
17788 }
17789
17790 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17791 nonce_pos,
17792 nonce_count_pos,
17793 nonce_client_pos,
17794 qop_pos,
17795 tmp_digest[0],
17796 tmp_digest[1],
17797 tmp_digest[2],
17798 tmp_digest[3]);
17799 }
17800 else
17801 {
17802 esalt_len = 1 + nonce_len + 1 + 32;
17803
17804 if (esalt_len > max_esalt_len)
17805 {
17806 myfree (temp_input_buf);
17807
17808 return (PARSER_SALT_LENGTH);
17809 }
17810
17811 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17812 nonce_pos,
17813 tmp_digest[0],
17814 tmp_digest[1],
17815 tmp_digest[2],
17816 tmp_digest[3]);
17817 }
17818
17819 // add 0x80 to esalt
17820
17821 esalt_buf_ptr[esalt_len] = 0x80;
17822
17823 sip->esalt_len = esalt_len;
17824
17825 /*
17826 * actual salt
17827 */
17828
17829 char *sip_salt_ptr = (char *) sip->salt_buf;
17830
17831 uint salt_len = user_len + 1 + realm_len + 1;
17832
17833 uint max_salt_len = 119;
17834
17835 if (salt_len > max_salt_len)
17836 {
17837 myfree (temp_input_buf);
17838
17839 return (PARSER_SALT_LENGTH);
17840 }
17841
17842 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17843
17844 sip->salt_len = salt_len;
17845
17846 /*
17847 * fake salt (for sorting)
17848 */
17849
17850 char *salt_buf_ptr = (char *) salt->salt_buf;
17851
17852 max_salt_len = 55;
17853
17854 uint fake_salt_len = salt_len;
17855
17856 if (fake_salt_len > max_salt_len)
17857 {
17858 fake_salt_len = max_salt_len;
17859 }
17860
17861 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17862
17863 salt->salt_len = fake_salt_len;
17864
17865 /*
17866 * digest
17867 */
17868
17869 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
17870 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
17871 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
17872 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
17873
17874 digest[0] = byte_swap_32 (digest[0]);
17875 digest[1] = byte_swap_32 (digest[1]);
17876 digest[2] = byte_swap_32 (digest[2]);
17877 digest[3] = byte_swap_32 (digest[3]);
17878
17879 myfree (temp_input_buf);
17880
17881 return (PARSER_OK);
17882 }
17883
17884 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17885 {
17886 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17887
17888 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17889
17890 u32 *digest = (u32 *) hash_buf->digest;
17891
17892 salt_t *salt = hash_buf->salt;
17893
17894 // digest
17895
17896 char *digest_pos = input_buf;
17897
17898 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
17899 digest[1] = 0;
17900 digest[2] = 0;
17901 digest[3] = 0;
17902
17903 // salt
17904
17905 char *salt_buf = input_buf + 8 + 1;
17906
17907 uint salt_len = 8;
17908
17909 char *salt_buf_ptr = (char *) salt->salt_buf;
17910
17911 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17912
17913 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17914
17915 salt->salt_len = salt_len;
17916
17917 return (PARSER_OK);
17918 }
17919
17920 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17921 {
17922 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
17923
17924 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17925
17926 u32 *digest = (u32 *) hash_buf->digest;
17927
17928 salt_t *salt = hash_buf->salt;
17929
17930 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
17931
17932 /**
17933 * parse line
17934 */
17935
17936 char *p_buf_pos = input_buf + 4;
17937
17938 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
17939
17940 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17941
17942 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
17943
17944 NumCyclesPower_pos++;
17945
17946 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
17947
17948 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17949
17950 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
17951
17952 salt_len_pos++;
17953
17954 char *salt_buf_pos = strchr (salt_len_pos, '$');
17955
17956 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17957
17958 u32 salt_len_len = salt_buf_pos - salt_len_pos;
17959
17960 salt_buf_pos++;
17961
17962 char *iv_len_pos = strchr (salt_buf_pos, '$');
17963
17964 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17965
17966 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
17967
17968 iv_len_pos++;
17969
17970 char *iv_buf_pos = strchr (iv_len_pos, '$');
17971
17972 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17973
17974 u32 iv_len_len = iv_buf_pos - iv_len_pos;
17975
17976 iv_buf_pos++;
17977
17978 char *crc_buf_pos = strchr (iv_buf_pos, '$');
17979
17980 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17981
17982 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
17983
17984 crc_buf_pos++;
17985
17986 char *data_len_pos = strchr (crc_buf_pos, '$');
17987
17988 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17989
17990 u32 crc_buf_len = data_len_pos - crc_buf_pos;
17991
17992 data_len_pos++;
17993
17994 char *unpack_size_pos = strchr (data_len_pos, '$');
17995
17996 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17997
17998 u32 data_len_len = unpack_size_pos - data_len_pos;
17999
18000 unpack_size_pos++;
18001
18002 char *data_buf_pos = strchr (unpack_size_pos, '$');
18003
18004 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18005
18006 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18007
18008 data_buf_pos++;
18009
18010 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;
18011
18012 const uint iter = atoi (NumCyclesPower_pos);
18013 const uint crc = atoi (crc_buf_pos);
18014 const uint p_buf = atoi (p_buf_pos);
18015 const uint salt_len = atoi (salt_len_pos);
18016 const uint iv_len = atoi (iv_len_pos);
18017 const uint unpack_size = atoi (unpack_size_pos);
18018 const uint data_len = atoi (data_len_pos);
18019
18020 /**
18021 * verify some data
18022 */
18023
18024 if (p_buf != 0) return (PARSER_SALT_VALUE);
18025 if (salt_len != 0) return (PARSER_SALT_VALUE);
18026
18027 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18028
18029 if (data_len > 384) return (PARSER_SALT_VALUE);
18030
18031 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18032
18033 /**
18034 * store data
18035 */
18036
18037 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18038 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18039 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18040 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18041
18042 seven_zip->iv_len = iv_len;
18043
18044 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18045
18046 seven_zip->salt_len = 0;
18047
18048 seven_zip->crc = crc;
18049
18050 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18051 {
18052 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18053
18054 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18055 }
18056
18057 seven_zip->data_len = data_len;
18058
18059 seven_zip->unpack_size = unpack_size;
18060
18061 // real salt
18062
18063 salt->salt_buf[0] = seven_zip->data_buf[0];
18064 salt->salt_buf[1] = seven_zip->data_buf[1];
18065 salt->salt_buf[2] = seven_zip->data_buf[2];
18066 salt->salt_buf[3] = seven_zip->data_buf[3];
18067
18068 salt->salt_len = 16;
18069
18070 salt->salt_sign[0] = iter;
18071
18072 salt->salt_iter = 1 << iter;
18073
18074 /**
18075 * digest
18076 */
18077
18078 digest[0] = crc;
18079 digest[1] = 0;
18080 digest[2] = 0;
18081 digest[3] = 0;
18082
18083 return (PARSER_OK);
18084 }
18085
18086 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18087 {
18088 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18089
18090 u32 *digest = (u32 *) hash_buf->digest;
18091
18092 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18093 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18094 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18095 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18096 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18097 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18098 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18099 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18100
18101 digest[0] = byte_swap_32 (digest[0]);
18102 digest[1] = byte_swap_32 (digest[1]);
18103 digest[2] = byte_swap_32 (digest[2]);
18104 digest[3] = byte_swap_32 (digest[3]);
18105 digest[4] = byte_swap_32 (digest[4]);
18106 digest[5] = byte_swap_32 (digest[5]);
18107 digest[6] = byte_swap_32 (digest[6]);
18108 digest[7] = byte_swap_32 (digest[7]);
18109
18110 return (PARSER_OK);
18111 }
18112
18113 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18114 {
18115 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18116
18117 u32 *digest = (u32 *) hash_buf->digest;
18118
18119 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18120 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18121 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18122 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18123 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18124 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18125 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18126 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18127 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18128 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18129 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18130 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18131 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18132 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18133 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18134 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18135
18136 digest[ 0] = byte_swap_32 (digest[ 0]);
18137 digest[ 1] = byte_swap_32 (digest[ 1]);
18138 digest[ 2] = byte_swap_32 (digest[ 2]);
18139 digest[ 3] = byte_swap_32 (digest[ 3]);
18140 digest[ 4] = byte_swap_32 (digest[ 4]);
18141 digest[ 5] = byte_swap_32 (digest[ 5]);
18142 digest[ 6] = byte_swap_32 (digest[ 6]);
18143 digest[ 7] = byte_swap_32 (digest[ 7]);
18144 digest[ 8] = byte_swap_32 (digest[ 8]);
18145 digest[ 9] = byte_swap_32 (digest[ 9]);
18146 digest[10] = byte_swap_32 (digest[10]);
18147 digest[11] = byte_swap_32 (digest[11]);
18148 digest[12] = byte_swap_32 (digest[12]);
18149 digest[13] = byte_swap_32 (digest[13]);
18150 digest[14] = byte_swap_32 (digest[14]);
18151 digest[15] = byte_swap_32 (digest[15]);
18152
18153 return (PARSER_OK);
18154 }
18155
18156 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18157 {
18158 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
18159
18160 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18161
18162 u32 *digest = (u32 *) hash_buf->digest;
18163
18164 salt_t *salt = hash_buf->salt;
18165
18166 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
18167
18168 /**
18169 * parse line
18170 */
18171
18172 // iterations
18173
18174 char *iter_pos = input_buf + 4;
18175
18176 u32 iter = atoi (iter_pos);
18177
18178 if (iter < 1) return (PARSER_SALT_ITERATION);
18179 if (iter > 999999) return (PARSER_SALT_ITERATION);
18180
18181 // first is *raw* salt
18182
18183 char *salt_pos = strchr (iter_pos, ':');
18184
18185 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18186
18187 salt_pos++;
18188
18189 char *hash_pos = strchr (salt_pos, ':');
18190
18191 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18192
18193 u32 salt_len = hash_pos - salt_pos;
18194
18195 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18196
18197 hash_pos++;
18198
18199 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18200
18201 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18202
18203 // decode salt
18204
18205 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
18206
18207 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18208
18209 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18210
18211 salt_buf_ptr[salt_len + 3] = 0x01;
18212 salt_buf_ptr[salt_len + 4] = 0x80;
18213
18214 salt->salt_len = salt_len;
18215 salt->salt_iter = iter - 1;
18216
18217 // decode hash
18218
18219 u8 tmp_buf[100] = { 0 };
18220
18221 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18222
18223 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18224
18225 memcpy (digest, tmp_buf, 16);
18226
18227 // add some stuff to normal salt to make sorted happy
18228
18229 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
18230 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
18231 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
18232 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
18233 salt->salt_buf[4] = salt->salt_iter;
18234
18235 return (PARSER_OK);
18236 }
18237
18238 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18239 {
18240 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
18241
18242 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
18243
18244 u32 *digest = (u32 *) hash_buf->digest;
18245
18246 salt_t *salt = hash_buf->salt;
18247
18248 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
18249
18250 /**
18251 * parse line
18252 */
18253
18254 // iterations
18255
18256 char *iter_pos = input_buf + 5;
18257
18258 u32 iter = atoi (iter_pos);
18259
18260 if (iter < 1) return (PARSER_SALT_ITERATION);
18261 if (iter > 999999) return (PARSER_SALT_ITERATION);
18262
18263 // first is *raw* salt
18264
18265 char *salt_pos = strchr (iter_pos, ':');
18266
18267 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18268
18269 salt_pos++;
18270
18271 char *hash_pos = strchr (salt_pos, ':');
18272
18273 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18274
18275 u32 salt_len = hash_pos - salt_pos;
18276
18277 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18278
18279 hash_pos++;
18280
18281 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18282
18283 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18284
18285 // decode salt
18286
18287 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18288
18289 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18290
18291 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18292
18293 salt_buf_ptr[salt_len + 3] = 0x01;
18294 salt_buf_ptr[salt_len + 4] = 0x80;
18295
18296 salt->salt_len = salt_len;
18297 salt->salt_iter = iter - 1;
18298
18299 // decode hash
18300
18301 u8 tmp_buf[100] = { 0 };
18302
18303 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18304
18305 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18306
18307 memcpy (digest, tmp_buf, 16);
18308
18309 digest[0] = byte_swap_32 (digest[0]);
18310 digest[1] = byte_swap_32 (digest[1]);
18311 digest[2] = byte_swap_32 (digest[2]);
18312 digest[3] = byte_swap_32 (digest[3]);
18313
18314 // add some stuff to normal salt to make sorted happy
18315
18316 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18317 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18318 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18319 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18320 salt->salt_buf[4] = salt->salt_iter;
18321
18322 return (PARSER_OK);
18323 }
18324
18325 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18326 {
18327 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18328
18329 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18330
18331 u64 *digest = (u64 *) hash_buf->digest;
18332
18333 salt_t *salt = hash_buf->salt;
18334
18335 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18336
18337 /**
18338 * parse line
18339 */
18340
18341 // iterations
18342
18343 char *iter_pos = input_buf + 7;
18344
18345 u32 iter = atoi (iter_pos);
18346
18347 if (iter < 1) return (PARSER_SALT_ITERATION);
18348 if (iter > 999999) return (PARSER_SALT_ITERATION);
18349
18350 // first is *raw* salt
18351
18352 char *salt_pos = strchr (iter_pos, ':');
18353
18354 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18355
18356 salt_pos++;
18357
18358 char *hash_pos = strchr (salt_pos, ':');
18359
18360 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18361
18362 u32 salt_len = hash_pos - salt_pos;
18363
18364 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18365
18366 hash_pos++;
18367
18368 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18369
18370 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18371
18372 // decode salt
18373
18374 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18375
18376 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18377
18378 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18379
18380 salt_buf_ptr[salt_len + 3] = 0x01;
18381 salt_buf_ptr[salt_len + 4] = 0x80;
18382
18383 salt->salt_len = salt_len;
18384 salt->salt_iter = iter - 1;
18385
18386 // decode hash
18387
18388 u8 tmp_buf[100] = { 0 };
18389
18390 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18391
18392 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18393
18394 memcpy (digest, tmp_buf, 64);
18395
18396 digest[0] = byte_swap_64 (digest[0]);
18397 digest[1] = byte_swap_64 (digest[1]);
18398 digest[2] = byte_swap_64 (digest[2]);
18399 digest[3] = byte_swap_64 (digest[3]);
18400 digest[4] = byte_swap_64 (digest[4]);
18401 digest[5] = byte_swap_64 (digest[5]);
18402 digest[6] = byte_swap_64 (digest[6]);
18403 digest[7] = byte_swap_64 (digest[7]);
18404
18405 // add some stuff to normal salt to make sorted happy
18406
18407 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18408 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18409 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18410 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18411 salt->salt_buf[4] = salt->salt_iter;
18412
18413 return (PARSER_OK);
18414 }
18415
18416 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18417 {
18418 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18419
18420 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18421
18422 uint *digest = (uint *) hash_buf->digest;
18423
18424 salt_t *salt = hash_buf->salt;
18425
18426 /**
18427 * parse line
18428 */
18429
18430 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18431
18432 char *hash_pos = strchr (salt_pos, '$');
18433
18434 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18435
18436 u32 salt_len = hash_pos - salt_pos;
18437
18438 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18439
18440 hash_pos++;
18441
18442 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18443
18444 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18445
18446 // decode hash
18447
18448 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
18449 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
18450 digest[ 2] = 0;
18451 digest[ 3] = 0;
18452 digest[ 4] = 0;
18453 digest[ 5] = 0;
18454 digest[ 6] = 0;
18455 digest[ 7] = 0;
18456 digest[ 8] = 0;
18457 digest[ 9] = 0;
18458 digest[10] = 0;
18459 digest[11] = 0;
18460 digest[12] = 0;
18461 digest[13] = 0;
18462 digest[14] = 0;
18463 digest[15] = 0;
18464
18465 // decode salt
18466
18467 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18468 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18469
18470 salt->salt_iter = ROUNDS_ECRYPTFS;
18471 salt->salt_len = 8;
18472
18473 return (PARSER_OK);
18474 }
18475
18476 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18477 {
18478 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18479
18480 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18481
18482 unsigned char c19 = itoa64_to_int (input_buf[19]);
18483
18484 if (c19 & 3) return (PARSER_HASH_VALUE);
18485
18486 salt_t *salt = hash_buf->salt;
18487
18488 u32 *digest = (u32 *) hash_buf->digest;
18489
18490 // iteration count
18491
18492 salt->salt_iter = itoa64_to_int (input_buf[1])
18493 | itoa64_to_int (input_buf[2]) << 6
18494 | itoa64_to_int (input_buf[3]) << 12
18495 | itoa64_to_int (input_buf[4]) << 18;
18496
18497 // set salt
18498
18499 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18500 | itoa64_to_int (input_buf[6]) << 6
18501 | itoa64_to_int (input_buf[7]) << 12
18502 | itoa64_to_int (input_buf[8]) << 18;
18503
18504 salt->salt_len = 4;
18505
18506 u8 tmp_buf[100] = { 0 };
18507
18508 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
18509
18510 memcpy (digest, tmp_buf, 8);
18511
18512 uint tt;
18513
18514 IP (digest[0], digest[1], tt);
18515
18516 digest[0] = rotr32 (digest[0], 31);
18517 digest[1] = rotr32 (digest[1], 31);
18518 digest[2] = 0;
18519 digest[3] = 0;
18520
18521 return (PARSER_OK);
18522 }
18523
18524 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18525 {
18526 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18527
18528 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18529
18530 u32 *digest = (u32 *) hash_buf->digest;
18531
18532 salt_t *salt = hash_buf->salt;
18533
18534 /**
18535 * parse line
18536 */
18537
18538 char *type_pos = input_buf + 6 + 1;
18539
18540 char *salt_pos = strchr (type_pos, '*');
18541
18542 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18543
18544 u32 type_len = salt_pos - type_pos;
18545
18546 if (type_len != 1) return (PARSER_SALT_LENGTH);
18547
18548 salt_pos++;
18549
18550 char *crypted_pos = strchr (salt_pos, '*');
18551
18552 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18553
18554 u32 salt_len = crypted_pos - salt_pos;
18555
18556 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18557
18558 crypted_pos++;
18559
18560 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18561
18562 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18563
18564 /**
18565 * copy data
18566 */
18567
18568 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18569 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18570
18571 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18572 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18573
18574 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
18575 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
18576 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
18577 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
18578
18579 salt->salt_len = 24;
18580 salt->salt_iter = ROUNDS_RAR3;
18581
18582 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18583 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18584
18585 digest[0] = 0xc43d7b00;
18586 digest[1] = 0x40070000;
18587 digest[2] = 0;
18588 digest[3] = 0;
18589
18590 return (PARSER_OK);
18591 }
18592
18593 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18594 {
18595 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
18596
18597 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
18598
18599 u32 *digest = (u32 *) hash_buf->digest;
18600
18601 salt_t *salt = hash_buf->salt;
18602
18603 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
18604
18605 /**
18606 * parse line
18607 */
18608
18609 char *param0_pos = input_buf + 1 + 4 + 1;
18610
18611 char *param1_pos = strchr (param0_pos, '$');
18612
18613 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18614
18615 u32 param0_len = param1_pos - param0_pos;
18616
18617 param1_pos++;
18618
18619 char *param2_pos = strchr (param1_pos, '$');
18620
18621 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18622
18623 u32 param1_len = param2_pos - param1_pos;
18624
18625 param2_pos++;
18626
18627 char *param3_pos = strchr (param2_pos, '$');
18628
18629 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18630
18631 u32 param2_len = param3_pos - param2_pos;
18632
18633 param3_pos++;
18634
18635 char *param4_pos = strchr (param3_pos, '$');
18636
18637 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18638
18639 u32 param3_len = param4_pos - param3_pos;
18640
18641 param4_pos++;
18642
18643 char *param5_pos = strchr (param4_pos, '$');
18644
18645 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18646
18647 u32 param4_len = param5_pos - param4_pos;
18648
18649 param5_pos++;
18650
18651 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
18652
18653 char *salt_buf = param1_pos;
18654 char *iv = param3_pos;
18655 char *pswcheck = param5_pos;
18656
18657 const uint salt_len = atoi (param0_pos);
18658 const uint iterations = atoi (param2_pos);
18659 const uint pswcheck_len = atoi (param4_pos);
18660
18661 /**
18662 * verify some data
18663 */
18664
18665 if (param1_len != 32) return (PARSER_SALT_VALUE);
18666 if (param3_len != 32) return (PARSER_SALT_VALUE);
18667 if (param5_len != 16) return (PARSER_SALT_VALUE);
18668
18669 if (salt_len != 16) return (PARSER_SALT_VALUE);
18670 if (iterations == 0) return (PARSER_SALT_VALUE);
18671 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
18672
18673 /**
18674 * store data
18675 */
18676
18677 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
18678 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
18679 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
18680 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
18681
18682 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
18683 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
18684 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
18685 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
18686
18687 salt->salt_len = 16;
18688
18689 salt->salt_sign[0] = iterations;
18690
18691 salt->salt_iter = ((1 << iterations) + 32) - 1;
18692
18693 /**
18694 * digest buf
18695 */
18696
18697 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
18698 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
18699 digest[2] = 0;
18700 digest[3] = 0;
18701
18702 return (PARSER_OK);
18703 }
18704
18705 int krb5tgs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18706 {
18707 if ((input_len < DISPLAY_LEN_MIN_13100) || (input_len > DISPLAY_LEN_MAX_13100)) return (PARSER_GLOBAL_LENGTH);
18708
18709 if (memcmp (SIGNATURE_KRB5TGS, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18710
18711 u32 *digest = (u32 *) hash_buf->digest;
18712
18713 salt_t *salt = hash_buf->salt;
18714
18715 krb5tgs_t *krb5tgs = (krb5tgs_t *) hash_buf->esalt;
18716
18717 /**
18718 * parse line
18719 */
18720
18721 /* Skip '$' */
18722 char *account_pos = input_buf + 11 + 1;
18723
18724 char *data_pos;
18725
18726 uint data_len;
18727
18728 if (account_pos[0] == '*')
18729 {
18730 account_pos++;
18731
18732 data_pos = strchr (account_pos, '*');
18733
18734 /* Skip '*' */
18735 data_pos++;
18736
18737 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18738
18739 uint account_len = data_pos - account_pos + 1;
18740
18741 if (account_len >= 512) return (PARSER_SALT_LENGTH);
18742
18743 /* Skip '$' */
18744 data_pos++;
18745
18746 data_len = input_len - 11 - 1 - account_len - 2;
18747
18748 memcpy (krb5tgs->account_info, account_pos - 1, account_len);
18749 }
18750 else
18751 {
18752 /* assume $krb5tgs$23$checksum$edata2 */
18753 data_pos = account_pos;
18754
18755 memcpy (krb5tgs->account_info, "**", 3);
18756
18757 data_len = input_len - 11 - 1 - 1;
18758 }
18759
18760 if (data_len < ((16 + 32) * 2)) return (PARSER_SALT_LENGTH);
18761
18762 char *checksum_ptr = (char *) krb5tgs->checksum;
18763
18764 for (uint i = 0; i < 16 * 2; i += 2)
18765 {
18766 const char p0 = data_pos[i + 0];
18767 const char p1 = data_pos[i + 1];
18768
18769 *checksum_ptr++ = hex_convert (p1) << 0
18770 | hex_convert (p0) << 4;
18771 }
18772
18773 char *edata_ptr = (char *) krb5tgs->edata2;
18774
18775 /* skip '$' */
18776 for (uint i = 16 * 2 + 1; i < input_len; i += 2)
18777 {
18778 const char p0 = data_pos[i + 0];
18779 const char p1 = data_pos[i + 1];
18780 *edata_ptr++ = hex_convert (p1) << 0
18781 | hex_convert (p0) << 4;
18782 }
18783
18784 krb5tgs->edata2_len = strlen(edata_ptr - input_len)/(2 * 4);
18785
18786 salt->salt_buf[0] = krb5tgs->checksum[0];
18787 salt->salt_buf[1] = krb5tgs->checksum[1];
18788 salt->salt_buf[2] = krb5tgs->checksum[2];
18789 salt->salt_buf[3] = krb5tgs->checksum[3];
18790
18791 salt->salt_len = 32;
18792
18793 digest[0] = krb5tgs->checksum[0];
18794 digest[1] = krb5tgs->checksum[1];
18795 digest[2] = krb5tgs->checksum[2];
18796 digest[3] = krb5tgs->checksum[3];
18797
18798 return (PARSER_OK);
18799 }
18800
18801 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18802 {
18803 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18804
18805 u32 *digest = (u32 *) hash_buf->digest;
18806
18807 salt_t *salt = hash_buf->salt;
18808
18809 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18810 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18811 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18812 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18813 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18814 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18815 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18816 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18817
18818 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18819
18820 uint salt_len = input_len - 64 - 1;
18821
18822 char *salt_buf = input_buf + 64 + 1;
18823
18824 char *salt_buf_ptr = (char *) salt->salt_buf;
18825
18826 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18827
18828 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18829
18830 salt->salt_len = salt_len;
18831
18832 /**
18833 * we can precompute the first sha256 transform
18834 */
18835
18836 uint w[16] = { 0 };
18837
18838 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18839 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18840 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18841 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18842 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18843 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18844 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18845 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18846 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18847 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18848 w[10] = byte_swap_32 (salt->salt_buf[10]);
18849 w[11] = byte_swap_32 (salt->salt_buf[11]);
18850 w[12] = byte_swap_32 (salt->salt_buf[12]);
18851 w[13] = byte_swap_32 (salt->salt_buf[13]);
18852 w[14] = byte_swap_32 (salt->salt_buf[14]);
18853 w[15] = byte_swap_32 (salt->salt_buf[15]);
18854
18855 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
18856
18857 sha256_64 (w, pc256);
18858
18859 salt->salt_buf_pc[0] = pc256[0];
18860 salt->salt_buf_pc[1] = pc256[1];
18861 salt->salt_buf_pc[2] = pc256[2];
18862 salt->salt_buf_pc[3] = pc256[3];
18863 salt->salt_buf_pc[4] = pc256[4];
18864 salt->salt_buf_pc[5] = pc256[5];
18865 salt->salt_buf_pc[6] = pc256[6];
18866 salt->salt_buf_pc[7] = pc256[7];
18867
18868 digest[0] -= pc256[0];
18869 digest[1] -= pc256[1];
18870 digest[2] -= pc256[2];
18871 digest[3] -= pc256[3];
18872 digest[4] -= pc256[4];
18873 digest[5] -= pc256[5];
18874 digest[6] -= pc256[6];
18875 digest[7] -= pc256[7];
18876
18877 return (PARSER_OK);
18878 }
18879
18880 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18881 {
18882 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18883
18884 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18885
18886 u32 *digest = (u32 *) hash_buf->digest;
18887
18888 salt_t *salt = hash_buf->salt;
18889
18890 /**
18891 * parse line
18892 */
18893
18894 char *data_len_pos = input_buf + 1 + 10 + 1;
18895
18896 char *data_buf_pos = strchr (data_len_pos, '$');
18897
18898 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18899
18900 u32 data_len_len = data_buf_pos - data_len_pos;
18901
18902 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18903 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18904
18905 data_buf_pos++;
18906
18907 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18908
18909 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18910
18911 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18912
18913 u32 data_len = atoi (data_len_pos);
18914
18915 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18916
18917 /**
18918 * salt
18919 */
18920
18921 char *salt_pos = data_buf_pos;
18922
18923 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18924 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18925 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
18926 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
18927
18928 // this is actually the CT, which is also the hash later (if matched)
18929
18930 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
18931 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
18932 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
18933 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
18934
18935 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18936
18937 salt->salt_iter = 10 - 1;
18938
18939 /**
18940 * digest buf
18941 */
18942
18943 digest[0] = salt->salt_buf[4];
18944 digest[1] = salt->salt_buf[5];
18945 digest[2] = salt->salt_buf[6];
18946 digest[3] = salt->salt_buf[7];
18947
18948 return (PARSER_OK);
18949 }
18950
18951 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18952 {
18953 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
18954
18955 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18956
18957 u32 *digest = (u32 *) hash_buf->digest;
18958
18959 salt_t *salt = hash_buf->salt;
18960
18961 /**
18962 * parse line
18963 */
18964
18965 char *salt_pos = input_buf + 11 + 1;
18966
18967 char *iter_pos = strchr (salt_pos, ',');
18968
18969 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18970
18971 u32 salt_len = iter_pos - salt_pos;
18972
18973 if (salt_len != 20) return (PARSER_SALT_LENGTH);
18974
18975 iter_pos++;
18976
18977 char *hash_pos = strchr (iter_pos, ',');
18978
18979 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18980
18981 u32 iter_len = hash_pos - iter_pos;
18982
18983 if (iter_len > 5) return (PARSER_SALT_LENGTH);
18984
18985 hash_pos++;
18986
18987 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
18988
18989 if (hash_len != 64) return (PARSER_HASH_LENGTH);
18990
18991 /**
18992 * salt
18993 */
18994
18995 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18996 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18997 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
18998 salt->salt_buf[3] = 0x00018000;
18999
19000 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
19001 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
19002 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
19003 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
19004
19005 salt->salt_len = salt_len / 2;
19006
19007 salt->salt_iter = atoi (iter_pos) - 1;
19008
19009 /**
19010 * digest buf
19011 */
19012
19013 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
19014 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
19015 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
19016 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
19017 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
19018 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
19019 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
19020 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
19021
19022 return (PARSER_OK);
19023 }
19024
19025 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
19026 {
19027 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
19028
19029 u32 *digest = (u32 *) hash_buf->digest;
19030
19031 salt_t *salt = hash_buf->salt;
19032
19033 /**
19034 * parse line
19035 */
19036
19037 char *hash_pos = input_buf + 64;
19038 char *salt1_pos = input_buf + 128;
19039 char *salt2_pos = input_buf;
19040
19041 /**
19042 * salt
19043 */
19044
19045 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
19046 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
19047 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
19048 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
19049
19050 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
19051 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
19052 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
19053 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
19054
19055 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
19056 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
19057 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
19058 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
19059
19060 salt->salt_len = 48;
19061
19062 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
19063
19064 /**
19065 * digest buf
19066 */
19067
19068 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
19069 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
19070 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
19071 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
19072 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
19073 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
19074 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
19075 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
19076
19077 return (PARSER_OK);
19078 }
19079
19080 /**
19081 * parallel running threads
19082 */
19083
19084 #ifdef WIN
19085
19086 BOOL WINAPI sigHandler_default (DWORD sig)
19087 {
19088 switch (sig)
19089 {
19090 case CTRL_CLOSE_EVENT:
19091
19092 /*
19093 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
19094 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
19095 * function otherwise it is too late (e.g. after returning from this function)
19096 */
19097
19098 myabort ();
19099
19100 SetConsoleCtrlHandler (NULL, TRUE);
19101
19102 hc_sleep (10);
19103
19104 return TRUE;
19105
19106 case CTRL_C_EVENT:
19107 case CTRL_LOGOFF_EVENT:
19108 case CTRL_SHUTDOWN_EVENT:
19109
19110 myabort ();
19111
19112 SetConsoleCtrlHandler (NULL, TRUE);
19113
19114 return TRUE;
19115 }
19116
19117 return FALSE;
19118 }
19119
19120 BOOL WINAPI sigHandler_benchmark (DWORD sig)
19121 {
19122 switch (sig)
19123 {
19124 case CTRL_CLOSE_EVENT:
19125
19126 myabort ();
19127
19128 SetConsoleCtrlHandler (NULL, TRUE);
19129
19130 hc_sleep (10);
19131
19132 return TRUE;
19133
19134 case CTRL_C_EVENT:
19135 case CTRL_LOGOFF_EVENT:
19136 case CTRL_SHUTDOWN_EVENT:
19137
19138 myquit ();
19139
19140 SetConsoleCtrlHandler (NULL, TRUE);
19141
19142 return TRUE;
19143 }
19144
19145 return FALSE;
19146 }
19147
19148 void hc_signal (BOOL WINAPI (callback) (DWORD))
19149 {
19150 if (callback == NULL)
19151 {
19152 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
19153 }
19154 else
19155 {
19156 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
19157 }
19158 }
19159
19160 #else
19161
19162 void sigHandler_default (int sig)
19163 {
19164 myabort ();
19165
19166 signal (sig, NULL);
19167 }
19168
19169 void sigHandler_benchmark (int sig)
19170 {
19171 myquit ();
19172
19173 signal (sig, NULL);
19174 }
19175
19176 void hc_signal (void (callback) (int))
19177 {
19178 if (callback == NULL) callback = SIG_DFL;
19179
19180 signal (SIGINT, callback);
19181 signal (SIGTERM, callback);
19182 signal (SIGABRT, callback);
19183 }
19184
19185 #endif
19186
19187 void status_display ();
19188
19189 void *thread_keypress (void *p)
19190 {
19191 int benchmark = *((int *) p);
19192
19193 uint quiet = data.quiet;
19194
19195 tty_break();
19196
19197 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
19198 {
19199 int ch = tty_getchar();
19200
19201 if (ch == -1) break;
19202
19203 if (ch == 0) continue;
19204
19205 #ifdef _POSIX
19206 if (ch != '\n')
19207 #endif
19208
19209 hc_thread_mutex_lock (mux_display);
19210
19211 log_info ("");
19212
19213 switch (ch)
19214 {
19215 case 's':
19216 case '\n':
19217
19218 log_info ("");
19219
19220 status_display ();
19221
19222 log_info ("");
19223
19224 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19225 if (quiet == 0) fflush (stdout);
19226
19227 break;
19228
19229 case 'b':
19230
19231 log_info ("");
19232
19233 bypass ();
19234
19235 log_info ("");
19236
19237 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19238 if (quiet == 0) fflush (stdout);
19239
19240 break;
19241
19242 case 'p':
19243
19244 log_info ("");
19245
19246 SuspendThreads ();
19247
19248 log_info ("");
19249
19250 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19251 if (quiet == 0) fflush (stdout);
19252
19253 break;
19254
19255 case 'r':
19256
19257 log_info ("");
19258
19259 ResumeThreads ();
19260
19261 log_info ("");
19262
19263 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19264 if (quiet == 0) fflush (stdout);
19265
19266 break;
19267
19268 case 'c':
19269
19270 log_info ("");
19271
19272 if (benchmark == 1) break;
19273
19274 stop_at_checkpoint ();
19275
19276 log_info ("");
19277
19278 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19279 if (quiet == 0) fflush (stdout);
19280
19281 break;
19282
19283 case 'q':
19284
19285 log_info ("");
19286
19287 if (benchmark == 1)
19288 {
19289 myquit ();
19290 }
19291 else
19292 {
19293 myabort ();
19294 }
19295
19296 break;
19297 }
19298
19299 hc_thread_mutex_unlock (mux_display);
19300 }
19301
19302 tty_fix();
19303
19304 return (p);
19305 }
19306
19307 /**
19308 * rules common
19309 */
19310
19311 bool class_num (const u8 c)
19312 {
19313 return ((c >= '0') && (c <= '9'));
19314 }
19315
19316 bool class_lower (const u8 c)
19317 {
19318 return ((c >= 'a') && (c <= 'z'));
19319 }
19320
19321 bool class_upper (const u8 c)
19322 {
19323 return ((c >= 'A') && (c <= 'Z'));
19324 }
19325
19326 bool class_alpha (const u8 c)
19327 {
19328 return (class_lower (c) || class_upper (c));
19329 }
19330
19331 int conv_ctoi (const u8 c)
19332 {
19333 if (class_num (c))
19334 {
19335 return c - '0';
19336 }
19337 else if (class_upper (c))
19338 {
19339 return c - 'A' + 10;
19340 }
19341
19342 return -1;
19343 }
19344
19345 int conv_itoc (const u8 c)
19346 {
19347 if (c < 10)
19348 {
19349 return c + '0';
19350 }
19351 else if (c < 37)
19352 {
19353 return c + 'A' - 10;
19354 }
19355
19356 return -1;
19357 }
19358
19359 /**
19360 * device rules
19361 */
19362
19363 #define INCR_POS if (++rule_pos == rule_len) return (-1)
19364 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
19365 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
19366 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
19367 #define MAX_KERNEL_RULES 255
19368 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
19369 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19370 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19371
19372 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
19373 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
19374 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19375 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19376
19377 int cpu_rule_to_kernel_rule (char rule_buf[BUFSIZ], uint rule_len, kernel_rule_t *rule)
19378 {
19379 uint rule_pos;
19380 uint rule_cnt;
19381
19382 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19383 {
19384 switch (rule_buf[rule_pos])
19385 {
19386 case ' ':
19387 rule_cnt--;
19388 break;
19389
19390 case RULE_OP_MANGLE_NOOP:
19391 SET_NAME (rule, rule_buf[rule_pos]);
19392 break;
19393
19394 case RULE_OP_MANGLE_LREST:
19395 SET_NAME (rule, rule_buf[rule_pos]);
19396 break;
19397
19398 case RULE_OP_MANGLE_UREST:
19399 SET_NAME (rule, rule_buf[rule_pos]);
19400 break;
19401
19402 case RULE_OP_MANGLE_LREST_UFIRST:
19403 SET_NAME (rule, rule_buf[rule_pos]);
19404 break;
19405
19406 case RULE_OP_MANGLE_UREST_LFIRST:
19407 SET_NAME (rule, rule_buf[rule_pos]);
19408 break;
19409
19410 case RULE_OP_MANGLE_TREST:
19411 SET_NAME (rule, rule_buf[rule_pos]);
19412 break;
19413
19414 case RULE_OP_MANGLE_TOGGLE_AT:
19415 SET_NAME (rule, rule_buf[rule_pos]);
19416 SET_P0_CONV (rule, rule_buf[rule_pos]);
19417 break;
19418
19419 case RULE_OP_MANGLE_REVERSE:
19420 SET_NAME (rule, rule_buf[rule_pos]);
19421 break;
19422
19423 case RULE_OP_MANGLE_DUPEWORD:
19424 SET_NAME (rule, rule_buf[rule_pos]);
19425 break;
19426
19427 case RULE_OP_MANGLE_DUPEWORD_TIMES:
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_REFLECT:
19433 SET_NAME (rule, rule_buf[rule_pos]);
19434 break;
19435
19436 case RULE_OP_MANGLE_ROTATE_LEFT:
19437 SET_NAME (rule, rule_buf[rule_pos]);
19438 break;
19439
19440 case RULE_OP_MANGLE_ROTATE_RIGHT:
19441 SET_NAME (rule, rule_buf[rule_pos]);
19442 break;
19443
19444 case RULE_OP_MANGLE_APPEND:
19445 SET_NAME (rule, rule_buf[rule_pos]);
19446 SET_P0 (rule, rule_buf[rule_pos]);
19447 break;
19448
19449 case RULE_OP_MANGLE_PREPEND:
19450 SET_NAME (rule, rule_buf[rule_pos]);
19451 SET_P0 (rule, rule_buf[rule_pos]);
19452 break;
19453
19454 case RULE_OP_MANGLE_DELETE_FIRST:
19455 SET_NAME (rule, rule_buf[rule_pos]);
19456 break;
19457
19458 case RULE_OP_MANGLE_DELETE_LAST:
19459 SET_NAME (rule, rule_buf[rule_pos]);
19460 break;
19461
19462 case RULE_OP_MANGLE_DELETE_AT:
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_EXTRACT:
19468 SET_NAME (rule, rule_buf[rule_pos]);
19469 SET_P0_CONV (rule, rule_buf[rule_pos]);
19470 SET_P1_CONV (rule, rule_buf[rule_pos]);
19471 break;
19472
19473 case RULE_OP_MANGLE_OMIT:
19474 SET_NAME (rule, rule_buf[rule_pos]);
19475 SET_P0_CONV (rule, rule_buf[rule_pos]);
19476 SET_P1_CONV (rule, rule_buf[rule_pos]);
19477 break;
19478
19479 case RULE_OP_MANGLE_INSERT:
19480 SET_NAME (rule, rule_buf[rule_pos]);
19481 SET_P0_CONV (rule, rule_buf[rule_pos]);
19482 SET_P1 (rule, rule_buf[rule_pos]);
19483 break;
19484
19485 case RULE_OP_MANGLE_OVERSTRIKE:
19486 SET_NAME (rule, rule_buf[rule_pos]);
19487 SET_P0_CONV (rule, rule_buf[rule_pos]);
19488 SET_P1 (rule, rule_buf[rule_pos]);
19489 break;
19490
19491 case RULE_OP_MANGLE_TRUNCATE_AT:
19492 SET_NAME (rule, rule_buf[rule_pos]);
19493 SET_P0_CONV (rule, rule_buf[rule_pos]);
19494 break;
19495
19496 case RULE_OP_MANGLE_REPLACE:
19497 SET_NAME (rule, rule_buf[rule_pos]);
19498 SET_P0 (rule, rule_buf[rule_pos]);
19499 SET_P1 (rule, rule_buf[rule_pos]);
19500 break;
19501
19502 case RULE_OP_MANGLE_PURGECHAR:
19503 return (-1);
19504 break;
19505
19506 case RULE_OP_MANGLE_TOGGLECASE_REC:
19507 return (-1);
19508 break;
19509
19510 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19511 SET_NAME (rule, rule_buf[rule_pos]);
19512 SET_P0_CONV (rule, rule_buf[rule_pos]);
19513 break;
19514
19515 case RULE_OP_MANGLE_DUPECHAR_LAST:
19516 SET_NAME (rule, rule_buf[rule_pos]);
19517 SET_P0_CONV (rule, rule_buf[rule_pos]);
19518 break;
19519
19520 case RULE_OP_MANGLE_DUPECHAR_ALL:
19521 SET_NAME (rule, rule_buf[rule_pos]);
19522 break;
19523
19524 case RULE_OP_MANGLE_SWITCH_FIRST:
19525 SET_NAME (rule, rule_buf[rule_pos]);
19526 break;
19527
19528 case RULE_OP_MANGLE_SWITCH_LAST:
19529 SET_NAME (rule, rule_buf[rule_pos]);
19530 break;
19531
19532 case RULE_OP_MANGLE_SWITCH_AT:
19533 SET_NAME (rule, rule_buf[rule_pos]);
19534 SET_P0_CONV (rule, rule_buf[rule_pos]);
19535 SET_P1_CONV (rule, rule_buf[rule_pos]);
19536 break;
19537
19538 case RULE_OP_MANGLE_CHR_SHIFTL:
19539 SET_NAME (rule, rule_buf[rule_pos]);
19540 SET_P0_CONV (rule, rule_buf[rule_pos]);
19541 break;
19542
19543 case RULE_OP_MANGLE_CHR_SHIFTR:
19544 SET_NAME (rule, rule_buf[rule_pos]);
19545 SET_P0_CONV (rule, rule_buf[rule_pos]);
19546 break;
19547
19548 case RULE_OP_MANGLE_CHR_INCR:
19549 SET_NAME (rule, rule_buf[rule_pos]);
19550 SET_P0_CONV (rule, rule_buf[rule_pos]);
19551 break;
19552
19553 case RULE_OP_MANGLE_CHR_DECR:
19554 SET_NAME (rule, rule_buf[rule_pos]);
19555 SET_P0_CONV (rule, rule_buf[rule_pos]);
19556 break;
19557
19558 case RULE_OP_MANGLE_REPLACE_NP1:
19559 SET_NAME (rule, rule_buf[rule_pos]);
19560 SET_P0_CONV (rule, rule_buf[rule_pos]);
19561 break;
19562
19563 case RULE_OP_MANGLE_REPLACE_NM1:
19564 SET_NAME (rule, rule_buf[rule_pos]);
19565 SET_P0_CONV (rule, rule_buf[rule_pos]);
19566 break;
19567
19568 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19569 SET_NAME (rule, rule_buf[rule_pos]);
19570 SET_P0_CONV (rule, rule_buf[rule_pos]);
19571 break;
19572
19573 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19574 SET_NAME (rule, rule_buf[rule_pos]);
19575 SET_P0_CONV (rule, rule_buf[rule_pos]);
19576 break;
19577
19578 case RULE_OP_MANGLE_TITLE:
19579 SET_NAME (rule, rule_buf[rule_pos]);
19580 break;
19581
19582 default:
19583 return (-1);
19584 break;
19585 }
19586 }
19587
19588 if (rule_pos < rule_len) return (-1);
19589
19590 return (0);
19591 }
19592
19593 int kernel_rule_to_cpu_rule (char rule_buf[BUFSIZ], kernel_rule_t *rule)
19594 {
19595 uint rule_cnt;
19596 uint rule_pos;
19597 uint rule_len = BUFSIZ - 1; // maximum possible len
19598
19599 char rule_cmd;
19600
19601 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19602 {
19603 GET_NAME (rule);
19604
19605 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19606
19607 switch (rule_cmd)
19608 {
19609 case RULE_OP_MANGLE_NOOP:
19610 rule_buf[rule_pos] = rule_cmd;
19611 break;
19612
19613 case RULE_OP_MANGLE_LREST:
19614 rule_buf[rule_pos] = rule_cmd;
19615 break;
19616
19617 case RULE_OP_MANGLE_UREST:
19618 rule_buf[rule_pos] = rule_cmd;
19619 break;
19620
19621 case RULE_OP_MANGLE_LREST_UFIRST:
19622 rule_buf[rule_pos] = rule_cmd;
19623 break;
19624
19625 case RULE_OP_MANGLE_UREST_LFIRST:
19626 rule_buf[rule_pos] = rule_cmd;
19627 break;
19628
19629 case RULE_OP_MANGLE_TREST:
19630 rule_buf[rule_pos] = rule_cmd;
19631 break;
19632
19633 case RULE_OP_MANGLE_TOGGLE_AT:
19634 rule_buf[rule_pos] = rule_cmd;
19635 GET_P0_CONV (rule);
19636 break;
19637
19638 case RULE_OP_MANGLE_REVERSE:
19639 rule_buf[rule_pos] = rule_cmd;
19640 break;
19641
19642 case RULE_OP_MANGLE_DUPEWORD:
19643 rule_buf[rule_pos] = rule_cmd;
19644 break;
19645
19646 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19647 rule_buf[rule_pos] = rule_cmd;
19648 GET_P0_CONV (rule);
19649 break;
19650
19651 case RULE_OP_MANGLE_REFLECT:
19652 rule_buf[rule_pos] = rule_cmd;
19653 break;
19654
19655 case RULE_OP_MANGLE_ROTATE_LEFT:
19656 rule_buf[rule_pos] = rule_cmd;
19657 break;
19658
19659 case RULE_OP_MANGLE_ROTATE_RIGHT:
19660 rule_buf[rule_pos] = rule_cmd;
19661 break;
19662
19663 case RULE_OP_MANGLE_APPEND:
19664 rule_buf[rule_pos] = rule_cmd;
19665 GET_P0 (rule);
19666 break;
19667
19668 case RULE_OP_MANGLE_PREPEND:
19669 rule_buf[rule_pos] = rule_cmd;
19670 GET_P0 (rule);
19671 break;
19672
19673 case RULE_OP_MANGLE_DELETE_FIRST:
19674 rule_buf[rule_pos] = rule_cmd;
19675 break;
19676
19677 case RULE_OP_MANGLE_DELETE_LAST:
19678 rule_buf[rule_pos] = rule_cmd;
19679 break;
19680
19681 case RULE_OP_MANGLE_DELETE_AT:
19682 rule_buf[rule_pos] = rule_cmd;
19683 GET_P0_CONV (rule);
19684 break;
19685
19686 case RULE_OP_MANGLE_EXTRACT:
19687 rule_buf[rule_pos] = rule_cmd;
19688 GET_P0_CONV (rule);
19689 GET_P1_CONV (rule);
19690 break;
19691
19692 case RULE_OP_MANGLE_OMIT:
19693 rule_buf[rule_pos] = rule_cmd;
19694 GET_P0_CONV (rule);
19695 GET_P1_CONV (rule);
19696 break;
19697
19698 case RULE_OP_MANGLE_INSERT:
19699 rule_buf[rule_pos] = rule_cmd;
19700 GET_P0_CONV (rule);
19701 GET_P1 (rule);
19702 break;
19703
19704 case RULE_OP_MANGLE_OVERSTRIKE:
19705 rule_buf[rule_pos] = rule_cmd;
19706 GET_P0_CONV (rule);
19707 GET_P1 (rule);
19708 break;
19709
19710 case RULE_OP_MANGLE_TRUNCATE_AT:
19711 rule_buf[rule_pos] = rule_cmd;
19712 GET_P0_CONV (rule);
19713 break;
19714
19715 case RULE_OP_MANGLE_REPLACE:
19716 rule_buf[rule_pos] = rule_cmd;
19717 GET_P0 (rule);
19718 GET_P1 (rule);
19719 break;
19720
19721 case RULE_OP_MANGLE_PURGECHAR:
19722 return (-1);
19723 break;
19724
19725 case RULE_OP_MANGLE_TOGGLECASE_REC:
19726 return (-1);
19727 break;
19728
19729 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19730 rule_buf[rule_pos] = rule_cmd;
19731 GET_P0_CONV (rule);
19732 break;
19733
19734 case RULE_OP_MANGLE_DUPECHAR_LAST:
19735 rule_buf[rule_pos] = rule_cmd;
19736 GET_P0_CONV (rule);
19737 break;
19738
19739 case RULE_OP_MANGLE_DUPECHAR_ALL:
19740 rule_buf[rule_pos] = rule_cmd;
19741 break;
19742
19743 case RULE_OP_MANGLE_SWITCH_FIRST:
19744 rule_buf[rule_pos] = rule_cmd;
19745 break;
19746
19747 case RULE_OP_MANGLE_SWITCH_LAST:
19748 rule_buf[rule_pos] = rule_cmd;
19749 break;
19750
19751 case RULE_OP_MANGLE_SWITCH_AT:
19752 rule_buf[rule_pos] = rule_cmd;
19753 GET_P0_CONV (rule);
19754 GET_P1_CONV (rule);
19755 break;
19756
19757 case RULE_OP_MANGLE_CHR_SHIFTL:
19758 rule_buf[rule_pos] = rule_cmd;
19759 GET_P0_CONV (rule);
19760 break;
19761
19762 case RULE_OP_MANGLE_CHR_SHIFTR:
19763 rule_buf[rule_pos] = rule_cmd;
19764 GET_P0_CONV (rule);
19765 break;
19766
19767 case RULE_OP_MANGLE_CHR_INCR:
19768 rule_buf[rule_pos] = rule_cmd;
19769 GET_P0_CONV (rule);
19770 break;
19771
19772 case RULE_OP_MANGLE_CHR_DECR:
19773 rule_buf[rule_pos] = rule_cmd;
19774 GET_P0_CONV (rule);
19775 break;
19776
19777 case RULE_OP_MANGLE_REPLACE_NP1:
19778 rule_buf[rule_pos] = rule_cmd;
19779 GET_P0_CONV (rule);
19780 break;
19781
19782 case RULE_OP_MANGLE_REPLACE_NM1:
19783 rule_buf[rule_pos] = rule_cmd;
19784 GET_P0_CONV (rule);
19785 break;
19786
19787 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19788 rule_buf[rule_pos] = rule_cmd;
19789 GET_P0_CONV (rule);
19790 break;
19791
19792 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19793 rule_buf[rule_pos] = rule_cmd;
19794 GET_P0_CONV (rule);
19795 break;
19796
19797 case RULE_OP_MANGLE_TITLE:
19798 rule_buf[rule_pos] = rule_cmd;
19799 break;
19800
19801 case 0:
19802 return rule_pos - 1;
19803 break;
19804
19805 default:
19806 return (-1);
19807 break;
19808 }
19809 }
19810
19811 if (rule_cnt > 0)
19812 {
19813 return rule_pos;
19814 }
19815
19816 return (-1);
19817 }
19818
19819 /**
19820 * CPU rules : this is from hashcat sources, cpu based rules
19821 */
19822
19823 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19824 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19825
19826 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19827 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19828 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19829
19830 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19831 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19832 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19833
19834 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19835 {
19836 int pos;
19837
19838 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19839
19840 return (arr_len);
19841 }
19842
19843 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19844 {
19845 int pos;
19846
19847 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19848
19849 return (arr_len);
19850 }
19851
19852 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19853 {
19854 int pos;
19855
19856 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19857
19858 return (arr_len);
19859 }
19860
19861 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19862 {
19863 int l;
19864 int r;
19865
19866 for (l = 0; l < arr_len; l++)
19867 {
19868 r = arr_len - 1 - l;
19869
19870 if (l >= r) break;
19871
19872 MANGLE_SWITCH (arr, l, r);
19873 }
19874
19875 return (arr_len);
19876 }
19877
19878 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19879 {
19880 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19881
19882 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19883
19884 return (arr_len * 2);
19885 }
19886
19887 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19888 {
19889 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19890
19891 int orig_len = arr_len;
19892
19893 int i;
19894
19895 for (i = 0; i < times; i++)
19896 {
19897 memcpy (&arr[arr_len], arr, orig_len);
19898
19899 arr_len += orig_len;
19900 }
19901
19902 return (arr_len);
19903 }
19904
19905 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19906 {
19907 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19908
19909 mangle_double (arr, arr_len);
19910
19911 mangle_reverse (arr + arr_len, arr_len);
19912
19913 return (arr_len * 2);
19914 }
19915
19916 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19917 {
19918 int l;
19919 int r;
19920
19921 for (l = 0, r = arr_len - 1; r > 0; r--)
19922 {
19923 MANGLE_SWITCH (arr, l, r);
19924 }
19925
19926 return (arr_len);
19927 }
19928
19929 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19930 {
19931 int l;
19932 int r;
19933
19934 for (l = 0, r = arr_len - 1; l < r; l++)
19935 {
19936 MANGLE_SWITCH (arr, l, r);
19937 }
19938
19939 return (arr_len);
19940 }
19941
19942 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19943 {
19944 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19945
19946 arr[arr_len] = c;
19947
19948 return (arr_len + 1);
19949 }
19950
19951 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19952 {
19953 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19954
19955 int arr_pos;
19956
19957 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19958 {
19959 arr[arr_pos + 1] = arr[arr_pos];
19960 }
19961
19962 arr[0] = c;
19963
19964 return (arr_len + 1);
19965 }
19966
19967 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19968 {
19969 if (upos >= arr_len) return (arr_len);
19970
19971 int arr_pos;
19972
19973 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
19974 {
19975 arr[arr_pos] = arr[arr_pos + 1];
19976 }
19977
19978 return (arr_len - 1);
19979 }
19980
19981 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19982 {
19983 if (upos >= arr_len) return (arr_len);
19984
19985 if ((upos + ulen) > arr_len) return (arr_len);
19986
19987 int arr_pos;
19988
19989 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
19990 {
19991 arr[arr_pos] = arr[upos + arr_pos];
19992 }
19993
19994 return (ulen);
19995 }
19996
19997 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19998 {
19999 if (upos >= arr_len) return (arr_len);
20000
20001 if ((upos + ulen) >= arr_len) return (arr_len);
20002
20003 int arr_pos;
20004
20005 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
20006 {
20007 arr[arr_pos] = arr[arr_pos + ulen];
20008 }
20009
20010 return (arr_len - ulen);
20011 }
20012
20013 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
20014 {
20015 if (upos >= arr_len) return (arr_len);
20016
20017 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
20018
20019 int arr_pos;
20020
20021 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
20022 {
20023 arr[arr_pos + 1] = arr[arr_pos];
20024 }
20025
20026 arr[upos] = c;
20027
20028 return (arr_len + 1);
20029 }
20030
20031 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)
20032 {
20033 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20034
20035 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
20036
20037 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
20038
20039 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
20040
20041 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
20042
20043 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
20044
20045 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
20046
20047 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
20048
20049 return (arr_len + arr2_cpy);
20050 }
20051
20052 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
20053 {
20054 if (upos >= arr_len) return (arr_len);
20055
20056 arr[upos] = c;
20057
20058 return (arr_len);
20059 }
20060
20061 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
20062 {
20063 if (upos >= arr_len) return (arr_len);
20064
20065 memset (arr + upos, 0, arr_len - upos);
20066
20067 return (upos);
20068 }
20069
20070 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
20071 {
20072 int arr_pos;
20073
20074 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
20075 {
20076 if (arr[arr_pos] != oldc) continue;
20077
20078 arr[arr_pos] = newc;
20079 }
20080
20081 return (arr_len);
20082 }
20083
20084 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
20085 {
20086 int arr_pos;
20087
20088 int ret_len;
20089
20090 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
20091 {
20092 if (arr[arr_pos] == c) continue;
20093
20094 arr[ret_len] = arr[arr_pos];
20095
20096 ret_len++;
20097 }
20098
20099 return (ret_len);
20100 }
20101
20102 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
20103 {
20104 if (ulen > arr_len) return (arr_len);
20105
20106 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20107
20108 char cs[100] = { 0 };
20109
20110 memcpy (cs, arr, ulen);
20111
20112 int i;
20113
20114 for (i = 0; i < ulen; i++)
20115 {
20116 char c = cs[i];
20117
20118 arr_len = mangle_insert (arr, arr_len, i, c);
20119 }
20120
20121 return (arr_len);
20122 }
20123
20124 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
20125 {
20126 if (ulen > arr_len) return (arr_len);
20127
20128 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20129
20130 int upos = arr_len - ulen;
20131
20132 int i;
20133
20134 for (i = 0; i < ulen; i++)
20135 {
20136 char c = arr[upos + i];
20137
20138 arr_len = mangle_append (arr, arr_len, c);
20139 }
20140
20141 return (arr_len);
20142 }
20143
20144 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20145 {
20146 if ( arr_len == 0) return (arr_len);
20147 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20148
20149 char c = arr[upos];
20150
20151 int i;
20152
20153 for (i = 0; i < ulen; i++)
20154 {
20155 arr_len = mangle_insert (arr, arr_len, upos, c);
20156 }
20157
20158 return (arr_len);
20159 }
20160
20161 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
20162 {
20163 if ( arr_len == 0) return (arr_len);
20164 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
20165
20166 int arr_pos;
20167
20168 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
20169 {
20170 int new_pos = arr_pos * 2;
20171
20172 arr[new_pos] = arr[arr_pos];
20173
20174 arr[new_pos + 1] = arr[arr_pos];
20175 }
20176
20177 return (arr_len * 2);
20178 }
20179
20180 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20181 {
20182 if (upos >= arr_len) return (arr_len);
20183 if (upos2 >= arr_len) return (arr_len);
20184
20185 MANGLE_SWITCH (arr, upos, upos2);
20186
20187 return (arr_len);
20188 }
20189
20190 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20191 {
20192 MANGLE_SWITCH (arr, upos, upos2);
20193
20194 return (arr_len);
20195 }
20196
20197 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
20198 {
20199 if (upos >= arr_len) return (arr_len);
20200
20201 arr[upos] <<= 1;
20202
20203 return (arr_len);
20204 }
20205
20206 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
20207 {
20208 if (upos >= arr_len) return (arr_len);
20209
20210 arr[upos] >>= 1;
20211
20212 return (arr_len);
20213 }
20214
20215 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
20216 {
20217 if (upos >= arr_len) return (arr_len);
20218
20219 arr[upos] += 1;
20220
20221 return (arr_len);
20222 }
20223
20224 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
20225 {
20226 if (upos >= arr_len) return (arr_len);
20227
20228 arr[upos] -= 1;
20229
20230 return (arr_len);
20231 }
20232
20233 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
20234 {
20235 int upper_next = 1;
20236
20237 int pos;
20238
20239 for (pos = 0; pos < arr_len; pos++)
20240 {
20241 if (arr[pos] == ' ')
20242 {
20243 upper_next = 1;
20244
20245 continue;
20246 }
20247
20248 if (upper_next)
20249 {
20250 upper_next = 0;
20251
20252 MANGLE_UPPER_AT (arr, pos);
20253 }
20254 else
20255 {
20256 MANGLE_LOWER_AT (arr, pos);
20257 }
20258 }
20259
20260 return (arr_len);
20261 }
20262
20263 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
20264 {
20265 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
20266
20267 u32 j;
20268
20269 u32 rule_pos = 0;
20270
20271 for (j = 0; j < rp_gen_num; j++)
20272 {
20273 u32 r = 0;
20274 u32 p1 = 0;
20275 u32 p2 = 0;
20276 u32 p3 = 0;
20277
20278 switch ((char) get_random_num (0, 9))
20279 {
20280 case 0:
20281 r = get_random_num (0, sizeof (grp_op_nop));
20282 rule_buf[rule_pos++] = grp_op_nop[r];
20283 break;
20284
20285 case 1:
20286 r = get_random_num (0, sizeof (grp_op_pos_p0));
20287 rule_buf[rule_pos++] = grp_op_pos_p0[r];
20288 p1 = get_random_num (0, sizeof (grp_pos));
20289 rule_buf[rule_pos++] = grp_pos[p1];
20290 break;
20291
20292 case 2:
20293 r = get_random_num (0, sizeof (grp_op_pos_p1));
20294 rule_buf[rule_pos++] = grp_op_pos_p1[r];
20295 p1 = get_random_num (1, 6);
20296 rule_buf[rule_pos++] = grp_pos[p1];
20297 break;
20298
20299 case 3:
20300 r = get_random_num (0, sizeof (grp_op_chr));
20301 rule_buf[rule_pos++] = grp_op_chr[r];
20302 p1 = get_random_num (0x20, 0x7e);
20303 rule_buf[rule_pos++] = (char) p1;
20304 break;
20305
20306 case 4:
20307 r = get_random_num (0, sizeof (grp_op_chr_chr));
20308 rule_buf[rule_pos++] = grp_op_chr_chr[r];
20309 p1 = get_random_num (0x20, 0x7e);
20310 rule_buf[rule_pos++] = (char) p1;
20311 p2 = get_random_num (0x20, 0x7e);
20312 while (p1 == p2)
20313 p2 = get_random_num (0x20, 0x7e);
20314 rule_buf[rule_pos++] = (char) p2;
20315 break;
20316
20317 case 5:
20318 r = get_random_num (0, sizeof (grp_op_pos_chr));
20319 rule_buf[rule_pos++] = grp_op_pos_chr[r];
20320 p1 = get_random_num (0, sizeof (grp_pos));
20321 rule_buf[rule_pos++] = grp_pos[p1];
20322 p2 = get_random_num (0x20, 0x7e);
20323 rule_buf[rule_pos++] = (char) p2;
20324 break;
20325
20326 case 6:
20327 r = get_random_num (0, sizeof (grp_op_pos_pos0));
20328 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
20329 p1 = get_random_num (0, sizeof (grp_pos));
20330 rule_buf[rule_pos++] = grp_pos[p1];
20331 p2 = get_random_num (0, sizeof (grp_pos));
20332 while (p1 == p2)
20333 p2 = get_random_num (0, sizeof (grp_pos));
20334 rule_buf[rule_pos++] = grp_pos[p2];
20335 break;
20336
20337 case 7:
20338 r = get_random_num (0, sizeof (grp_op_pos_pos1));
20339 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
20340 p1 = get_random_num (0, sizeof (grp_pos));
20341 rule_buf[rule_pos++] = grp_pos[p1];
20342 p2 = get_random_num (1, sizeof (grp_pos));
20343 while (p1 == p2)
20344 p2 = get_random_num (1, sizeof (grp_pos));
20345 rule_buf[rule_pos++] = grp_pos[p2];
20346 break;
20347
20348 case 8:
20349 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
20350 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
20351 p1 = get_random_num (0, sizeof (grp_pos));
20352 rule_buf[rule_pos++] = grp_pos[p1];
20353 p2 = get_random_num (1, sizeof (grp_pos));
20354 rule_buf[rule_pos++] = grp_pos[p1];
20355 p3 = get_random_num (0, sizeof (grp_pos));
20356 rule_buf[rule_pos++] = grp_pos[p3];
20357 break;
20358 }
20359 }
20360
20361 return (rule_pos);
20362 }
20363
20364 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
20365 {
20366 char mem[BLOCK_SIZE] = { 0 };
20367
20368 if (in == NULL) return (RULE_RC_REJECT_ERROR);
20369
20370 if (out == NULL) return (RULE_RC_REJECT_ERROR);
20371
20372 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20373
20374 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
20375
20376 int out_len = in_len;
20377 int mem_len = in_len;
20378
20379 memcpy (out, in, out_len);
20380
20381 int rule_pos;
20382
20383 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
20384 {
20385 int upos, upos2;
20386 int ulen;
20387
20388 switch (rule[rule_pos])
20389 {
20390 case ' ':
20391 break;
20392
20393 case RULE_OP_MANGLE_NOOP:
20394 break;
20395
20396 case RULE_OP_MANGLE_LREST:
20397 out_len = mangle_lrest (out, out_len);
20398 break;
20399
20400 case RULE_OP_MANGLE_UREST:
20401 out_len = mangle_urest (out, out_len);
20402 break;
20403
20404 case RULE_OP_MANGLE_LREST_UFIRST:
20405 out_len = mangle_lrest (out, out_len);
20406 if (out_len) MANGLE_UPPER_AT (out, 0);
20407 break;
20408
20409 case RULE_OP_MANGLE_UREST_LFIRST:
20410 out_len = mangle_urest (out, out_len);
20411 if (out_len) MANGLE_LOWER_AT (out, 0);
20412 break;
20413
20414 case RULE_OP_MANGLE_TREST:
20415 out_len = mangle_trest (out, out_len);
20416 break;
20417
20418 case RULE_OP_MANGLE_TOGGLE_AT:
20419 NEXT_RULEPOS (rule_pos);
20420 NEXT_RPTOI (rule, rule_pos, upos);
20421 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
20422 break;
20423
20424 case RULE_OP_MANGLE_REVERSE:
20425 out_len = mangle_reverse (out, out_len);
20426 break;
20427
20428 case RULE_OP_MANGLE_DUPEWORD:
20429 out_len = mangle_double (out, out_len);
20430 break;
20431
20432 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20433 NEXT_RULEPOS (rule_pos);
20434 NEXT_RPTOI (rule, rule_pos, ulen);
20435 out_len = mangle_double_times (out, out_len, ulen);
20436 break;
20437
20438 case RULE_OP_MANGLE_REFLECT:
20439 out_len = mangle_reflect (out, out_len);
20440 break;
20441
20442 case RULE_OP_MANGLE_ROTATE_LEFT:
20443 mangle_rotate_left (out, out_len);
20444 break;
20445
20446 case RULE_OP_MANGLE_ROTATE_RIGHT:
20447 mangle_rotate_right (out, out_len);
20448 break;
20449
20450 case RULE_OP_MANGLE_APPEND:
20451 NEXT_RULEPOS (rule_pos);
20452 out_len = mangle_append (out, out_len, rule[rule_pos]);
20453 break;
20454
20455 case RULE_OP_MANGLE_PREPEND:
20456 NEXT_RULEPOS (rule_pos);
20457 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
20458 break;
20459
20460 case RULE_OP_MANGLE_DELETE_FIRST:
20461 out_len = mangle_delete_at (out, out_len, 0);
20462 break;
20463
20464 case RULE_OP_MANGLE_DELETE_LAST:
20465 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
20466 break;
20467
20468 case RULE_OP_MANGLE_DELETE_AT:
20469 NEXT_RULEPOS (rule_pos);
20470 NEXT_RPTOI (rule, rule_pos, upos);
20471 out_len = mangle_delete_at (out, out_len, upos);
20472 break;
20473
20474 case RULE_OP_MANGLE_EXTRACT:
20475 NEXT_RULEPOS (rule_pos);
20476 NEXT_RPTOI (rule, rule_pos, upos);
20477 NEXT_RULEPOS (rule_pos);
20478 NEXT_RPTOI (rule, rule_pos, ulen);
20479 out_len = mangle_extract (out, out_len, upos, ulen);
20480 break;
20481
20482 case RULE_OP_MANGLE_OMIT:
20483 NEXT_RULEPOS (rule_pos);
20484 NEXT_RPTOI (rule, rule_pos, upos);
20485 NEXT_RULEPOS (rule_pos);
20486 NEXT_RPTOI (rule, rule_pos, ulen);
20487 out_len = mangle_omit (out, out_len, upos, ulen);
20488 break;
20489
20490 case RULE_OP_MANGLE_INSERT:
20491 NEXT_RULEPOS (rule_pos);
20492 NEXT_RPTOI (rule, rule_pos, upos);
20493 NEXT_RULEPOS (rule_pos);
20494 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
20495 break;
20496
20497 case RULE_OP_MANGLE_OVERSTRIKE:
20498 NEXT_RULEPOS (rule_pos);
20499 NEXT_RPTOI (rule, rule_pos, upos);
20500 NEXT_RULEPOS (rule_pos);
20501 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
20502 break;
20503
20504 case RULE_OP_MANGLE_TRUNCATE_AT:
20505 NEXT_RULEPOS (rule_pos);
20506 NEXT_RPTOI (rule, rule_pos, upos);
20507 out_len = mangle_truncate_at (out, out_len, upos);
20508 break;
20509
20510 case RULE_OP_MANGLE_REPLACE:
20511 NEXT_RULEPOS (rule_pos);
20512 NEXT_RULEPOS (rule_pos);
20513 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
20514 break;
20515
20516 case RULE_OP_MANGLE_PURGECHAR:
20517 NEXT_RULEPOS (rule_pos);
20518 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
20519 break;
20520
20521 case RULE_OP_MANGLE_TOGGLECASE_REC:
20522 /* todo */
20523 break;
20524
20525 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20526 NEXT_RULEPOS (rule_pos);
20527 NEXT_RPTOI (rule, rule_pos, ulen);
20528 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
20529 break;
20530
20531 case RULE_OP_MANGLE_DUPECHAR_LAST:
20532 NEXT_RULEPOS (rule_pos);
20533 NEXT_RPTOI (rule, rule_pos, ulen);
20534 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
20535 break;
20536
20537 case RULE_OP_MANGLE_DUPECHAR_ALL:
20538 out_len = mangle_dupechar (out, out_len);
20539 break;
20540
20541 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20542 NEXT_RULEPOS (rule_pos);
20543 NEXT_RPTOI (rule, rule_pos, ulen);
20544 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20545 break;
20546
20547 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20548 NEXT_RULEPOS (rule_pos);
20549 NEXT_RPTOI (rule, rule_pos, ulen);
20550 out_len = mangle_dupeblock_append (out, out_len, ulen);
20551 break;
20552
20553 case RULE_OP_MANGLE_SWITCH_FIRST:
20554 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20555 break;
20556
20557 case RULE_OP_MANGLE_SWITCH_LAST:
20558 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20559 break;
20560
20561 case RULE_OP_MANGLE_SWITCH_AT:
20562 NEXT_RULEPOS (rule_pos);
20563 NEXT_RPTOI (rule, rule_pos, upos);
20564 NEXT_RULEPOS (rule_pos);
20565 NEXT_RPTOI (rule, rule_pos, upos2);
20566 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20567 break;
20568
20569 case RULE_OP_MANGLE_CHR_SHIFTL:
20570 NEXT_RULEPOS (rule_pos);
20571 NEXT_RPTOI (rule, rule_pos, upos);
20572 mangle_chr_shiftl (out, out_len, upos);
20573 break;
20574
20575 case RULE_OP_MANGLE_CHR_SHIFTR:
20576 NEXT_RULEPOS (rule_pos);
20577 NEXT_RPTOI (rule, rule_pos, upos);
20578 mangle_chr_shiftr (out, out_len, upos);
20579 break;
20580
20581 case RULE_OP_MANGLE_CHR_INCR:
20582 NEXT_RULEPOS (rule_pos);
20583 NEXT_RPTOI (rule, rule_pos, upos);
20584 mangle_chr_incr (out, out_len, upos);
20585 break;
20586
20587 case RULE_OP_MANGLE_CHR_DECR:
20588 NEXT_RULEPOS (rule_pos);
20589 NEXT_RPTOI (rule, rule_pos, upos);
20590 mangle_chr_decr (out, out_len, upos);
20591 break;
20592
20593 case RULE_OP_MANGLE_REPLACE_NP1:
20594 NEXT_RULEPOS (rule_pos);
20595 NEXT_RPTOI (rule, rule_pos, upos);
20596 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20597 break;
20598
20599 case RULE_OP_MANGLE_REPLACE_NM1:
20600 NEXT_RULEPOS (rule_pos);
20601 NEXT_RPTOI (rule, rule_pos, upos);
20602 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20603 break;
20604
20605 case RULE_OP_MANGLE_TITLE:
20606 out_len = mangle_title (out, out_len);
20607 break;
20608
20609 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20610 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20611 NEXT_RULEPOS (rule_pos);
20612 NEXT_RPTOI (rule, rule_pos, upos);
20613 NEXT_RULEPOS (rule_pos);
20614 NEXT_RPTOI (rule, rule_pos, ulen);
20615 NEXT_RULEPOS (rule_pos);
20616 NEXT_RPTOI (rule, rule_pos, upos2);
20617 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20618 break;
20619
20620 case RULE_OP_MANGLE_APPEND_MEMORY:
20621 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20622 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20623 memcpy (out + out_len, mem, mem_len);
20624 out_len += mem_len;
20625 break;
20626
20627 case RULE_OP_MANGLE_PREPEND_MEMORY:
20628 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20629 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20630 memcpy (mem + mem_len, out, out_len);
20631 out_len += mem_len;
20632 memcpy (out, mem, out_len);
20633 break;
20634
20635 case RULE_OP_MEMORIZE_WORD:
20636 memcpy (mem, out, out_len);
20637 mem_len = out_len;
20638 break;
20639
20640 case RULE_OP_REJECT_LESS:
20641 NEXT_RULEPOS (rule_pos);
20642 NEXT_RPTOI (rule, rule_pos, upos);
20643 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20644 break;
20645
20646 case RULE_OP_REJECT_GREATER:
20647 NEXT_RULEPOS (rule_pos);
20648 NEXT_RPTOI (rule, rule_pos, upos);
20649 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20650 break;
20651
20652 case RULE_OP_REJECT_CONTAIN:
20653 NEXT_RULEPOS (rule_pos);
20654 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20655 break;
20656
20657 case RULE_OP_REJECT_NOT_CONTAIN:
20658 NEXT_RULEPOS (rule_pos);
20659 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20660 break;
20661
20662 case RULE_OP_REJECT_EQUAL_FIRST:
20663 NEXT_RULEPOS (rule_pos);
20664 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20665 break;
20666
20667 case RULE_OP_REJECT_EQUAL_LAST:
20668 NEXT_RULEPOS (rule_pos);
20669 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20670 break;
20671
20672 case RULE_OP_REJECT_EQUAL_AT:
20673 NEXT_RULEPOS (rule_pos);
20674 NEXT_RPTOI (rule, rule_pos, upos);
20675 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20676 NEXT_RULEPOS (rule_pos);
20677 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20678 break;
20679
20680 case RULE_OP_REJECT_CONTAINS:
20681 NEXT_RULEPOS (rule_pos);
20682 NEXT_RPTOI (rule, rule_pos, upos);
20683 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20684 NEXT_RULEPOS (rule_pos);
20685 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20686 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20687 break;
20688
20689 case RULE_OP_REJECT_MEMORY:
20690 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20691 break;
20692
20693 default:
20694 return (RULE_RC_SYNTAX_ERROR);
20695 break;
20696 }
20697 }
20698
20699 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20700
20701 return (out_len);
20702 }