Merge pull request #177 from magnumripper/master
[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 * tuning tools
17 */
18
19 #define GET_ACCEL(x) KERNEL_ACCEL_ ## x
20 #define GET_LOOPS(x) KERNEL_LOOPS_ ## x
21
22 /**
23 * basic bit handling
24 */
25
26 u32 rotl32 (const u32 a, const u32 n)
27 {
28 return ((a << n) | (a >> (32 - n)));
29 }
30
31 u32 rotr32 (const u32 a, const u32 n)
32 {
33 return ((a >> n) | (a << (32 - n)));
34 }
35
36 u64 rotl64 (const u64 a, const u64 n)
37 {
38 return ((a << n) | (a >> (64 - n)));
39 }
40
41 u64 rotr64 (const u64 a, const u64 n)
42 {
43 return ((a >> n) | (a << (64 - n)));
44 }
45
46 u32 byte_swap_32 (const u32 n)
47 {
48 return (n & 0xff000000) >> 24
49 | (n & 0x00ff0000) >> 8
50 | (n & 0x0000ff00) << 8
51 | (n & 0x000000ff) << 24;
52 }
53
54 u64 byte_swap_64 (const u64 n)
55 {
56 return (n & 0xff00000000000000ULL) >> 56
57 | (n & 0x00ff000000000000ULL) >> 40
58 | (n & 0x0000ff0000000000ULL) >> 24
59 | (n & 0x000000ff00000000ULL) >> 8
60 | (n & 0x00000000ff000000ULL) << 8
61 | (n & 0x0000000000ff0000ULL) << 24
62 | (n & 0x000000000000ff00ULL) << 40
63 | (n & 0x00000000000000ffULL) << 56;
64 }
65
66 /**
67 * ciphers for use on cpu
68 */
69
70 #include "cpu-des.c"
71 #include "cpu-aes.c"
72
73 /**
74 * hashes for use on cpu
75 */
76
77 #include "cpu-md5.c"
78 #include "cpu-sha256.c"
79
80 /**
81 * logging
82 */
83
84 int last_len = 0;
85
86 void log_final (FILE *fp, const char *fmt, va_list ap)
87 {
88 if (last_len)
89 {
90 fputc ('\r', fp);
91
92 for (int i = 0; i < last_len; i++)
93 {
94 fputc (' ', fp);
95 }
96
97 fputc ('\r', fp);
98 }
99
100 char s[4096] = { 0 };
101
102 int max_len = (int) sizeof (s);
103
104 int len = vsnprintf (s, max_len, fmt, ap);
105
106 if (len > max_len) len = max_len;
107
108 fwrite (s, len, 1, fp);
109
110 fflush (fp);
111
112 last_len = len;
113 }
114
115 void log_out_nn (FILE *fp, const char *fmt, ...)
116 {
117 if (SUPPRESS_OUTPUT) return;
118
119 va_list ap;
120
121 va_start (ap, fmt);
122
123 log_final (fp, fmt, ap);
124
125 va_end (ap);
126 }
127
128 void log_info_nn (const char *fmt, ...)
129 {
130 if (SUPPRESS_OUTPUT) return;
131
132 va_list ap;
133
134 va_start (ap, fmt);
135
136 log_final (stdout, fmt, ap);
137
138 va_end (ap);
139 }
140
141 void log_error_nn (const char *fmt, ...)
142 {
143 if (SUPPRESS_OUTPUT) return;
144
145 va_list ap;
146
147 va_start (ap, fmt);
148
149 log_final (stderr, fmt, ap);
150
151 va_end (ap);
152 }
153
154 void log_out (FILE *fp, const char *fmt, ...)
155 {
156 if (SUPPRESS_OUTPUT) return;
157
158 va_list ap;
159
160 va_start (ap, fmt);
161
162 log_final (fp, fmt, ap);
163
164 va_end (ap);
165
166 fputc ('\n', fp);
167
168 last_len = 0;
169 }
170
171 void log_info (const char *fmt, ...)
172 {
173 if (SUPPRESS_OUTPUT) return;
174
175 va_list ap;
176
177 va_start (ap, fmt);
178
179 log_final (stdout, fmt, ap);
180
181 va_end (ap);
182
183 fputc ('\n', stdout);
184
185 last_len = 0;
186 }
187
188 void log_error (const char *fmt, ...)
189 {
190 if (SUPPRESS_OUTPUT) return;
191
192 fputc ('\n', stderr);
193 fputc ('\n', stderr);
194
195 va_list ap;
196
197 va_start (ap, fmt);
198
199 log_final (stderr, fmt, ap);
200
201 va_end (ap);
202
203 fputc ('\n', stderr);
204 fputc ('\n', stderr);
205
206 last_len = 0;
207 }
208
209 /**
210 * converter
211 */
212
213 u8 int_to_base32 (const u8 c)
214 {
215 static const u8 tbl[0x20] =
216 {
217 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
218 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
219 };
220
221 return tbl[c];
222 }
223
224 u8 base32_to_int (const u8 c)
225 {
226 if ((c >= 'A') && (c <= 'Z')) return c - 'A';
227 else if ((c >= '2') && (c <= '7')) return c - '2' + 26;
228
229 return 0;
230 }
231
232 u8 int_to_itoa32 (const u8 c)
233 {
234 static const u8 tbl[0x20] =
235 {
236 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
237 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
238 };
239
240 return tbl[c];
241 }
242
243 u8 itoa32_to_int (const u8 c)
244 {
245 if ((c >= '0') && (c <= '9')) return c - '0';
246 else if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10;
247
248 return 0;
249 }
250
251 u8 int_to_itoa64 (const u8 c)
252 {
253 static const u8 tbl[0x40] =
254 {
255 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
256 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
257 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
258 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
259 };
260
261 return tbl[c];
262 }
263
264 u8 itoa64_to_int (const u8 c)
265 {
266 static const u8 tbl[0x100] =
267 {
268 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
269 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
270 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01,
271 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
272 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
273 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
274 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
275 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
276 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
277 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
278 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
279 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
280 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
281 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
282 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
283 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
284 };
285
286 return tbl[c];
287 }
288
289 u8 int_to_base64 (const u8 c)
290 {
291 static const u8 tbl[0x40] =
292 {
293 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
294 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
295 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
296 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f,
297 };
298
299 return tbl[c];
300 }
301
302 u8 base64_to_int (const u8 c)
303 {
304 static const u8 tbl[0x100] =
305 {
306 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
309 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
311 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
313 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322 };
323
324 return tbl[c];
325 }
326
327 u8 int_to_bf64 (const u8 c)
328 {
329 static const u8 tbl[0x40] =
330 {
331 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
332 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
333 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
334 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
335 };
336
337 return tbl[c];
338 }
339
340 u8 bf64_to_int (const u8 c)
341 {
342 static const u8 tbl[0x100] =
343 {
344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
347 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
349 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
351 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360 };
361
362 return tbl[c];
363 }
364
365 u8 int_to_lotus64 (const u8 c)
366 {
367 if (c < 10) return '0' + c;
368 else if (c < 36) return 'A' + c - 10;
369 else if (c < 62) return 'a' + c - 36;
370 else if (c == 62) return '+';
371 else if (c == 63) return '/';
372
373 return 0;
374 }
375
376 u8 lotus64_to_int (const u8 c)
377 {
378 if ((c >= '0') && (c <= '9')) return c - '0';
379 else if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10;
380 else if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36;
381 else if (c == '+') return 62;
382 else if (c == '/') return 63;
383 else
384
385 return 0;
386 }
387
388 int base32_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
389 {
390 const u8 *in_ptr = in_buf;
391
392 u8 *out_ptr = out_buf;
393
394 for (int i = 0; i < in_len; i += 8)
395 {
396 const u8 out_val0 = f (in_ptr[0] & 0x7f);
397 const u8 out_val1 = f (in_ptr[1] & 0x7f);
398 const u8 out_val2 = f (in_ptr[2] & 0x7f);
399 const u8 out_val3 = f (in_ptr[3] & 0x7f);
400 const u8 out_val4 = f (in_ptr[4] & 0x7f);
401 const u8 out_val5 = f (in_ptr[5] & 0x7f);
402 const u8 out_val6 = f (in_ptr[6] & 0x7f);
403 const u8 out_val7 = f (in_ptr[7] & 0x7f);
404
405 out_ptr[0] = ((out_val0 << 3) & 0xf8) | ((out_val1 >> 2) & 0x07);
406 out_ptr[1] = ((out_val1 << 6) & 0xc0) | ((out_val2 << 1) & 0x3e) | ((out_val3 >> 4) & 0x01);
407 out_ptr[2] = ((out_val3 << 4) & 0xf0) | ((out_val4 >> 1) & 0x0f);
408 out_ptr[3] = ((out_val4 << 7) & 0x80) | ((out_val5 << 2) & 0x7c) | ((out_val6 >> 3) & 0x03);
409 out_ptr[4] = ((out_val6 << 5) & 0xe0) | ((out_val7 >> 0) & 0x1f);
410
411 in_ptr += 8;
412 out_ptr += 5;
413 }
414
415 for (int i = 0; i < in_len; i++)
416 {
417 if (in_buf[i] != '=') continue;
418
419 in_len = i;
420 }
421
422 int out_len = (in_len * 5) / 8;
423
424 return out_len;
425 }
426
427 int base32_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
428 {
429 const u8 *in_ptr = in_buf;
430
431 u8 *out_ptr = out_buf;
432
433 for (int i = 0; i < in_len; i += 5)
434 {
435 const u8 out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f));
436 const u8 out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03));
437 const u8 out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f));
438 const u8 out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f));
439 const u8 out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01));
440 const u8 out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f));
441 const u8 out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07));
442 const u8 out_val7 = f ( ((in_ptr[4] >> 0) & 0x1f));
443
444 out_ptr[0] = out_val0 & 0x7f;
445 out_ptr[1] = out_val1 & 0x7f;
446 out_ptr[2] = out_val2 & 0x7f;
447 out_ptr[3] = out_val3 & 0x7f;
448 out_ptr[4] = out_val4 & 0x7f;
449 out_ptr[5] = out_val5 & 0x7f;
450 out_ptr[6] = out_val6 & 0x7f;
451 out_ptr[7] = out_val7 & 0x7f;
452
453 in_ptr += 5;
454 out_ptr += 8;
455 }
456
457 int out_len = (int) (((0.5 + (float) in_len) * 8) / 5); // ceil (in_len * 8 / 5)
458
459 while (out_len % 8)
460 {
461 out_buf[out_len] = '=';
462
463 out_len++;
464 }
465
466 return out_len;
467 }
468
469 int base64_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
470 {
471 const u8 *in_ptr = in_buf;
472
473 u8 *out_ptr = out_buf;
474
475 for (int i = 0; i < in_len; i += 4)
476 {
477 const u8 out_val0 = f (in_ptr[0] & 0x7f);
478 const u8 out_val1 = f (in_ptr[1] & 0x7f);
479 const u8 out_val2 = f (in_ptr[2] & 0x7f);
480 const u8 out_val3 = f (in_ptr[3] & 0x7f);
481
482 out_ptr[0] = ((out_val0 << 2) & 0xfc) | ((out_val1 >> 4) & 0x03);
483 out_ptr[1] = ((out_val1 << 4) & 0xf0) | ((out_val2 >> 2) & 0x0f);
484 out_ptr[2] = ((out_val2 << 6) & 0xc0) | ((out_val3 >> 0) & 0x3f);
485
486 in_ptr += 4;
487 out_ptr += 3;
488 }
489
490 for (int i = 0; i < in_len; i++)
491 {
492 if (in_buf[i] != '=') continue;
493
494 in_len = i;
495 }
496
497 int out_len = (in_len * 6) / 8;
498
499 return out_len;
500 }
501
502 int base64_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
503 {
504 const u8 *in_ptr = in_buf;
505
506 u8 *out_ptr = out_buf;
507
508 for (int i = 0; i < in_len; i += 3)
509 {
510 const u8 out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f));
511 const u8 out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f));
512 const u8 out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03));
513 const u8 out_val3 = f ( ((in_ptr[2] >> 0) & 0x3f));
514
515 out_ptr[0] = out_val0 & 0x7f;
516 out_ptr[1] = out_val1 & 0x7f;
517 out_ptr[2] = out_val2 & 0x7f;
518 out_ptr[3] = out_val3 & 0x7f;
519
520 in_ptr += 3;
521 out_ptr += 4;
522 }
523
524 int out_len = (int) (((0.5 + (float) in_len) * 8) / 6); // ceil (in_len * 8 / 6)
525
526 while (out_len % 4)
527 {
528 out_buf[out_len] = '=';
529
530 out_len++;
531 }
532
533 return out_len;
534 }
535
536 int is_valid_hex_char (const u8 c)
537 {
538 if ((c >= '0') && (c <= '9')) return 1;
539 if ((c >= 'A') && (c <= 'F')) return 1;
540 if ((c >= 'a') && (c <= 'f')) return 1;
541
542 return 0;
543 }
544
545 u8 hex_convert (const u8 c)
546 {
547 return (c & 15) + (c >> 6) * 9;
548 }
549
550 u8 hex_to_u8 (const u8 hex[2])
551 {
552 u8 v = 0;
553
554 v |= (hex_convert (hex[1]) << 0);
555 v |= (hex_convert (hex[0]) << 4);
556
557 return (v);
558 }
559
560 u32 hex_to_u32 (const u8 hex[8])
561 {
562 u32 v = 0;
563
564 v |= ((u32) hex_convert (hex[7])) << 0;
565 v |= ((u32) hex_convert (hex[6])) << 4;
566 v |= ((u32) hex_convert (hex[5])) << 8;
567 v |= ((u32) hex_convert (hex[4])) << 12;
568 v |= ((u32) hex_convert (hex[3])) << 16;
569 v |= ((u32) hex_convert (hex[2])) << 20;
570 v |= ((u32) hex_convert (hex[1])) << 24;
571 v |= ((u32) hex_convert (hex[0])) << 28;
572
573 return (v);
574 }
575
576 u64 hex_to_u64 (const u8 hex[16])
577 {
578 u64 v = 0;
579
580 v |= ((u64) hex_convert (hex[15]) << 0);
581 v |= ((u64) hex_convert (hex[14]) << 4);
582 v |= ((u64) hex_convert (hex[13]) << 8);
583 v |= ((u64) hex_convert (hex[12]) << 12);
584 v |= ((u64) hex_convert (hex[11]) << 16);
585 v |= ((u64) hex_convert (hex[10]) << 20);
586 v |= ((u64) hex_convert (hex[ 9]) << 24);
587 v |= ((u64) hex_convert (hex[ 8]) << 28);
588 v |= ((u64) hex_convert (hex[ 7]) << 32);
589 v |= ((u64) hex_convert (hex[ 6]) << 36);
590 v |= ((u64) hex_convert (hex[ 5]) << 40);
591 v |= ((u64) hex_convert (hex[ 4]) << 44);
592 v |= ((u64) hex_convert (hex[ 3]) << 48);
593 v |= ((u64) hex_convert (hex[ 2]) << 52);
594 v |= ((u64) hex_convert (hex[ 1]) << 56);
595 v |= ((u64) hex_convert (hex[ 0]) << 60);
596
597 return (v);
598 }
599
600 void bin_to_hex_lower (const u32 v, u8 hex[8])
601 {
602 hex[0] = v >> 28 & 15;
603 hex[1] = v >> 24 & 15;
604 hex[2] = v >> 20 & 15;
605 hex[3] = v >> 16 & 15;
606 hex[4] = v >> 12 & 15;
607 hex[5] = v >> 8 & 15;
608 hex[6] = v >> 4 & 15;
609 hex[7] = v >> 0 & 15;
610
611 u32 add;
612
613 hex[0] += 6; add = ((hex[0] & 0x10) >> 4) * 39; hex[0] += 42 + add;
614 hex[1] += 6; add = ((hex[1] & 0x10) >> 4) * 39; hex[1] += 42 + add;
615 hex[2] += 6; add = ((hex[2] & 0x10) >> 4) * 39; hex[2] += 42 + add;
616 hex[3] += 6; add = ((hex[3] & 0x10) >> 4) * 39; hex[3] += 42 + add;
617 hex[4] += 6; add = ((hex[4] & 0x10) >> 4) * 39; hex[4] += 42 + add;
618 hex[5] += 6; add = ((hex[5] & 0x10) >> 4) * 39; hex[5] += 42 + add;
619 hex[6] += 6; add = ((hex[6] & 0x10) >> 4) * 39; hex[6] += 42 + add;
620 hex[7] += 6; add = ((hex[7] & 0x10) >> 4) * 39; hex[7] += 42 + add;
621 }
622
623 /**
624 * decoder
625 */
626
627 static void AES128_decrypt_cbc (const u32 key[4], const u32 iv[4], const u32 in[16], u32 out[16])
628 {
629 AES_KEY skey;
630
631 AES_set_decrypt_key ((const u8 *) key, 128, &skey);
632
633 u32 _iv[4] = { 0 };
634
635 _iv[0] = iv[0];
636 _iv[1] = iv[1];
637 _iv[2] = iv[2];
638 _iv[3] = iv[3];
639
640 for (int i = 0; i < 16; i += 4)
641 {
642 u32 _in[4] = { 0 };
643 u32 _out[4] = { 0 };
644
645 _in[0] = in[i + 0];
646 _in[1] = in[i + 1];
647 _in[2] = in[i + 2];
648 _in[3] = in[i + 3];
649
650 AES_decrypt (&skey, (const u8 *) _in, (u8 *) _out);
651
652 _out[0] ^= _iv[0];
653 _out[1] ^= _iv[1];
654 _out[2] ^= _iv[2];
655 _out[3] ^= _iv[3];
656
657 out[i + 0] = _out[0];
658 out[i + 1] = _out[1];
659 out[i + 2] = _out[2];
660 out[i + 3] = _out[3];
661
662 _iv[0] = _in[0];
663 _iv[1] = _in[1];
664 _iv[2] = _in[2];
665 _iv[3] = _in[3];
666 }
667 }
668
669 static void juniper_decrypt_hash (char *in, char *out)
670 {
671 // base64 decode
672
673 u8 base64_buf[100] = { 0 };
674
675 base64_decode (base64_to_int, (const u8 *) in, DISPLAY_LEN_MIN_501, base64_buf);
676
677 // iv stuff
678
679 u32 juniper_iv[4] = { 0 };
680
681 memcpy (juniper_iv, base64_buf, 12);
682
683 memcpy (out, juniper_iv, 12);
684
685 // reversed key
686
687 u32 juniper_key[4] = { 0 };
688
689 juniper_key[0] = byte_swap_32 (0xa6707a7e);
690 juniper_key[1] = byte_swap_32 (0x8df91059);
691 juniper_key[2] = byte_swap_32 (0xdea70ae5);
692 juniper_key[3] = byte_swap_32 (0x2f9c2442);
693
694 // AES decrypt
695
696 u32 *in_ptr = (u32 *) (base64_buf + 12);
697 u32 *out_ptr = (u32 *) (out + 12);
698
699 AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr);
700 }
701
702 void phpass_decode (u8 digest[16], u8 buf[22])
703 {
704 int l;
705
706 l = itoa64_to_int (buf[ 0]) << 0;
707 l |= itoa64_to_int (buf[ 1]) << 6;
708 l |= itoa64_to_int (buf[ 2]) << 12;
709 l |= itoa64_to_int (buf[ 3]) << 18;
710
711 digest[ 0] = (l >> 0) & 0xff;
712 digest[ 1] = (l >> 8) & 0xff;
713 digest[ 2] = (l >> 16) & 0xff;
714
715 l = itoa64_to_int (buf[ 4]) << 0;
716 l |= itoa64_to_int (buf[ 5]) << 6;
717 l |= itoa64_to_int (buf[ 6]) << 12;
718 l |= itoa64_to_int (buf[ 7]) << 18;
719
720 digest[ 3] = (l >> 0) & 0xff;
721 digest[ 4] = (l >> 8) & 0xff;
722 digest[ 5] = (l >> 16) & 0xff;
723
724 l = itoa64_to_int (buf[ 8]) << 0;
725 l |= itoa64_to_int (buf[ 9]) << 6;
726 l |= itoa64_to_int (buf[10]) << 12;
727 l |= itoa64_to_int (buf[11]) << 18;
728
729 digest[ 6] = (l >> 0) & 0xff;
730 digest[ 7] = (l >> 8) & 0xff;
731 digest[ 8] = (l >> 16) & 0xff;
732
733 l = itoa64_to_int (buf[12]) << 0;
734 l |= itoa64_to_int (buf[13]) << 6;
735 l |= itoa64_to_int (buf[14]) << 12;
736 l |= itoa64_to_int (buf[15]) << 18;
737
738 digest[ 9] = (l >> 0) & 0xff;
739 digest[10] = (l >> 8) & 0xff;
740 digest[11] = (l >> 16) & 0xff;
741
742 l = itoa64_to_int (buf[16]) << 0;
743 l |= itoa64_to_int (buf[17]) << 6;
744 l |= itoa64_to_int (buf[18]) << 12;
745 l |= itoa64_to_int (buf[19]) << 18;
746
747 digest[12] = (l >> 0) & 0xff;
748 digest[13] = (l >> 8) & 0xff;
749 digest[14] = (l >> 16) & 0xff;
750
751 l = itoa64_to_int (buf[20]) << 0;
752 l |= itoa64_to_int (buf[21]) << 6;
753
754 digest[15] = (l >> 0) & 0xff;
755 }
756
757 void phpass_encode (u8 digest[16], u8 buf[22])
758 {
759 int l;
760
761 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
762
763 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
764 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
765 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
766 buf[ 3] = int_to_itoa64 (l & 0x3f);
767
768 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
769
770 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
771 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
772 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
773 buf[ 7] = int_to_itoa64 (l & 0x3f);
774
775 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
776
777 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
778 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
779 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
780 buf[11] = int_to_itoa64 (l & 0x3f);
781
782 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
783
784 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
785 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
786 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
787 buf[15] = int_to_itoa64 (l & 0x3f);
788
789 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
790
791 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
792 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
793 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
794 buf[19] = int_to_itoa64 (l & 0x3f);
795
796 l = (digest[15] << 0);
797
798 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
799 buf[21] = int_to_itoa64 (l & 0x3f);
800 }
801
802 void md5crypt_decode (u8 digest[16], u8 buf[22])
803 {
804 int l;
805
806 l = itoa64_to_int (buf[ 0]) << 0;
807 l |= itoa64_to_int (buf[ 1]) << 6;
808 l |= itoa64_to_int (buf[ 2]) << 12;
809 l |= itoa64_to_int (buf[ 3]) << 18;
810
811 digest[ 0] = (l >> 16) & 0xff;
812 digest[ 6] = (l >> 8) & 0xff;
813 digest[12] = (l >> 0) & 0xff;
814
815 l = itoa64_to_int (buf[ 4]) << 0;
816 l |= itoa64_to_int (buf[ 5]) << 6;
817 l |= itoa64_to_int (buf[ 6]) << 12;
818 l |= itoa64_to_int (buf[ 7]) << 18;
819
820 digest[ 1] = (l >> 16) & 0xff;
821 digest[ 7] = (l >> 8) & 0xff;
822 digest[13] = (l >> 0) & 0xff;
823
824 l = itoa64_to_int (buf[ 8]) << 0;
825 l |= itoa64_to_int (buf[ 9]) << 6;
826 l |= itoa64_to_int (buf[10]) << 12;
827 l |= itoa64_to_int (buf[11]) << 18;
828
829 digest[ 2] = (l >> 16) & 0xff;
830 digest[ 8] = (l >> 8) & 0xff;
831 digest[14] = (l >> 0) & 0xff;
832
833 l = itoa64_to_int (buf[12]) << 0;
834 l |= itoa64_to_int (buf[13]) << 6;
835 l |= itoa64_to_int (buf[14]) << 12;
836 l |= itoa64_to_int (buf[15]) << 18;
837
838 digest[ 3] = (l >> 16) & 0xff;
839 digest[ 9] = (l >> 8) & 0xff;
840 digest[15] = (l >> 0) & 0xff;
841
842 l = itoa64_to_int (buf[16]) << 0;
843 l |= itoa64_to_int (buf[17]) << 6;
844 l |= itoa64_to_int (buf[18]) << 12;
845 l |= itoa64_to_int (buf[19]) << 18;
846
847 digest[ 4] = (l >> 16) & 0xff;
848 digest[10] = (l >> 8) & 0xff;
849 digest[ 5] = (l >> 0) & 0xff;
850
851 l = itoa64_to_int (buf[20]) << 0;
852 l |= itoa64_to_int (buf[21]) << 6;
853
854 digest[11] = (l >> 0) & 0xff;
855 }
856
857 void md5crypt_encode (u8 digest[16], u8 buf[22])
858 {
859 int l;
860
861 l = (digest[ 0] << 16) | (digest[ 6] << 8) | (digest[12] << 0);
862
863 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
864 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
865 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
866 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
867
868 l = (digest[ 1] << 16) | (digest[ 7] << 8) | (digest[13] << 0);
869
870 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
871 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
872 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
873 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
874
875 l = (digest[ 2] << 16) | (digest[ 8] << 8) | (digest[14] << 0);
876
877 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
878 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
879 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
880 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
881
882 l = (digest[ 3] << 16) | (digest[ 9] << 8) | (digest[15] << 0);
883
884 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
885 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
886 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
887 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
888
889 l = (digest[ 4] << 16) | (digest[10] << 8) | (digest[ 5] << 0);
890
891 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
892 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
893 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
894 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
895
896 l = (digest[11] << 0);
897
898 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
899 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
900 }
901
902 void sha512crypt_decode (u8 digest[64], u8 buf[86])
903 {
904 int l;
905
906 l = itoa64_to_int (buf[ 0]) << 0;
907 l |= itoa64_to_int (buf[ 1]) << 6;
908 l |= itoa64_to_int (buf[ 2]) << 12;
909 l |= itoa64_to_int (buf[ 3]) << 18;
910
911 digest[ 0] = (l >> 16) & 0xff;
912 digest[21] = (l >> 8) & 0xff;
913 digest[42] = (l >> 0) & 0xff;
914
915 l = itoa64_to_int (buf[ 4]) << 0;
916 l |= itoa64_to_int (buf[ 5]) << 6;
917 l |= itoa64_to_int (buf[ 6]) << 12;
918 l |= itoa64_to_int (buf[ 7]) << 18;
919
920 digest[22] = (l >> 16) & 0xff;
921 digest[43] = (l >> 8) & 0xff;
922 digest[ 1] = (l >> 0) & 0xff;
923
924 l = itoa64_to_int (buf[ 8]) << 0;
925 l |= itoa64_to_int (buf[ 9]) << 6;
926 l |= itoa64_to_int (buf[10]) << 12;
927 l |= itoa64_to_int (buf[11]) << 18;
928
929 digest[44] = (l >> 16) & 0xff;
930 digest[ 2] = (l >> 8) & 0xff;
931 digest[23] = (l >> 0) & 0xff;
932
933 l = itoa64_to_int (buf[12]) << 0;
934 l |= itoa64_to_int (buf[13]) << 6;
935 l |= itoa64_to_int (buf[14]) << 12;
936 l |= itoa64_to_int (buf[15]) << 18;
937
938 digest[ 3] = (l >> 16) & 0xff;
939 digest[24] = (l >> 8) & 0xff;
940 digest[45] = (l >> 0) & 0xff;
941
942 l = itoa64_to_int (buf[16]) << 0;
943 l |= itoa64_to_int (buf[17]) << 6;
944 l |= itoa64_to_int (buf[18]) << 12;
945 l |= itoa64_to_int (buf[19]) << 18;
946
947 digest[25] = (l >> 16) & 0xff;
948 digest[46] = (l >> 8) & 0xff;
949 digest[ 4] = (l >> 0) & 0xff;
950
951 l = itoa64_to_int (buf[20]) << 0;
952 l |= itoa64_to_int (buf[21]) << 6;
953 l |= itoa64_to_int (buf[22]) << 12;
954 l |= itoa64_to_int (buf[23]) << 18;
955
956 digest[47] = (l >> 16) & 0xff;
957 digest[ 5] = (l >> 8) & 0xff;
958 digest[26] = (l >> 0) & 0xff;
959
960 l = itoa64_to_int (buf[24]) << 0;
961 l |= itoa64_to_int (buf[25]) << 6;
962 l |= itoa64_to_int (buf[26]) << 12;
963 l |= itoa64_to_int (buf[27]) << 18;
964
965 digest[ 6] = (l >> 16) & 0xff;
966 digest[27] = (l >> 8) & 0xff;
967 digest[48] = (l >> 0) & 0xff;
968
969 l = itoa64_to_int (buf[28]) << 0;
970 l |= itoa64_to_int (buf[29]) << 6;
971 l |= itoa64_to_int (buf[30]) << 12;
972 l |= itoa64_to_int (buf[31]) << 18;
973
974 digest[28] = (l >> 16) & 0xff;
975 digest[49] = (l >> 8) & 0xff;
976 digest[ 7] = (l >> 0) & 0xff;
977
978 l = itoa64_to_int (buf[32]) << 0;
979 l |= itoa64_to_int (buf[33]) << 6;
980 l |= itoa64_to_int (buf[34]) << 12;
981 l |= itoa64_to_int (buf[35]) << 18;
982
983 digest[50] = (l >> 16) & 0xff;
984 digest[ 8] = (l >> 8) & 0xff;
985 digest[29] = (l >> 0) & 0xff;
986
987 l = itoa64_to_int (buf[36]) << 0;
988 l |= itoa64_to_int (buf[37]) << 6;
989 l |= itoa64_to_int (buf[38]) << 12;
990 l |= itoa64_to_int (buf[39]) << 18;
991
992 digest[ 9] = (l >> 16) & 0xff;
993 digest[30] = (l >> 8) & 0xff;
994 digest[51] = (l >> 0) & 0xff;
995
996 l = itoa64_to_int (buf[40]) << 0;
997 l |= itoa64_to_int (buf[41]) << 6;
998 l |= itoa64_to_int (buf[42]) << 12;
999 l |= itoa64_to_int (buf[43]) << 18;
1000
1001 digest[31] = (l >> 16) & 0xff;
1002 digest[52] = (l >> 8) & 0xff;
1003 digest[10] = (l >> 0) & 0xff;
1004
1005 l = itoa64_to_int (buf[44]) << 0;
1006 l |= itoa64_to_int (buf[45]) << 6;
1007 l |= itoa64_to_int (buf[46]) << 12;
1008 l |= itoa64_to_int (buf[47]) << 18;
1009
1010 digest[53] = (l >> 16) & 0xff;
1011 digest[11] = (l >> 8) & 0xff;
1012 digest[32] = (l >> 0) & 0xff;
1013
1014 l = itoa64_to_int (buf[48]) << 0;
1015 l |= itoa64_to_int (buf[49]) << 6;
1016 l |= itoa64_to_int (buf[50]) << 12;
1017 l |= itoa64_to_int (buf[51]) << 18;
1018
1019 digest[12] = (l >> 16) & 0xff;
1020 digest[33] = (l >> 8) & 0xff;
1021 digest[54] = (l >> 0) & 0xff;
1022
1023 l = itoa64_to_int (buf[52]) << 0;
1024 l |= itoa64_to_int (buf[53]) << 6;
1025 l |= itoa64_to_int (buf[54]) << 12;
1026 l |= itoa64_to_int (buf[55]) << 18;
1027
1028 digest[34] = (l >> 16) & 0xff;
1029 digest[55] = (l >> 8) & 0xff;
1030 digest[13] = (l >> 0) & 0xff;
1031
1032 l = itoa64_to_int (buf[56]) << 0;
1033 l |= itoa64_to_int (buf[57]) << 6;
1034 l |= itoa64_to_int (buf[58]) << 12;
1035 l |= itoa64_to_int (buf[59]) << 18;
1036
1037 digest[56] = (l >> 16) & 0xff;
1038 digest[14] = (l >> 8) & 0xff;
1039 digest[35] = (l >> 0) & 0xff;
1040
1041 l = itoa64_to_int (buf[60]) << 0;
1042 l |= itoa64_to_int (buf[61]) << 6;
1043 l |= itoa64_to_int (buf[62]) << 12;
1044 l |= itoa64_to_int (buf[63]) << 18;
1045
1046 digest[15] = (l >> 16) & 0xff;
1047 digest[36] = (l >> 8) & 0xff;
1048 digest[57] = (l >> 0) & 0xff;
1049
1050 l = itoa64_to_int (buf[64]) << 0;
1051 l |= itoa64_to_int (buf[65]) << 6;
1052 l |= itoa64_to_int (buf[66]) << 12;
1053 l |= itoa64_to_int (buf[67]) << 18;
1054
1055 digest[37] = (l >> 16) & 0xff;
1056 digest[58] = (l >> 8) & 0xff;
1057 digest[16] = (l >> 0) & 0xff;
1058
1059 l = itoa64_to_int (buf[68]) << 0;
1060 l |= itoa64_to_int (buf[69]) << 6;
1061 l |= itoa64_to_int (buf[70]) << 12;
1062 l |= itoa64_to_int (buf[71]) << 18;
1063
1064 digest[59] = (l >> 16) & 0xff;
1065 digest[17] = (l >> 8) & 0xff;
1066 digest[38] = (l >> 0) & 0xff;
1067
1068 l = itoa64_to_int (buf[72]) << 0;
1069 l |= itoa64_to_int (buf[73]) << 6;
1070 l |= itoa64_to_int (buf[74]) << 12;
1071 l |= itoa64_to_int (buf[75]) << 18;
1072
1073 digest[18] = (l >> 16) & 0xff;
1074 digest[39] = (l >> 8) & 0xff;
1075 digest[60] = (l >> 0) & 0xff;
1076
1077 l = itoa64_to_int (buf[76]) << 0;
1078 l |= itoa64_to_int (buf[77]) << 6;
1079 l |= itoa64_to_int (buf[78]) << 12;
1080 l |= itoa64_to_int (buf[79]) << 18;
1081
1082 digest[40] = (l >> 16) & 0xff;
1083 digest[61] = (l >> 8) & 0xff;
1084 digest[19] = (l >> 0) & 0xff;
1085
1086 l = itoa64_to_int (buf[80]) << 0;
1087 l |= itoa64_to_int (buf[81]) << 6;
1088 l |= itoa64_to_int (buf[82]) << 12;
1089 l |= itoa64_to_int (buf[83]) << 18;
1090
1091 digest[62] = (l >> 16) & 0xff;
1092 digest[20] = (l >> 8) & 0xff;
1093 digest[41] = (l >> 0) & 0xff;
1094
1095 l = itoa64_to_int (buf[84]) << 0;
1096 l |= itoa64_to_int (buf[85]) << 6;
1097
1098 digest[63] = (l >> 0) & 0xff;
1099 }
1100
1101 void sha512crypt_encode (u8 digest[64], u8 buf[86])
1102 {
1103 int l;
1104
1105 l = (digest[ 0] << 16) | (digest[21] << 8) | (digest[42] << 0);
1106
1107 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1108 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1109 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1110 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
1111
1112 l = (digest[22] << 16) | (digest[43] << 8) | (digest[ 1] << 0);
1113
1114 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1115 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1116 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1117 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
1118
1119 l = (digest[44] << 16) | (digest[ 2] << 8) | (digest[23] << 0);
1120
1121 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1122 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1123 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1124 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
1125
1126 l = (digest[ 3] << 16) | (digest[24] << 8) | (digest[45] << 0);
1127
1128 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1129 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1130 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1131 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
1132
1133 l = (digest[25] << 16) | (digest[46] << 8) | (digest[ 4] << 0);
1134
1135 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1136 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1137 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1138 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
1139
1140 l = (digest[47] << 16) | (digest[ 5] << 8) | (digest[26] << 0);
1141
1142 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1143 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1144 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1145 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
1146
1147 l = (digest[ 6] << 16) | (digest[27] << 8) | (digest[48] << 0);
1148
1149 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1150 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1151 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1152 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
1153
1154 l = (digest[28] << 16) | (digest[49] << 8) | (digest[ 7] << 0);
1155
1156 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1157 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1158 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1159 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
1160
1161 l = (digest[50] << 16) | (digest[ 8] << 8) | (digest[29] << 0);
1162
1163 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1164 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1165 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1166 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
1167
1168 l = (digest[ 9] << 16) | (digest[30] << 8) | (digest[51] << 0);
1169
1170 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1171 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1172 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1173 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
1174
1175 l = (digest[31] << 16) | (digest[52] << 8) | (digest[10] << 0);
1176
1177 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1178 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1179 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1180 buf[43] = int_to_itoa64 (l & 0x3f); l >>= 6;
1181
1182 l = (digest[53] << 16) | (digest[11] << 8) | (digest[32] << 0);
1183
1184 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1185 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1186 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1187 buf[47] = int_to_itoa64 (l & 0x3f); l >>= 6;
1188
1189 l = (digest[12] << 16) | (digest[33] << 8) | (digest[54] << 0);
1190
1191 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1192 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1193 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1194 buf[51] = int_to_itoa64 (l & 0x3f); l >>= 6;
1195
1196 l = (digest[34] << 16) | (digest[55] << 8) | (digest[13] << 0);
1197
1198 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1199 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1200 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1201 buf[55] = int_to_itoa64 (l & 0x3f); l >>= 6;
1202
1203 l = (digest[56] << 16) | (digest[14] << 8) | (digest[35] << 0);
1204
1205 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1206 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1207 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1208 buf[59] = int_to_itoa64 (l & 0x3f); l >>= 6;
1209
1210 l = (digest[15] << 16) | (digest[36] << 8) | (digest[57] << 0);
1211
1212 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1213 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1214 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1215 buf[63] = int_to_itoa64 (l & 0x3f); l >>= 6;
1216
1217 l = (digest[37] << 16) | (digest[58] << 8) | (digest[16] << 0);
1218
1219 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1220 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1221 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1222 buf[67] = int_to_itoa64 (l & 0x3f); l >>= 6;
1223
1224 l = (digest[59] << 16) | (digest[17] << 8) | (digest[38] << 0);
1225
1226 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1227 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1228 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1229 buf[71] = int_to_itoa64 (l & 0x3f); l >>= 6;
1230
1231 l = (digest[18] << 16) | (digest[39] << 8) | (digest[60] << 0);
1232
1233 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1234 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1235 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1236 buf[75] = int_to_itoa64 (l & 0x3f); l >>= 6;
1237
1238 l = (digest[40] << 16) | (digest[61] << 8) | (digest[19] << 0);
1239
1240 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1241 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1242 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1243 buf[79] = int_to_itoa64 (l & 0x3f); l >>= 6;
1244
1245 l = (digest[62] << 16) | (digest[20] << 8) | (digest[41] << 0);
1246
1247 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1248 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1249 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1250 buf[83] = int_to_itoa64 (l & 0x3f); l >>= 6;
1251
1252 l = 0 | 0 | (digest[63] << 0);
1253
1254 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1255 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1256 }
1257
1258 void sha1aix_decode (u8 digest[20], u8 buf[27])
1259 {
1260 int l;
1261
1262 l = itoa64_to_int (buf[ 0]) << 0;
1263 l |= itoa64_to_int (buf[ 1]) << 6;
1264 l |= itoa64_to_int (buf[ 2]) << 12;
1265 l |= itoa64_to_int (buf[ 3]) << 18;
1266
1267 digest[ 2] = (l >> 0) & 0xff;
1268 digest[ 1] = (l >> 8) & 0xff;
1269 digest[ 0] = (l >> 16) & 0xff;
1270
1271 l = itoa64_to_int (buf[ 4]) << 0;
1272 l |= itoa64_to_int (buf[ 5]) << 6;
1273 l |= itoa64_to_int (buf[ 6]) << 12;
1274 l |= itoa64_to_int (buf[ 7]) << 18;
1275
1276 digest[ 5] = (l >> 0) & 0xff;
1277 digest[ 4] = (l >> 8) & 0xff;
1278 digest[ 3] = (l >> 16) & 0xff;
1279
1280 l = itoa64_to_int (buf[ 8]) << 0;
1281 l |= itoa64_to_int (buf[ 9]) << 6;
1282 l |= itoa64_to_int (buf[10]) << 12;
1283 l |= itoa64_to_int (buf[11]) << 18;
1284
1285 digest[ 8] = (l >> 0) & 0xff;
1286 digest[ 7] = (l >> 8) & 0xff;
1287 digest[ 6] = (l >> 16) & 0xff;
1288
1289 l = itoa64_to_int (buf[12]) << 0;
1290 l |= itoa64_to_int (buf[13]) << 6;
1291 l |= itoa64_to_int (buf[14]) << 12;
1292 l |= itoa64_to_int (buf[15]) << 18;
1293
1294 digest[11] = (l >> 0) & 0xff;
1295 digest[10] = (l >> 8) & 0xff;
1296 digest[ 9] = (l >> 16) & 0xff;
1297
1298 l = itoa64_to_int (buf[16]) << 0;
1299 l |= itoa64_to_int (buf[17]) << 6;
1300 l |= itoa64_to_int (buf[18]) << 12;
1301 l |= itoa64_to_int (buf[19]) << 18;
1302
1303 digest[14] = (l >> 0) & 0xff;
1304 digest[13] = (l >> 8) & 0xff;
1305 digest[12] = (l >> 16) & 0xff;
1306
1307 l = itoa64_to_int (buf[20]) << 0;
1308 l |= itoa64_to_int (buf[21]) << 6;
1309 l |= itoa64_to_int (buf[22]) << 12;
1310 l |= itoa64_to_int (buf[23]) << 18;
1311
1312 digest[17] = (l >> 0) & 0xff;
1313 digest[16] = (l >> 8) & 0xff;
1314 digest[15] = (l >> 16) & 0xff;
1315
1316 l = itoa64_to_int (buf[24]) << 0;
1317 l |= itoa64_to_int (buf[25]) << 6;
1318 l |= itoa64_to_int (buf[26]) << 12;
1319
1320 digest[19] = (l >> 8) & 0xff;
1321 digest[18] = (l >> 16) & 0xff;
1322 }
1323
1324 void sha1aix_encode (u8 digest[20], u8 buf[27])
1325 {
1326 int l;
1327
1328 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1329
1330 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1331 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1332 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1333 buf[ 3] = int_to_itoa64 (l & 0x3f);
1334
1335 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1336
1337 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1338 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1339 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1340 buf[ 7] = int_to_itoa64 (l & 0x3f);
1341
1342 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1343
1344 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1345 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1346 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1347 buf[11] = int_to_itoa64 (l & 0x3f);
1348
1349 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1350
1351 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1352 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1353 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1354 buf[15] = int_to_itoa64 (l & 0x3f);
1355
1356 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1357
1358 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1359 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1360 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1361 buf[19] = int_to_itoa64 (l & 0x3f);
1362
1363 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1364
1365 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1366 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1367 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1368 buf[23] = int_to_itoa64 (l & 0x3f);
1369
1370 l = 0 | (digest[19] << 8) | (digest[18] << 16);
1371
1372 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1373 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1374 buf[26] = int_to_itoa64 (l & 0x3f);
1375 }
1376
1377 void sha256aix_decode (u8 digest[32], u8 buf[43])
1378 {
1379 int l;
1380
1381 l = itoa64_to_int (buf[ 0]) << 0;
1382 l |= itoa64_to_int (buf[ 1]) << 6;
1383 l |= itoa64_to_int (buf[ 2]) << 12;
1384 l |= itoa64_to_int (buf[ 3]) << 18;
1385
1386 digest[ 2] = (l >> 0) & 0xff;
1387 digest[ 1] = (l >> 8) & 0xff;
1388 digest[ 0] = (l >> 16) & 0xff;
1389
1390 l = itoa64_to_int (buf[ 4]) << 0;
1391 l |= itoa64_to_int (buf[ 5]) << 6;
1392 l |= itoa64_to_int (buf[ 6]) << 12;
1393 l |= itoa64_to_int (buf[ 7]) << 18;
1394
1395 digest[ 5] = (l >> 0) & 0xff;
1396 digest[ 4] = (l >> 8) & 0xff;
1397 digest[ 3] = (l >> 16) & 0xff;
1398
1399 l = itoa64_to_int (buf[ 8]) << 0;
1400 l |= itoa64_to_int (buf[ 9]) << 6;
1401 l |= itoa64_to_int (buf[10]) << 12;
1402 l |= itoa64_to_int (buf[11]) << 18;
1403
1404 digest[ 8] = (l >> 0) & 0xff;
1405 digest[ 7] = (l >> 8) & 0xff;
1406 digest[ 6] = (l >> 16) & 0xff;
1407
1408 l = itoa64_to_int (buf[12]) << 0;
1409 l |= itoa64_to_int (buf[13]) << 6;
1410 l |= itoa64_to_int (buf[14]) << 12;
1411 l |= itoa64_to_int (buf[15]) << 18;
1412
1413 digest[11] = (l >> 0) & 0xff;
1414 digest[10] = (l >> 8) & 0xff;
1415 digest[ 9] = (l >> 16) & 0xff;
1416
1417 l = itoa64_to_int (buf[16]) << 0;
1418 l |= itoa64_to_int (buf[17]) << 6;
1419 l |= itoa64_to_int (buf[18]) << 12;
1420 l |= itoa64_to_int (buf[19]) << 18;
1421
1422 digest[14] = (l >> 0) & 0xff;
1423 digest[13] = (l >> 8) & 0xff;
1424 digest[12] = (l >> 16) & 0xff;
1425
1426 l = itoa64_to_int (buf[20]) << 0;
1427 l |= itoa64_to_int (buf[21]) << 6;
1428 l |= itoa64_to_int (buf[22]) << 12;
1429 l |= itoa64_to_int (buf[23]) << 18;
1430
1431 digest[17] = (l >> 0) & 0xff;
1432 digest[16] = (l >> 8) & 0xff;
1433 digest[15] = (l >> 16) & 0xff;
1434
1435 l = itoa64_to_int (buf[24]) << 0;
1436 l |= itoa64_to_int (buf[25]) << 6;
1437 l |= itoa64_to_int (buf[26]) << 12;
1438 l |= itoa64_to_int (buf[27]) << 18;
1439
1440 digest[20] = (l >> 0) & 0xff;
1441 digest[19] = (l >> 8) & 0xff;
1442 digest[18] = (l >> 16) & 0xff;
1443
1444 l = itoa64_to_int (buf[28]) << 0;
1445 l |= itoa64_to_int (buf[29]) << 6;
1446 l |= itoa64_to_int (buf[30]) << 12;
1447 l |= itoa64_to_int (buf[31]) << 18;
1448
1449 digest[23] = (l >> 0) & 0xff;
1450 digest[22] = (l >> 8) & 0xff;
1451 digest[21] = (l >> 16) & 0xff;
1452
1453 l = itoa64_to_int (buf[32]) << 0;
1454 l |= itoa64_to_int (buf[33]) << 6;
1455 l |= itoa64_to_int (buf[34]) << 12;
1456 l |= itoa64_to_int (buf[35]) << 18;
1457
1458 digest[26] = (l >> 0) & 0xff;
1459 digest[25] = (l >> 8) & 0xff;
1460 digest[24] = (l >> 16) & 0xff;
1461
1462 l = itoa64_to_int (buf[36]) << 0;
1463 l |= itoa64_to_int (buf[37]) << 6;
1464 l |= itoa64_to_int (buf[38]) << 12;
1465 l |= itoa64_to_int (buf[39]) << 18;
1466
1467 digest[29] = (l >> 0) & 0xff;
1468 digest[28] = (l >> 8) & 0xff;
1469 digest[27] = (l >> 16) & 0xff;
1470
1471 l = itoa64_to_int (buf[40]) << 0;
1472 l |= itoa64_to_int (buf[41]) << 6;
1473 l |= itoa64_to_int (buf[42]) << 12;
1474
1475 //digest[32] = (l >> 0) & 0xff;
1476 digest[31] = (l >> 8) & 0xff;
1477 digest[30] = (l >> 16) & 0xff;
1478 }
1479
1480 void sha256aix_encode (u8 digest[32], u8 buf[43])
1481 {
1482 int l;
1483
1484 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1485
1486 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1487 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1488 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1489 buf[ 3] = int_to_itoa64 (l & 0x3f);
1490
1491 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1492
1493 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1494 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1495 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1496 buf[ 7] = int_to_itoa64 (l & 0x3f);
1497
1498 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1499
1500 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1501 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1502 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1503 buf[11] = int_to_itoa64 (l & 0x3f);
1504
1505 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1506
1507 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1508 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1509 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1510 buf[15] = int_to_itoa64 (l & 0x3f);
1511
1512 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1513
1514 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1515 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1516 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1517 buf[19] = int_to_itoa64 (l & 0x3f);
1518
1519 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1520
1521 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1522 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1523 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1524 buf[23] = int_to_itoa64 (l & 0x3f);
1525
1526 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1527
1528 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1529 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1530 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1531 buf[27] = int_to_itoa64 (l & 0x3f);
1532
1533 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1534
1535 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1536 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1537 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1538 buf[31] = int_to_itoa64 (l & 0x3f);
1539
1540 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1541
1542 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1543 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1544 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1545 buf[35] = int_to_itoa64 (l & 0x3f);
1546
1547 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1548
1549 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1550 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1551 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1552 buf[39] = int_to_itoa64 (l & 0x3f);
1553
1554 l = 0 | (digest[31] << 8) | (digest[30] << 16);
1555
1556 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1557 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1558 buf[42] = int_to_itoa64 (l & 0x3f);
1559 }
1560
1561 void sha512aix_decode (u8 digest[64], u8 buf[86])
1562 {
1563 int l;
1564
1565 l = itoa64_to_int (buf[ 0]) << 0;
1566 l |= itoa64_to_int (buf[ 1]) << 6;
1567 l |= itoa64_to_int (buf[ 2]) << 12;
1568 l |= itoa64_to_int (buf[ 3]) << 18;
1569
1570 digest[ 2] = (l >> 0) & 0xff;
1571 digest[ 1] = (l >> 8) & 0xff;
1572 digest[ 0] = (l >> 16) & 0xff;
1573
1574 l = itoa64_to_int (buf[ 4]) << 0;
1575 l |= itoa64_to_int (buf[ 5]) << 6;
1576 l |= itoa64_to_int (buf[ 6]) << 12;
1577 l |= itoa64_to_int (buf[ 7]) << 18;
1578
1579 digest[ 5] = (l >> 0) & 0xff;
1580 digest[ 4] = (l >> 8) & 0xff;
1581 digest[ 3] = (l >> 16) & 0xff;
1582
1583 l = itoa64_to_int (buf[ 8]) << 0;
1584 l |= itoa64_to_int (buf[ 9]) << 6;
1585 l |= itoa64_to_int (buf[10]) << 12;
1586 l |= itoa64_to_int (buf[11]) << 18;
1587
1588 digest[ 8] = (l >> 0) & 0xff;
1589 digest[ 7] = (l >> 8) & 0xff;
1590 digest[ 6] = (l >> 16) & 0xff;
1591
1592 l = itoa64_to_int (buf[12]) << 0;
1593 l |= itoa64_to_int (buf[13]) << 6;
1594 l |= itoa64_to_int (buf[14]) << 12;
1595 l |= itoa64_to_int (buf[15]) << 18;
1596
1597 digest[11] = (l >> 0) & 0xff;
1598 digest[10] = (l >> 8) & 0xff;
1599 digest[ 9] = (l >> 16) & 0xff;
1600
1601 l = itoa64_to_int (buf[16]) << 0;
1602 l |= itoa64_to_int (buf[17]) << 6;
1603 l |= itoa64_to_int (buf[18]) << 12;
1604 l |= itoa64_to_int (buf[19]) << 18;
1605
1606 digest[14] = (l >> 0) & 0xff;
1607 digest[13] = (l >> 8) & 0xff;
1608 digest[12] = (l >> 16) & 0xff;
1609
1610 l = itoa64_to_int (buf[20]) << 0;
1611 l |= itoa64_to_int (buf[21]) << 6;
1612 l |= itoa64_to_int (buf[22]) << 12;
1613 l |= itoa64_to_int (buf[23]) << 18;
1614
1615 digest[17] = (l >> 0) & 0xff;
1616 digest[16] = (l >> 8) & 0xff;
1617 digest[15] = (l >> 16) & 0xff;
1618
1619 l = itoa64_to_int (buf[24]) << 0;
1620 l |= itoa64_to_int (buf[25]) << 6;
1621 l |= itoa64_to_int (buf[26]) << 12;
1622 l |= itoa64_to_int (buf[27]) << 18;
1623
1624 digest[20] = (l >> 0) & 0xff;
1625 digest[19] = (l >> 8) & 0xff;
1626 digest[18] = (l >> 16) & 0xff;
1627
1628 l = itoa64_to_int (buf[28]) << 0;
1629 l |= itoa64_to_int (buf[29]) << 6;
1630 l |= itoa64_to_int (buf[30]) << 12;
1631 l |= itoa64_to_int (buf[31]) << 18;
1632
1633 digest[23] = (l >> 0) & 0xff;
1634 digest[22] = (l >> 8) & 0xff;
1635 digest[21] = (l >> 16) & 0xff;
1636
1637 l = itoa64_to_int (buf[32]) << 0;
1638 l |= itoa64_to_int (buf[33]) << 6;
1639 l |= itoa64_to_int (buf[34]) << 12;
1640 l |= itoa64_to_int (buf[35]) << 18;
1641
1642 digest[26] = (l >> 0) & 0xff;
1643 digest[25] = (l >> 8) & 0xff;
1644 digest[24] = (l >> 16) & 0xff;
1645
1646 l = itoa64_to_int (buf[36]) << 0;
1647 l |= itoa64_to_int (buf[37]) << 6;
1648 l |= itoa64_to_int (buf[38]) << 12;
1649 l |= itoa64_to_int (buf[39]) << 18;
1650
1651 digest[29] = (l >> 0) & 0xff;
1652 digest[28] = (l >> 8) & 0xff;
1653 digest[27] = (l >> 16) & 0xff;
1654
1655 l = itoa64_to_int (buf[40]) << 0;
1656 l |= itoa64_to_int (buf[41]) << 6;
1657 l |= itoa64_to_int (buf[42]) << 12;
1658 l |= itoa64_to_int (buf[43]) << 18;
1659
1660 digest[32] = (l >> 0) & 0xff;
1661 digest[31] = (l >> 8) & 0xff;
1662 digest[30] = (l >> 16) & 0xff;
1663
1664 l = itoa64_to_int (buf[44]) << 0;
1665 l |= itoa64_to_int (buf[45]) << 6;
1666 l |= itoa64_to_int (buf[46]) << 12;
1667 l |= itoa64_to_int (buf[47]) << 18;
1668
1669 digest[35] = (l >> 0) & 0xff;
1670 digest[34] = (l >> 8) & 0xff;
1671 digest[33] = (l >> 16) & 0xff;
1672
1673 l = itoa64_to_int (buf[48]) << 0;
1674 l |= itoa64_to_int (buf[49]) << 6;
1675 l |= itoa64_to_int (buf[50]) << 12;
1676 l |= itoa64_to_int (buf[51]) << 18;
1677
1678 digest[38] = (l >> 0) & 0xff;
1679 digest[37] = (l >> 8) & 0xff;
1680 digest[36] = (l >> 16) & 0xff;
1681
1682 l = itoa64_to_int (buf[52]) << 0;
1683 l |= itoa64_to_int (buf[53]) << 6;
1684 l |= itoa64_to_int (buf[54]) << 12;
1685 l |= itoa64_to_int (buf[55]) << 18;
1686
1687 digest[41] = (l >> 0) & 0xff;
1688 digest[40] = (l >> 8) & 0xff;
1689 digest[39] = (l >> 16) & 0xff;
1690
1691 l = itoa64_to_int (buf[56]) << 0;
1692 l |= itoa64_to_int (buf[57]) << 6;
1693 l |= itoa64_to_int (buf[58]) << 12;
1694 l |= itoa64_to_int (buf[59]) << 18;
1695
1696 digest[44] = (l >> 0) & 0xff;
1697 digest[43] = (l >> 8) & 0xff;
1698 digest[42] = (l >> 16) & 0xff;
1699
1700 l = itoa64_to_int (buf[60]) << 0;
1701 l |= itoa64_to_int (buf[61]) << 6;
1702 l |= itoa64_to_int (buf[62]) << 12;
1703 l |= itoa64_to_int (buf[63]) << 18;
1704
1705 digest[47] = (l >> 0) & 0xff;
1706 digest[46] = (l >> 8) & 0xff;
1707 digest[45] = (l >> 16) & 0xff;
1708
1709 l = itoa64_to_int (buf[64]) << 0;
1710 l |= itoa64_to_int (buf[65]) << 6;
1711 l |= itoa64_to_int (buf[66]) << 12;
1712 l |= itoa64_to_int (buf[67]) << 18;
1713
1714 digest[50] = (l >> 0) & 0xff;
1715 digest[49] = (l >> 8) & 0xff;
1716 digest[48] = (l >> 16) & 0xff;
1717
1718 l = itoa64_to_int (buf[68]) << 0;
1719 l |= itoa64_to_int (buf[69]) << 6;
1720 l |= itoa64_to_int (buf[70]) << 12;
1721 l |= itoa64_to_int (buf[71]) << 18;
1722
1723 digest[53] = (l >> 0) & 0xff;
1724 digest[52] = (l >> 8) & 0xff;
1725 digest[51] = (l >> 16) & 0xff;
1726
1727 l = itoa64_to_int (buf[72]) << 0;
1728 l |= itoa64_to_int (buf[73]) << 6;
1729 l |= itoa64_to_int (buf[74]) << 12;
1730 l |= itoa64_to_int (buf[75]) << 18;
1731
1732 digest[56] = (l >> 0) & 0xff;
1733 digest[55] = (l >> 8) & 0xff;
1734 digest[54] = (l >> 16) & 0xff;
1735
1736 l = itoa64_to_int (buf[76]) << 0;
1737 l |= itoa64_to_int (buf[77]) << 6;
1738 l |= itoa64_to_int (buf[78]) << 12;
1739 l |= itoa64_to_int (buf[79]) << 18;
1740
1741 digest[59] = (l >> 0) & 0xff;
1742 digest[58] = (l >> 8) & 0xff;
1743 digest[57] = (l >> 16) & 0xff;
1744
1745 l = itoa64_to_int (buf[80]) << 0;
1746 l |= itoa64_to_int (buf[81]) << 6;
1747 l |= itoa64_to_int (buf[82]) << 12;
1748 l |= itoa64_to_int (buf[83]) << 18;
1749
1750 digest[62] = (l >> 0) & 0xff;
1751 digest[61] = (l >> 8) & 0xff;
1752 digest[60] = (l >> 16) & 0xff;
1753
1754 l = itoa64_to_int (buf[84]) << 0;
1755 l |= itoa64_to_int (buf[85]) << 6;
1756
1757 digest[63] = (l >> 16) & 0xff;
1758 }
1759
1760 void sha512aix_encode (u8 digest[64], u8 buf[86])
1761 {
1762 int l;
1763
1764 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1765
1766 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1767 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1768 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1769 buf[ 3] = int_to_itoa64 (l & 0x3f);
1770
1771 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1772
1773 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1774 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1775 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1776 buf[ 7] = int_to_itoa64 (l & 0x3f);
1777
1778 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1779
1780 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1781 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1782 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1783 buf[11] = int_to_itoa64 (l & 0x3f);
1784
1785 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1786
1787 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1788 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1789 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1790 buf[15] = int_to_itoa64 (l & 0x3f);
1791
1792 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1793
1794 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1795 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1796 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1797 buf[19] = int_to_itoa64 (l & 0x3f);
1798
1799 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1800
1801 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1802 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1803 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1804 buf[23] = int_to_itoa64 (l & 0x3f);
1805
1806 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1807
1808 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1809 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1810 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1811 buf[27] = int_to_itoa64 (l & 0x3f);
1812
1813 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1814
1815 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1816 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1817 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1818 buf[31] = int_to_itoa64 (l & 0x3f);
1819
1820 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1821
1822 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1823 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1824 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1825 buf[35] = int_to_itoa64 (l & 0x3f);
1826
1827 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1828
1829 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1830 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1831 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1832 buf[39] = int_to_itoa64 (l & 0x3f);
1833
1834 l = (digest[32] << 0) | (digest[31] << 8) | (digest[30] << 16);
1835
1836 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1837 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1838 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1839 buf[43] = int_to_itoa64 (l & 0x3f);
1840
1841 l = (digest[35] << 0) | (digest[34] << 8) | (digest[33] << 16);
1842
1843 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1844 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1845 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1846 buf[47] = int_to_itoa64 (l & 0x3f);
1847
1848 l = (digest[38] << 0) | (digest[37] << 8) | (digest[36] << 16);
1849
1850 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1851 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1852 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1853 buf[51] = int_to_itoa64 (l & 0x3f);
1854
1855 l = (digest[41] << 0) | (digest[40] << 8) | (digest[39] << 16);
1856
1857 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1858 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1859 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1860 buf[55] = int_to_itoa64 (l & 0x3f);
1861
1862 l = (digest[44] << 0) | (digest[43] << 8) | (digest[42] << 16);
1863
1864 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1865 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1866 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1867 buf[59] = int_to_itoa64 (l & 0x3f);
1868
1869 l = (digest[47] << 0) | (digest[46] << 8) | (digest[45] << 16);
1870
1871 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1872 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1873 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1874 buf[63] = int_to_itoa64 (l & 0x3f);
1875
1876 l = (digest[50] << 0) | (digest[49] << 8) | (digest[48] << 16);
1877
1878 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1879 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1880 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1881 buf[67] = int_to_itoa64 (l & 0x3f);
1882
1883 l = (digest[53] << 0) | (digest[52] << 8) | (digest[51] << 16);
1884
1885 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1886 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1887 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1888 buf[71] = int_to_itoa64 (l & 0x3f);
1889
1890 l = (digest[56] << 0) | (digest[55] << 8) | (digest[54] << 16);
1891
1892 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1893 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1894 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1895 buf[75] = int_to_itoa64 (l & 0x3f);
1896
1897 l = (digest[59] << 0) | (digest[58] << 8) | (digest[57] << 16);
1898
1899 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1900 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1901 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1902 buf[79] = int_to_itoa64 (l & 0x3f);
1903
1904 l = (digest[62] << 0) | (digest[61] << 8) | (digest[60] << 16);
1905
1906 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1907 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1908 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1909 buf[83] = int_to_itoa64 (l & 0x3f);
1910
1911 l = 0 | 0 | (digest[63] << 16);
1912
1913 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1914 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1915 }
1916
1917 void sha256crypt_decode (u8 digest[32], u8 buf[43])
1918 {
1919 int l;
1920
1921 l = itoa64_to_int (buf[ 0]) << 0;
1922 l |= itoa64_to_int (buf[ 1]) << 6;
1923 l |= itoa64_to_int (buf[ 2]) << 12;
1924 l |= itoa64_to_int (buf[ 3]) << 18;
1925
1926 digest[ 0] = (l >> 16) & 0xff;
1927 digest[10] = (l >> 8) & 0xff;
1928 digest[20] = (l >> 0) & 0xff;
1929
1930 l = itoa64_to_int (buf[ 4]) << 0;
1931 l |= itoa64_to_int (buf[ 5]) << 6;
1932 l |= itoa64_to_int (buf[ 6]) << 12;
1933 l |= itoa64_to_int (buf[ 7]) << 18;
1934
1935 digest[21] = (l >> 16) & 0xff;
1936 digest[ 1] = (l >> 8) & 0xff;
1937 digest[11] = (l >> 0) & 0xff;
1938
1939 l = itoa64_to_int (buf[ 8]) << 0;
1940 l |= itoa64_to_int (buf[ 9]) << 6;
1941 l |= itoa64_to_int (buf[10]) << 12;
1942 l |= itoa64_to_int (buf[11]) << 18;
1943
1944 digest[12] = (l >> 16) & 0xff;
1945 digest[22] = (l >> 8) & 0xff;
1946 digest[ 2] = (l >> 0) & 0xff;
1947
1948 l = itoa64_to_int (buf[12]) << 0;
1949 l |= itoa64_to_int (buf[13]) << 6;
1950 l |= itoa64_to_int (buf[14]) << 12;
1951 l |= itoa64_to_int (buf[15]) << 18;
1952
1953 digest[ 3] = (l >> 16) & 0xff;
1954 digest[13] = (l >> 8) & 0xff;
1955 digest[23] = (l >> 0) & 0xff;
1956
1957 l = itoa64_to_int (buf[16]) << 0;
1958 l |= itoa64_to_int (buf[17]) << 6;
1959 l |= itoa64_to_int (buf[18]) << 12;
1960 l |= itoa64_to_int (buf[19]) << 18;
1961
1962 digest[24] = (l >> 16) & 0xff;
1963 digest[ 4] = (l >> 8) & 0xff;
1964 digest[14] = (l >> 0) & 0xff;
1965
1966 l = itoa64_to_int (buf[20]) << 0;
1967 l |= itoa64_to_int (buf[21]) << 6;
1968 l |= itoa64_to_int (buf[22]) << 12;
1969 l |= itoa64_to_int (buf[23]) << 18;
1970
1971 digest[15] = (l >> 16) & 0xff;
1972 digest[25] = (l >> 8) & 0xff;
1973 digest[ 5] = (l >> 0) & 0xff;
1974
1975 l = itoa64_to_int (buf[24]) << 0;
1976 l |= itoa64_to_int (buf[25]) << 6;
1977 l |= itoa64_to_int (buf[26]) << 12;
1978 l |= itoa64_to_int (buf[27]) << 18;
1979
1980 digest[ 6] = (l >> 16) & 0xff;
1981 digest[16] = (l >> 8) & 0xff;
1982 digest[26] = (l >> 0) & 0xff;
1983
1984 l = itoa64_to_int (buf[28]) << 0;
1985 l |= itoa64_to_int (buf[29]) << 6;
1986 l |= itoa64_to_int (buf[30]) << 12;
1987 l |= itoa64_to_int (buf[31]) << 18;
1988
1989 digest[27] = (l >> 16) & 0xff;
1990 digest[ 7] = (l >> 8) & 0xff;
1991 digest[17] = (l >> 0) & 0xff;
1992
1993 l = itoa64_to_int (buf[32]) << 0;
1994 l |= itoa64_to_int (buf[33]) << 6;
1995 l |= itoa64_to_int (buf[34]) << 12;
1996 l |= itoa64_to_int (buf[35]) << 18;
1997
1998 digest[18] = (l >> 16) & 0xff;
1999 digest[28] = (l >> 8) & 0xff;
2000 digest[ 8] = (l >> 0) & 0xff;
2001
2002 l = itoa64_to_int (buf[36]) << 0;
2003 l |= itoa64_to_int (buf[37]) << 6;
2004 l |= itoa64_to_int (buf[38]) << 12;
2005 l |= itoa64_to_int (buf[39]) << 18;
2006
2007 digest[ 9] = (l >> 16) & 0xff;
2008 digest[19] = (l >> 8) & 0xff;
2009 digest[29] = (l >> 0) & 0xff;
2010
2011 l = itoa64_to_int (buf[40]) << 0;
2012 l |= itoa64_to_int (buf[41]) << 6;
2013 l |= itoa64_to_int (buf[42]) << 12;
2014
2015 digest[31] = (l >> 8) & 0xff;
2016 digest[30] = (l >> 0) & 0xff;
2017 }
2018
2019 void sha256crypt_encode (u8 digest[32], u8 buf[43])
2020 {
2021 int l;
2022
2023 l = (digest[ 0] << 16) | (digest[10] << 8) | (digest[20] << 0);
2024
2025 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2026 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2027 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2028 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
2029
2030 l = (digest[21] << 16) | (digest[ 1] << 8) | (digest[11] << 0);
2031
2032 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2033 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2034 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2035 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
2036
2037 l = (digest[12] << 16) | (digest[22] << 8) | (digest[ 2] << 0);
2038
2039 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2040 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2041 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2042 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
2043
2044 l = (digest[ 3] << 16) | (digest[13] << 8) | (digest[23] << 0);
2045
2046 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2047 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2048 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2049 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
2050
2051 l = (digest[24] << 16) | (digest[ 4] << 8) | (digest[14] << 0);
2052
2053 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2054 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2055 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2056 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
2057
2058 l = (digest[15] << 16) | (digest[25] << 8) | (digest[ 5] << 0);
2059
2060 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2061 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2062 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2063 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
2064
2065 l = (digest[ 6] << 16) | (digest[16] << 8) | (digest[26] << 0);
2066
2067 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2068 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2069 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2070 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
2071
2072 l = (digest[27] << 16) | (digest[ 7] << 8) | (digest[17] << 0);
2073
2074 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2075 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2076 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2077 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
2078
2079 l = (digest[18] << 16) | (digest[28] << 8) | (digest[ 8] << 0);
2080
2081 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2082 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2083 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2084 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
2085
2086 l = (digest[ 9] << 16) | (digest[19] << 8) | (digest[29] << 0);
2087
2088 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2089 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2090 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2091 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
2092
2093 l = 0 | (digest[31] << 8) | (digest[30] << 0);
2094
2095 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2096 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2097 buf[42] = int_to_itoa64 (l & 0x3f);
2098 }
2099
2100 void drupal7_decode (u8 digest[64], u8 buf[44])
2101 {
2102 int l;
2103
2104 l = itoa64_to_int (buf[ 0]) << 0;
2105 l |= itoa64_to_int (buf[ 1]) << 6;
2106 l |= itoa64_to_int (buf[ 2]) << 12;
2107 l |= itoa64_to_int (buf[ 3]) << 18;
2108
2109 digest[ 0] = (l >> 0) & 0xff;
2110 digest[ 1] = (l >> 8) & 0xff;
2111 digest[ 2] = (l >> 16) & 0xff;
2112
2113 l = itoa64_to_int (buf[ 4]) << 0;
2114 l |= itoa64_to_int (buf[ 5]) << 6;
2115 l |= itoa64_to_int (buf[ 6]) << 12;
2116 l |= itoa64_to_int (buf[ 7]) << 18;
2117
2118 digest[ 3] = (l >> 0) & 0xff;
2119 digest[ 4] = (l >> 8) & 0xff;
2120 digest[ 5] = (l >> 16) & 0xff;
2121
2122 l = itoa64_to_int (buf[ 8]) << 0;
2123 l |= itoa64_to_int (buf[ 9]) << 6;
2124 l |= itoa64_to_int (buf[10]) << 12;
2125 l |= itoa64_to_int (buf[11]) << 18;
2126
2127 digest[ 6] = (l >> 0) & 0xff;
2128 digest[ 7] = (l >> 8) & 0xff;
2129 digest[ 8] = (l >> 16) & 0xff;
2130
2131 l = itoa64_to_int (buf[12]) << 0;
2132 l |= itoa64_to_int (buf[13]) << 6;
2133 l |= itoa64_to_int (buf[14]) << 12;
2134 l |= itoa64_to_int (buf[15]) << 18;
2135
2136 digest[ 9] = (l >> 0) & 0xff;
2137 digest[10] = (l >> 8) & 0xff;
2138 digest[11] = (l >> 16) & 0xff;
2139
2140 l = itoa64_to_int (buf[16]) << 0;
2141 l |= itoa64_to_int (buf[17]) << 6;
2142 l |= itoa64_to_int (buf[18]) << 12;
2143 l |= itoa64_to_int (buf[19]) << 18;
2144
2145 digest[12] = (l >> 0) & 0xff;
2146 digest[13] = (l >> 8) & 0xff;
2147 digest[14] = (l >> 16) & 0xff;
2148
2149 l = itoa64_to_int (buf[20]) << 0;
2150 l |= itoa64_to_int (buf[21]) << 6;
2151 l |= itoa64_to_int (buf[22]) << 12;
2152 l |= itoa64_to_int (buf[23]) << 18;
2153
2154 digest[15] = (l >> 0) & 0xff;
2155 digest[16] = (l >> 8) & 0xff;
2156 digest[17] = (l >> 16) & 0xff;
2157
2158 l = itoa64_to_int (buf[24]) << 0;
2159 l |= itoa64_to_int (buf[25]) << 6;
2160 l |= itoa64_to_int (buf[26]) << 12;
2161 l |= itoa64_to_int (buf[27]) << 18;
2162
2163 digest[18] = (l >> 0) & 0xff;
2164 digest[19] = (l >> 8) & 0xff;
2165 digest[20] = (l >> 16) & 0xff;
2166
2167 l = itoa64_to_int (buf[28]) << 0;
2168 l |= itoa64_to_int (buf[29]) << 6;
2169 l |= itoa64_to_int (buf[30]) << 12;
2170 l |= itoa64_to_int (buf[31]) << 18;
2171
2172 digest[21] = (l >> 0) & 0xff;
2173 digest[22] = (l >> 8) & 0xff;
2174 digest[23] = (l >> 16) & 0xff;
2175
2176 l = itoa64_to_int (buf[32]) << 0;
2177 l |= itoa64_to_int (buf[33]) << 6;
2178 l |= itoa64_to_int (buf[34]) << 12;
2179 l |= itoa64_to_int (buf[35]) << 18;
2180
2181 digest[24] = (l >> 0) & 0xff;
2182 digest[25] = (l >> 8) & 0xff;
2183 digest[26] = (l >> 16) & 0xff;
2184
2185 l = itoa64_to_int (buf[36]) << 0;
2186 l |= itoa64_to_int (buf[37]) << 6;
2187 l |= itoa64_to_int (buf[38]) << 12;
2188 l |= itoa64_to_int (buf[39]) << 18;
2189
2190 digest[27] = (l >> 0) & 0xff;
2191 digest[28] = (l >> 8) & 0xff;
2192 digest[29] = (l >> 16) & 0xff;
2193
2194 l = itoa64_to_int (buf[40]) << 0;
2195 l |= itoa64_to_int (buf[41]) << 6;
2196 l |= itoa64_to_int (buf[42]) << 12;
2197 l |= itoa64_to_int (buf[43]) << 18;
2198
2199 digest[30] = (l >> 0) & 0xff;
2200 digest[31] = (l >> 8) & 0xff;
2201 digest[32] = (l >> 16) & 0xff;
2202
2203 digest[33] = 0;
2204 digest[34] = 0;
2205 digest[35] = 0;
2206 digest[36] = 0;
2207 digest[37] = 0;
2208 digest[38] = 0;
2209 digest[39] = 0;
2210 digest[40] = 0;
2211 digest[41] = 0;
2212 digest[42] = 0;
2213 digest[43] = 0;
2214 digest[44] = 0;
2215 digest[45] = 0;
2216 digest[46] = 0;
2217 digest[47] = 0;
2218 digest[48] = 0;
2219 digest[49] = 0;
2220 digest[50] = 0;
2221 digest[51] = 0;
2222 digest[52] = 0;
2223 digest[53] = 0;
2224 digest[54] = 0;
2225 digest[55] = 0;
2226 digest[56] = 0;
2227 digest[57] = 0;
2228 digest[58] = 0;
2229 digest[59] = 0;
2230 digest[60] = 0;
2231 digest[61] = 0;
2232 digest[62] = 0;
2233 digest[63] = 0;
2234 }
2235
2236 void drupal7_encode (u8 digest[64], u8 buf[43])
2237 {
2238 int l;
2239
2240 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
2241
2242 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2243 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2244 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2245 buf[ 3] = int_to_itoa64 (l & 0x3f);
2246
2247 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
2248
2249 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2250 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2251 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2252 buf[ 7] = int_to_itoa64 (l & 0x3f);
2253
2254 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
2255
2256 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2257 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2258 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2259 buf[11] = int_to_itoa64 (l & 0x3f);
2260
2261 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
2262
2263 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2264 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2265 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2266 buf[15] = int_to_itoa64 (l & 0x3f);
2267
2268 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
2269
2270 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2271 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2272 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2273 buf[19] = int_to_itoa64 (l & 0x3f);
2274
2275 l = (digest[15] << 0) | (digest[16] << 8) | (digest[17] << 16);
2276
2277 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2278 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2279 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2280 buf[23] = int_to_itoa64 (l & 0x3f);
2281
2282 l = (digest[18] << 0) | (digest[19] << 8) | (digest[20] << 16);
2283
2284 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2285 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2286 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2287 buf[27] = int_to_itoa64 (l & 0x3f);
2288
2289 l = (digest[21] << 0) | (digest[22] << 8) | (digest[23] << 16);
2290
2291 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2292 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2293 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2294 buf[31] = int_to_itoa64 (l & 0x3f);
2295
2296 l = (digest[24] << 0) | (digest[25] << 8) | (digest[26] << 16);
2297
2298 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2299 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2300 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2301 buf[35] = int_to_itoa64 (l & 0x3f);
2302
2303 l = (digest[27] << 0) | (digest[28] << 8) | (digest[29] << 16);
2304
2305 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2306 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2307 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2308 buf[39] = int_to_itoa64 (l & 0x3f);
2309
2310 l = (digest[30] << 0) | (digest[31] << 8) | (digest[32] << 16);
2311
2312 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2313 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2314 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
2315 //buf[43] = int_to_itoa64 (l & 0x3f);
2316 }
2317
2318 /**
2319 * tty
2320 */
2321
2322 #ifdef LINUX
2323 static struct termio savemodes;
2324 static int havemodes = 0;
2325
2326 int tty_break()
2327 {
2328 struct termio modmodes;
2329
2330 if (ioctl (fileno (stdin), TCGETA, &savemodes) < 0) return -1;
2331
2332 havemodes = 1;
2333
2334 modmodes = savemodes;
2335 modmodes.c_lflag &= ~ICANON;
2336 modmodes.c_cc[VMIN] = 1;
2337 modmodes.c_cc[VTIME] = 0;
2338
2339 return ioctl (fileno (stdin), TCSETAW, &modmodes);
2340 }
2341
2342 int tty_getchar()
2343 {
2344 fd_set rfds;
2345
2346 FD_ZERO (&rfds);
2347
2348 FD_SET (fileno (stdin), &rfds);
2349
2350 struct timeval tv;
2351
2352 tv.tv_sec = 1;
2353 tv.tv_usec = 0;
2354
2355 int retval = select (1, &rfds, NULL, NULL, &tv);
2356
2357 if (retval == 0) return 0;
2358 if (retval == -1) return -1;
2359
2360 return getchar();
2361 }
2362
2363 int tty_fix()
2364 {
2365 if (!havemodes) return 0;
2366
2367 return ioctl (fileno (stdin), TCSETAW, &savemodes);
2368 }
2369 #endif
2370
2371 #ifdef OSX
2372 static struct termios savemodes;
2373 static int havemodes = 0;
2374
2375 int tty_break()
2376 {
2377 struct termios modmodes;
2378
2379 if (ioctl (fileno (stdin), TIOCGETA, &savemodes) < 0) return -1;
2380
2381 havemodes = 1;
2382
2383 modmodes = savemodes;
2384 modmodes.c_lflag &= ~ICANON;
2385 modmodes.c_cc[VMIN] = 1;
2386 modmodes.c_cc[VTIME] = 0;
2387
2388 return ioctl (fileno (stdin), TIOCSETAW, &modmodes);
2389 }
2390
2391 int tty_getchar()
2392 {
2393 fd_set rfds;
2394
2395 FD_ZERO (&rfds);
2396
2397 FD_SET (fileno (stdin), &rfds);
2398
2399 struct timeval tv;
2400
2401 tv.tv_sec = 1;
2402 tv.tv_usec = 0;
2403
2404 int retval = select (1, &rfds, NULL, NULL, &tv);
2405
2406 if (retval == 0) return 0;
2407 if (retval == -1) return -1;
2408
2409 return getchar();
2410 }
2411
2412 int tty_fix()
2413 {
2414 if (!havemodes) return 0;
2415
2416 return ioctl (fileno (stdin), TIOCSETAW, &savemodes);
2417 }
2418 #endif
2419
2420 #ifdef WIN
2421 static DWORD saveMode = 0;
2422
2423 int tty_break()
2424 {
2425 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2426
2427 GetConsoleMode (stdinHandle, &saveMode);
2428 SetConsoleMode (stdinHandle, ENABLE_PROCESSED_INPUT);
2429
2430 return 0;
2431 }
2432
2433 int tty_getchar()
2434 {
2435 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2436
2437 DWORD rc = WaitForSingleObject (stdinHandle, 1000);
2438
2439 if (rc == WAIT_TIMEOUT) return 0;
2440 if (rc == WAIT_ABANDONED) return -1;
2441 if (rc == WAIT_FAILED) return -1;
2442
2443 // The whole ReadConsoleInput () part is a workaround.
2444 // For some unknown reason, maybe a mingw bug, a random signal
2445 // is sent to stdin which unblocks WaitForSingleObject () and sets rc 0.
2446 // Then it wants to read with getche () a keyboard input
2447 // which has never been made.
2448
2449 INPUT_RECORD buf[100];
2450
2451 DWORD num = 0;
2452
2453 memset (buf, 0, sizeof (buf));
2454
2455 ReadConsoleInput (stdinHandle, buf, 100, &num);
2456
2457 FlushConsoleInputBuffer (stdinHandle);
2458
2459 for (uint i = 0; i < num; i++)
2460 {
2461 if (buf[i].EventType != KEY_EVENT) continue;
2462
2463 KEY_EVENT_RECORD KeyEvent = buf[i].Event.KeyEvent;
2464
2465 if (KeyEvent.bKeyDown != TRUE) continue;
2466
2467 return KeyEvent.uChar.AsciiChar;
2468 }
2469
2470 return 0;
2471 }
2472
2473 int tty_fix()
2474 {
2475 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2476
2477 SetConsoleMode (stdinHandle, saveMode);
2478
2479 return 0;
2480 }
2481 #endif
2482
2483 /**
2484 * mem alloc
2485 */
2486
2487 #define MSG_ENOMEM "Insufficient memory available"
2488
2489 void *mycalloc (size_t nmemb, size_t size)
2490 {
2491 void *p = calloc (nmemb, size);
2492
2493 if (p == NULL)
2494 {
2495 log_error ("ERROR: %s", MSG_ENOMEM);
2496
2497 exit (-1);
2498 }
2499
2500 return (p);
2501 }
2502
2503 void *mymalloc (size_t size)
2504 {
2505 void *p = malloc (size);
2506
2507 if (p == NULL)
2508 {
2509 log_error ("ERROR: %s", MSG_ENOMEM);
2510
2511 exit (-1);
2512 }
2513
2514 memset (p, 0, size);
2515
2516 return (p);
2517 }
2518
2519 void myfree (void *ptr)
2520 {
2521 if (ptr == NULL) return;
2522
2523 free (ptr);
2524 }
2525
2526 void *myrealloc (void *ptr, size_t oldsz, size_t add)
2527 {
2528 void *p = realloc (ptr, oldsz + add);
2529
2530 if (p == NULL)
2531 {
2532 log_error ("ERROR: %s", MSG_ENOMEM);
2533
2534 exit (-1);
2535 }
2536
2537 memset ((char *) p + oldsz, 0, add);
2538
2539 return (p);
2540 }
2541
2542 char *mystrdup (const char *s)
2543 {
2544 const size_t len = strlen (s);
2545
2546 char *b = (char *) mymalloc (len + 1);
2547
2548 memcpy (b, s, len);
2549
2550 return (b);
2551 }
2552
2553 FILE *logfile_open (char *logfile)
2554 {
2555 FILE *fp = fopen (logfile, "ab");
2556
2557 if (fp == NULL)
2558 {
2559 fp = stdout;
2560 }
2561
2562 return fp;
2563 }
2564
2565 void logfile_close (FILE *fp)
2566 {
2567 if (fp == stdout) return;
2568
2569 fclose (fp);
2570 }
2571
2572 void logfile_append (const char *fmt, ...)
2573 {
2574 if (data.logfile_disable == 1) return;
2575
2576 FILE *fp = logfile_open (data.logfile);
2577
2578 va_list ap;
2579
2580 va_start (ap, fmt);
2581
2582 vfprintf (fp, fmt, ap);
2583
2584 va_end (ap);
2585
2586 fputc ('\n', fp);
2587
2588 fflush (fp);
2589
2590 logfile_close (fp);
2591 }
2592
2593 int logfile_generate_id ()
2594 {
2595 const int n = rand ();
2596
2597 time_t t;
2598
2599 time (&t);
2600
2601 return t + n;
2602 }
2603
2604 char *logfile_generate_topid ()
2605 {
2606 const int id = logfile_generate_id ();
2607
2608 char *topid = (char *) mymalloc (1 + 16 + 1);
2609
2610 snprintf (topid, 1 + 16, "TOP%08x", id);
2611
2612 return topid;
2613 }
2614
2615 char *logfile_generate_subid ()
2616 {
2617 const int id = logfile_generate_id ();
2618
2619 char *subid = (char *) mymalloc (1 + 16 + 1);
2620
2621 snprintf (subid, 1 + 16, "SUB%08x", id);
2622
2623 return subid;
2624 }
2625
2626 /**
2627 * system
2628 */
2629
2630 #if F_SETLKW
2631 void lock_file (FILE *fp)
2632 {
2633 struct flock lock = { 0 };
2634
2635 lock.l_type = F_WRLCK;
2636 while (fcntl(fileno(fp), F_SETLKW, &lock))
2637 {
2638 if (errno != EINTR)
2639 {
2640 log_error ("ERROR: failed acquiring write lock: %s", strerror (errno));
2641
2642 exit (-1);
2643 }
2644 }
2645 }
2646
2647 void unlock_file (FILE *fp)
2648 {
2649 struct flock lock = { 0 };
2650
2651 lock.l_type = F_UNLCK;
2652 fcntl(fileno(fp), F_SETLK, &lock);
2653 }
2654 #endif /* F_SETLKW */
2655
2656 #ifdef _WIN
2657 void fsync (int fd)
2658 {
2659 HANDLE h = (HANDLE) _get_osfhandle (fd);
2660
2661 FlushFileBuffers (h);
2662 }
2663 #endif
2664
2665 /**
2666 * thermal
2667 */
2668
2669 #ifdef HAVE_HWMON
2670 #if defined(_WIN) && defined(HAVE_NVAPI)
2671 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2672 {
2673 NvU32 pGpuCount;
2674
2675 if (hc_NvAPI_EnumPhysicalGPUs (nvGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2676
2677 if (pGpuCount == 0)
2678 {
2679 log_info ("WARN: No NvAPI adapters found");
2680
2681 return (0);
2682 }
2683
2684 return (pGpuCount);
2685 }
2686 #endif // _WIN && HAVE_NVAPI
2687
2688 #if defined(LINUX) && defined(HAVE_NVML)
2689 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2690 {
2691 int pGpuCount = 0;
2692
2693 for (uint i = 0; i < DEVICES_MAX; i++)
2694 {
2695 if (hc_NVML_nvmlDeviceGetHandleByIndex (data.hm_dll_nv, 1, i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2696
2697 // can be used to determine if the device by index matches the cuda device by index
2698 // char name[100]; memset (name, 0, sizeof (name));
2699 // hc_NVML_nvmlDeviceGetName (data.hm_dll_nv, nvGPUHandle[i], name, sizeof (name) - 1);
2700
2701 pGpuCount++;
2702 }
2703
2704 if (pGpuCount == 0)
2705 {
2706 log_info ("WARN: No NVML adapters found");
2707
2708 return (0);
2709 }
2710
2711 return (pGpuCount);
2712 }
2713 #endif // LINUX && HAVE_NVML
2714
2715 #if defined(HAVE_ADL) || defined(HAVE_NVML)
2716 void hm_close (HM_LIB hm_dll)
2717 {
2718 #ifdef _POSIX
2719 dlclose (hm_dll);
2720
2721 #elif _WIN
2722 FreeLibrary (hm_dll);
2723
2724 #endif
2725 }
2726
2727 HM_LIB hm_init (const cl_uint vendor_id)
2728 {
2729 HM_LIB hm_dll = NULL;
2730
2731 #ifdef HAVE_ADL
2732 if (vendor_id == VENDOR_ID_AMD)
2733 {
2734 #ifdef _POSIX
2735 hm_dll = dlopen ("libatiadlxx.so", RTLD_LAZY | RTLD_GLOBAL);
2736
2737 #elif _WIN
2738 hm_dll = LoadLibrary ("atiadlxx.dll");
2739
2740 if (hm_dll == NULL)
2741 {
2742 hm_dll = LoadLibrary ("atiadlxy.dll");
2743 }
2744
2745 #endif
2746 }
2747 #endif
2748
2749 #if defined(LINUX) && defined(HAVE_NVML)
2750 if (vendor_id == VENDOR_ID_NV)
2751 {
2752 hm_dll = dlopen ("libnvidia-ml.so", RTLD_LAZY | RTLD_GLOBAL);
2753 }
2754 #endif
2755
2756 return hm_dll;
2757 }
2758 #endif // HAVE_ADL || HAVE_NVML
2759
2760 #ifdef HAVE_ADL
2761 int get_adapters_num_amd (HM_LIB hm_dll_amd, int *iNumberAdapters)
2762 {
2763 if (hc_ADL_Adapter_NumberOfAdapters_Get (hm_dll_amd, iNumberAdapters) != ADL_OK) return -1;
2764
2765 if (iNumberAdapters == 0)
2766 {
2767 log_info ("WARN: No ADL adapters found.");
2768
2769 return -1;
2770 }
2771
2772 return 0;
2773 }
2774
2775 /*
2776 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2777 {
2778 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2779 ADLODParameters lpOdParameters;
2780
2781 lpOdParameters.iSize = sizeof (ADLODParameters);
2782 size_t plevels_size = 0;
2783
2784 if (hc_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2785
2786 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2787 __func__, iAdapterIndex,
2788 lpOdParameters.iNumberOfPerformanceLevels,
2789 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2790 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2791
2792 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2793
2794 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2795
2796 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2797
2798 if (hc_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2799
2800 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2801 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2802 __func__, iAdapterIndex, j,
2803 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2804
2805 myfree (lpOdPerformanceLevels);
2806
2807 return 0;
2808 }
2809 */
2810
2811 LPAdapterInfo hm_get_adapter_info_amd (HM_LIB hm_dll_amd, int iNumberAdapters)
2812 {
2813 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2814
2815 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2816
2817 if (hc_ADL_Adapter_AdapterInfo_Get (hm_dll_amd, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2818
2819 return lpAdapterInfo;
2820 }
2821
2822 /*
2823 //
2824 // does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2825 //
2826
2827 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2828 {
2829 u32 idx = -1;
2830
2831 for (uint i = 0; i < num_adl_adapters; i++)
2832 {
2833 int opencl_bus_num = hm_device[i].busid;
2834 int opencl_dev_num = hm_device[i].devid;
2835
2836 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2837 {
2838 idx = i;
2839
2840 break;
2841 }
2842 }
2843
2844 if (idx >= DEVICES_MAX) return -1;
2845
2846 return idx;
2847 }
2848
2849 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2850 {
2851 for (uint i = 0; i < opencl_num_devices; i++)
2852 {
2853 cl_device_topology_amd device_topology;
2854
2855 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2856
2857 hm_device[i].busid = device_topology.pcie.bus;
2858 hm_device[i].devid = device_topology.pcie.device;
2859 }
2860 }
2861 */
2862
2863 void hm_sort_adl_adapters_by_busid_devid (u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2864 {
2865 // basically bubble sort
2866
2867 for (int i = 0; i < num_adl_adapters; i++)
2868 {
2869 for (int j = 0; j < num_adl_adapters - 1; j++)
2870 {
2871 // get info of adapter [x]
2872
2873 u32 adapter_index_x = valid_adl_device_list[j];
2874 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2875
2876 u32 bus_num_x = info_x.iBusNumber;
2877 u32 dev_num_x = info_x.iDeviceNumber;
2878
2879 // get info of adapter [y]
2880
2881 u32 adapter_index_y = valid_adl_device_list[j + 1];
2882 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2883
2884 u32 bus_num_y = info_y.iBusNumber;
2885 u32 dev_num_y = info_y.iDeviceNumber;
2886
2887 uint need_swap = 0;
2888
2889 if (bus_num_y < bus_num_x)
2890 {
2891 need_swap = 1;
2892 }
2893 else if (bus_num_y == bus_num_x)
2894 {
2895 if (dev_num_y < dev_num_x)
2896 {
2897 need_swap = 1;
2898 }
2899 }
2900
2901 if (need_swap == 1)
2902 {
2903 u32 temp = valid_adl_device_list[j + 1];
2904
2905 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2906 valid_adl_device_list[j + 0] = temp;
2907 }
2908 }
2909 }
2910 }
2911
2912 u32 *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2913 {
2914 *num_adl_adapters = 0;
2915
2916 u32 *adl_adapters = NULL;
2917
2918 int *bus_numbers = NULL;
2919 int *device_numbers = NULL;
2920
2921 for (int i = 0; i < iNumberAdapters; i++)
2922 {
2923 AdapterInfo info = lpAdapterInfo[i];
2924
2925 if (strlen (info.strUDID) < 1) continue;
2926
2927 #ifdef WIN
2928 if (info.iVendorID != 1002) continue;
2929 #else
2930 if (info.iVendorID != 0x1002) continue;
2931 #endif
2932
2933 if (info.iBusNumber < 0) continue;
2934 if (info.iDeviceNumber < 0) continue;
2935
2936 int found = 0;
2937
2938 for (int pos = 0; pos < *num_adl_adapters; pos++)
2939 {
2940 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2941 {
2942 found = 1;
2943 break;
2944 }
2945 }
2946
2947 if (found) continue;
2948
2949 // add it to the list
2950
2951 adl_adapters = (u32 *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2952
2953 adl_adapters[*num_adl_adapters] = i;
2954
2955 // rest is just bookkeeping
2956
2957 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2958 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2959
2960 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2961 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2962
2963 (*num_adl_adapters)++;
2964 }
2965
2966 myfree (bus_numbers);
2967 myfree (device_numbers);
2968
2969 // sort the list by increasing bus id, device id number
2970
2971 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2972
2973 return adl_adapters;
2974 }
2975
2976 int hm_check_fanspeed_control (HM_LIB hm_dll_amd, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2977 {
2978 // loop through all valid devices
2979
2980 for (int i = 0; i < num_adl_adapters; i++)
2981 {
2982 u32 adapter_index = valid_adl_device_list[i];
2983
2984 // get AdapterInfo
2985
2986 AdapterInfo info = lpAdapterInfo[adapter_index];
2987
2988 // unfortunately this doesn't work since bus id and dev id are not unique
2989 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2990 // if (opencl_device_index == -1) continue;
2991
2992 int opencl_device_index = i;
2993
2994 // if (hm_show_performance_level (hm_dll_amd, info.iAdapterIndex) != 0) return -1;
2995
2996 // get fanspeed info
2997
2998 if (hm_device[opencl_device_index].od_version == 5)
2999 {
3000 ADLFanSpeedInfo FanSpeedInfo;
3001
3002 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
3003
3004 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
3005
3006 if (hc_ADL_Overdrive5_FanSpeedInfo_Get (hm_dll_amd, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
3007
3008 // check read and write capability in fanspeedinfo
3009
3010 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
3011 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
3012 {
3013 hm_device[opencl_device_index].fan_supported = 1;
3014 }
3015 else
3016 {
3017 hm_device[opencl_device_index].fan_supported = 0;
3018 }
3019 }
3020 else // od_version == 6
3021 {
3022 ADLOD6FanSpeedInfo faninfo;
3023
3024 memset (&faninfo, 0, sizeof (faninfo));
3025
3026 if (hc_ADL_Overdrive6_FanSpeed_Get (hm_dll_amd, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
3027
3028 // check read capability in fanspeedinfo
3029
3030 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
3031 {
3032 hm_device[opencl_device_index].fan_supported = 1;
3033 }
3034 else
3035 {
3036 hm_device[opencl_device_index].fan_supported = 0;
3037 }
3038 }
3039 }
3040
3041 return 0;
3042 }
3043
3044 int hm_get_overdrive_version (HM_LIB hm_dll_amd, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3045 {
3046 for (int i = 0; i < num_adl_adapters; i++)
3047 {
3048 u32 adapter_index = valid_adl_device_list[i];
3049
3050 // get AdapterInfo
3051
3052 AdapterInfo info = lpAdapterInfo[adapter_index];
3053
3054 // get overdrive version
3055
3056 int od_supported = 0;
3057 int od_enabled = 0;
3058 int od_version = 0;
3059
3060 if (hc_ADL_Overdrive_Caps (hm_dll_amd, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3061
3062 // store the overdrive version in hm_device
3063
3064 // unfortunately this doesn't work since bus id and dev id are not unique
3065 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3066 // if (opencl_device_index == -1) continue;
3067
3068 int opencl_device_index = i;
3069
3070 hm_device[opencl_device_index].od_version = od_version;
3071 }
3072
3073 return 0;
3074 }
3075
3076 int hm_get_adapter_index_amd (hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3077 {
3078 for (int i = 0; i < num_adl_adapters; i++)
3079 {
3080 u32 adapter_index = valid_adl_device_list[i];
3081
3082 // get AdapterInfo
3083
3084 AdapterInfo info = lpAdapterInfo[adapter_index];
3085
3086 // store the iAdapterIndex in hm_device
3087
3088 // unfortunately this doesn't work since bus id and dev id are not unique
3089 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3090 // if (opencl_device_index == -1) continue;
3091
3092 int opencl_device_index = i;
3093
3094 hm_device[opencl_device_index].adapter_index.amd = info.iAdapterIndex;
3095 }
3096
3097 return num_adl_adapters;
3098 }
3099 #endif // HAVE_ADL
3100
3101 int hm_get_temperature_with_device_id (const uint device_id)
3102 {
3103 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3104
3105 #ifdef HAVE_ADL
3106 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3107 {
3108 if (data.hm_dll_amd)
3109 {
3110 if (data.hm_device[device_id].od_version == 5)
3111 {
3112 ADLTemperature Temperature;
3113
3114 Temperature.iSize = sizeof (ADLTemperature);
3115
3116 if (hc_ADL_Overdrive5_Temperature_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, 0, &Temperature) != ADL_OK) return -1;
3117
3118 return Temperature.iTemperature / 1000;
3119 }
3120 else if (data.hm_device[device_id].od_version == 6)
3121 {
3122 int Temperature = 0;
3123
3124 if (hc_ADL_Overdrive6_Temperature_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &Temperature) != ADL_OK) return -1;
3125
3126 return Temperature / 1000;
3127 }
3128 }
3129 }
3130 #endif
3131
3132 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3133 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3134 {
3135 #if defined(LINUX) && defined(HAVE_NVML)
3136 int temperature = 0;
3137
3138 hc_NVML_nvmlDeviceGetTemperature (data.hm_dll_nv, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_GPU, (unsigned int *) &temperature);
3139
3140 return temperature;
3141 #endif
3142
3143 #if defined(WIN) && defined(HAVE_NVAPI)
3144 NV_GPU_THERMAL_SETTINGS pThermalSettings;
3145
3146 pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER;
3147 pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU;
3148 pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN;
3149 pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
3150
3151 if (hc_NvAPI_GPU_GetThermalSettings (data.hm_device[device_id].adapter_index.nv, 0, &pThermalSettings) != NVAPI_OK) return -1;
3152
3153 return pThermalSettings.sensor[0].currentTemp;
3154 #endif // WIN && HAVE_NVAPI
3155 }
3156 #endif // HAVE_NVML || HAVE_NVAPI
3157
3158 return -1;
3159 }
3160
3161 int hm_get_fanspeed_with_device_id (const uint device_id)
3162 {
3163 // we shouldn't really need this extra CL_DEVICE_TYPE_GPU check, because fan_supported should not be set w/ CPUs
3164 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3165
3166 if (data.hm_device[device_id].fan_supported == 1)
3167 {
3168 #ifdef HAVE_ADL
3169 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3170 {
3171 if (data.hm_dll_amd)
3172 {
3173 if (data.hm_device[device_id].od_version == 5)
3174 {
3175 ADLFanSpeedValue lpFanSpeedValue;
3176
3177 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3178
3179 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3180 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3181 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3182
3183 if (hc_ADL_Overdrive5_FanSpeed_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3184
3185 return lpFanSpeedValue.iFanSpeed;
3186 }
3187 else // od_version == 6
3188 {
3189 ADLOD6FanSpeedInfo faninfo;
3190
3191 memset (&faninfo, 0, sizeof (faninfo));
3192
3193 if (hc_ADL_Overdrive6_FanSpeed_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &faninfo) != ADL_OK) return -1;
3194
3195 return faninfo.iFanSpeedPercent;
3196 }
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 int speed = 0;
3206
3207 hc_NVML_nvmlDeviceGetFanSpeed (data.hm_dll_nv, 1, data.hm_device[device_id].adapter_index.nv, (unsigned int *) &speed);
3208
3209 return speed;
3210 #endif
3211
3212 #if defined(WIN) && defined(HAVE_NVAPI)
3213 NvU32 speed = 0;
3214
3215 hc_NvAPI_GPU_GetTachReading (data.hm_device[device_id].adapter_index.nv, &speed);
3216
3217 return speed;
3218 #endif
3219 }
3220 #endif // HAVE_NVML || HAVE_NVAPI
3221 }
3222
3223 return -1;
3224 }
3225
3226 int hm_get_utilization_with_device_id (const uint device_id)
3227 {
3228 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3229
3230 #ifdef HAVE_ADL
3231 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3232 {
3233 if (data.hm_dll_amd)
3234 {
3235 ADLPMActivity PMActivity;
3236
3237 PMActivity.iSize = sizeof (ADLPMActivity);
3238
3239 if (hc_ADL_Overdrive_CurrentActivity_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3240
3241 return PMActivity.iActivityPercent;
3242 }
3243 }
3244 #endif // HAVE_ADL
3245
3246 #if defined(HAVE_NVML) || defined(HAVE_NVAPI)
3247 if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3248 {
3249 #if defined(LINUX) && defined(HAVE_NVML)
3250 nvmlUtilization_t utilization;
3251
3252 hc_NVML_nvmlDeviceGetUtilizationRates (data.hm_dll_nv, data.hm_device[device_id].adapter_index.nv, &utilization);
3253
3254 return utilization.gpu;
3255 #endif
3256
3257 #if defined(WIN) && defined(HAVE_NVAPI)
3258 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3259
3260 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3261
3262 if (hc_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_device[device_id].adapter_index.nv, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3263
3264 return pDynamicPstatesInfoEx.utilization[0].percentage;
3265 #endif
3266 }
3267 #endif // HAVE_NVML || HAVE_NVAPI
3268
3269 return -1;
3270 }
3271
3272 #ifdef HAVE_ADL
3273 int hm_set_fanspeed_with_device_id_amd (const uint device_id, const int fanspeed)
3274 {
3275 if (data.hm_device[device_id].fan_supported == 1)
3276 {
3277 if (data.hm_dll_amd)
3278 {
3279 if (data.hm_device[device_id].od_version == 5)
3280 {
3281 ADLFanSpeedValue lpFanSpeedValue;
3282
3283 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3284
3285 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3286 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3287 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3288 lpFanSpeedValue.iFanSpeed = fanspeed;
3289
3290 if (hc_ADL_Overdrive5_FanSpeed_Set (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3291
3292 return 0;
3293 }
3294 else // od_version == 6
3295 {
3296 ADLOD6FanSpeedValue fan_speed_value;
3297
3298 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3299
3300 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3301 fan_speed_value.iFanSpeed = fanspeed;
3302
3303 if (hc_ADL_Overdrive6_FanSpeed_Set (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &fan_speed_value) != ADL_OK) return -1;
3304
3305 return 0;
3306 }
3307 }
3308 }
3309
3310 return -1;
3311 }
3312 #endif
3313
3314 // helper function for status display
3315
3316 void hm_device_val_to_str (char *target_buf, int max_buf_size, char *suffix, int value)
3317 {
3318 #define VALUE_NOT_AVAILABLE "N/A"
3319
3320 if (value == -1)
3321 {
3322 snprintf (target_buf, max_buf_size, VALUE_NOT_AVAILABLE);
3323 }
3324 else
3325 {
3326 snprintf (target_buf, max_buf_size, "%2d%s", value, suffix);
3327 }
3328 }
3329 #endif // HAVE_HWMON
3330
3331 /**
3332 * maskprocessor
3333 */
3334
3335 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3336 {
3337 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3338
3339 if (css_cnt > SP_PW_MAX)
3340 {
3341 log_error ("ERROR: mask length is too long");
3342
3343 exit (-1);
3344 }
3345
3346 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3347 {
3348 uint *uniq_tbl = uniq_tbls[css_pos];
3349
3350 uint *cs_buf = css[css_pos].cs_buf;
3351 uint cs_len = css[css_pos].cs_len;
3352
3353 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3354 {
3355 uint c = cs_buf[cs_pos] & 0xff;
3356
3357 uniq_tbl[c] = 1;
3358 }
3359 }
3360 }
3361
3362 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3363 {
3364 cs_t *cs = &css[css_cnt];
3365
3366 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3367
3368 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3369
3370 size_t i;
3371
3372 for (i = 0; i < cs->cs_len; i++)
3373 {
3374 const uint u = cs->cs_buf[i];
3375
3376 css_uniq[u] = 1;
3377 }
3378
3379 for (i = 0; i < in_len; i++)
3380 {
3381 uint u = in_buf[i] & 0xff;
3382
3383 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3384
3385 if (css_uniq[u] == 1) continue;
3386
3387 css_uniq[u] = 1;
3388
3389 cs->cs_buf[cs->cs_len] = u;
3390
3391 cs->cs_len++;
3392 }
3393
3394 myfree (css_uniq);
3395 }
3396
3397 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3398 {
3399 size_t in_pos;
3400
3401 for (in_pos = 0; in_pos < in_len; in_pos++)
3402 {
3403 uint p0 = in_buf[in_pos] & 0xff;
3404
3405 if (interpret == 1 && p0 == '?')
3406 {
3407 in_pos++;
3408
3409 if (in_pos == in_len) break;
3410
3411 uint p1 = in_buf[in_pos] & 0xff;
3412
3413 switch (p1)
3414 {
3415 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3416 break;
3417 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3418 break;
3419 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3420 break;
3421 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3422 break;
3423 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3424 break;
3425 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3426 break;
3427 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3428 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3429 break;
3430 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3431 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3432 break;
3433 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3434 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3435 break;
3436 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3437 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3438 break;
3439 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3440 break;
3441 default: log_error ("Syntax error: %s", in_buf);
3442 exit (-1);
3443 }
3444 }
3445 else
3446 {
3447 if (data.hex_charset)
3448 {
3449 in_pos++;
3450
3451 if (in_pos == in_len)
3452 {
3453 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3454
3455 exit (-1);
3456 }
3457
3458 uint p1 = in_buf[in_pos] & 0xff;
3459
3460 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3461 {
3462 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3463
3464 exit (-1);
3465 }
3466
3467 uint chr = 0;
3468
3469 chr = hex_convert (p1) << 0;
3470 chr |= hex_convert (p0) << 4;
3471
3472 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3473 }
3474 else
3475 {
3476 uint chr = p0;
3477
3478 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3479 }
3480 }
3481 }
3482 }
3483
3484 u64 mp_get_sum (uint css_cnt, cs_t *css)
3485 {
3486 u64 sum = 1;
3487
3488 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3489 {
3490 sum *= css[css_pos].cs_len;
3491 }
3492
3493 return (sum);
3494 }
3495
3496 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3497 {
3498 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3499
3500 uint mask_pos;
3501 uint css_pos;
3502
3503 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3504 {
3505 char p0 = mask_buf[mask_pos];
3506
3507 if (p0 == '?')
3508 {
3509 mask_pos++;
3510
3511 if (mask_pos == mask_len) break;
3512
3513 char p1 = mask_buf[mask_pos];
3514
3515 uint chr = p1;
3516
3517 switch (p1)
3518 {
3519 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3520 break;
3521 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3522 break;
3523 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3524 break;
3525 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3526 break;
3527 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3528 break;
3529 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3530 break;
3531 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3532 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3533 break;
3534 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3535 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3536 break;
3537 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3538 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3539 break;
3540 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3541 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3542 break;
3543 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3544 break;
3545 default: log_error ("ERROR: syntax error: %s", mask_buf);
3546 exit (-1);
3547 }
3548 }
3549 else
3550 {
3551 if (data.hex_charset)
3552 {
3553 mask_pos++;
3554
3555 // if there is no 2nd hex character, show an error:
3556
3557 if (mask_pos == mask_len)
3558 {
3559 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3560
3561 exit (-1);
3562 }
3563
3564 char p1 = mask_buf[mask_pos];
3565
3566 // if they are not valid hex character, show an error:
3567
3568 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3569 {
3570 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3571
3572 exit (-1);
3573 }
3574
3575 uint chr = 0;
3576
3577 chr |= hex_convert (p1) << 0;
3578 chr |= hex_convert (p0) << 4;
3579
3580 mp_add_cs_buf (&chr, 1, css, css_pos);
3581 }
3582 else
3583 {
3584 uint chr = p0;
3585
3586 mp_add_cs_buf (&chr, 1, css, css_pos);
3587 }
3588 }
3589 }
3590
3591 if (css_pos == 0)
3592 {
3593 log_error ("ERROR: invalid mask length (0)");
3594
3595 exit (-1);
3596 }
3597
3598 *css_cnt = css_pos;
3599
3600 return (css);
3601 }
3602
3603 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3604 {
3605 for (int i = 0; i < css_cnt; i++)
3606 {
3607 uint len = css[i].cs_len;
3608 u64 next = val / len;
3609 uint pos = val % len;
3610 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3611 val = next;
3612 }
3613 }
3614
3615 void mp_cut_at (char *mask, uint max)
3616 {
3617 uint i;
3618 uint j;
3619 uint mask_len = strlen (mask);
3620
3621 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3622 {
3623 if (mask[i] == '?') i++;
3624 }
3625
3626 mask[i] = 0;
3627 }
3628
3629 void mp_setup_sys (cs_t *mp_sys)
3630 {
3631 uint pos;
3632 uint chr;
3633 uint donec[CHARSIZ] = { 0 };
3634
3635 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3636 mp_sys[0].cs_buf[pos++] = chr;
3637 mp_sys[0].cs_len = pos; }
3638
3639 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3640 mp_sys[1].cs_buf[pos++] = chr;
3641 mp_sys[1].cs_len = pos; }
3642
3643 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3644 mp_sys[2].cs_buf[pos++] = chr;
3645 mp_sys[2].cs_len = pos; }
3646
3647 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3648 mp_sys[3].cs_buf[pos++] = chr;
3649 mp_sys[3].cs_len = pos; }
3650
3651 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3652 mp_sys[4].cs_len = pos; }
3653
3654 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3655 mp_sys[5].cs_len = pos; }
3656 }
3657
3658 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3659 {
3660 FILE *fp = fopen (buf, "rb");
3661
3662 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3663 {
3664 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3665 }
3666 else
3667 {
3668 char mp_file[1024] = { 0 };
3669
3670 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3671
3672 fclose (fp);
3673
3674 len = in_superchop (mp_file);
3675
3676 if (len == 0)
3677 {
3678 log_info ("WARNING: charset file corrupted");
3679
3680 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3681 }
3682 else
3683 {
3684 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3685 }
3686 }
3687 }
3688
3689 void mp_reset_usr (cs_t *mp_usr, uint index)
3690 {
3691 mp_usr[index].cs_len = 0;
3692
3693 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3694 }
3695
3696 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3697 {
3698 char *new_mask_buf = (char *) mymalloc (256);
3699
3700 uint mask_pos;
3701
3702 uint css_pos;
3703
3704 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3705 {
3706 if (css_pos == len) break;
3707
3708 char p0 = mask_buf[mask_pos];
3709
3710 new_mask_buf[mask_pos] = p0;
3711
3712 if (p0 == '?')
3713 {
3714 mask_pos++;
3715
3716 if (mask_pos == mask_len) break;
3717
3718 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3719 }
3720 else
3721 {
3722 if (data.hex_charset)
3723 {
3724 mask_pos++;
3725
3726 if (mask_pos == mask_len)
3727 {
3728 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3729
3730 exit (-1);
3731 }
3732
3733 char p1 = mask_buf[mask_pos];
3734
3735 // if they are not valid hex character, show an error:
3736
3737 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3738 {
3739 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3740
3741 exit (-1);
3742 }
3743
3744 new_mask_buf[mask_pos] = p1;
3745 }
3746 }
3747 }
3748
3749 if (css_pos == len) return (new_mask_buf);
3750
3751 myfree (new_mask_buf);
3752
3753 return (NULL);
3754 }
3755
3756 /**
3757 * statprocessor
3758 */
3759
3760 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3761 {
3762 u64 sum = 1;
3763
3764 uint i;
3765
3766 for (i = start; i < stop; i++)
3767 {
3768 sum *= root_css_buf[i].cs_len;
3769 }
3770
3771 return (sum);
3772 }
3773
3774 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3775 {
3776 u64 v = ctx;
3777
3778 cs_t *cs = &root_css_buf[start];
3779
3780 uint i;
3781
3782 for (i = start; i < stop; i++)
3783 {
3784 const u64 m = v % cs->cs_len;
3785 const u64 d = v / cs->cs_len;
3786
3787 v = d;
3788
3789 const uint k = cs->cs_buf[m];
3790
3791 pw_buf[i - start] = (char) k;
3792
3793 cs = &markov_css_buf[(i * CHARSIZ) + k];
3794 }
3795 }
3796
3797 int sp_comp_val (const void *p1, const void *p2)
3798 {
3799 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3800 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3801
3802 return b2->val - b1->val;
3803 }
3804
3805 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)
3806 {
3807 uint i;
3808 uint j;
3809 uint k;
3810
3811 /**
3812 * Initialize hcstats
3813 */
3814
3815 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
3816
3817 u64 *root_stats_ptr = root_stats_buf;
3818
3819 u64 *root_stats_buf_by_pos[SP_PW_MAX];
3820
3821 for (i = 0; i < SP_PW_MAX; i++)
3822 {
3823 root_stats_buf_by_pos[i] = root_stats_ptr;
3824
3825 root_stats_ptr += CHARSIZ;
3826 }
3827
3828 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
3829
3830 u64 *markov_stats_ptr = markov_stats_buf;
3831
3832 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3833
3834 for (i = 0; i < SP_PW_MAX; i++)
3835 {
3836 for (j = 0; j < CHARSIZ; j++)
3837 {
3838 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3839
3840 markov_stats_ptr += CHARSIZ;
3841 }
3842 }
3843
3844 /**
3845 * Load hcstats File
3846 */
3847
3848 if (hcstat == NULL)
3849 {
3850 char hcstat_tmp[256] = { 0 };
3851
3852 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
3853
3854 hcstat = hcstat_tmp;
3855 }
3856
3857 FILE *fd = fopen (hcstat, "rb");
3858
3859 if (fd == NULL)
3860 {
3861 log_error ("%s: %s", hcstat, strerror (errno));
3862
3863 exit (-1);
3864 }
3865
3866 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3867 {
3868 log_error ("%s: Could not load data", hcstat);
3869
3870 fclose (fd);
3871
3872 exit (-1);
3873 }
3874
3875 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3876 {
3877 log_error ("%s: Could not load data", hcstat);
3878
3879 fclose (fd);
3880
3881 exit (-1);
3882 }
3883
3884 fclose (fd);
3885
3886 /**
3887 * Markov modifier of hcstat_table on user request
3888 */
3889
3890 if (disable)
3891 {
3892 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
3893 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
3894 }
3895
3896 if (classic)
3897 {
3898 /* Add all stats to first position */
3899
3900 for (i = 1; i < SP_PW_MAX; i++)
3901 {
3902 u64 *out = root_stats_buf_by_pos[0];
3903 u64 *in = root_stats_buf_by_pos[i];
3904
3905 for (j = 0; j < CHARSIZ; j++)
3906 {
3907 *out++ += *in++;
3908 }
3909 }
3910
3911 for (i = 1; i < SP_PW_MAX; i++)
3912 {
3913 u64 *out = markov_stats_buf_by_key[0][0];
3914 u64 *in = markov_stats_buf_by_key[i][0];
3915
3916 for (j = 0; j < CHARSIZ; j++)
3917 {
3918 for (k = 0; k < CHARSIZ; k++)
3919 {
3920 *out++ += *in++;
3921 }
3922 }
3923 }
3924
3925 /* copy them to all pw_positions */
3926
3927 for (i = 1; i < SP_PW_MAX; i++)
3928 {
3929 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
3930 }
3931
3932 for (i = 1; i < SP_PW_MAX; i++)
3933 {
3934 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
3935 }
3936 }
3937
3938 /**
3939 * Initialize tables
3940 */
3941
3942 hcstat_table_t *root_table_ptr = root_table_buf;
3943
3944 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
3945
3946 for (i = 0; i < SP_PW_MAX; i++)
3947 {
3948 root_table_buf_by_pos[i] = root_table_ptr;
3949
3950 root_table_ptr += CHARSIZ;
3951 }
3952
3953 hcstat_table_t *markov_table_ptr = markov_table_buf;
3954
3955 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
3956
3957 for (i = 0; i < SP_PW_MAX; i++)
3958 {
3959 for (j = 0; j < CHARSIZ; j++)
3960 {
3961 markov_table_buf_by_key[i][j] = markov_table_ptr;
3962
3963 markov_table_ptr += CHARSIZ;
3964 }
3965 }
3966
3967 /**
3968 * Convert hcstat to tables
3969 */
3970
3971 for (i = 0; i < SP_ROOT_CNT; i++)
3972 {
3973 uint key = i % CHARSIZ;
3974
3975 root_table_buf[i].key = key;
3976 root_table_buf[i].val = root_stats_buf[i];
3977 }
3978
3979 for (i = 0; i < SP_MARKOV_CNT; i++)
3980 {
3981 uint key = i % CHARSIZ;
3982
3983 markov_table_buf[i].key = key;
3984 markov_table_buf[i].val = markov_stats_buf[i];
3985 }
3986
3987 myfree (root_stats_buf);
3988 myfree (markov_stats_buf);
3989
3990 /**
3991 * Finally sort them
3992 */
3993
3994 for (i = 0; i < SP_PW_MAX; i++)
3995 {
3996 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3997 }
3998
3999 for (i = 0; i < SP_PW_MAX; i++)
4000 {
4001 for (j = 0; j < CHARSIZ; j++)
4002 {
4003 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
4004 }
4005 }
4006 }
4007
4008 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])
4009 {
4010 /**
4011 * Convert tables to css
4012 */
4013
4014 for (uint i = 0; i < SP_ROOT_CNT; i++)
4015 {
4016 uint pw_pos = i / CHARSIZ;
4017
4018 cs_t *cs = &root_css_buf[pw_pos];
4019
4020 if (cs->cs_len == threshold) continue;
4021
4022 uint key = root_table_buf[i].key;
4023
4024 if (uniq_tbls[pw_pos][key] == 0) continue;
4025
4026 cs->cs_buf[cs->cs_len] = key;
4027
4028 cs->cs_len++;
4029 }
4030
4031 /**
4032 * Convert table to css
4033 */
4034
4035 for (uint i = 0; i < SP_MARKOV_CNT; i++)
4036 {
4037 uint c = i / CHARSIZ;
4038
4039 cs_t *cs = &markov_css_buf[c];
4040
4041 if (cs->cs_len == threshold) continue;
4042
4043 uint pw_pos = c / CHARSIZ;
4044
4045 uint key = markov_table_buf[i].key;
4046
4047 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
4048
4049 cs->cs_buf[cs->cs_len] = key;
4050
4051 cs->cs_len++;
4052 }
4053
4054 /*
4055 for (uint i = 0; i < 8; i++)
4056 {
4057 for (uint j = 0x20; j < 0x80; j++)
4058 {
4059 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4060
4061 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4062
4063 for (uint k = 0; k < 10; k++)
4064 {
4065 printf (" %u\n", ptr->cs_buf[k]);
4066 }
4067 }
4068 }
4069 */
4070 }
4071
4072 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4073 {
4074 for (uint i = 0; i < SP_PW_MAX; i += 2)
4075 {
4076 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4077
4078 out += CHARSIZ;
4079 in += CHARSIZ;
4080
4081 out->key = 0;
4082 out->val = 1;
4083
4084 out++;
4085
4086 for (uint j = 1; j < CHARSIZ; j++)
4087 {
4088 out->key = j;
4089 out->val = 0;
4090
4091 out++;
4092 }
4093 }
4094 }
4095
4096 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4097 {
4098 for (uint i = 0; i < SP_PW_MAX; i += 2)
4099 {
4100 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4101
4102 out += CHARSIZ * CHARSIZ;
4103 in += CHARSIZ * CHARSIZ;
4104
4105 for (uint j = 0; j < CHARSIZ; j++)
4106 {
4107 out->key = 0;
4108 out->val = 1;
4109
4110 out++;
4111
4112 for (uint k = 1; k < CHARSIZ; k++)
4113 {
4114 out->key = k;
4115 out->val = 0;
4116
4117 out++;
4118 }
4119 }
4120 }
4121 }
4122
4123 /**
4124 * mixed shared functions
4125 */
4126
4127 void dump_hex (const u8 *s, const int sz)
4128 {
4129 for (int i = 0; i < sz; i++)
4130 {
4131 log_info_nn ("%02x ", s[i]);
4132 }
4133
4134 log_info ("");
4135 }
4136
4137 void usage_mini_print (const char *progname)
4138 {
4139 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4140 }
4141
4142 void usage_big_print (const char *progname)
4143 {
4144 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4145 }
4146
4147 char *get_exec_path ()
4148 {
4149 int exec_path_len = 1024;
4150
4151 char *exec_path = (char *) mymalloc (exec_path_len);
4152
4153 #ifdef LINUX
4154
4155 char tmp[32] = { 0 };
4156
4157 snprintf (tmp, sizeof (tmp) - 1, "/proc/%d/exe", getpid ());
4158
4159 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4160
4161 #elif WIN
4162
4163 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4164
4165 #elif OSX
4166
4167 uint size = exec_path_len;
4168
4169 if (_NSGetExecutablePath (exec_path, &size) != 0)
4170 {
4171 log_error("! executable path buffer too small\n");
4172
4173 exit (-1);
4174 }
4175
4176 const int len = strlen (exec_path);
4177
4178 #else
4179 #error Your Operating System is not supported or detected
4180 #endif
4181
4182 exec_path[len] = 0;
4183
4184 return exec_path;
4185 }
4186
4187 char *get_install_dir (const char *progname)
4188 {
4189 char *install_dir = mystrdup (progname);
4190 char *last_slash = NULL;
4191
4192 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4193 {
4194 *last_slash = 0;
4195 }
4196 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4197 {
4198 *last_slash = 0;
4199 }
4200 else
4201 {
4202 install_dir[0] = '.';
4203 install_dir[1] = 0;
4204 }
4205
4206 return (install_dir);
4207 }
4208
4209 char *get_profile_dir (const char *homedir)
4210 {
4211 #define DOT_HASHCAT ".hashcat"
4212
4213 size_t len = strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1;
4214
4215 char *profile_dir = (char *) mymalloc (len + 1);
4216
4217 snprintf (profile_dir, len, "%s/%s", homedir, DOT_HASHCAT);
4218
4219 return profile_dir;
4220 }
4221
4222 char *get_session_dir (const char *profile_dir)
4223 {
4224 #define SESSIONS_FOLDER "sessions"
4225
4226 size_t len = strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1;
4227
4228 char *session_dir = (char *) mymalloc (len + 1);
4229
4230 snprintf (session_dir, len, "%s/%s", profile_dir, SESSIONS_FOLDER);
4231
4232 return session_dir;
4233 }
4234
4235 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4236 {
4237 uint crc = ~0;
4238
4239 FILE *fd = fopen (filename, "rb");
4240
4241 if (fd == NULL)
4242 {
4243 log_error ("%s: %s", filename, strerror (errno));
4244
4245 exit (-1);
4246 }
4247
4248 #define MAX_KEY_SIZE (1024 * 1024)
4249
4250 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4251
4252 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4253
4254 fclose (fd);
4255
4256 int kpos = 0;
4257
4258 for (int fpos = 0; fpos < nread; fpos++)
4259 {
4260 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4261
4262 keytab[kpos++] += (crc >> 24) & 0xff;
4263 keytab[kpos++] += (crc >> 16) & 0xff;
4264 keytab[kpos++] += (crc >> 8) & 0xff;
4265 keytab[kpos++] += (crc >> 0) & 0xff;
4266
4267 if (kpos >= 64) kpos = 0;
4268 }
4269
4270 myfree (buf);
4271 }
4272
4273 void set_cpu_affinity (char *cpu_affinity)
4274 {
4275 #ifdef WIN
4276 DWORD_PTR aff_mask = 0;
4277 #elif LINUX
4278 cpu_set_t cpuset;
4279 CPU_ZERO (&cpuset);
4280 #endif
4281
4282 if (cpu_affinity)
4283 {
4284 char *devices = strdup (cpu_affinity);
4285
4286 char *next = strtok (devices, ",");
4287
4288 do
4289 {
4290 uint cpu_id = atoi (next);
4291
4292 if (cpu_id == 0)
4293 {
4294 #ifdef WIN
4295 aff_mask = 0;
4296 #elif LINUX
4297 CPU_ZERO (&cpuset);
4298 #endif
4299
4300 break;
4301 }
4302
4303 if (cpu_id > 32)
4304 {
4305 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4306
4307 exit (-1);
4308 }
4309
4310 #ifdef WIN
4311 aff_mask |= 1 << (cpu_id - 1);
4312 #elif LINUX
4313 CPU_SET ((cpu_id - 1), &cpuset);
4314 #endif
4315
4316 } while ((next = strtok (NULL, ",")) != NULL);
4317
4318 free (devices);
4319 }
4320
4321 #ifdef WIN
4322 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4323 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4324 #elif LINUX
4325 pthread_t thread = pthread_self ();
4326 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4327 #endif
4328 }
4329
4330 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4331 {
4332 char *element, *end;
4333
4334 end = (char *) base + nmemb * size;
4335
4336 for (element = (char *) base; element < end; element += size)
4337 if (!compar (element, key))
4338 return element;
4339
4340 return NULL;
4341 }
4342
4343 int sort_by_salt (const void *v1, const void *v2)
4344 {
4345 const salt_t *s1 = (const salt_t *) v1;
4346 const salt_t *s2 = (const salt_t *) v2;
4347
4348 const int res1 = s1->salt_len - s2->salt_len;
4349
4350 if (res1 != 0) return (res1);
4351
4352 const int res2 = s1->salt_iter - s2->salt_iter;
4353
4354 if (res2 != 0) return (res2);
4355
4356 uint n;
4357
4358 n = 12;
4359
4360 while (n--)
4361 {
4362 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4363 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4364 }
4365
4366 n = 8;
4367
4368 while (n--)
4369 {
4370 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4371 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4372 }
4373
4374 return (0);
4375 }
4376
4377 int sort_by_salt_buf (const void *v1, const void *v2)
4378 {
4379 const pot_t *p1 = (const pot_t *) v1;
4380 const pot_t *p2 = (const pot_t *) v2;
4381
4382 const hash_t *h1 = &p1->hash;
4383 const hash_t *h2 = &p2->hash;
4384
4385 const salt_t *s1 = h1->salt;
4386 const salt_t *s2 = h2->salt;
4387
4388 uint n = 12;
4389
4390 while (n--)
4391 {
4392 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4393 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4394 }
4395
4396 return 0;
4397 }
4398
4399 int sort_by_hash_t_salt (const void *v1, const void *v2)
4400 {
4401 const hash_t *h1 = (const hash_t *) v1;
4402 const hash_t *h2 = (const hash_t *) v2;
4403
4404 const salt_t *s1 = h1->salt;
4405 const salt_t *s2 = h2->salt;
4406
4407 // testphase: this should work
4408 uint n = 12;
4409
4410 while (n--)
4411 {
4412 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4413 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4414 }
4415
4416 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4417 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4418 if (s1->salt_len > s2->salt_len) return ( 1);
4419 if (s1->salt_len < s2->salt_len) return (-1);
4420
4421 uint n = s1->salt_len;
4422
4423 while (n--)
4424 {
4425 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4426 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4427 }
4428 */
4429
4430 return 0;
4431 }
4432
4433 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4434 {
4435 const hash_t *h1 = (const hash_t *) v1;
4436 const hash_t *h2 = (const hash_t *) v2;
4437
4438 const salt_t *s1 = h1->salt;
4439 const salt_t *s2 = h2->salt;
4440
4441 // 12 - 2 (since last 2 uints contain the digest)
4442 uint n = 10;
4443
4444 while (n--)
4445 {
4446 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4447 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4448 }
4449
4450 return 0;
4451 }
4452
4453 int sort_by_hash_no_salt (const void *v1, const void *v2)
4454 {
4455 const hash_t *h1 = (const hash_t *) v1;
4456 const hash_t *h2 = (const hash_t *) v2;
4457
4458 const void *d1 = h1->digest;
4459 const void *d2 = h2->digest;
4460
4461 return data.sort_by_digest (d1, d2);
4462 }
4463
4464 int sort_by_hash (const void *v1, const void *v2)
4465 {
4466 const hash_t *h1 = (const hash_t *) v1;
4467 const hash_t *h2 = (const hash_t *) v2;
4468
4469 if (data.isSalted)
4470 {
4471 const salt_t *s1 = h1->salt;
4472 const salt_t *s2 = h2->salt;
4473
4474 int res = sort_by_salt (s1, s2);
4475
4476 if (res != 0) return (res);
4477 }
4478
4479 const void *d1 = h1->digest;
4480 const void *d2 = h2->digest;
4481
4482 return data.sort_by_digest (d1, d2);
4483 }
4484
4485 int sort_by_pot (const void *v1, const void *v2)
4486 {
4487 const pot_t *p1 = (const pot_t *) v1;
4488 const pot_t *p2 = (const pot_t *) v2;
4489
4490 const hash_t *h1 = &p1->hash;
4491 const hash_t *h2 = &p2->hash;
4492
4493 return sort_by_hash (h1, h2);
4494 }
4495
4496 int sort_by_mtime (const void *p1, const void *p2)
4497 {
4498 const char **f1 = (const char **) p1;
4499 const char **f2 = (const char **) p2;
4500
4501 struct stat s1; stat (*f1, &s1);
4502 struct stat s2; stat (*f2, &s2);
4503
4504 return s2.st_mtime - s1.st_mtime;
4505 }
4506
4507 int sort_by_cpu_rule (const void *p1, const void *p2)
4508 {
4509 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4510 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4511
4512 return memcmp (r1, r2, sizeof (cpu_rule_t));
4513 }
4514
4515 int sort_by_kernel_rule (const void *p1, const void *p2)
4516 {
4517 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4518 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4519
4520 return memcmp (r1, r2, sizeof (kernel_rule_t));
4521 }
4522
4523 int sort_by_stringptr (const void *p1, const void *p2)
4524 {
4525 const char **s1 = (const char **) p1;
4526 const char **s2 = (const char **) p2;
4527
4528 return strcmp (*s1, *s2);
4529 }
4530
4531 int sort_by_dictstat (const void *s1, const void *s2)
4532 {
4533 dictstat_t *d1 = (dictstat_t *) s1;
4534 dictstat_t *d2 = (dictstat_t *) s2;
4535
4536 #ifdef LINUX
4537 d2->stat.st_atim = d1->stat.st_atim;
4538 #else
4539 d2->stat.st_atime = d1->stat.st_atime;
4540 #endif
4541
4542 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4543 }
4544
4545 int sort_by_bitmap (const void *p1, const void *p2)
4546 {
4547 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4548 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4549
4550 return b1->collisions - b2->collisions;
4551 }
4552
4553 int sort_by_digest_4_2 (const void *v1, const void *v2)
4554 {
4555 const u32 *d1 = (const u32 *) v1;
4556 const u32 *d2 = (const u32 *) v2;
4557
4558 uint n = 2;
4559
4560 while (n--)
4561 {
4562 if (d1[n] > d2[n]) return ( 1);
4563 if (d1[n] < d2[n]) return (-1);
4564 }
4565
4566 return (0);
4567 }
4568
4569 int sort_by_digest_4_4 (const void *v1, const void *v2)
4570 {
4571 const u32 *d1 = (const u32 *) v1;
4572 const u32 *d2 = (const u32 *) v2;
4573
4574 uint n = 4;
4575
4576 while (n--)
4577 {
4578 if (d1[n] > d2[n]) return ( 1);
4579 if (d1[n] < d2[n]) return (-1);
4580 }
4581
4582 return (0);
4583 }
4584
4585 int sort_by_digest_4_5 (const void *v1, const void *v2)
4586 {
4587 const u32 *d1 = (const u32 *) v1;
4588 const u32 *d2 = (const u32 *) v2;
4589
4590 uint n = 5;
4591
4592 while (n--)
4593 {
4594 if (d1[n] > d2[n]) return ( 1);
4595 if (d1[n] < d2[n]) return (-1);
4596 }
4597
4598 return (0);
4599 }
4600
4601 int sort_by_digest_4_6 (const void *v1, const void *v2)
4602 {
4603 const u32 *d1 = (const u32 *) v1;
4604 const u32 *d2 = (const u32 *) v2;
4605
4606 uint n = 6;
4607
4608 while (n--)
4609 {
4610 if (d1[n] > d2[n]) return ( 1);
4611 if (d1[n] < d2[n]) return (-1);
4612 }
4613
4614 return (0);
4615 }
4616
4617 int sort_by_digest_4_8 (const void *v1, const void *v2)
4618 {
4619 const u32 *d1 = (const u32 *) v1;
4620 const u32 *d2 = (const u32 *) v2;
4621
4622 uint n = 8;
4623
4624 while (n--)
4625 {
4626 if (d1[n] > d2[n]) return ( 1);
4627 if (d1[n] < d2[n]) return (-1);
4628 }
4629
4630 return (0);
4631 }
4632
4633 int sort_by_digest_4_16 (const void *v1, const void *v2)
4634 {
4635 const u32 *d1 = (const u32 *) v1;
4636 const u32 *d2 = (const u32 *) v2;
4637
4638 uint n = 16;
4639
4640 while (n--)
4641 {
4642 if (d1[n] > d2[n]) return ( 1);
4643 if (d1[n] < d2[n]) return (-1);
4644 }
4645
4646 return (0);
4647 }
4648
4649 int sort_by_digest_4_32 (const void *v1, const void *v2)
4650 {
4651 const u32 *d1 = (const u32 *) v1;
4652 const u32 *d2 = (const u32 *) v2;
4653
4654 uint n = 32;
4655
4656 while (n--)
4657 {
4658 if (d1[n] > d2[n]) return ( 1);
4659 if (d1[n] < d2[n]) return (-1);
4660 }
4661
4662 return (0);
4663 }
4664
4665 int sort_by_digest_4_64 (const void *v1, const void *v2)
4666 {
4667 const u32 *d1 = (const u32 *) v1;
4668 const u32 *d2 = (const u32 *) v2;
4669
4670 uint n = 64;
4671
4672 while (n--)
4673 {
4674 if (d1[n] > d2[n]) return ( 1);
4675 if (d1[n] < d2[n]) return (-1);
4676 }
4677
4678 return (0);
4679 }
4680
4681 int sort_by_digest_8_8 (const void *v1, const void *v2)
4682 {
4683 const u64 *d1 = (const u64 *) v1;
4684 const u64 *d2 = (const u64 *) v2;
4685
4686 uint n = 8;
4687
4688 while (n--)
4689 {
4690 if (d1[n] > d2[n]) return ( 1);
4691 if (d1[n] < d2[n]) return (-1);
4692 }
4693
4694 return (0);
4695 }
4696
4697 int sort_by_digest_8_16 (const void *v1, const void *v2)
4698 {
4699 const u64 *d1 = (const u64 *) v1;
4700 const u64 *d2 = (const u64 *) v2;
4701
4702 uint n = 16;
4703
4704 while (n--)
4705 {
4706 if (d1[n] > d2[n]) return ( 1);
4707 if (d1[n] < d2[n]) return (-1);
4708 }
4709
4710 return (0);
4711 }
4712
4713 int sort_by_digest_8_25 (const void *v1, const void *v2)
4714 {
4715 const u64 *d1 = (const u64 *) v1;
4716 const u64 *d2 = (const u64 *) v2;
4717
4718 uint n = 25;
4719
4720 while (n--)
4721 {
4722 if (d1[n] > d2[n]) return ( 1);
4723 if (d1[n] < d2[n]) return (-1);
4724 }
4725
4726 return (0);
4727 }
4728
4729 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4730 {
4731 const u32 *d1 = (const u32 *) v1;
4732 const u32 *d2 = (const u32 *) v2;
4733
4734 const uint dgst_pos0 = data.dgst_pos0;
4735 const uint dgst_pos1 = data.dgst_pos1;
4736 const uint dgst_pos2 = data.dgst_pos2;
4737 const uint dgst_pos3 = data.dgst_pos3;
4738
4739 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4740 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4741 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4742 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4743 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4744 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4745 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4746 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4747
4748 return (0);
4749 }
4750
4751 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)
4752 {
4753 uint outfile_autohex = data.outfile_autohex;
4754
4755 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4756
4757 FILE *debug_fp = NULL;
4758
4759 if (debug_file != NULL)
4760 {
4761 debug_fp = fopen (debug_file, "ab");
4762
4763 lock_file (debug_fp);
4764 }
4765 else
4766 {
4767 debug_fp = stderr;
4768 }
4769
4770 if (debug_fp == NULL)
4771 {
4772 log_info ("WARNING: Could not open debug-file for writing");
4773 }
4774 else
4775 {
4776 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4777 {
4778 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4779
4780 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4781 }
4782
4783 fwrite (rule_ptr, rule_len, 1, debug_fp);
4784
4785 if (debug_mode == 4)
4786 {
4787 fputc (':', debug_fp);
4788
4789 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4790 }
4791
4792 fputc ('\n', debug_fp);
4793
4794 if (debug_file != NULL) fclose (debug_fp);
4795 }
4796 }
4797
4798 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4799 {
4800 int needs_hexify = 0;
4801
4802 if (outfile_autohex == 1)
4803 {
4804 for (uint i = 0; i < plain_len; i++)
4805 {
4806 if (plain_ptr[i] < 0x20)
4807 {
4808 needs_hexify = 1;
4809
4810 break;
4811 }
4812
4813 if (plain_ptr[i] > 0x7f)
4814 {
4815 needs_hexify = 1;
4816
4817 break;
4818 }
4819 }
4820 }
4821
4822 if (needs_hexify == 1)
4823 {
4824 fprintf (fp, "$HEX[");
4825
4826 for (uint i = 0; i < plain_len; i++)
4827 {
4828 fprintf (fp, "%02x", plain_ptr[i]);
4829 }
4830
4831 fprintf (fp, "]");
4832 }
4833 else
4834 {
4835 fwrite (plain_ptr, plain_len, 1, fp);
4836 }
4837 }
4838
4839 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)
4840 {
4841 uint outfile_format = data.outfile_format;
4842
4843 char separator = data.separator;
4844
4845 if (outfile_format & OUTFILE_FMT_HASH)
4846 {
4847 fprintf (out_fp, "%s", out_buf);
4848
4849 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4850 {
4851 fputc (separator, out_fp);
4852 }
4853 }
4854 else if (data.username)
4855 {
4856 if (username != NULL)
4857 {
4858 for (uint i = 0; i < user_len; i++)
4859 {
4860 fprintf (out_fp, "%c", username[i]);
4861 }
4862
4863 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4864 {
4865 fputc (separator, out_fp);
4866 }
4867 }
4868 }
4869
4870 if (outfile_format & OUTFILE_FMT_PLAIN)
4871 {
4872 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4873
4874 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4875 {
4876 fputc (separator, out_fp);
4877 }
4878 }
4879
4880 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4881 {
4882 for (uint i = 0; i < plain_len; i++)
4883 {
4884 fprintf (out_fp, "%02x", plain_ptr[i]);
4885 }
4886
4887 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4888 {
4889 fputc (separator, out_fp);
4890 }
4891 }
4892
4893 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4894 {
4895 #ifdef _WIN
4896 __mingw_fprintf (out_fp, "%llu", crackpos);
4897 #endif
4898
4899 #ifdef _POSIX
4900 #ifdef __x86_64__
4901 fprintf (out_fp, "%lu", (unsigned long) crackpos);
4902 #else
4903 fprintf (out_fp, "%llu", crackpos);
4904 #endif
4905 #endif
4906 }
4907
4908 fputc ('\n', out_fp);
4909 }
4910
4911 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)
4912 {
4913 pot_t pot_key;
4914
4915 pot_key.hash.salt = hashes_buf->salt;
4916 pot_key.hash.digest = hashes_buf->digest;
4917
4918 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4919
4920 if (pot_ptr)
4921 {
4922 log_info_nn ("");
4923
4924 input_buf[input_len] = 0;
4925
4926 // user
4927 unsigned char *username = NULL;
4928 uint user_len = 0;
4929
4930 if (data.username)
4931 {
4932 user_t *user = hashes_buf->hash_info->user;
4933
4934 if (user)
4935 {
4936 username = (unsigned char *) (user->user_name);
4937
4938 user_len = user->user_len;
4939 }
4940 }
4941
4942 // do output the line
4943 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
4944 }
4945 }
4946
4947 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
4948 #define LM_MASKED_PLAIN "[notfound]"
4949
4950 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)
4951 {
4952 // left
4953
4954 pot_t pot_left_key;
4955
4956 pot_left_key.hash.salt = hash_left->salt;
4957 pot_left_key.hash.digest = hash_left->digest;
4958
4959 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4960
4961 // right
4962
4963 uint weak_hash_found = 0;
4964
4965 pot_t pot_right_key;
4966
4967 pot_right_key.hash.salt = hash_right->salt;
4968 pot_right_key.hash.digest = hash_right->digest;
4969
4970 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4971
4972 if (pot_right_ptr == NULL)
4973 {
4974 // special case, if "weak hash"
4975
4976 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
4977 {
4978 weak_hash_found = 1;
4979
4980 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4981
4982 // in theory this is not needed, but we are paranoia:
4983
4984 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4985 pot_right_ptr->plain_len = 0;
4986 }
4987 }
4988
4989 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
4990 {
4991 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
4992
4993 return;
4994 }
4995
4996 // at least one half was found:
4997
4998 log_info_nn ("");
4999
5000 input_buf[input_len] = 0;
5001
5002 // user
5003
5004 unsigned char *username = NULL;
5005 uint user_len = 0;
5006
5007 if (data.username)
5008 {
5009 user_t *user = hash_left->hash_info->user;
5010
5011 if (user)
5012 {
5013 username = (unsigned char *) (user->user_name);
5014
5015 user_len = user->user_len;
5016 }
5017 }
5018
5019 // mask the part which was not found
5020
5021 uint left_part_masked = 0;
5022 uint right_part_masked = 0;
5023
5024 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
5025
5026 if (pot_left_ptr == NULL)
5027 {
5028 left_part_masked = 1;
5029
5030 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5031
5032 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
5033
5034 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5035 pot_left_ptr->plain_len = mask_plain_len;
5036 }
5037
5038 if (pot_right_ptr == NULL)
5039 {
5040 right_part_masked = 1;
5041
5042 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5043
5044 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
5045
5046 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
5047 pot_right_ptr->plain_len = mask_plain_len;
5048 }
5049
5050 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
5051
5052 pot_t pot_ptr;
5053
5054 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
5055
5056 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
5057
5058 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
5059
5060 // do output the line
5061
5062 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5063
5064 if (weak_hash_found == 1) myfree (pot_right_ptr);
5065
5066 if (left_part_masked == 1) myfree (pot_left_ptr);
5067 if (right_part_masked == 1) myfree (pot_right_ptr);
5068 }
5069
5070 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)
5071 {
5072 pot_t pot_key;
5073
5074 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5075
5076 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5077
5078 if (pot_ptr == NULL)
5079 {
5080 log_info_nn ("");
5081
5082 input_buf[input_len] = 0;
5083
5084 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5085 }
5086 }
5087
5088 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)
5089 {
5090 // left
5091
5092 pot_t pot_left_key;
5093
5094 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5095
5096 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5097
5098 // right
5099
5100 pot_t pot_right_key;
5101
5102 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5103
5104 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5105
5106 uint weak_hash_found = 0;
5107
5108 if (pot_right_ptr == NULL)
5109 {
5110 // special case, if "weak hash"
5111
5112 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5113 {
5114 weak_hash_found = 1;
5115
5116 // we just need that pot_right_ptr is not a NULL pointer
5117
5118 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5119 }
5120 }
5121
5122 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5123 {
5124 if (weak_hash_found == 1) myfree (pot_right_ptr);
5125
5126 return;
5127 }
5128
5129 // ... at least one part was not cracked
5130
5131 log_info_nn ("");
5132
5133 input_buf[input_len] = 0;
5134
5135 // only show the hash part which is still not cracked
5136
5137 uint user_len = input_len - 32;
5138
5139 char *hash_output = (char *) mymalloc (33);
5140
5141 memcpy (hash_output, input_buf, input_len);
5142
5143 if (pot_left_ptr != NULL)
5144 {
5145 // only show right part (because left part was already found)
5146
5147 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5148
5149 hash_output[user_len + 16] = 0;
5150 }
5151
5152 if (pot_right_ptr != NULL)
5153 {
5154 // only show left part (because right part was already found)
5155
5156 memcpy (hash_output + user_len, input_buf + user_len, 16);
5157
5158 hash_output[user_len + 16] = 0;
5159 }
5160
5161 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5162
5163 myfree (hash_output);
5164
5165 if (weak_hash_found == 1) myfree (pot_right_ptr);
5166 }
5167
5168 uint setup_opencl_platforms_filter (char *opencl_platforms)
5169 {
5170 uint opencl_platforms_filter = 0;
5171
5172 if (opencl_platforms)
5173 {
5174 char *platforms = strdup (opencl_platforms);
5175
5176 char *next = strtok (platforms, ",");
5177
5178 do
5179 {
5180 int platform = atoi (next);
5181
5182 if (platform < 1 || platform > 32)
5183 {
5184 log_error ("ERROR: invalid OpenCL platform %u specified", platform);
5185
5186 exit (-1);
5187 }
5188
5189 opencl_platforms_filter |= 1 << (platform - 1);
5190
5191 } while ((next = strtok (NULL, ",")) != NULL);
5192
5193 free (platforms);
5194 }
5195 else
5196 {
5197 opencl_platforms_filter = -1;
5198 }
5199
5200 return opencl_platforms_filter;
5201 }
5202
5203 u32 setup_devices_filter (char *opencl_devices)
5204 {
5205 u32 devices_filter = 0;
5206
5207 if (opencl_devices)
5208 {
5209 char *devices = strdup (opencl_devices);
5210
5211 char *next = strtok (devices, ",");
5212
5213 do
5214 {
5215 int device_id = atoi (next);
5216
5217 if (device_id < 1 || device_id > 32)
5218 {
5219 log_error ("ERROR: invalid device_id %u specified", device_id);
5220
5221 exit (-1);
5222 }
5223
5224 devices_filter |= 1 << (device_id - 1);
5225
5226 } while ((next = strtok (NULL, ",")) != NULL);
5227
5228 free (devices);
5229 }
5230 else
5231 {
5232 devices_filter = -1;
5233 }
5234
5235 return devices_filter;
5236 }
5237
5238 cl_device_type setup_device_types_filter (char *opencl_device_types)
5239 {
5240 cl_device_type device_types_filter = 0;
5241
5242 if (opencl_device_types)
5243 {
5244 char *device_types = strdup (opencl_device_types);
5245
5246 char *next = strtok (device_types, ",");
5247
5248 do
5249 {
5250 int device_type = atoi (next);
5251
5252 if (device_type < 1 || device_type > 3)
5253 {
5254 log_error ("ERROR: invalid device_type %u specified", device_type);
5255
5256 exit (-1);
5257 }
5258
5259 device_types_filter |= 1 << device_type;
5260
5261 } while ((next = strtok (NULL, ",")) != NULL);
5262
5263 free (device_types);
5264 }
5265 else
5266 {
5267 // Do not use CPU by default, this often reduces GPU performance because
5268 // the CPU is too busy to handle GPU synchronization
5269
5270 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5271 }
5272
5273 return device_types_filter;
5274 }
5275
5276 u32 get_random_num (const u32 min, const u32 max)
5277 {
5278 if (min == max) return (min);
5279
5280 return ((rand () % (max - min)) + min);
5281 }
5282
5283 u32 mydivc32 (const u32 dividend, const u32 divisor)
5284 {
5285 u32 quotient = dividend / divisor;
5286
5287 if (dividend % divisor) quotient++;
5288
5289 return quotient;
5290 }
5291
5292 u64 mydivc64 (const u64 dividend, const u64 divisor)
5293 {
5294 u64 quotient = dividend / divisor;
5295
5296 if (dividend % divisor) quotient++;
5297
5298 return quotient;
5299 }
5300
5301 void format_timer_display (struct tm *tm, char *buf, size_t len)
5302 {
5303 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5304 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5305
5306 if (tm->tm_year - 70)
5307 {
5308 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5309 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5310
5311 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5312 }
5313 else if (tm->tm_yday)
5314 {
5315 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5316 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5317
5318 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5319 }
5320 else if (tm->tm_hour)
5321 {
5322 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5323 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5324
5325 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5326 }
5327 else if (tm->tm_min)
5328 {
5329 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5330 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5331
5332 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5333 }
5334 else
5335 {
5336 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5337
5338 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5339 }
5340 }
5341
5342 void format_speed_display (float val, char *buf, size_t len)
5343 {
5344 if (val <= 0)
5345 {
5346 buf[0] = '0';
5347 buf[1] = ' ';
5348 buf[2] = 0;
5349
5350 return;
5351 }
5352
5353 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5354
5355 uint level = 0;
5356
5357 while (val > 99999)
5358 {
5359 val /= 1000;
5360
5361 level++;
5362 }
5363
5364 /* generate output */
5365
5366 if (level == 0)
5367 {
5368 snprintf (buf, len - 1, "%.0f ", val);
5369 }
5370 else
5371 {
5372 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5373 }
5374 }
5375
5376 void lowercase (u8 *buf, int len)
5377 {
5378 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5379 }
5380
5381 void uppercase (u8 *buf, int len)
5382 {
5383 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5384 }
5385
5386 int fgetl (FILE *fp, char *line_buf)
5387 {
5388 int line_len = 0;
5389
5390 while (!feof (fp))
5391 {
5392 const int c = fgetc (fp);
5393
5394 if (c == EOF) break;
5395
5396 line_buf[line_len] = (char) c;
5397
5398 line_len++;
5399
5400 if (line_len == BUFSIZ) line_len--;
5401
5402 if (c == '\n') break;
5403 }
5404
5405 if (line_len == 0) return 0;
5406
5407 if (line_buf[line_len - 1] == '\n')
5408 {
5409 line_len--;
5410
5411 line_buf[line_len] = 0;
5412 }
5413
5414 if (line_len == 0) return 0;
5415
5416 if (line_buf[line_len - 1] == '\r')
5417 {
5418 line_len--;
5419
5420 line_buf[line_len] = 0;
5421 }
5422
5423 return (line_len);
5424 }
5425
5426 int in_superchop (char *buf)
5427 {
5428 int len = strlen (buf);
5429
5430 while (len)
5431 {
5432 if (buf[len - 1] == '\n')
5433 {
5434 len--;
5435
5436 continue;
5437 }
5438
5439 if (buf[len - 1] == '\r')
5440 {
5441 len--;
5442
5443 continue;
5444 }
5445
5446 break;
5447 }
5448
5449 buf[len] = 0;
5450
5451 return len;
5452 }
5453
5454 char **scan_directory (const char *path)
5455 {
5456 char *tmp_path = mystrdup (path);
5457
5458 size_t tmp_path_len = strlen (tmp_path);
5459
5460 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5461 {
5462 tmp_path[tmp_path_len - 1] = 0;
5463
5464 tmp_path_len = strlen (tmp_path);
5465 }
5466
5467 char **files = NULL;
5468
5469 int num_files = 0;
5470
5471 DIR *d = NULL;
5472
5473 if ((d = opendir (tmp_path)) != NULL)
5474 {
5475 #ifdef OSX
5476 struct dirent e;
5477
5478 for (;;) {
5479 memset (&e, 0, sizeof (e));
5480 struct dirent *de = NULL;
5481
5482 if (readdir_r (d, &e, &de) != 0)
5483 {
5484 log_error ("ERROR: readdir_r() failed");
5485
5486 break;
5487 }
5488
5489 if (de == NULL) break;
5490 #else
5491 struct dirent *de;
5492
5493 while ((de = readdir (d)) != NULL)
5494 {
5495 #endif
5496 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5497
5498 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5499
5500 char *path_file = (char *) mymalloc (path_size + 1);
5501
5502 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5503
5504 path_file[path_size] = 0;
5505
5506 DIR *d_test;
5507
5508 if ((d_test = opendir (path_file)) != NULL)
5509 {
5510 closedir (d_test);
5511
5512 myfree (path_file);
5513 }
5514 else
5515 {
5516 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5517
5518 num_files++;
5519
5520 files[num_files - 1] = path_file;
5521 }
5522 }
5523
5524 closedir (d);
5525 }
5526 else if (errno == ENOTDIR)
5527 {
5528 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5529
5530 num_files++;
5531
5532 files[num_files - 1] = mystrdup (path);
5533 }
5534
5535 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5536
5537 num_files++;
5538
5539 files[num_files - 1] = NULL;
5540
5541 myfree (tmp_path);
5542
5543 return (files);
5544 }
5545
5546 int count_dictionaries (char **dictionary_files)
5547 {
5548 if (dictionary_files == NULL) return 0;
5549
5550 int cnt = 0;
5551
5552 for (int d = 0; dictionary_files[d] != NULL; d++)
5553 {
5554 cnt++;
5555 }
5556
5557 return (cnt);
5558 }
5559
5560 char *stroptitype (const uint opti_type)
5561 {
5562 switch (opti_type)
5563 {
5564 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5565 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5566 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5567 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5568 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5569 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5570 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5571 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5572 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5573 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5574 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5575 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5576 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5577 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5578 }
5579
5580 return (NULL);
5581 }
5582
5583 char *strparser (const uint parser_status)
5584 {
5585 switch (parser_status)
5586 {
5587 case PARSER_OK: return ((char *) PA_000); break;
5588 case PARSER_COMMENT: return ((char *) PA_001); break;
5589 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5590 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5591 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5592 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5593 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5594 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5595 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5596 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5597 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5598 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5599 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5600 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5601 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5602 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5603 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5604 }
5605
5606 return ((char *) PA_255);
5607 }
5608
5609 char *strhashtype (const uint hash_mode)
5610 {
5611 switch (hash_mode)
5612 {
5613 case 0: return ((char *) HT_00000); break;
5614 case 10: return ((char *) HT_00010); break;
5615 case 11: return ((char *) HT_00011); break;
5616 case 12: return ((char *) HT_00012); break;
5617 case 20: return ((char *) HT_00020); break;
5618 case 21: return ((char *) HT_00021); break;
5619 case 22: return ((char *) HT_00022); break;
5620 case 23: return ((char *) HT_00023); break;
5621 case 30: return ((char *) HT_00030); break;
5622 case 40: return ((char *) HT_00040); break;
5623 case 50: return ((char *) HT_00050); break;
5624 case 60: return ((char *) HT_00060); break;
5625 case 100: return ((char *) HT_00100); break;
5626 case 101: return ((char *) HT_00101); break;
5627 case 110: return ((char *) HT_00110); break;
5628 case 111: return ((char *) HT_00111); break;
5629 case 112: return ((char *) HT_00112); break;
5630 case 120: return ((char *) HT_00120); break;
5631 case 121: return ((char *) HT_00121); break;
5632 case 122: return ((char *) HT_00122); break;
5633 case 124: return ((char *) HT_00124); break;
5634 case 130: return ((char *) HT_00130); break;
5635 case 131: return ((char *) HT_00131); break;
5636 case 132: return ((char *) HT_00132); break;
5637 case 133: return ((char *) HT_00133); break;
5638 case 140: return ((char *) HT_00140); break;
5639 case 141: return ((char *) HT_00141); break;
5640 case 150: return ((char *) HT_00150); break;
5641 case 160: return ((char *) HT_00160); break;
5642 case 190: return ((char *) HT_00190); break;
5643 case 200: return ((char *) HT_00200); break;
5644 case 300: return ((char *) HT_00300); break;
5645 case 400: return ((char *) HT_00400); break;
5646 case 500: return ((char *) HT_00500); break;
5647 case 501: return ((char *) HT_00501); break;
5648 case 900: return ((char *) HT_00900); break;
5649 case 910: return ((char *) HT_00910); break;
5650 case 1000: return ((char *) HT_01000); break;
5651 case 1100: return ((char *) HT_01100); break;
5652 case 1400: return ((char *) HT_01400); break;
5653 case 1410: return ((char *) HT_01410); break;
5654 case 1420: return ((char *) HT_01420); break;
5655 case 1421: return ((char *) HT_01421); break;
5656 case 1430: return ((char *) HT_01430); break;
5657 case 1440: return ((char *) HT_01440); break;
5658 case 1441: return ((char *) HT_01441); break;
5659 case 1450: return ((char *) HT_01450); break;
5660 case 1460: return ((char *) HT_01460); break;
5661 case 1500: return ((char *) HT_01500); break;
5662 case 1600: return ((char *) HT_01600); break;
5663 case 1700: return ((char *) HT_01700); break;
5664 case 1710: return ((char *) HT_01710); break;
5665 case 1711: return ((char *) HT_01711); break;
5666 case 1720: return ((char *) HT_01720); break;
5667 case 1722: return ((char *) HT_01722); break;
5668 case 1730: return ((char *) HT_01730); break;
5669 case 1731: return ((char *) HT_01731); break;
5670 case 1740: return ((char *) HT_01740); break;
5671 case 1750: return ((char *) HT_01750); break;
5672 case 1760: return ((char *) HT_01760); break;
5673 case 1800: return ((char *) HT_01800); break;
5674 case 2100: return ((char *) HT_02100); break;
5675 case 2400: return ((char *) HT_02400); break;
5676 case 2410: return ((char *) HT_02410); break;
5677 case 2500: return ((char *) HT_02500); break;
5678 case 2600: return ((char *) HT_02600); break;
5679 case 2611: return ((char *) HT_02611); break;
5680 case 2612: return ((char *) HT_02612); break;
5681 case 2711: return ((char *) HT_02711); break;
5682 case 2811: return ((char *) HT_02811); break;
5683 case 3000: return ((char *) HT_03000); break;
5684 case 3100: return ((char *) HT_03100); break;
5685 case 3200: return ((char *) HT_03200); break;
5686 case 3710: return ((char *) HT_03710); break;
5687 case 3711: return ((char *) HT_03711); break;
5688 case 3800: return ((char *) HT_03800); break;
5689 case 4300: return ((char *) HT_04300); break;
5690 case 4400: return ((char *) HT_04400); break;
5691 case 4500: return ((char *) HT_04500); break;
5692 case 4700: return ((char *) HT_04700); break;
5693 case 4800: return ((char *) HT_04800); break;
5694 case 4900: return ((char *) HT_04900); break;
5695 case 5000: return ((char *) HT_05000); break;
5696 case 5100: return ((char *) HT_05100); break;
5697 case 5200: return ((char *) HT_05200); break;
5698 case 5300: return ((char *) HT_05300); break;
5699 case 5400: return ((char *) HT_05400); break;
5700 case 5500: return ((char *) HT_05500); break;
5701 case 5600: return ((char *) HT_05600); break;
5702 case 5700: return ((char *) HT_05700); break;
5703 case 5800: return ((char *) HT_05800); break;
5704 case 6000: return ((char *) HT_06000); break;
5705 case 6100: return ((char *) HT_06100); break;
5706 case 6211: return ((char *) HT_06211); break;
5707 case 6212: return ((char *) HT_06212); break;
5708 case 6213: return ((char *) HT_06213); break;
5709 case 6221: return ((char *) HT_06221); break;
5710 case 6222: return ((char *) HT_06222); break;
5711 case 6223: return ((char *) HT_06223); break;
5712 case 6231: return ((char *) HT_06231); break;
5713 case 6232: return ((char *) HT_06232); break;
5714 case 6233: return ((char *) HT_06233); break;
5715 case 6241: return ((char *) HT_06241); break;
5716 case 6242: return ((char *) HT_06242); break;
5717 case 6243: return ((char *) HT_06243); break;
5718 case 6300: return ((char *) HT_06300); break;
5719 case 6400: return ((char *) HT_06400); break;
5720 case 6500: return ((char *) HT_06500); break;
5721 case 6600: return ((char *) HT_06600); break;
5722 case 6700: return ((char *) HT_06700); break;
5723 case 6800: return ((char *) HT_06800); break;
5724 case 6900: return ((char *) HT_06900); break;
5725 case 7100: return ((char *) HT_07100); break;
5726 case 7200: return ((char *) HT_07200); break;
5727 case 7300: return ((char *) HT_07300); break;
5728 case 7400: return ((char *) HT_07400); break;
5729 case 7500: return ((char *) HT_07500); break;
5730 case 7600: return ((char *) HT_07600); break;
5731 case 7700: return ((char *) HT_07700); break;
5732 case 7800: return ((char *) HT_07800); break;
5733 case 7900: return ((char *) HT_07900); break;
5734 case 8000: return ((char *) HT_08000); break;
5735 case 8100: return ((char *) HT_08100); break;
5736 case 8200: return ((char *) HT_08200); break;
5737 case 8300: return ((char *) HT_08300); break;
5738 case 8400: return ((char *) HT_08400); break;
5739 case 8500: return ((char *) HT_08500); break;
5740 case 8600: return ((char *) HT_08600); break;
5741 case 8700: return ((char *) HT_08700); break;
5742 case 8800: return ((char *) HT_08800); break;
5743 case 8900: return ((char *) HT_08900); break;
5744 case 9000: return ((char *) HT_09000); break;
5745 case 9100: return ((char *) HT_09100); break;
5746 case 9200: return ((char *) HT_09200); break;
5747 case 9300: return ((char *) HT_09300); break;
5748 case 9400: return ((char *) HT_09400); break;
5749 case 9500: return ((char *) HT_09500); break;
5750 case 9600: return ((char *) HT_09600); break;
5751 case 9700: return ((char *) HT_09700); break;
5752 case 9710: return ((char *) HT_09710); break;
5753 case 9720: return ((char *) HT_09720); break;
5754 case 9800: return ((char *) HT_09800); break;
5755 case 9810: return ((char *) HT_09810); break;
5756 case 9820: return ((char *) HT_09820); break;
5757 case 9900: return ((char *) HT_09900); break;
5758 case 10000: return ((char *) HT_10000); break;
5759 case 10100: return ((char *) HT_10100); break;
5760 case 10200: return ((char *) HT_10200); break;
5761 case 10300: return ((char *) HT_10300); break;
5762 case 10400: return ((char *) HT_10400); break;
5763 case 10410: return ((char *) HT_10410); break;
5764 case 10420: return ((char *) HT_10420); break;
5765 case 10500: return ((char *) HT_10500); break;
5766 case 10600: return ((char *) HT_10600); break;
5767 case 10700: return ((char *) HT_10700); break;
5768 case 10800: return ((char *) HT_10800); break;
5769 case 10900: return ((char *) HT_10900); break;
5770 case 11000: return ((char *) HT_11000); break;
5771 case 11100: return ((char *) HT_11100); break;
5772 case 11200: return ((char *) HT_11200); break;
5773 case 11300: return ((char *) HT_11300); break;
5774 case 11400: return ((char *) HT_11400); break;
5775 case 11500: return ((char *) HT_11500); break;
5776 case 11600: return ((char *) HT_11600); break;
5777 case 11700: return ((char *) HT_11700); break;
5778 case 11800: return ((char *) HT_11800); break;
5779 case 11900: return ((char *) HT_11900); break;
5780 case 12000: return ((char *) HT_12000); break;
5781 case 12100: return ((char *) HT_12100); break;
5782 case 12200: return ((char *) HT_12200); break;
5783 case 12300: return ((char *) HT_12300); break;
5784 case 12400: return ((char *) HT_12400); break;
5785 case 12500: return ((char *) HT_12500); break;
5786 case 12600: return ((char *) HT_12600); break;
5787 case 12700: return ((char *) HT_12700); break;
5788 case 12800: return ((char *) HT_12800); break;
5789 case 12900: return ((char *) HT_12900); break;
5790 case 13000: return ((char *) HT_13000); break;
5791 }
5792
5793 return ((char *) "Unknown");
5794 }
5795
5796 char *strstatus (const uint devices_status)
5797 {
5798 switch (devices_status)
5799 {
5800 case STATUS_INIT: return ((char *) ST_0000); break;
5801 case STATUS_STARTING: return ((char *) ST_0001); break;
5802 case STATUS_RUNNING: return ((char *) ST_0002); break;
5803 case STATUS_PAUSED: return ((char *) ST_0003); break;
5804 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5805 case STATUS_CRACKED: return ((char *) ST_0005); break;
5806 case STATUS_ABORTED: return ((char *) ST_0006); break;
5807 case STATUS_QUIT: return ((char *) ST_0007); break;
5808 case STATUS_BYPASS: return ((char *) ST_0008); break;
5809 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5810 }
5811
5812 return ((char *) "Unknown");
5813 }
5814
5815 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5816 {
5817 uint hash_type = data.hash_type;
5818 uint hash_mode = data.hash_mode;
5819 uint salt_type = data.salt_type;
5820 uint opts_type = data.opts_type;
5821 uint opti_type = data.opti_type;
5822 uint dgst_size = data.dgst_size;
5823
5824 char *hashfile = data.hashfile;
5825
5826 uint len = 4096;
5827
5828 uint digest_buf[64] = { 0 };
5829
5830 u64 *digest_buf64 = (u64 *) digest_buf;
5831
5832 char *digests_buf_ptr = (char *) data.digests_buf;
5833
5834 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5835
5836 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5837 {
5838 uint tt;
5839
5840 switch (hash_type)
5841 {
5842 case HASH_TYPE_DESCRYPT:
5843 FP (digest_buf[1], digest_buf[0], tt);
5844 break;
5845
5846 case HASH_TYPE_DESRACF:
5847 digest_buf[0] = rotl32 (digest_buf[0], 29);
5848 digest_buf[1] = rotl32 (digest_buf[1], 29);
5849
5850 FP (digest_buf[1], digest_buf[0], tt);
5851 break;
5852
5853 case HASH_TYPE_LM:
5854 FP (digest_buf[1], digest_buf[0], tt);
5855 break;
5856
5857 case HASH_TYPE_NETNTLM:
5858 digest_buf[0] = rotl32 (digest_buf[0], 29);
5859 digest_buf[1] = rotl32 (digest_buf[1], 29);
5860 digest_buf[2] = rotl32 (digest_buf[2], 29);
5861 digest_buf[3] = rotl32 (digest_buf[3], 29);
5862
5863 FP (digest_buf[1], digest_buf[0], tt);
5864 FP (digest_buf[3], digest_buf[2], tt);
5865 break;
5866
5867 case HASH_TYPE_BSDICRYPT:
5868 digest_buf[0] = rotl32 (digest_buf[0], 31);
5869 digest_buf[1] = rotl32 (digest_buf[1], 31);
5870
5871 FP (digest_buf[1], digest_buf[0], tt);
5872 break;
5873 }
5874 }
5875
5876 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5877 {
5878 switch (hash_type)
5879 {
5880 case HASH_TYPE_MD4:
5881 digest_buf[0] += MD4M_A;
5882 digest_buf[1] += MD4M_B;
5883 digest_buf[2] += MD4M_C;
5884 digest_buf[3] += MD4M_D;
5885 break;
5886
5887 case HASH_TYPE_MD5:
5888 digest_buf[0] += MD5M_A;
5889 digest_buf[1] += MD5M_B;
5890 digest_buf[2] += MD5M_C;
5891 digest_buf[3] += MD5M_D;
5892 break;
5893
5894 case HASH_TYPE_SHA1:
5895 digest_buf[0] += SHA1M_A;
5896 digest_buf[1] += SHA1M_B;
5897 digest_buf[2] += SHA1M_C;
5898 digest_buf[3] += SHA1M_D;
5899 digest_buf[4] += SHA1M_E;
5900 break;
5901
5902 case HASH_TYPE_SHA256:
5903 digest_buf[0] += SHA256M_A;
5904 digest_buf[1] += SHA256M_B;
5905 digest_buf[2] += SHA256M_C;
5906 digest_buf[3] += SHA256M_D;
5907 digest_buf[4] += SHA256M_E;
5908 digest_buf[5] += SHA256M_F;
5909 digest_buf[6] += SHA256M_G;
5910 digest_buf[7] += SHA256M_H;
5911 break;
5912
5913 case HASH_TYPE_SHA384:
5914 digest_buf64[0] += SHA384M_A;
5915 digest_buf64[1] += SHA384M_B;
5916 digest_buf64[2] += SHA384M_C;
5917 digest_buf64[3] += SHA384M_D;
5918 digest_buf64[4] += SHA384M_E;
5919 digest_buf64[5] += SHA384M_F;
5920 digest_buf64[6] += 0;
5921 digest_buf64[7] += 0;
5922 break;
5923
5924 case HASH_TYPE_SHA512:
5925 digest_buf64[0] += SHA512M_A;
5926 digest_buf64[1] += SHA512M_B;
5927 digest_buf64[2] += SHA512M_C;
5928 digest_buf64[3] += SHA512M_D;
5929 digest_buf64[4] += SHA512M_E;
5930 digest_buf64[5] += SHA512M_F;
5931 digest_buf64[6] += SHA512M_G;
5932 digest_buf64[7] += SHA512M_H;
5933 break;
5934 }
5935 }
5936
5937 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
5938 {
5939 if (dgst_size == DGST_SIZE_4_2)
5940 {
5941 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5942 }
5943 else if (dgst_size == DGST_SIZE_4_4)
5944 {
5945 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5946 }
5947 else if (dgst_size == DGST_SIZE_4_5)
5948 {
5949 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5950 }
5951 else if (dgst_size == DGST_SIZE_4_6)
5952 {
5953 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5954 }
5955 else if (dgst_size == DGST_SIZE_4_8)
5956 {
5957 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5958 }
5959 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
5960 {
5961 if (hash_type == HASH_TYPE_WHIRLPOOL)
5962 {
5963 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5964 }
5965 else if (hash_type == HASH_TYPE_SHA384)
5966 {
5967 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5968 }
5969 else if (hash_type == HASH_TYPE_SHA512)
5970 {
5971 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5972 }
5973 else if (hash_type == HASH_TYPE_GOST)
5974 {
5975 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5976 }
5977 }
5978 else if (dgst_size == DGST_SIZE_4_64)
5979 {
5980 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5981 }
5982 else if (dgst_size == DGST_SIZE_8_25)
5983 {
5984 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5985 }
5986 }
5987
5988 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
5989 | (data.salt_type == SALT_TYPE_EXTERN)
5990 | (data.salt_type == SALT_TYPE_EMBEDDED));
5991
5992 salt_t salt;
5993
5994 if (isSalted)
5995 {
5996 memset (&salt, 0, sizeof (salt_t));
5997
5998 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
5999
6000 char *ptr = (char *) salt.salt_buf;
6001
6002 uint len = salt.salt_len;
6003
6004 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
6005 {
6006 uint tt;
6007
6008 switch (hash_type)
6009 {
6010 case HASH_TYPE_NETNTLM:
6011
6012 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
6013 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
6014
6015 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
6016
6017 break;
6018 }
6019 }
6020
6021 if (opts_type & OPTS_TYPE_ST_UNICODE)
6022 {
6023 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6024 {
6025 ptr[i] = ptr[j];
6026 }
6027
6028 len = len / 2;
6029 }
6030
6031 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
6032 {
6033 uint max = salt.salt_len / 4;
6034
6035 if (len % 4) max++;
6036
6037 for (uint i = 0; i < max; i++)
6038 {
6039 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
6040 }
6041 }
6042
6043 if (opts_type & OPTS_TYPE_ST_HEX)
6044 {
6045 char tmp[64] = { 0 };
6046
6047 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
6048 {
6049 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
6050 }
6051
6052 len = len * 2;
6053
6054 memcpy (ptr, tmp, len);
6055 }
6056
6057 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
6058
6059 memset (ptr + len, 0, memset_size);
6060
6061 salt.salt_len = len;
6062 }
6063
6064 //
6065 // some modes require special encoding
6066 //
6067
6068 uint out_buf_plain[256] = { 0 };
6069 uint out_buf_salt[256] = { 0 };
6070
6071 char tmp_buf[1024] = { 0 };
6072
6073 char *ptr_plain = (char *) out_buf_plain;
6074 char *ptr_salt = (char *) out_buf_salt;
6075
6076 if (hash_mode == 22)
6077 {
6078 char username[30] = { 0 };
6079
6080 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6081
6082 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6083
6084 u16 *ptr = (u16 *) digest_buf;
6085
6086 tmp_buf[ 0] = sig[0];
6087 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6088 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6089 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6090 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6091 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6092 tmp_buf[ 6] = sig[1];
6093 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6094 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6095 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6096 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6097 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6098 tmp_buf[12] = sig[2];
6099 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6100 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6101 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6102 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6103 tmp_buf[17] = sig[3];
6104 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6105 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6106 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6107 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6108 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6109 tmp_buf[23] = sig[4];
6110 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6111 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6112 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6113 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6114 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6115 tmp_buf[29] = sig[5];
6116
6117 snprintf (out_buf, len-1, "%s:%s",
6118 tmp_buf,
6119 username);
6120 }
6121 else if (hash_mode == 23)
6122 {
6123 // do not show the \nskyper\n part in output
6124
6125 char *salt_buf_ptr = (char *) salt.salt_buf;
6126
6127 salt_buf_ptr[salt.salt_len - 8] = 0;
6128
6129 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6130 digest_buf[0],
6131 digest_buf[1],
6132 digest_buf[2],
6133 digest_buf[3],
6134 salt_buf_ptr);
6135 }
6136 else if (hash_mode == 101)
6137 {
6138 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6139
6140 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6141 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6142 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6143 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6144 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6145
6146 memcpy (tmp_buf, digest_buf, 20);
6147
6148 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6149
6150 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6151 }
6152 else if (hash_mode == 111)
6153 {
6154 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6155
6156 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6157 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6158 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6159 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6160 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6161
6162 memcpy (tmp_buf, digest_buf, 20);
6163 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6164
6165 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6166
6167 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6168 }
6169 else if (hash_mode == 122)
6170 {
6171 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6172 (char *) salt.salt_buf,
6173 digest_buf[0],
6174 digest_buf[1],
6175 digest_buf[2],
6176 digest_buf[3],
6177 digest_buf[4]);
6178 }
6179 else if (hash_mode == 124)
6180 {
6181 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6182 (char *) salt.salt_buf,
6183 digest_buf[0],
6184 digest_buf[1],
6185 digest_buf[2],
6186 digest_buf[3],
6187 digest_buf[4]);
6188 }
6189 else if (hash_mode == 131)
6190 {
6191 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6192 (char *) salt.salt_buf,
6193 0, 0, 0, 0, 0,
6194 digest_buf[0],
6195 digest_buf[1],
6196 digest_buf[2],
6197 digest_buf[3],
6198 digest_buf[4]);
6199 }
6200 else if (hash_mode == 132)
6201 {
6202 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6203 (char *) salt.salt_buf,
6204 digest_buf[0],
6205 digest_buf[1],
6206 digest_buf[2],
6207 digest_buf[3],
6208 digest_buf[4]);
6209 }
6210 else if (hash_mode == 133)
6211 {
6212 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6213
6214 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6215 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6216 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6217 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6218 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6219
6220 memcpy (tmp_buf, digest_buf, 20);
6221
6222 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6223
6224 snprintf (out_buf, len-1, "%s", ptr_plain);
6225 }
6226 else if (hash_mode == 141)
6227 {
6228 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6229
6230 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6231
6232 memset (tmp_buf, 0, sizeof (tmp_buf));
6233
6234 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6235
6236 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6237 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6238 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6239 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6240 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6241
6242 memcpy (tmp_buf, digest_buf, 20);
6243
6244 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6245
6246 ptr_plain[27] = 0;
6247
6248 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6249 }
6250 else if (hash_mode == 400)
6251 {
6252 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6253
6254 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6255 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6256 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6257 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6258
6259 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6260
6261 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6262 }
6263 else if (hash_mode == 500)
6264 {
6265 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6266
6267 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6268 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6269 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6270 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6271
6272 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6273
6274 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6275 {
6276 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6277 }
6278 else
6279 {
6280 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6281 }
6282 }
6283 else if (hash_mode == 501)
6284 {
6285 uint digest_idx = salt.digests_offset + digest_pos;
6286
6287 hashinfo_t **hashinfo_ptr = data.hash_info;
6288 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6289
6290 snprintf (out_buf, len-1, "%s", hash_buf);
6291 }
6292 else if (hash_mode == 1421)
6293 {
6294 u8 *salt_ptr = (u8 *) salt.salt_buf;
6295
6296 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6297 salt_ptr[0],
6298 salt_ptr[1],
6299 salt_ptr[2],
6300 salt_ptr[3],
6301 salt_ptr[4],
6302 salt_ptr[5],
6303 digest_buf[0],
6304 digest_buf[1],
6305 digest_buf[2],
6306 digest_buf[3],
6307 digest_buf[4],
6308 digest_buf[5],
6309 digest_buf[6],
6310 digest_buf[7]);
6311 }
6312 else if (hash_mode == 1441)
6313 {
6314 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6315
6316 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6317
6318 memset (tmp_buf, 0, sizeof (tmp_buf));
6319
6320 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6321
6322 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6323 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6324 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6325 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6326 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6327 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6328 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6329 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6330
6331 memcpy (tmp_buf, digest_buf, 32);
6332
6333 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6334
6335 ptr_plain[43] = 0;
6336
6337 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6338 }
6339 else if (hash_mode == 1500)
6340 {
6341 out_buf[0] = salt.salt_sign[0] & 0xff;
6342 out_buf[1] = salt.salt_sign[1] & 0xff;
6343 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6344 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6345 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6346
6347 memset (tmp_buf, 0, sizeof (tmp_buf));
6348
6349 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6350
6351 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6352 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6353
6354 memcpy (tmp_buf, digest_buf, 8);
6355
6356 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6357
6358 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6359
6360 out_buf[13] = 0;
6361 }
6362 else if (hash_mode == 1600)
6363 {
6364 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6365
6366 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6367 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6368 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6369 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6370
6371 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6372
6373 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6374 {
6375 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6376 }
6377 else
6378 {
6379 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6380 }
6381 }
6382 else if (hash_mode == 1711)
6383 {
6384 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6385
6386 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6387 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6388 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6389 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6390 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6391 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6392 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6393 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6394
6395 memcpy (tmp_buf, digest_buf, 64);
6396 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6397
6398 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6399
6400 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6401 }
6402 else if (hash_mode == 1722)
6403 {
6404 uint *ptr = digest_buf;
6405
6406 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6407 (unsigned char *) salt.salt_buf,
6408 ptr[ 1], ptr[ 0],
6409 ptr[ 3], ptr[ 2],
6410 ptr[ 5], ptr[ 4],
6411 ptr[ 7], ptr[ 6],
6412 ptr[ 9], ptr[ 8],
6413 ptr[11], ptr[10],
6414 ptr[13], ptr[12],
6415 ptr[15], ptr[14]);
6416 }
6417 else if (hash_mode == 1731)
6418 {
6419 uint *ptr = digest_buf;
6420
6421 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6422 (unsigned char *) salt.salt_buf,
6423 ptr[ 1], ptr[ 0],
6424 ptr[ 3], ptr[ 2],
6425 ptr[ 5], ptr[ 4],
6426 ptr[ 7], ptr[ 6],
6427 ptr[ 9], ptr[ 8],
6428 ptr[11], ptr[10],
6429 ptr[13], ptr[12],
6430 ptr[15], ptr[14]);
6431 }
6432 else if (hash_mode == 1800)
6433 {
6434 // temp workaround
6435
6436 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6437 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6438 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6439 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6440 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6441 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6442 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6443 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6444
6445 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6446
6447 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6448 {
6449 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6450 }
6451 else
6452 {
6453 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6454 }
6455 }
6456 else if (hash_mode == 2100)
6457 {
6458 uint pos = 0;
6459
6460 snprintf (out_buf + pos, len-1, "%s%i#",
6461 SIGNATURE_DCC2,
6462 salt.salt_iter + 1);
6463
6464 uint signature_len = strlen (out_buf);
6465
6466 pos += signature_len;
6467 len -= signature_len;
6468
6469 char *salt_ptr = (char *) salt.salt_buf;
6470
6471 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6472
6473 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6474 byte_swap_32 (digest_buf[0]),
6475 byte_swap_32 (digest_buf[1]),
6476 byte_swap_32 (digest_buf[2]),
6477 byte_swap_32 (digest_buf[3]));
6478 }
6479 else if ((hash_mode == 2400) || (hash_mode == 2410))
6480 {
6481 memcpy (tmp_buf, digest_buf, 16);
6482
6483 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6484
6485 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6486 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6487 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6488 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6489
6490 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6491 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6492 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6493 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6494
6495 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6496 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6497 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6498 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6499
6500 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6501 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6502 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6503 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6504
6505 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6506 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6507 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6508 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6509
6510 out_buf[16] = 0;
6511 }
6512 else if (hash_mode == 2500)
6513 {
6514 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6515
6516 wpa_t *wpa = &wpas[salt_pos];
6517
6518 uint pke[25] = { 0 };
6519
6520 char *pke_ptr = (char *) pke;
6521
6522 for (uint i = 0; i < 25; i++)
6523 {
6524 pke[i] = byte_swap_32 (wpa->pke[i]);
6525 }
6526
6527 unsigned char mac1[6] = { 0 };
6528 unsigned char mac2[6] = { 0 };
6529
6530 memcpy (mac1, pke_ptr + 23, 6);
6531 memcpy (mac2, pke_ptr + 29, 6);
6532
6533 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6534 (char *) salt.salt_buf,
6535 mac1[0],
6536 mac1[1],
6537 mac1[2],
6538 mac1[3],
6539 mac1[4],
6540 mac1[5],
6541 mac2[0],
6542 mac2[1],
6543 mac2[2],
6544 mac2[3],
6545 mac2[4],
6546 mac2[5]);
6547 }
6548 else if (hash_mode == 4400)
6549 {
6550 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6551 byte_swap_32 (digest_buf[0]),
6552 byte_swap_32 (digest_buf[1]),
6553 byte_swap_32 (digest_buf[2]),
6554 byte_swap_32 (digest_buf[3]));
6555 }
6556 else if (hash_mode == 4700)
6557 {
6558 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6559 byte_swap_32 (digest_buf[0]),
6560 byte_swap_32 (digest_buf[1]),
6561 byte_swap_32 (digest_buf[2]),
6562 byte_swap_32 (digest_buf[3]),
6563 byte_swap_32 (digest_buf[4]));
6564 }
6565 else if (hash_mode == 4800)
6566 {
6567 u8 chap_id_byte = (u8) salt.salt_buf[4];
6568
6569 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6570 digest_buf[0],
6571 digest_buf[1],
6572 digest_buf[2],
6573 digest_buf[3],
6574 byte_swap_32 (salt.salt_buf[0]),
6575 byte_swap_32 (salt.salt_buf[1]),
6576 byte_swap_32 (salt.salt_buf[2]),
6577 byte_swap_32 (salt.salt_buf[3]),
6578 chap_id_byte);
6579 }
6580 else if (hash_mode == 4900)
6581 {
6582 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6583 byte_swap_32 (digest_buf[0]),
6584 byte_swap_32 (digest_buf[1]),
6585 byte_swap_32 (digest_buf[2]),
6586 byte_swap_32 (digest_buf[3]),
6587 byte_swap_32 (digest_buf[4]));
6588 }
6589 else if (hash_mode == 5100)
6590 {
6591 snprintf (out_buf, len-1, "%08x%08x",
6592 digest_buf[0],
6593 digest_buf[1]);
6594 }
6595 else if (hash_mode == 5200)
6596 {
6597 snprintf (out_buf, len-1, "%s", hashfile);
6598 }
6599 else if (hash_mode == 5300)
6600 {
6601 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6602
6603 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6604
6605 int buf_len = len -1;
6606
6607 // msg_buf
6608
6609 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6610
6611 for (uint i = 0; i < ikepsk_msg_len; i++)
6612 {
6613 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6614 {
6615 snprintf (out_buf, buf_len, ":");
6616
6617 buf_len--;
6618 out_buf++;
6619 }
6620
6621 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6622
6623 buf_len -= 8;
6624 out_buf += 8;
6625 }
6626
6627 // nr_buf
6628
6629 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6630
6631 for (uint i = 0; i < ikepsk_nr_len; i++)
6632 {
6633 if ((i == 0) || (i == 5))
6634 {
6635 snprintf (out_buf, buf_len, ":");
6636
6637 buf_len--;
6638 out_buf++;
6639 }
6640
6641 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6642
6643 buf_len -= 8;
6644 out_buf += 8;
6645 }
6646
6647 // digest_buf
6648
6649 for (uint i = 0; i < 4; i++)
6650 {
6651 if (i == 0)
6652 {
6653 snprintf (out_buf, buf_len, ":");
6654
6655 buf_len--;
6656 out_buf++;
6657 }
6658
6659 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6660
6661 buf_len -= 8;
6662 out_buf += 8;
6663 }
6664 }
6665 else if (hash_mode == 5400)
6666 {
6667 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6668
6669 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6670
6671 int buf_len = len -1;
6672
6673 // msg_buf
6674
6675 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6676
6677 for (uint i = 0; i < ikepsk_msg_len; i++)
6678 {
6679 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6680 {
6681 snprintf (out_buf, buf_len, ":");
6682
6683 buf_len--;
6684 out_buf++;
6685 }
6686
6687 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6688
6689 buf_len -= 8;
6690 out_buf += 8;
6691 }
6692
6693 // nr_buf
6694
6695 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6696
6697 for (uint i = 0; i < ikepsk_nr_len; i++)
6698 {
6699 if ((i == 0) || (i == 5))
6700 {
6701 snprintf (out_buf, buf_len, ":");
6702
6703 buf_len--;
6704 out_buf++;
6705 }
6706
6707 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6708
6709 buf_len -= 8;
6710 out_buf += 8;
6711 }
6712
6713 // digest_buf
6714
6715 for (uint i = 0; i < 5; i++)
6716 {
6717 if (i == 0)
6718 {
6719 snprintf (out_buf, buf_len, ":");
6720
6721 buf_len--;
6722 out_buf++;
6723 }
6724
6725 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6726
6727 buf_len -= 8;
6728 out_buf += 8;
6729 }
6730 }
6731 else if (hash_mode == 5500)
6732 {
6733 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6734
6735 netntlm_t *netntlm = &netntlms[salt_pos];
6736
6737 char user_buf[64] = { 0 };
6738 char domain_buf[64] = { 0 };
6739 char srvchall_buf[1024] = { 0 };
6740 char clichall_buf[1024] = { 0 };
6741
6742 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6743 {
6744 char *ptr = (char *) netntlm->userdomain_buf;
6745
6746 user_buf[i] = ptr[j];
6747 }
6748
6749 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6750 {
6751 char *ptr = (char *) netntlm->userdomain_buf;
6752
6753 domain_buf[i] = ptr[netntlm->user_len + j];
6754 }
6755
6756 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6757 {
6758 u8 *ptr = (u8 *) netntlm->chall_buf;
6759
6760 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6761 }
6762
6763 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6764 {
6765 u8 *ptr = (u8 *) netntlm->chall_buf;
6766
6767 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6768 }
6769
6770 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6771 user_buf,
6772 domain_buf,
6773 srvchall_buf,
6774 digest_buf[0],
6775 digest_buf[1],
6776 digest_buf[2],
6777 digest_buf[3],
6778 byte_swap_32 (salt.salt_buf_pc[0]),
6779 byte_swap_32 (salt.salt_buf_pc[1]),
6780 clichall_buf);
6781 }
6782 else if (hash_mode == 5600)
6783 {
6784 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6785
6786 netntlm_t *netntlm = &netntlms[salt_pos];
6787
6788 char user_buf[64] = { 0 };
6789 char domain_buf[64] = { 0 };
6790 char srvchall_buf[1024] = { 0 };
6791 char clichall_buf[1024] = { 0 };
6792
6793 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6794 {
6795 char *ptr = (char *) netntlm->userdomain_buf;
6796
6797 user_buf[i] = ptr[j];
6798 }
6799
6800 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6801 {
6802 char *ptr = (char *) netntlm->userdomain_buf;
6803
6804 domain_buf[i] = ptr[netntlm->user_len + j];
6805 }
6806
6807 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6808 {
6809 u8 *ptr = (u8 *) netntlm->chall_buf;
6810
6811 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6812 }
6813
6814 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6815 {
6816 u8 *ptr = (u8 *) netntlm->chall_buf;
6817
6818 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6819 }
6820
6821 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6822 user_buf,
6823 domain_buf,
6824 srvchall_buf,
6825 digest_buf[0],
6826 digest_buf[1],
6827 digest_buf[2],
6828 digest_buf[3],
6829 clichall_buf);
6830 }
6831 else if (hash_mode == 5700)
6832 {
6833 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6834
6835 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6836 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6837 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6838 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6839 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6840 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6841 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6842 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6843
6844 memcpy (tmp_buf, digest_buf, 32);
6845
6846 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6847
6848 ptr_plain[43] = 0;
6849
6850 snprintf (out_buf, len-1, "%s", ptr_plain);
6851 }
6852 else if (hash_mode == 5800)
6853 {
6854 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6855 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6856 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6857 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6858 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6859
6860 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6861 digest_buf[0],
6862 digest_buf[1],
6863 digest_buf[2],
6864 digest_buf[3],
6865 digest_buf[4]);
6866 }
6867 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6868 {
6869 snprintf (out_buf, len-1, "%s", hashfile);
6870 }
6871 else if (hash_mode == 6300)
6872 {
6873 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6874
6875 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6876 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6877 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6878 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6879
6880 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6881
6882 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6883 }
6884 else if (hash_mode == 6400)
6885 {
6886 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6887
6888 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6889 }
6890 else if (hash_mode == 6500)
6891 {
6892 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6893
6894 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6895 }
6896 else if (hash_mode == 6600)
6897 {
6898 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6899
6900 agilekey_t *agilekey = &agilekeys[salt_pos];
6901
6902 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6903 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6904
6905 uint buf_len = len - 1;
6906
6907 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6908 buf_len -= 22;
6909
6910 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6911 {
6912 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6913
6914 buf_len -= 2;
6915 }
6916 }
6917 else if (hash_mode == 6700)
6918 {
6919 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6920
6921 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6922 }
6923 else if (hash_mode == 6800)
6924 {
6925 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6926 }
6927 else if (hash_mode == 7100)
6928 {
6929 uint *ptr = digest_buf;
6930
6931 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6932
6933 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6934
6935 uint esalt[8] = { 0 };
6936
6937 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6938 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6939 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6940 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6941 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6942 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6943 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6944 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6945
6946 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",
6947 SIGNATURE_SHA512OSX,
6948 salt.salt_iter + 1,
6949 esalt[ 0], esalt[ 1],
6950 esalt[ 2], esalt[ 3],
6951 esalt[ 4], esalt[ 5],
6952 esalt[ 6], esalt[ 7],
6953 ptr [ 1], ptr [ 0],
6954 ptr [ 3], ptr [ 2],
6955 ptr [ 5], ptr [ 4],
6956 ptr [ 7], ptr [ 6],
6957 ptr [ 9], ptr [ 8],
6958 ptr [11], ptr [10],
6959 ptr [13], ptr [12],
6960 ptr [15], ptr [14]);
6961 }
6962 else if (hash_mode == 7200)
6963 {
6964 uint *ptr = digest_buf;
6965
6966 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6967
6968 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6969
6970 uint len_used = 0;
6971
6972 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
6973
6974 len_used = strlen (out_buf);
6975
6976 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
6977
6978 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
6979 {
6980 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
6981 }
6982
6983 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",
6984 ptr [ 1], ptr [ 0],
6985 ptr [ 3], ptr [ 2],
6986 ptr [ 5], ptr [ 4],
6987 ptr [ 7], ptr [ 6],
6988 ptr [ 9], ptr [ 8],
6989 ptr [11], ptr [10],
6990 ptr [13], ptr [12],
6991 ptr [15], ptr [14]);
6992 }
6993 else if (hash_mode == 7300)
6994 {
6995 rakp_t *rakps = (rakp_t *) data.esalts_buf;
6996
6997 rakp_t *rakp = &rakps[salt_pos];
6998
6999 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
7000 {
7001 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
7002 }
7003
7004 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
7005 digest_buf[0],
7006 digest_buf[1],
7007 digest_buf[2],
7008 digest_buf[3],
7009 digest_buf[4]);
7010 }
7011 else if (hash_mode == 7400)
7012 {
7013 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
7014
7015 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7016 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7017 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7018 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7019 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7020 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7021 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7022 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7023
7024 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
7025
7026 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
7027 {
7028 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
7029 }
7030 else
7031 {
7032 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
7033 }
7034 }
7035 else if (hash_mode == 7500)
7036 {
7037 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
7038
7039 krb5pa_t *krb5pa = &krb5pas[salt_pos];
7040
7041 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
7042 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
7043
7044 char data[128] = { 0 };
7045
7046 char *ptr_data = data;
7047
7048 for (uint i = 0; i < 36; i++, ptr_data += 2)
7049 {
7050 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
7051 }
7052
7053 for (uint i = 0; i < 16; i++, ptr_data += 2)
7054 {
7055 sprintf (ptr_data, "%02x", ptr_checksum[i]);
7056 }
7057
7058 *ptr_data = 0;
7059
7060 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7061 SIGNATURE_KRB5PA,
7062 (char *) krb5pa->user,
7063 (char *) krb5pa->realm,
7064 (char *) krb5pa->salt,
7065 data);
7066 }
7067 else if (hash_mode == 7700)
7068 {
7069 snprintf (out_buf, len-1, "%s$%08X%08X",
7070 (char *) salt.salt_buf,
7071 digest_buf[0],
7072 digest_buf[1]);
7073 }
7074 else if (hash_mode == 7800)
7075 {
7076 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7077 (char *) salt.salt_buf,
7078 digest_buf[0],
7079 digest_buf[1],
7080 digest_buf[2],
7081 digest_buf[3],
7082 digest_buf[4]);
7083 }
7084 else if (hash_mode == 7900)
7085 {
7086 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7087
7088 // ugly hack start
7089
7090 char *tmp = (char *) salt.salt_buf_pc;
7091
7092 ptr_plain[42] = tmp[0];
7093
7094 // ugly hack end
7095
7096 ptr_plain[43] = 0;
7097
7098 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7099 }
7100 else if (hash_mode == 8000)
7101 {
7102 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7103 (unsigned char *) salt.salt_buf,
7104 digest_buf[0],
7105 digest_buf[1],
7106 digest_buf[2],
7107 digest_buf[3],
7108 digest_buf[4],
7109 digest_buf[5],
7110 digest_buf[6],
7111 digest_buf[7]);
7112 }
7113 else if (hash_mode == 8100)
7114 {
7115 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7116 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7117
7118 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7119 (unsigned char *) salt.salt_buf,
7120 digest_buf[0],
7121 digest_buf[1],
7122 digest_buf[2],
7123 digest_buf[3],
7124 digest_buf[4]);
7125 }
7126 else if (hash_mode == 8200)
7127 {
7128 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7129
7130 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7131
7132 char data_buf[4096] = { 0 };
7133
7134 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7135 {
7136 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7137 }
7138
7139 data_buf[cloudkey->data_len * 2] = 0;
7140
7141 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7142 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7143 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7144 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7145 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7146 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7147 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7148 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7149
7150 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7151 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7152 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7153 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7154
7155 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7156 digest_buf[0],
7157 digest_buf[1],
7158 digest_buf[2],
7159 digest_buf[3],
7160 digest_buf[4],
7161 digest_buf[5],
7162 digest_buf[6],
7163 digest_buf[7],
7164 salt.salt_buf[0],
7165 salt.salt_buf[1],
7166 salt.salt_buf[2],
7167 salt.salt_buf[3],
7168 salt.salt_iter + 1,
7169 data_buf);
7170 }
7171 else if (hash_mode == 8300)
7172 {
7173 char digest_buf_c[34] = { 0 };
7174
7175 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7176
7177 digest_buf_c[32] = 0;
7178
7179 // domain
7180
7181 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7182
7183 char domain_buf_c[33] = { 0 };
7184
7185 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7186
7187 for (uint i = 0; i < salt_pc_len; i++)
7188 {
7189 const char next = domain_buf_c[i];
7190
7191 domain_buf_c[i] = '.';
7192
7193 i += next;
7194 }
7195
7196 domain_buf_c[salt_pc_len] = 0;
7197
7198 // final
7199
7200 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7201 }
7202 else if (hash_mode == 8500)
7203 {
7204 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7205 }
7206 else if (hash_mode == 2612)
7207 {
7208 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7209 SIGNATURE_PHPS,
7210 (char *) salt.salt_buf,
7211 digest_buf[0],
7212 digest_buf[1],
7213 digest_buf[2],
7214 digest_buf[3]);
7215 }
7216 else if (hash_mode == 3711)
7217 {
7218 char *salt_ptr = (char *) salt.salt_buf;
7219
7220 salt_ptr[salt.salt_len - 1] = 0;
7221
7222 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7223 SIGNATURE_MEDIAWIKI_B,
7224 salt_ptr,
7225 digest_buf[0],
7226 digest_buf[1],
7227 digest_buf[2],
7228 digest_buf[3]);
7229 }
7230 else if (hash_mode == 8800)
7231 {
7232 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7233
7234 androidfde_t *androidfde = &androidfdes[salt_pos];
7235
7236 char tmp[3073] = { 0 };
7237
7238 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7239 {
7240 sprintf (tmp + j, "%08x", androidfde->data[i]);
7241 }
7242
7243 tmp[3072] = 0;
7244
7245 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7246 SIGNATURE_ANDROIDFDE,
7247 byte_swap_32 (salt.salt_buf[0]),
7248 byte_swap_32 (salt.salt_buf[1]),
7249 byte_swap_32 (salt.salt_buf[2]),
7250 byte_swap_32 (salt.salt_buf[3]),
7251 byte_swap_32 (digest_buf[0]),
7252 byte_swap_32 (digest_buf[1]),
7253 byte_swap_32 (digest_buf[2]),
7254 byte_swap_32 (digest_buf[3]),
7255 tmp);
7256 }
7257 else if (hash_mode == 8900)
7258 {
7259 uint N = salt.scrypt_N;
7260 uint r = salt.scrypt_r;
7261 uint p = salt.scrypt_p;
7262
7263 char base64_salt[32] = { 0 };
7264
7265 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7266
7267 memset (tmp_buf, 0, 46);
7268
7269 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7270 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7271 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7272 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7273 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7274 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7275 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7276 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7277 digest_buf[8] = 0; // needed for base64_encode ()
7278
7279 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7280
7281 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7282 SIGNATURE_SCRYPT,
7283 N,
7284 r,
7285 p,
7286 base64_salt,
7287 tmp_buf);
7288 }
7289 else if (hash_mode == 9000)
7290 {
7291 snprintf (out_buf, len-1, "%s", hashfile);
7292 }
7293 else if (hash_mode == 9200)
7294 {
7295 // salt
7296
7297 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7298
7299 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7300
7301 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7302
7303 // hash
7304
7305 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7306 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7307 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7308 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7309 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7310 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7311 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7312 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7313 digest_buf[8] = 0; // needed for base64_encode ()
7314
7315 char tmp_buf[64] = { 0 };
7316
7317 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7318 tmp_buf[43] = 0; // cut it here
7319
7320 // output
7321
7322 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7323 }
7324 else if (hash_mode == 9300)
7325 {
7326 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7327 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7328 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7329 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7330 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7331 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7332 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7333 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7334 digest_buf[8] = 0; // needed for base64_encode ()
7335
7336 char tmp_buf[64] = { 0 };
7337
7338 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7339 tmp_buf[43] = 0; // cut it here
7340
7341 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7342
7343 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7344 }
7345 else if (hash_mode == 9400)
7346 {
7347 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7348
7349 office2007_t *office2007 = &office2007s[salt_pos];
7350
7351 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7352 SIGNATURE_OFFICE2007,
7353 2007,
7354 20,
7355 office2007->keySize,
7356 16,
7357 salt.salt_buf[0],
7358 salt.salt_buf[1],
7359 salt.salt_buf[2],
7360 salt.salt_buf[3],
7361 office2007->encryptedVerifier[0],
7362 office2007->encryptedVerifier[1],
7363 office2007->encryptedVerifier[2],
7364 office2007->encryptedVerifier[3],
7365 office2007->encryptedVerifierHash[0],
7366 office2007->encryptedVerifierHash[1],
7367 office2007->encryptedVerifierHash[2],
7368 office2007->encryptedVerifierHash[3],
7369 office2007->encryptedVerifierHash[4]);
7370 }
7371 else if (hash_mode == 9500)
7372 {
7373 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7374
7375 office2010_t *office2010 = &office2010s[salt_pos];
7376
7377 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,
7378
7379 salt.salt_buf[0],
7380 salt.salt_buf[1],
7381 salt.salt_buf[2],
7382 salt.salt_buf[3],
7383 office2010->encryptedVerifier[0],
7384 office2010->encryptedVerifier[1],
7385 office2010->encryptedVerifier[2],
7386 office2010->encryptedVerifier[3],
7387 office2010->encryptedVerifierHash[0],
7388 office2010->encryptedVerifierHash[1],
7389 office2010->encryptedVerifierHash[2],
7390 office2010->encryptedVerifierHash[3],
7391 office2010->encryptedVerifierHash[4],
7392 office2010->encryptedVerifierHash[5],
7393 office2010->encryptedVerifierHash[6],
7394 office2010->encryptedVerifierHash[7]);
7395 }
7396 else if (hash_mode == 9600)
7397 {
7398 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7399
7400 office2013_t *office2013 = &office2013s[salt_pos];
7401
7402 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x%08x%08x", SIGNATURE_OFFICE2013, 2013, 100000, 256, 16,
7403
7404 salt.salt_buf[0],
7405 salt.salt_buf[1],
7406 salt.salt_buf[2],
7407 salt.salt_buf[3],
7408 office2013->encryptedVerifier[0],
7409 office2013->encryptedVerifier[1],
7410 office2013->encryptedVerifier[2],
7411 office2013->encryptedVerifier[3],
7412 office2013->encryptedVerifierHash[0],
7413 office2013->encryptedVerifierHash[1],
7414 office2013->encryptedVerifierHash[2],
7415 office2013->encryptedVerifierHash[3],
7416 office2013->encryptedVerifierHash[4],
7417 office2013->encryptedVerifierHash[5],
7418 office2013->encryptedVerifierHash[6],
7419 office2013->encryptedVerifierHash[7]);
7420 }
7421 else if (hash_mode == 9700)
7422 {
7423 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7424
7425 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7426
7427 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7428 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7429 byte_swap_32 (salt.salt_buf[0]),
7430 byte_swap_32 (salt.salt_buf[1]),
7431 byte_swap_32 (salt.salt_buf[2]),
7432 byte_swap_32 (salt.salt_buf[3]),
7433 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7434 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7435 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7436 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7437 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7438 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7439 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7440 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7441 }
7442 else if (hash_mode == 9710)
7443 {
7444 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7445
7446 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7447
7448 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7449 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7450 byte_swap_32 (salt.salt_buf[0]),
7451 byte_swap_32 (salt.salt_buf[1]),
7452 byte_swap_32 (salt.salt_buf[2]),
7453 byte_swap_32 (salt.salt_buf[3]),
7454 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7455 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7456 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7457 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7458 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7459 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7460 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7461 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7462 }
7463 else if (hash_mode == 9720)
7464 {
7465 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7466
7467 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7468
7469 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7470
7471 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7472 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7473 byte_swap_32 (salt.salt_buf[0]),
7474 byte_swap_32 (salt.salt_buf[1]),
7475 byte_swap_32 (salt.salt_buf[2]),
7476 byte_swap_32 (salt.salt_buf[3]),
7477 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7478 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7479 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7480 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7481 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7482 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7483 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7484 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7485 rc4key[0],
7486 rc4key[1],
7487 rc4key[2],
7488 rc4key[3],
7489 rc4key[4]);
7490 }
7491 else if (hash_mode == 9800)
7492 {
7493 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7494
7495 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7496
7497 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7498 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7499 salt.salt_buf[0],
7500 salt.salt_buf[1],
7501 salt.salt_buf[2],
7502 salt.salt_buf[3],
7503 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7504 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7505 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7506 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7507 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7508 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7509 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7510 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7511 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7512 }
7513 else if (hash_mode == 9810)
7514 {
7515 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7516
7517 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7518
7519 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7520 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7521 salt.salt_buf[0],
7522 salt.salt_buf[1],
7523 salt.salt_buf[2],
7524 salt.salt_buf[3],
7525 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7526 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7527 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7528 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7529 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7530 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7531 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7532 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7533 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7534 }
7535 else if (hash_mode == 9820)
7536 {
7537 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7538
7539 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7540
7541 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7542
7543 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7544 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7545 salt.salt_buf[0],
7546 salt.salt_buf[1],
7547 salt.salt_buf[2],
7548 salt.salt_buf[3],
7549 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7550 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7551 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7552 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7553 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7554 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7555 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7556 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7557 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7558 rc4key[0],
7559 rc4key[1],
7560 rc4key[2],
7561 rc4key[3],
7562 rc4key[4]);
7563 }
7564 else if (hash_mode == 10000)
7565 {
7566 // salt
7567
7568 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7569
7570 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7571
7572 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7573
7574 // hash
7575
7576 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7577 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7578 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7579 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7580 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7581 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7582 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7583 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7584 digest_buf[8] = 0; // needed for base64_encode ()
7585
7586 char tmp_buf[64] = { 0 };
7587
7588 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7589
7590 // output
7591
7592 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7593 }
7594 else if (hash_mode == 10100)
7595 {
7596 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7597 digest_buf[0],
7598 digest_buf[1],
7599 2,
7600 4,
7601 byte_swap_32 (salt.salt_buf[0]),
7602 byte_swap_32 (salt.salt_buf[1]),
7603 byte_swap_32 (salt.salt_buf[2]),
7604 byte_swap_32 (salt.salt_buf[3]));
7605 }
7606 else if (hash_mode == 10200)
7607 {
7608 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7609
7610 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7611
7612 // challenge
7613
7614 char challenge[100] = { 0 };
7615
7616 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7617
7618 // response
7619
7620 char tmp_buf[100] = { 0 };
7621
7622 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7623 (char *) cram_md5->user,
7624 digest_buf[0],
7625 digest_buf[1],
7626 digest_buf[2],
7627 digest_buf[3]);
7628
7629 char response[100] = { 0 };
7630
7631 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7632
7633 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7634 }
7635 else if (hash_mode == 10300)
7636 {
7637 char tmp_buf[100] = { 0 };
7638
7639 memcpy (tmp_buf + 0, digest_buf, 20);
7640 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7641
7642 uint tmp_len = 20 + salt.salt_len;
7643
7644 // base64 encode it
7645
7646 char base64_encoded[100] = { 0 };
7647
7648 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7649
7650 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7651 }
7652 else if (hash_mode == 10400)
7653 {
7654 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7655
7656 pdf_t *pdf = &pdfs[salt_pos];
7657
7658 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",
7659
7660 pdf->V,
7661 pdf->R,
7662 40,
7663 pdf->P,
7664 pdf->enc_md,
7665 pdf->id_len,
7666 byte_swap_32 (pdf->id_buf[0]),
7667 byte_swap_32 (pdf->id_buf[1]),
7668 byte_swap_32 (pdf->id_buf[2]),
7669 byte_swap_32 (pdf->id_buf[3]),
7670 pdf->u_len,
7671 byte_swap_32 (pdf->u_buf[0]),
7672 byte_swap_32 (pdf->u_buf[1]),
7673 byte_swap_32 (pdf->u_buf[2]),
7674 byte_swap_32 (pdf->u_buf[3]),
7675 byte_swap_32 (pdf->u_buf[4]),
7676 byte_swap_32 (pdf->u_buf[5]),
7677 byte_swap_32 (pdf->u_buf[6]),
7678 byte_swap_32 (pdf->u_buf[7]),
7679 pdf->o_len,
7680 byte_swap_32 (pdf->o_buf[0]),
7681 byte_swap_32 (pdf->o_buf[1]),
7682 byte_swap_32 (pdf->o_buf[2]),
7683 byte_swap_32 (pdf->o_buf[3]),
7684 byte_swap_32 (pdf->o_buf[4]),
7685 byte_swap_32 (pdf->o_buf[5]),
7686 byte_swap_32 (pdf->o_buf[6]),
7687 byte_swap_32 (pdf->o_buf[7])
7688 );
7689 }
7690 else if (hash_mode == 10410)
7691 {
7692 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7693
7694 pdf_t *pdf = &pdfs[salt_pos];
7695
7696 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",
7697
7698 pdf->V,
7699 pdf->R,
7700 40,
7701 pdf->P,
7702 pdf->enc_md,
7703 pdf->id_len,
7704 byte_swap_32 (pdf->id_buf[0]),
7705 byte_swap_32 (pdf->id_buf[1]),
7706 byte_swap_32 (pdf->id_buf[2]),
7707 byte_swap_32 (pdf->id_buf[3]),
7708 pdf->u_len,
7709 byte_swap_32 (pdf->u_buf[0]),
7710 byte_swap_32 (pdf->u_buf[1]),
7711 byte_swap_32 (pdf->u_buf[2]),
7712 byte_swap_32 (pdf->u_buf[3]),
7713 byte_swap_32 (pdf->u_buf[4]),
7714 byte_swap_32 (pdf->u_buf[5]),
7715 byte_swap_32 (pdf->u_buf[6]),
7716 byte_swap_32 (pdf->u_buf[7]),
7717 pdf->o_len,
7718 byte_swap_32 (pdf->o_buf[0]),
7719 byte_swap_32 (pdf->o_buf[1]),
7720 byte_swap_32 (pdf->o_buf[2]),
7721 byte_swap_32 (pdf->o_buf[3]),
7722 byte_swap_32 (pdf->o_buf[4]),
7723 byte_swap_32 (pdf->o_buf[5]),
7724 byte_swap_32 (pdf->o_buf[6]),
7725 byte_swap_32 (pdf->o_buf[7])
7726 );
7727 }
7728 else if (hash_mode == 10420)
7729 {
7730 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7731
7732 pdf_t *pdf = &pdfs[salt_pos];
7733
7734 u8 *rc4key = (u8 *) pdf->rc4key;
7735
7736 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",
7737
7738 pdf->V,
7739 pdf->R,
7740 40,
7741 pdf->P,
7742 pdf->enc_md,
7743 pdf->id_len,
7744 byte_swap_32 (pdf->id_buf[0]),
7745 byte_swap_32 (pdf->id_buf[1]),
7746 byte_swap_32 (pdf->id_buf[2]),
7747 byte_swap_32 (pdf->id_buf[3]),
7748 pdf->u_len,
7749 byte_swap_32 (pdf->u_buf[0]),
7750 byte_swap_32 (pdf->u_buf[1]),
7751 byte_swap_32 (pdf->u_buf[2]),
7752 byte_swap_32 (pdf->u_buf[3]),
7753 byte_swap_32 (pdf->u_buf[4]),
7754 byte_swap_32 (pdf->u_buf[5]),
7755 byte_swap_32 (pdf->u_buf[6]),
7756 byte_swap_32 (pdf->u_buf[7]),
7757 pdf->o_len,
7758 byte_swap_32 (pdf->o_buf[0]),
7759 byte_swap_32 (pdf->o_buf[1]),
7760 byte_swap_32 (pdf->o_buf[2]),
7761 byte_swap_32 (pdf->o_buf[3]),
7762 byte_swap_32 (pdf->o_buf[4]),
7763 byte_swap_32 (pdf->o_buf[5]),
7764 byte_swap_32 (pdf->o_buf[6]),
7765 byte_swap_32 (pdf->o_buf[7]),
7766 rc4key[0],
7767 rc4key[1],
7768 rc4key[2],
7769 rc4key[3],
7770 rc4key[4]
7771 );
7772 }
7773 else if (hash_mode == 10500)
7774 {
7775 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7776
7777 pdf_t *pdf = &pdfs[salt_pos];
7778
7779 if (pdf->id_len == 32)
7780 {
7781 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",
7782
7783 pdf->V,
7784 pdf->R,
7785 128,
7786 pdf->P,
7787 pdf->enc_md,
7788 pdf->id_len,
7789 byte_swap_32 (pdf->id_buf[0]),
7790 byte_swap_32 (pdf->id_buf[1]),
7791 byte_swap_32 (pdf->id_buf[2]),
7792 byte_swap_32 (pdf->id_buf[3]),
7793 byte_swap_32 (pdf->id_buf[4]),
7794 byte_swap_32 (pdf->id_buf[5]),
7795 byte_swap_32 (pdf->id_buf[6]),
7796 byte_swap_32 (pdf->id_buf[7]),
7797 pdf->u_len,
7798 byte_swap_32 (pdf->u_buf[0]),
7799 byte_swap_32 (pdf->u_buf[1]),
7800 byte_swap_32 (pdf->u_buf[2]),
7801 byte_swap_32 (pdf->u_buf[3]),
7802 byte_swap_32 (pdf->u_buf[4]),
7803 byte_swap_32 (pdf->u_buf[5]),
7804 byte_swap_32 (pdf->u_buf[6]),
7805 byte_swap_32 (pdf->u_buf[7]),
7806 pdf->o_len,
7807 byte_swap_32 (pdf->o_buf[0]),
7808 byte_swap_32 (pdf->o_buf[1]),
7809 byte_swap_32 (pdf->o_buf[2]),
7810 byte_swap_32 (pdf->o_buf[3]),
7811 byte_swap_32 (pdf->o_buf[4]),
7812 byte_swap_32 (pdf->o_buf[5]),
7813 byte_swap_32 (pdf->o_buf[6]),
7814 byte_swap_32 (pdf->o_buf[7])
7815 );
7816 }
7817 else
7818 {
7819 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",
7820
7821 pdf->V,
7822 pdf->R,
7823 128,
7824 pdf->P,
7825 pdf->enc_md,
7826 pdf->id_len,
7827 byte_swap_32 (pdf->id_buf[0]),
7828 byte_swap_32 (pdf->id_buf[1]),
7829 byte_swap_32 (pdf->id_buf[2]),
7830 byte_swap_32 (pdf->id_buf[3]),
7831 pdf->u_len,
7832 byte_swap_32 (pdf->u_buf[0]),
7833 byte_swap_32 (pdf->u_buf[1]),
7834 byte_swap_32 (pdf->u_buf[2]),
7835 byte_swap_32 (pdf->u_buf[3]),
7836 byte_swap_32 (pdf->u_buf[4]),
7837 byte_swap_32 (pdf->u_buf[5]),
7838 byte_swap_32 (pdf->u_buf[6]),
7839 byte_swap_32 (pdf->u_buf[7]),
7840 pdf->o_len,
7841 byte_swap_32 (pdf->o_buf[0]),
7842 byte_swap_32 (pdf->o_buf[1]),
7843 byte_swap_32 (pdf->o_buf[2]),
7844 byte_swap_32 (pdf->o_buf[3]),
7845 byte_swap_32 (pdf->o_buf[4]),
7846 byte_swap_32 (pdf->o_buf[5]),
7847 byte_swap_32 (pdf->o_buf[6]),
7848 byte_swap_32 (pdf->o_buf[7])
7849 );
7850 }
7851 }
7852 else if (hash_mode == 10600)
7853 {
7854 uint digest_idx = salt.digests_offset + digest_pos;
7855
7856 hashinfo_t **hashinfo_ptr = data.hash_info;
7857 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7858
7859 snprintf (out_buf, len-1, "%s", hash_buf);
7860 }
7861 else if (hash_mode == 10700)
7862 {
7863 uint digest_idx = salt.digests_offset + digest_pos;
7864
7865 hashinfo_t **hashinfo_ptr = data.hash_info;
7866 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7867
7868 snprintf (out_buf, len-1, "%s", hash_buf);
7869 }
7870 else if (hash_mode == 10900)
7871 {
7872 uint digest_idx = salt.digests_offset + digest_pos;
7873
7874 hashinfo_t **hashinfo_ptr = data.hash_info;
7875 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7876
7877 snprintf (out_buf, len-1, "%s", hash_buf);
7878 }
7879 else if (hash_mode == 11100)
7880 {
7881 u32 salt_challenge = salt.salt_buf[0];
7882
7883 salt_challenge = byte_swap_32 (salt_challenge);
7884
7885 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7886
7887 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7888 SIGNATURE_POSTGRESQL_AUTH,
7889 user_name,
7890 salt_challenge,
7891 digest_buf[0],
7892 digest_buf[1],
7893 digest_buf[2],
7894 digest_buf[3]);
7895 }
7896 else if (hash_mode == 11200)
7897 {
7898 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7899 SIGNATURE_MYSQL_AUTH,
7900 (unsigned char *) salt.salt_buf,
7901 digest_buf[0],
7902 digest_buf[1],
7903 digest_buf[2],
7904 digest_buf[3],
7905 digest_buf[4]);
7906 }
7907 else if (hash_mode == 11300)
7908 {
7909 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7910
7911 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7912
7913 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7914 const uint ckey_len = bitcoin_wallet->ckey_len;
7915 const uint public_key_len = bitcoin_wallet->public_key_len;
7916
7917 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7918 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7919 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7920
7921 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7922 {
7923 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
7924
7925 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7926 }
7927
7928 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7929 {
7930 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
7931
7932 sprintf (ckey_buf + j, "%02x", ptr[i]);
7933 }
7934
7935 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7936 {
7937 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
7938
7939 sprintf (public_key_buf + j, "%02x", ptr[i]);
7940 }
7941
7942 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
7943 SIGNATURE_BITCOIN_WALLET,
7944 cry_master_len * 2,
7945 cry_master_buf,
7946 salt.salt_len,
7947 (unsigned char *) salt.salt_buf,
7948 salt.salt_iter + 1,
7949 ckey_len * 2,
7950 ckey_buf,
7951 public_key_len * 2,
7952 public_key_buf
7953 );
7954
7955 free (cry_master_buf);
7956 free (ckey_buf);
7957 free (public_key_buf);
7958 }
7959 else if (hash_mode == 11400)
7960 {
7961 uint digest_idx = salt.digests_offset + digest_pos;
7962
7963 hashinfo_t **hashinfo_ptr = data.hash_info;
7964 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7965
7966 snprintf (out_buf, len-1, "%s", hash_buf);
7967 }
7968 else if (hash_mode == 11600)
7969 {
7970 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
7971
7972 seven_zip_t *seven_zip = &seven_zips[salt_pos];
7973
7974 const uint data_len = seven_zip->data_len;
7975
7976 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
7977
7978 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
7979 {
7980 const u8 *ptr = (const u8 *) seven_zip->data_buf;
7981
7982 sprintf (data_buf + j, "%02x", ptr[i]);
7983 }
7984
7985 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
7986 SIGNATURE_SEVEN_ZIP,
7987 0,
7988 salt.salt_sign[0],
7989 0,
7990 (char *) seven_zip->salt_buf,
7991 seven_zip->iv_len,
7992 seven_zip->iv_buf[0],
7993 seven_zip->iv_buf[1],
7994 seven_zip->iv_buf[2],
7995 seven_zip->iv_buf[3],
7996 seven_zip->crc,
7997 seven_zip->data_len,
7998 seven_zip->unpack_size,
7999 data_buf);
8000
8001 free (data_buf);
8002 }
8003 else if (hash_mode == 11700)
8004 {
8005 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8006 digest_buf[0],
8007 digest_buf[1],
8008 digest_buf[2],
8009 digest_buf[3],
8010 digest_buf[4],
8011 digest_buf[5],
8012 digest_buf[6],
8013 digest_buf[7]);
8014 }
8015 else if (hash_mode == 11800)
8016 {
8017 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8018 digest_buf[ 0],
8019 digest_buf[ 1],
8020 digest_buf[ 2],
8021 digest_buf[ 3],
8022 digest_buf[ 4],
8023 digest_buf[ 5],
8024 digest_buf[ 6],
8025 digest_buf[ 7],
8026 digest_buf[ 8],
8027 digest_buf[ 9],
8028 digest_buf[10],
8029 digest_buf[11],
8030 digest_buf[12],
8031 digest_buf[13],
8032 digest_buf[14],
8033 digest_buf[15]);
8034 }
8035 else if (hash_mode == 11900)
8036 {
8037 uint digest_idx = salt.digests_offset + digest_pos;
8038
8039 hashinfo_t **hashinfo_ptr = data.hash_info;
8040 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8041
8042 snprintf (out_buf, len-1, "%s", hash_buf);
8043 }
8044 else if (hash_mode == 12000)
8045 {
8046 uint digest_idx = salt.digests_offset + digest_pos;
8047
8048 hashinfo_t **hashinfo_ptr = data.hash_info;
8049 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8050
8051 snprintf (out_buf, len-1, "%s", hash_buf);
8052 }
8053 else if (hash_mode == 12100)
8054 {
8055 uint digest_idx = salt.digests_offset + digest_pos;
8056
8057 hashinfo_t **hashinfo_ptr = data.hash_info;
8058 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8059
8060 snprintf (out_buf, len-1, "%s", hash_buf);
8061 }
8062 else if (hash_mode == 12200)
8063 {
8064 uint *ptr_digest = digest_buf;
8065 uint *ptr_salt = salt.salt_buf;
8066
8067 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8068 SIGNATURE_ECRYPTFS,
8069 ptr_salt[0],
8070 ptr_salt[1],
8071 ptr_digest[0],
8072 ptr_digest[1]);
8073 }
8074 else if (hash_mode == 12300)
8075 {
8076 uint *ptr_digest = digest_buf;
8077 uint *ptr_salt = salt.salt_buf;
8078
8079 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",
8080 ptr_digest[ 0], ptr_digest[ 1],
8081 ptr_digest[ 2], ptr_digest[ 3],
8082 ptr_digest[ 4], ptr_digest[ 5],
8083 ptr_digest[ 6], ptr_digest[ 7],
8084 ptr_digest[ 8], ptr_digest[ 9],
8085 ptr_digest[10], ptr_digest[11],
8086 ptr_digest[12], ptr_digest[13],
8087 ptr_digest[14], ptr_digest[15],
8088 ptr_salt[0],
8089 ptr_salt[1],
8090 ptr_salt[2],
8091 ptr_salt[3]);
8092 }
8093 else if (hash_mode == 12400)
8094 {
8095 // encode iteration count
8096
8097 char salt_iter[5] = { 0 };
8098
8099 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8100 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8101 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8102 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8103 salt_iter[4] = 0;
8104
8105 // encode salt
8106
8107 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8108 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8109 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8110 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8111 ptr_salt[4] = 0;
8112
8113 // encode digest
8114
8115 memset (tmp_buf, 0, sizeof (tmp_buf));
8116
8117 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8118 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8119
8120 memcpy (tmp_buf, digest_buf, 8);
8121
8122 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8123
8124 ptr_plain[11] = 0;
8125
8126 // fill the resulting buffer
8127
8128 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8129 }
8130 else if (hash_mode == 12500)
8131 {
8132 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8133 SIGNATURE_RAR3,
8134 byte_swap_32 (salt.salt_buf[0]),
8135 byte_swap_32 (salt.salt_buf[1]),
8136 salt.salt_buf[2],
8137 salt.salt_buf[3],
8138 salt.salt_buf[4],
8139 salt.salt_buf[5]);
8140 }
8141 else if (hash_mode == 12600)
8142 {
8143 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8144 digest_buf[0] + salt.salt_buf_pc[0],
8145 digest_buf[1] + salt.salt_buf_pc[1],
8146 digest_buf[2] + salt.salt_buf_pc[2],
8147 digest_buf[3] + salt.salt_buf_pc[3],
8148 digest_buf[4] + salt.salt_buf_pc[4],
8149 digest_buf[5] + salt.salt_buf_pc[5],
8150 digest_buf[6] + salt.salt_buf_pc[6],
8151 digest_buf[7] + salt.salt_buf_pc[7]);
8152 }
8153 else if (hash_mode == 12700)
8154 {
8155 uint digest_idx = salt.digests_offset + digest_pos;
8156
8157 hashinfo_t **hashinfo_ptr = data.hash_info;
8158 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8159
8160 snprintf (out_buf, len-1, "%s", hash_buf);
8161 }
8162 else if (hash_mode == 12800)
8163 {
8164 const u8 *ptr = (const u8 *) salt.salt_buf;
8165
8166 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",
8167 SIGNATURE_MS_DRSR,
8168 ptr[0],
8169 ptr[1],
8170 ptr[2],
8171 ptr[3],
8172 ptr[4],
8173 ptr[5],
8174 ptr[6],
8175 ptr[7],
8176 ptr[8],
8177 ptr[9],
8178 salt.salt_iter + 1,
8179 byte_swap_32 (digest_buf[0]),
8180 byte_swap_32 (digest_buf[1]),
8181 byte_swap_32 (digest_buf[2]),
8182 byte_swap_32 (digest_buf[3]),
8183 byte_swap_32 (digest_buf[4]),
8184 byte_swap_32 (digest_buf[5]),
8185 byte_swap_32 (digest_buf[6]),
8186 byte_swap_32 (digest_buf[7])
8187 );
8188 }
8189 else if (hash_mode == 12900)
8190 {
8191 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",
8192 salt.salt_buf[ 4],
8193 salt.salt_buf[ 5],
8194 salt.salt_buf[ 6],
8195 salt.salt_buf[ 7],
8196 salt.salt_buf[ 8],
8197 salt.salt_buf[ 9],
8198 salt.salt_buf[10],
8199 salt.salt_buf[11],
8200 byte_swap_32 (digest_buf[0]),
8201 byte_swap_32 (digest_buf[1]),
8202 byte_swap_32 (digest_buf[2]),
8203 byte_swap_32 (digest_buf[3]),
8204 byte_swap_32 (digest_buf[4]),
8205 byte_swap_32 (digest_buf[5]),
8206 byte_swap_32 (digest_buf[6]),
8207 byte_swap_32 (digest_buf[7]),
8208 salt.salt_buf[ 0],
8209 salt.salt_buf[ 1],
8210 salt.salt_buf[ 2],
8211 salt.salt_buf[ 3]
8212 );
8213 }
8214 else if (hash_mode == 13000)
8215 {
8216 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8217
8218 rar5_t *rar5 = &rar5s[salt_pos];
8219
8220 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8221 salt.salt_buf[0],
8222 salt.salt_buf[1],
8223 salt.salt_buf[2],
8224 salt.salt_buf[3],
8225 salt.salt_sign[0],
8226 rar5->iv[0],
8227 rar5->iv[1],
8228 rar5->iv[2],
8229 rar5->iv[3],
8230 byte_swap_32 (digest_buf[0]),
8231 byte_swap_32 (digest_buf[1])
8232 );
8233 }
8234 else
8235 {
8236 if (hash_type == HASH_TYPE_MD4)
8237 {
8238 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8239 digest_buf[0],
8240 digest_buf[1],
8241 digest_buf[2],
8242 digest_buf[3]);
8243 }
8244 else if (hash_type == HASH_TYPE_MD5)
8245 {
8246 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8247 digest_buf[0],
8248 digest_buf[1],
8249 digest_buf[2],
8250 digest_buf[3]);
8251 }
8252 else if (hash_type == HASH_TYPE_SHA1)
8253 {
8254 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8255 digest_buf[0],
8256 digest_buf[1],
8257 digest_buf[2],
8258 digest_buf[3],
8259 digest_buf[4]);
8260 }
8261 else if (hash_type == HASH_TYPE_SHA256)
8262 {
8263 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8264 digest_buf[0],
8265 digest_buf[1],
8266 digest_buf[2],
8267 digest_buf[3],
8268 digest_buf[4],
8269 digest_buf[5],
8270 digest_buf[6],
8271 digest_buf[7]);
8272 }
8273 else if (hash_type == HASH_TYPE_SHA384)
8274 {
8275 uint *ptr = digest_buf;
8276
8277 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8278 ptr[ 1], ptr[ 0],
8279 ptr[ 3], ptr[ 2],
8280 ptr[ 5], ptr[ 4],
8281 ptr[ 7], ptr[ 6],
8282 ptr[ 9], ptr[ 8],
8283 ptr[11], ptr[10]);
8284 }
8285 else if (hash_type == HASH_TYPE_SHA512)
8286 {
8287 uint *ptr = digest_buf;
8288
8289 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8290 ptr[ 1], ptr[ 0],
8291 ptr[ 3], ptr[ 2],
8292 ptr[ 5], ptr[ 4],
8293 ptr[ 7], ptr[ 6],
8294 ptr[ 9], ptr[ 8],
8295 ptr[11], ptr[10],
8296 ptr[13], ptr[12],
8297 ptr[15], ptr[14]);
8298 }
8299 else if (hash_type == HASH_TYPE_LM)
8300 {
8301 snprintf (out_buf, len-1, "%08x%08x",
8302 digest_buf[0],
8303 digest_buf[1]);
8304 }
8305 else if (hash_type == HASH_TYPE_ORACLEH)
8306 {
8307 snprintf (out_buf, len-1, "%08X%08X",
8308 digest_buf[0],
8309 digest_buf[1]);
8310 }
8311 else if (hash_type == HASH_TYPE_BCRYPT)
8312 {
8313 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8314 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8315
8316 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8317
8318 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8319 }
8320 else if (hash_type == HASH_TYPE_KECCAK)
8321 {
8322 uint *ptr = digest_buf;
8323
8324 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",
8325 ptr[ 1], ptr[ 0],
8326 ptr[ 3], ptr[ 2],
8327 ptr[ 5], ptr[ 4],
8328 ptr[ 7], ptr[ 6],
8329 ptr[ 9], ptr[ 8],
8330 ptr[11], ptr[10],
8331 ptr[13], ptr[12],
8332 ptr[15], ptr[14],
8333 ptr[17], ptr[16],
8334 ptr[19], ptr[18],
8335 ptr[21], ptr[20],
8336 ptr[23], ptr[22],
8337 ptr[25], ptr[24],
8338 ptr[27], ptr[26],
8339 ptr[29], ptr[28],
8340 ptr[31], ptr[30],
8341 ptr[33], ptr[32],
8342 ptr[35], ptr[34],
8343 ptr[37], ptr[36],
8344 ptr[39], ptr[38],
8345 ptr[41], ptr[30],
8346 ptr[43], ptr[42],
8347 ptr[45], ptr[44],
8348 ptr[47], ptr[46],
8349 ptr[49], ptr[48]
8350 );
8351
8352 out_buf[salt.keccak_mdlen * 2] = 0;
8353 }
8354 else if (hash_type == HASH_TYPE_RIPEMD160)
8355 {
8356 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8357 digest_buf[0],
8358 digest_buf[1],
8359 digest_buf[2],
8360 digest_buf[3],
8361 digest_buf[4]);
8362 }
8363 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8364 {
8365 digest_buf[ 0] = digest_buf[ 0];
8366 digest_buf[ 1] = digest_buf[ 1];
8367 digest_buf[ 2] = digest_buf[ 2];
8368 digest_buf[ 3] = digest_buf[ 3];
8369 digest_buf[ 4] = digest_buf[ 4];
8370 digest_buf[ 5] = digest_buf[ 5];
8371 digest_buf[ 6] = digest_buf[ 6];
8372 digest_buf[ 7] = digest_buf[ 7];
8373 digest_buf[ 8] = digest_buf[ 8];
8374 digest_buf[ 9] = digest_buf[ 9];
8375 digest_buf[10] = digest_buf[10];
8376 digest_buf[11] = digest_buf[11];
8377 digest_buf[12] = digest_buf[12];
8378 digest_buf[13] = digest_buf[13];
8379 digest_buf[14] = digest_buf[14];
8380 digest_buf[15] = digest_buf[15];
8381
8382 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8383 digest_buf[ 0],
8384 digest_buf[ 1],
8385 digest_buf[ 2],
8386 digest_buf[ 3],
8387 digest_buf[ 4],
8388 digest_buf[ 5],
8389 digest_buf[ 6],
8390 digest_buf[ 7],
8391 digest_buf[ 8],
8392 digest_buf[ 9],
8393 digest_buf[10],
8394 digest_buf[11],
8395 digest_buf[12],
8396 digest_buf[13],
8397 digest_buf[14],
8398 digest_buf[15]);
8399 }
8400 else if (hash_type == HASH_TYPE_GOST)
8401 {
8402 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8403 digest_buf[0],
8404 digest_buf[1],
8405 digest_buf[2],
8406 digest_buf[3],
8407 digest_buf[4],
8408 digest_buf[5],
8409 digest_buf[6],
8410 digest_buf[7]);
8411 }
8412 else if (hash_type == HASH_TYPE_MYSQL)
8413 {
8414 snprintf (out_buf, len-1, "%08x%08x",
8415 digest_buf[0],
8416 digest_buf[1]);
8417 }
8418 else if (hash_type == HASH_TYPE_LOTUS5)
8419 {
8420 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8421 digest_buf[0],
8422 digest_buf[1],
8423 digest_buf[2],
8424 digest_buf[3]);
8425 }
8426 else if (hash_type == HASH_TYPE_LOTUS6)
8427 {
8428 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8429 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8430 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8431 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8432
8433 char buf[16] = { 0 };
8434
8435 memcpy (buf + 0, salt.salt_buf, 5);
8436 memcpy (buf + 5, digest_buf, 9);
8437
8438 buf[3] -= -4;
8439
8440 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
8441
8442 tmp_buf[18] = salt.salt_buf_pc[7];
8443 tmp_buf[19] = 0;
8444
8445 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8446 }
8447 else if (hash_type == HASH_TYPE_LOTUS8)
8448 {
8449 char buf[52] = { 0 };
8450
8451 // salt
8452
8453 memcpy (buf + 0, salt.salt_buf, 16);
8454
8455 buf[3] -= -4;
8456
8457 // iteration
8458
8459 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8460
8461 // chars
8462
8463 buf[26] = salt.salt_buf_pc[0];
8464 buf[27] = salt.salt_buf_pc[1];
8465
8466 // digest
8467
8468 memcpy (buf + 28, digest_buf, 8);
8469
8470 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
8471
8472 tmp_buf[49] = 0;
8473
8474 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8475 }
8476 else if (hash_type == HASH_TYPE_CRC32)
8477 {
8478 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8479 }
8480 }
8481
8482 if (salt_type == SALT_TYPE_INTERN)
8483 {
8484 size_t pos = strlen (out_buf);
8485
8486 out_buf[pos] = data.separator;
8487
8488 char *ptr = (char *) salt.salt_buf;
8489
8490 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8491
8492 out_buf[pos + 1 + salt.salt_len] = 0;
8493 }
8494 }
8495
8496 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8497 {
8498 memset (hccap, 0, sizeof (hccap_t));
8499
8500 salt_t *salt = &data.salts_buf[salt_pos];
8501
8502 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8503
8504 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8505 wpa_t *wpa = &wpas[salt_pos];
8506
8507 hccap->keyver = wpa->keyver;
8508
8509 hccap->eapol_size = wpa->eapol_size;
8510
8511 if (wpa->keyver != 1)
8512 {
8513 uint eapol_tmp[64] = { 0 };
8514
8515 for (uint i = 0; i < 64; i++)
8516 {
8517 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8518 }
8519
8520 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8521 }
8522 else
8523 {
8524 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8525 }
8526
8527 uint pke_tmp[25] = { 0 };
8528
8529 for (int i = 5; i < 25; i++)
8530 {
8531 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8532 }
8533
8534 char *pke_ptr = (char *) pke_tmp;
8535
8536 memcpy (hccap->mac1, pke_ptr + 23, 6);
8537 memcpy (hccap->mac2, pke_ptr + 29, 6);
8538 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8539 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8540
8541 char *digests_buf_ptr = (char *) data.digests_buf;
8542
8543 uint dgst_size = data.dgst_size;
8544
8545 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8546
8547 if (wpa->keyver != 1)
8548 {
8549 uint digest_tmp[4] = { 0 };
8550
8551 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8552 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8553 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8554 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8555
8556 memcpy (hccap->keymic, digest_tmp, 16);
8557 }
8558 else
8559 {
8560 memcpy (hccap->keymic, digest_ptr, 16);
8561 }
8562 }
8563
8564 void SuspendThreads ()
8565 {
8566 if (data.devices_status == STATUS_RUNNING)
8567 {
8568 hc_timer_set (&data.timer_paused);
8569
8570 data.devices_status = STATUS_PAUSED;
8571
8572 log_info ("Paused");
8573 }
8574 }
8575
8576 void ResumeThreads ()
8577 {
8578 if (data.devices_status == STATUS_PAUSED)
8579 {
8580 float ms_paused;
8581
8582 hc_timer_get (data.timer_paused, ms_paused);
8583
8584 data.ms_paused += ms_paused;
8585
8586 data.devices_status = STATUS_RUNNING;
8587
8588 log_info ("Resumed");
8589 }
8590 }
8591
8592 void bypass ()
8593 {
8594 if (data.devices_status != STATUS_RUNNING) return;
8595
8596 data.devices_status = STATUS_BYPASS;
8597
8598 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8599 }
8600
8601 void stop_at_checkpoint ()
8602 {
8603 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8604 {
8605 if (data.devices_status != STATUS_RUNNING) return;
8606 }
8607
8608 // this feature only makes sense if --restore-disable was not specified
8609
8610 if (data.restore_disable == 1)
8611 {
8612 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8613
8614 return;
8615 }
8616
8617 // check if monitoring of Restore Point updates should be enabled or disabled
8618
8619 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8620 {
8621 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8622
8623 // save the current restore point value
8624
8625 data.checkpoint_cur_words = get_lowest_words_done ();
8626
8627 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8628 }
8629 else
8630 {
8631 data.devices_status = STATUS_RUNNING;
8632
8633 // reset the global value for checkpoint checks
8634
8635 data.checkpoint_cur_words = 0;
8636
8637 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8638 }
8639 }
8640
8641 void myabort ()
8642 {
8643 if (data.devices_status == STATUS_INIT) return;
8644 if (data.devices_status == STATUS_STARTING) return;
8645
8646 data.devices_status = STATUS_ABORTED;
8647 }
8648
8649 void myquit ()
8650 {
8651 if (data.devices_status == STATUS_INIT) return;
8652 if (data.devices_status == STATUS_STARTING) return;
8653
8654 data.devices_status = STATUS_QUIT;
8655 }
8656
8657 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
8658 {
8659 FILE *fp = fopen (kernel_file, "rb");
8660
8661 if (fp != NULL)
8662 {
8663 struct stat st;
8664
8665 memset (&st, 0, sizeof (st));
8666
8667 stat (kernel_file, &st);
8668
8669 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
8670
8671 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
8672
8673 if (num_read != (size_t) st.st_size)
8674 {
8675 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8676
8677 exit (-1);
8678 }
8679
8680 fclose (fp);
8681
8682 buf[st.st_size] = 0;
8683
8684 for (int i = 0; i < num_devices; i++)
8685 {
8686 kernel_lengths[i] = (size_t) st.st_size;
8687
8688 kernel_sources[i] = buf;
8689 }
8690 }
8691 else
8692 {
8693 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8694
8695 exit (-1);
8696 }
8697
8698 return;
8699 }
8700
8701 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
8702 {
8703 if (binary_size > 0)
8704 {
8705 FILE *fp = fopen (dst, "wb");
8706
8707 lock_file (fp);
8708 fwrite (binary, sizeof (u8), binary_size, fp);
8709
8710 fflush (fp);
8711 fclose (fp);
8712 }
8713 }
8714
8715 /**
8716 * restore
8717 */
8718
8719 restore_data_t *init_restore (int argc, char **argv)
8720 {
8721 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8722
8723 if (data.restore_disable == 0)
8724 {
8725 FILE *fp = fopen (data.eff_restore_file, "rb");
8726
8727 if (fp)
8728 {
8729 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8730
8731 if (nread != 1)
8732 {
8733 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8734
8735 exit (-1);
8736 }
8737
8738 fclose (fp);
8739
8740 if (rd->pid)
8741 {
8742 char pidbin[BUFSIZ] = { 0 };
8743
8744 int pidbin_len = -1;
8745
8746 #ifdef _POSIX
8747 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8748
8749 FILE *fd = fopen (pidbin, "rb");
8750
8751 if (fd)
8752 {
8753 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8754
8755 pidbin[pidbin_len] = 0;
8756
8757 fclose (fd);
8758
8759 char *argv0_r = strrchr (argv[0], '/');
8760
8761 char *pidbin_r = strrchr (pidbin, '/');
8762
8763 if (argv0_r == NULL) argv0_r = argv[0];
8764
8765 if (pidbin_r == NULL) pidbin_r = pidbin;
8766
8767 if (strcmp (argv0_r, pidbin_r) == 0)
8768 {
8769 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8770
8771 exit (-1);
8772 }
8773 }
8774
8775 #elif _WIN
8776 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8777
8778 char pidbin2[BUFSIZ] = { 0 };
8779
8780 int pidbin2_len = -1;
8781
8782 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8783 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8784
8785 pidbin[pidbin_len] = 0;
8786 pidbin2[pidbin2_len] = 0;
8787
8788 if (pidbin2_len)
8789 {
8790 if (strcmp (pidbin, pidbin2) == 0)
8791 {
8792 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8793
8794 exit (-1);
8795 }
8796 }
8797 #endif
8798 }
8799
8800 if (rd->version_bin < RESTORE_MIN)
8801 {
8802 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8803
8804 exit (-1);
8805 }
8806 }
8807 }
8808
8809 memset (rd, 0, sizeof (restore_data_t));
8810
8811 rd->version_bin = VERSION_BIN;
8812
8813 #ifdef _POSIX
8814 rd->pid = getpid ();
8815 #elif _WIN
8816 rd->pid = GetCurrentProcessId ();
8817 #endif
8818
8819 if (getcwd (rd->cwd, 255) == NULL)
8820 {
8821 myfree (rd);
8822
8823 return (NULL);
8824 }
8825
8826 rd->argc = argc;
8827 rd->argv = argv;
8828
8829 return (rd);
8830 }
8831
8832 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8833 {
8834 FILE *fp = fopen (eff_restore_file, "rb");
8835
8836 if (fp == NULL)
8837 {
8838 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8839
8840 exit (-1);
8841 }
8842
8843 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8844 {
8845 log_error ("ERROR: cannot read %s", eff_restore_file);
8846
8847 exit (-1);
8848 }
8849
8850 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8851
8852 for (uint i = 0; i < rd->argc; i++)
8853 {
8854 char buf[BUFSIZ] = { 0 };
8855
8856 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8857 {
8858 log_error ("ERROR: cannot read %s", eff_restore_file);
8859
8860 exit (-1);
8861 }
8862
8863 size_t len = strlen (buf);
8864
8865 if (len) buf[len - 1] = 0;
8866
8867 rd->argv[i] = mystrdup (buf);
8868 }
8869
8870 fclose (fp);
8871
8872 char new_cwd[1024] = { 0 };
8873
8874 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8875
8876 if (nwd == NULL)
8877 {
8878 log_error ("Restore file is corrupted");
8879 }
8880
8881 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8882 {
8883 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8884 {
8885 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8886
8887 exit (-1);
8888 }
8889
8890 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8891 }
8892
8893 if (chdir (rd->cwd))
8894 {
8895 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8896
8897 exit (-1);
8898 }
8899 }
8900
8901 u64 get_lowest_words_done ()
8902 {
8903 u64 words_cur = -1;
8904
8905 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8906 {
8907 hc_device_param_t *device_param = &data.devices_param[device_id];
8908
8909 if (device_param->skipped) continue;
8910
8911 const u64 words_done = device_param->words_done;
8912
8913 if (words_done < words_cur) words_cur = words_done;
8914 }
8915
8916 // It's possible that a device's workload isn't finished right after a restore-case.
8917 // In that case, this function would return 0 and overwrite the real restore point
8918 // There's also data.words_cur which is set to rd->words_cur but it changes while
8919 // the attack is running therefore we should stick to rd->words_cur.
8920 // Note that -s influences rd->words_cur we should keep a close look on that.
8921
8922 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
8923
8924 return words_cur;
8925 }
8926
8927 void write_restore (const char *new_restore_file, restore_data_t *rd)
8928 {
8929 u64 words_cur = get_lowest_words_done ();
8930
8931 rd->words_cur = words_cur;
8932
8933 FILE *fp = fopen (new_restore_file, "wb");
8934
8935 if (fp == NULL)
8936 {
8937 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
8938
8939 exit (-1);
8940 }
8941
8942 if (setvbuf (fp, NULL, _IONBF, 0))
8943 {
8944 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
8945
8946 exit (-1);
8947 }
8948
8949 fwrite (rd, sizeof (restore_data_t), 1, fp);
8950
8951 for (uint i = 0; i < rd->argc; i++)
8952 {
8953 fprintf (fp, "%s", rd->argv[i]);
8954 fputc ('\n', fp);
8955 }
8956
8957 fflush (fp);
8958
8959 fsync (fileno (fp));
8960
8961 fclose (fp);
8962 }
8963
8964 void cycle_restore ()
8965 {
8966 const char *eff_restore_file = data.eff_restore_file;
8967 const char *new_restore_file = data.new_restore_file;
8968
8969 restore_data_t *rd = data.rd;
8970
8971 write_restore (new_restore_file, rd);
8972
8973 struct stat st;
8974
8975 memset (&st, 0, sizeof(st));
8976
8977 if (stat (eff_restore_file, &st) == 0)
8978 {
8979 if (unlink (eff_restore_file))
8980 {
8981 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
8982 }
8983 }
8984
8985 if (rename (new_restore_file, eff_restore_file))
8986 {
8987 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
8988 }
8989 }
8990
8991 void check_checkpoint ()
8992 {
8993 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
8994
8995 u64 words_cur = get_lowest_words_done ();
8996
8997 if (words_cur != data.checkpoint_cur_words)
8998 {
8999 myabort ();
9000 }
9001 }
9002
9003 /**
9004 * adjustments
9005 */
9006
9007 uint set_kernel_accel (uint hash_mode)
9008 {
9009 switch (hash_mode)
9010 {
9011 case 0: return GET_ACCEL (0);
9012 case 10: return GET_ACCEL (10);
9013 case 11: return GET_ACCEL (11);
9014 case 12: return GET_ACCEL (12);
9015 case 20: return GET_ACCEL (20);
9016 case 21: return GET_ACCEL (21);
9017 case 22: return GET_ACCEL (22);
9018 case 23: return GET_ACCEL (23);
9019 case 30: return GET_ACCEL (30);
9020 case 40: return GET_ACCEL (40);
9021 case 50: return GET_ACCEL (50);
9022 case 60: return GET_ACCEL (60);
9023 case 100: return GET_ACCEL (100);
9024 case 101: return GET_ACCEL (101);
9025 case 110: return GET_ACCEL (110);
9026 case 111: return GET_ACCEL (111);
9027 case 112: return GET_ACCEL (112);
9028 case 120: return GET_ACCEL (120);
9029 case 121: return GET_ACCEL (121);
9030 case 122: return GET_ACCEL (122);
9031 case 124: return GET_ACCEL (124);
9032 case 130: return GET_ACCEL (130);
9033 case 131: return GET_ACCEL (131);
9034 case 132: return GET_ACCEL (132);
9035 case 133: return GET_ACCEL (133);
9036 case 140: return GET_ACCEL (140);
9037 case 141: return GET_ACCEL (141);
9038 case 150: return GET_ACCEL (150);
9039 case 160: return GET_ACCEL (160);
9040 case 190: return GET_ACCEL (190);
9041 case 200: return GET_ACCEL (200);
9042 case 300: return GET_ACCEL (300);
9043 case 400: return GET_ACCEL (400);
9044 case 500: return GET_ACCEL (500);
9045 case 501: return GET_ACCEL (501);
9046 case 900: return GET_ACCEL (900);
9047 case 910: return GET_ACCEL (910);
9048 case 1000: return GET_ACCEL (1000);
9049 case 1100: return GET_ACCEL (1100);
9050 case 1400: return GET_ACCEL (1400);
9051 case 1410: return GET_ACCEL (1410);
9052 case 1420: return GET_ACCEL (1420);
9053 case 1421: return GET_ACCEL (1421);
9054 case 1430: return GET_ACCEL (1430);
9055 case 1440: return GET_ACCEL (1440);
9056 case 1441: return GET_ACCEL (1441);
9057 case 1450: return GET_ACCEL (1450);
9058 case 1460: return GET_ACCEL (1460);
9059 case 1500: return GET_ACCEL (1500);
9060 case 1600: return GET_ACCEL (1600);
9061 case 1700: return GET_ACCEL (1700);
9062 case 1710: return GET_ACCEL (1710);
9063 case 1711: return GET_ACCEL (1711);
9064 case 1720: return GET_ACCEL (1720);
9065 case 1722: return GET_ACCEL (1722);
9066 case 1730: return GET_ACCEL (1730);
9067 case 1731: return GET_ACCEL (1731);
9068 case 1740: return GET_ACCEL (1740);
9069 case 1750: return GET_ACCEL (1750);
9070 case 1760: return GET_ACCEL (1760);
9071 case 1800: return GET_ACCEL (1800);
9072 case 2100: return GET_ACCEL (2100);
9073 case 2400: return GET_ACCEL (2400);
9074 case 2410: return GET_ACCEL (2410);
9075 case 2500: return GET_ACCEL (2500);
9076 case 2600: return GET_ACCEL (2600);
9077 case 2611: return GET_ACCEL (2611);
9078 case 2612: return GET_ACCEL (2612);
9079 case 2711: return GET_ACCEL (2711);
9080 case 2811: return GET_ACCEL (2811);
9081 case 3000: return GET_ACCEL (3000);
9082 case 3100: return GET_ACCEL (3100);
9083 case 3200: return GET_ACCEL (3200);
9084 case 3710: return GET_ACCEL (3710);
9085 case 3711: return GET_ACCEL (3711);
9086 case 3800: return GET_ACCEL (3800);
9087 case 4300: return GET_ACCEL (4300);
9088 case 4400: return GET_ACCEL (4400);
9089 case 4500: return GET_ACCEL (4500);
9090 case 4700: return GET_ACCEL (4700);
9091 case 4800: return GET_ACCEL (4800);
9092 case 4900: return GET_ACCEL (4900);
9093 case 5000: return GET_ACCEL (5000);
9094 case 5100: return GET_ACCEL (5100);
9095 case 5200: return GET_ACCEL (5200);
9096 case 5300: return GET_ACCEL (5300);
9097 case 5400: return GET_ACCEL (5400);
9098 case 5500: return GET_ACCEL (5500);
9099 case 5600: return GET_ACCEL (5600);
9100 case 5700: return GET_ACCEL (5700);
9101 case 5800: return GET_ACCEL (5800);
9102 case 6000: return GET_ACCEL (6000);
9103 case 6100: return GET_ACCEL (6100);
9104 case 6211: return GET_ACCEL (6211);
9105 case 6212: return GET_ACCEL (6212);
9106 case 6213: return GET_ACCEL (6213);
9107 case 6221: return GET_ACCEL (6221);
9108 case 6222: return GET_ACCEL (6222);
9109 case 6223: return GET_ACCEL (6223);
9110 case 6231: return GET_ACCEL (6231);
9111 case 6232: return GET_ACCEL (6232);
9112 case 6233: return GET_ACCEL (6233);
9113 case 6241: return GET_ACCEL (6241);
9114 case 6242: return GET_ACCEL (6242);
9115 case 6243: return GET_ACCEL (6243);
9116 case 6300: return GET_ACCEL (6300);
9117 case 6400: return GET_ACCEL (6400);
9118 case 6500: return GET_ACCEL (6500);
9119 case 6600: return GET_ACCEL (6600);
9120 case 6700: return GET_ACCEL (6700);
9121 case 6800: return GET_ACCEL (6800);
9122 case 6900: return GET_ACCEL (6900);
9123 case 7100: return GET_ACCEL (7100);
9124 case 7200: return GET_ACCEL (7200);
9125 case 7300: return GET_ACCEL (7300);
9126 case 7400: return GET_ACCEL (7400);
9127 case 7500: return GET_ACCEL (7500);
9128 case 7600: return GET_ACCEL (7600);
9129 case 7700: return GET_ACCEL (7700);
9130 case 7800: return GET_ACCEL (7800);
9131 case 7900: return GET_ACCEL (7900);
9132 case 8000: return GET_ACCEL (8000);
9133 case 8100: return GET_ACCEL (8100);
9134 case 8200: return GET_ACCEL (8200);
9135 case 8300: return GET_ACCEL (8300);
9136 case 8400: return GET_ACCEL (8400);
9137 case 8500: return GET_ACCEL (8500);
9138 case 8600: return GET_ACCEL (8600);
9139 case 8700: return GET_ACCEL (8700);
9140 case 8800: return GET_ACCEL (8800);
9141 case 8900: return GET_ACCEL (8900);
9142 case 9000: return GET_ACCEL (9000);
9143 case 9100: return GET_ACCEL (9100);
9144 case 9200: return GET_ACCEL (9200);
9145 case 9300: return GET_ACCEL (9300);
9146 case 9400: return GET_ACCEL (9400);
9147 case 9500: return GET_ACCEL (9500);
9148 case 9600: return GET_ACCEL (9600);
9149 case 9700: return GET_ACCEL (9700);
9150 case 9710: return GET_ACCEL (9710);
9151 case 9720: return GET_ACCEL (9720);
9152 case 9800: return GET_ACCEL (9800);
9153 case 9810: return GET_ACCEL (9810);
9154 case 9820: return GET_ACCEL (9820);
9155 case 9900: return GET_ACCEL (9900);
9156 case 10000: return GET_ACCEL (10000);
9157 case 10100: return GET_ACCEL (10100);
9158 case 10200: return GET_ACCEL (10200);
9159 case 10300: return GET_ACCEL (10300);
9160 case 10400: return GET_ACCEL (10400);
9161 case 10410: return GET_ACCEL (10410);
9162 case 10420: return GET_ACCEL (10420);
9163 case 10500: return GET_ACCEL (10500);
9164 case 10600: return GET_ACCEL (10600);
9165 case 10700: return GET_ACCEL (10700);
9166 case 10800: return GET_ACCEL (10800);
9167 case 10900: return GET_ACCEL (10900);
9168 case 11000: return GET_ACCEL (11000);
9169 case 11100: return GET_ACCEL (11100);
9170 case 11200: return GET_ACCEL (11200);
9171 case 11300: return GET_ACCEL (11300);
9172 case 11400: return GET_ACCEL (11400);
9173 case 11500: return GET_ACCEL (11500);
9174 case 11600: return GET_ACCEL (11600);
9175 case 11700: return GET_ACCEL (11700);
9176 case 11800: return GET_ACCEL (11800);
9177 case 11900: return GET_ACCEL (11900);
9178 case 12000: return GET_ACCEL (12000);
9179 case 12100: return GET_ACCEL (12100);
9180 case 12200: return GET_ACCEL (12200);
9181 case 12300: return GET_ACCEL (12300);
9182 case 12400: return GET_ACCEL (12400);
9183 case 12500: return GET_ACCEL (12500);
9184 case 12600: return GET_ACCEL (12600);
9185 case 12700: return GET_ACCEL (12700);
9186 case 12800: return GET_ACCEL (12800);
9187 case 12900: return GET_ACCEL (12900);
9188 case 13000: return GET_ACCEL (13000);
9189 }
9190
9191 return 0;
9192 }
9193
9194 uint set_kernel_loops (uint hash_mode)
9195 {
9196 switch (hash_mode)
9197 {
9198 case 0: return GET_LOOPS (0);
9199 case 10: return GET_LOOPS (10);
9200 case 11: return GET_LOOPS (11);
9201 case 12: return GET_LOOPS (12);
9202 case 20: return GET_LOOPS (20);
9203 case 21: return GET_LOOPS (21);
9204 case 22: return GET_LOOPS (22);
9205 case 23: return GET_LOOPS (23);
9206 case 30: return GET_LOOPS (30);
9207 case 40: return GET_LOOPS (40);
9208 case 50: return GET_LOOPS (50);
9209 case 60: return GET_LOOPS (60);
9210 case 100: return GET_LOOPS (100);
9211 case 101: return GET_LOOPS (101);
9212 case 110: return GET_LOOPS (110);
9213 case 111: return GET_LOOPS (111);
9214 case 112: return GET_LOOPS (112);
9215 case 120: return GET_LOOPS (120);
9216 case 121: return GET_LOOPS (121);
9217 case 122: return GET_LOOPS (122);
9218 case 124: return GET_LOOPS (124);
9219 case 130: return GET_LOOPS (130);
9220 case 131: return GET_LOOPS (131);
9221 case 132: return GET_LOOPS (132);
9222 case 133: return GET_LOOPS (133);
9223 case 140: return GET_LOOPS (140);
9224 case 141: return GET_LOOPS (141);
9225 case 150: return GET_LOOPS (150);
9226 case 160: return GET_LOOPS (160);
9227 case 190: return GET_LOOPS (190);
9228 case 200: return GET_LOOPS (200);
9229 case 300: return GET_LOOPS (300);
9230 case 400: return GET_LOOPS (400);
9231 case 500: return GET_LOOPS (500);
9232 case 501: return GET_LOOPS (501);
9233 case 900: return GET_LOOPS (900);
9234 case 910: return GET_LOOPS (910);
9235 case 1000: return GET_LOOPS (1000);
9236 case 1100: return GET_LOOPS (1100);
9237 case 1400: return GET_LOOPS (1400);
9238 case 1410: return GET_LOOPS (1410);
9239 case 1420: return GET_LOOPS (1420);
9240 case 1421: return GET_LOOPS (1421);
9241 case 1430: return GET_LOOPS (1430);
9242 case 1440: return GET_LOOPS (1440);
9243 case 1441: return GET_LOOPS (1441);
9244 case 1450: return GET_LOOPS (1450);
9245 case 1460: return GET_LOOPS (1460);
9246 case 1500: return GET_LOOPS (1500);
9247 case 1600: return GET_LOOPS (1600);
9248 case 1700: return GET_LOOPS (1700);
9249 case 1710: return GET_LOOPS (1710);
9250 case 1711: return GET_LOOPS (1711);
9251 case 1720: return GET_LOOPS (1720);
9252 case 1722: return GET_LOOPS (1722);
9253 case 1730: return GET_LOOPS (1730);
9254 case 1731: return GET_LOOPS (1731);
9255 case 1740: return GET_LOOPS (1740);
9256 case 1750: return GET_LOOPS (1750);
9257 case 1760: return GET_LOOPS (1760);
9258 case 1800: return GET_LOOPS (1800);
9259 case 2100: return GET_LOOPS (2100);
9260 case 2400: return GET_LOOPS (2400);
9261 case 2410: return GET_LOOPS (2410);
9262 case 2500: return GET_LOOPS (2500);
9263 case 2600: return GET_LOOPS (2600);
9264 case 2611: return GET_LOOPS (2611);
9265 case 2612: return GET_LOOPS (2612);
9266 case 2711: return GET_LOOPS (2711);
9267 case 2811: return GET_LOOPS (2811);
9268 case 3000: return GET_LOOPS (3000);
9269 case 3100: return GET_LOOPS (3100);
9270 case 3200: return GET_LOOPS (3200);
9271 case 3710: return GET_LOOPS (3710);
9272 case 3711: return GET_LOOPS (3711);
9273 case 3800: return GET_LOOPS (3800);
9274 case 4300: return GET_LOOPS (4300);
9275 case 4400: return GET_LOOPS (4400);
9276 case 4500: return GET_LOOPS (4500);
9277 case 4700: return GET_LOOPS (4700);
9278 case 4800: return GET_LOOPS (4800);
9279 case 4900: return GET_LOOPS (4900);
9280 case 5000: return GET_LOOPS (5000);
9281 case 5100: return GET_LOOPS (5100);
9282 case 5200: return GET_LOOPS (5200);
9283 case 5300: return GET_LOOPS (5300);
9284 case 5400: return GET_LOOPS (5400);
9285 case 5500: return GET_LOOPS (5500);
9286 case 5600: return GET_LOOPS (5600);
9287 case 5700: return GET_LOOPS (5700);
9288 case 5800: return GET_LOOPS (5800);
9289 case 6000: return GET_LOOPS (6000);
9290 case 6100: return GET_LOOPS (6100);
9291 case 6211: return GET_LOOPS (6211);
9292 case 6212: return GET_LOOPS (6212);
9293 case 6213: return GET_LOOPS (6213);
9294 case 6221: return GET_LOOPS (6221);
9295 case 6222: return GET_LOOPS (6222);
9296 case 6223: return GET_LOOPS (6223);
9297 case 6231: return GET_LOOPS (6231);
9298 case 6232: return GET_LOOPS (6232);
9299 case 6233: return GET_LOOPS (6233);
9300 case 6241: return GET_LOOPS (6241);
9301 case 6242: return GET_LOOPS (6242);
9302 case 6243: return GET_LOOPS (6243);
9303 case 6300: return GET_LOOPS (6300);
9304 case 6400: return GET_LOOPS (6400);
9305 case 6500: return GET_LOOPS (6500);
9306 case 6600: return GET_LOOPS (6600);
9307 case 6700: return GET_LOOPS (6700);
9308 case 6800: return GET_LOOPS (6800);
9309 case 6900: return GET_LOOPS (6900);
9310 case 7100: return GET_LOOPS (7100);
9311 case 7200: return GET_LOOPS (7200);
9312 case 7300: return GET_LOOPS (7300);
9313 case 7400: return GET_LOOPS (7400);
9314 case 7500: return GET_LOOPS (7500);
9315 case 7600: return GET_LOOPS (7600);
9316 case 7700: return GET_LOOPS (7700);
9317 case 7800: return GET_LOOPS (7800);
9318 case 7900: return GET_LOOPS (7900);
9319 case 8000: return GET_LOOPS (8000);
9320 case 8100: return GET_LOOPS (8100);
9321 case 8200: return GET_LOOPS (8200);
9322 case 8300: return GET_LOOPS (8300);
9323 case 8400: return GET_LOOPS (8400);
9324 case 8500: return GET_LOOPS (8500);
9325 case 8600: return GET_LOOPS (8600);
9326 case 8700: return GET_LOOPS (8700);
9327 case 8800: return GET_LOOPS (8800);
9328 case 8900: return GET_LOOPS (8900);
9329 case 9000: return GET_LOOPS (9000);
9330 case 9100: return GET_LOOPS (9100);
9331 case 9200: return GET_LOOPS (9200);
9332 case 9300: return GET_LOOPS (9300);
9333 case 9400: return GET_LOOPS (9400);
9334 case 9500: return GET_LOOPS (9500);
9335 case 9600: return GET_LOOPS (9600);
9336 case 9700: return GET_LOOPS (9700);
9337 case 9710: return GET_LOOPS (9710);
9338 case 9720: return GET_LOOPS (9720);
9339 case 9800: return GET_LOOPS (9800);
9340 case 9810: return GET_LOOPS (9810);
9341 case 9820: return GET_LOOPS (9820);
9342 case 9900: return GET_LOOPS (9900);
9343 case 10000: return GET_LOOPS (10000);
9344 case 10100: return GET_LOOPS (10100);
9345 case 10200: return GET_LOOPS (10200);
9346 case 10300: return GET_LOOPS (10300);
9347 case 10400: return GET_LOOPS (10400);
9348 case 10410: return GET_LOOPS (10410);
9349 case 10420: return GET_LOOPS (10420);
9350 case 10500: return GET_LOOPS (10500);
9351 case 10600: return GET_LOOPS (10600);
9352 case 10700: return GET_LOOPS (10700);
9353 case 10800: return GET_LOOPS (10800);
9354 case 10900: return GET_LOOPS (10900);
9355 case 11000: return GET_LOOPS (11000);
9356 case 11100: return GET_LOOPS (11100);
9357 case 11200: return GET_LOOPS (11200);
9358 case 11300: return GET_LOOPS (11300);
9359 case 11400: return GET_LOOPS (11400);
9360 case 11500: return GET_LOOPS (11500);
9361 case 11600: return GET_LOOPS (11600);
9362 case 11700: return GET_LOOPS (11700);
9363 case 11800: return GET_LOOPS (11800);
9364 case 11900: return GET_LOOPS (11900);
9365 case 12000: return GET_LOOPS (12000);
9366 case 12100: return GET_LOOPS (12100);
9367 case 12200: return GET_LOOPS (12200);
9368 case 12300: return GET_LOOPS (12300);
9369 case 12400: return GET_LOOPS (12400);
9370 case 12500: return GET_LOOPS (12500);
9371 case 12600: return GET_LOOPS (12600);
9372 case 12700: return GET_LOOPS (12700);
9373 case 12800: return GET_LOOPS (12800);
9374 case 12900: return GET_LOOPS (12900);
9375 case 13000: return GET_LOOPS (13000);
9376 }
9377
9378 return 0;
9379 }
9380
9381 /**
9382 * parser
9383 */
9384
9385 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9386 {
9387 u8 tmp[256] = { 0 };
9388
9389 if (salt_len > sizeof (tmp))
9390 {
9391 return UINT_MAX;
9392 }
9393
9394 memcpy (tmp, in, salt_len);
9395
9396 if (data.opts_type & OPTS_TYPE_ST_HEX)
9397 {
9398 if ((salt_len % 2) == 0)
9399 {
9400 u32 new_salt_len = salt_len / 2;
9401
9402 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9403 {
9404 u8 p0 = tmp[j + 0];
9405 u8 p1 = tmp[j + 1];
9406
9407 tmp[i] = hex_convert (p1) << 0;
9408 tmp[i] |= hex_convert (p0) << 4;
9409 }
9410
9411 salt_len = new_salt_len;
9412 }
9413 else
9414 {
9415 return UINT_MAX;
9416 }
9417 }
9418 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9419 {
9420 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9421 }
9422
9423 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9424
9425 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9426 {
9427 if (salt_len < 20)
9428 {
9429 u32 *tmp_uint = (u32 *) tmp;
9430
9431 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9432 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9433 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9434 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9435 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9436 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9437 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9438 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9439 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9440 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9441
9442 salt_len = salt_len * 2;
9443 }
9444 else
9445 {
9446 return UINT_MAX;
9447 }
9448 }
9449
9450 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9451 {
9452 lowercase (tmp, salt_len);
9453 }
9454
9455 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9456 {
9457 uppercase (tmp, salt_len);
9458 }
9459
9460 u32 len = salt_len;
9461
9462 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9463 {
9464 tmp[len++] = 0x80;
9465 }
9466
9467 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9468 {
9469 tmp[len++] = 0x01;
9470 }
9471
9472 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9473 {
9474 u32 *tmp_uint = (uint *) tmp;
9475
9476 u32 max = len / 4;
9477
9478 if (len % 4) max++;
9479
9480 for (u32 i = 0; i < max; i++)
9481 {
9482 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9483 }
9484
9485 // Important: we may need to increase the length of memcpy since
9486 // we don't want to "loose" some swapped bytes (could happen if
9487 // they do not perfectly fit in the 4-byte blocks)
9488 // Memcpy does always copy the bytes in the BE order, but since
9489 // we swapped them, some important bytes could be in positions
9490 // we normally skip with the original len
9491
9492 if (len % 4) len += 4 - (len % 4);
9493 }
9494
9495 memcpy (out, tmp, len);
9496
9497 return (salt_len);
9498 }
9499
9500 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9501 {
9502 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9503
9504 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9505
9506 u32 *digest = (u32 *) hash_buf->digest;
9507
9508 salt_t *salt = hash_buf->salt;
9509
9510 memcpy ((char *) salt->salt_sign, input_buf, 6);
9511
9512 char *iter_pos = input_buf + 4;
9513
9514 salt->salt_iter = 1 << atoi (iter_pos);
9515
9516 char *salt_pos = strchr (iter_pos, '$');
9517
9518 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9519
9520 salt_pos++;
9521
9522 uint salt_len = 16;
9523
9524 salt->salt_len = salt_len;
9525
9526 u8 tmp_buf[100] = { 0 };
9527
9528 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9529
9530 char *salt_buf_ptr = (char *) salt->salt_buf;
9531
9532 memcpy (salt_buf_ptr, tmp_buf, 16);
9533
9534 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9535 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9536 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9537 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9538
9539 char *hash_pos = salt_pos + 22;
9540
9541 memset (tmp_buf, 0, sizeof (tmp_buf));
9542
9543 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9544
9545 memcpy (digest, tmp_buf, 24);
9546
9547 digest[0] = byte_swap_32 (digest[0]);
9548 digest[1] = byte_swap_32 (digest[1]);
9549 digest[2] = byte_swap_32 (digest[2]);
9550 digest[3] = byte_swap_32 (digest[3]);
9551 digest[4] = byte_swap_32 (digest[4]);
9552 digest[5] = byte_swap_32 (digest[5]);
9553
9554 digest[5] &= ~0xff; // its just 23 not 24 !
9555
9556 return (PARSER_OK);
9557 }
9558
9559 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9560 {
9561 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9562
9563 u32 *digest = (u32 *) hash_buf->digest;
9564
9565 u8 tmp_buf[100] = { 0 };
9566
9567 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
9568
9569 memcpy (digest, tmp_buf, 32);
9570
9571 digest[0] = byte_swap_32 (digest[0]);
9572 digest[1] = byte_swap_32 (digest[1]);
9573 digest[2] = byte_swap_32 (digest[2]);
9574 digest[3] = byte_swap_32 (digest[3]);
9575 digest[4] = byte_swap_32 (digest[4]);
9576 digest[5] = byte_swap_32 (digest[5]);
9577 digest[6] = byte_swap_32 (digest[6]);
9578 digest[7] = byte_swap_32 (digest[7]);
9579
9580 digest[0] -= SHA256M_A;
9581 digest[1] -= SHA256M_B;
9582 digest[2] -= SHA256M_C;
9583 digest[3] -= SHA256M_D;
9584 digest[4] -= SHA256M_E;
9585 digest[5] -= SHA256M_F;
9586 digest[6] -= SHA256M_G;
9587 digest[7] -= SHA256M_H;
9588
9589 return (PARSER_OK);
9590 }
9591
9592 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9593 {
9594 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9595
9596 u32 *digest = (u32 *) hash_buf->digest;
9597
9598 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9599 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9600
9601 digest[0] = byte_swap_32 (digest[0]);
9602 digest[1] = byte_swap_32 (digest[1]);
9603
9604 uint tt;
9605
9606 IP (digest[0], digest[1], tt);
9607
9608 digest[0] = digest[0];
9609 digest[1] = digest[1];
9610 digest[2] = 0;
9611 digest[3] = 0;
9612
9613 return (PARSER_OK);
9614 }
9615
9616 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9617 {
9618 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9619
9620 u32 *digest = (u32 *) hash_buf->digest;
9621
9622 salt_t *salt = hash_buf->salt;
9623
9624 char *hash_pos = input_buf + 8;
9625
9626 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
9627 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
9628 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
9629 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
9630 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
9631
9632 digest[0] -= SHA1M_A;
9633 digest[1] -= SHA1M_B;
9634 digest[2] -= SHA1M_C;
9635 digest[3] -= SHA1M_D;
9636 digest[4] -= SHA1M_E;
9637
9638 uint salt_len = 8;
9639
9640 char *salt_buf_ptr = (char *) salt->salt_buf;
9641
9642 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9643
9644 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9645
9646 salt->salt_len = salt_len;
9647
9648 return (PARSER_OK);
9649 }
9650
9651 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9652 {
9653 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9654
9655 u64 *digest = (u64 *) hash_buf->digest;
9656
9657 salt_t *salt = hash_buf->salt;
9658
9659 char *hash_pos = input_buf + 8;
9660
9661 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
9662 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
9663 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
9664 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
9665 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
9666 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
9667 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
9668 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
9669
9670 digest[0] -= SHA512M_A;
9671 digest[1] -= SHA512M_B;
9672 digest[2] -= SHA512M_C;
9673 digest[3] -= SHA512M_D;
9674 digest[4] -= SHA512M_E;
9675 digest[5] -= SHA512M_F;
9676 digest[6] -= SHA512M_G;
9677 digest[7] -= SHA512M_H;
9678
9679 uint salt_len = 8;
9680
9681 char *salt_buf_ptr = (char *) salt->salt_buf;
9682
9683 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9684
9685 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9686
9687 salt->salt_len = salt_len;
9688
9689 return (PARSER_OK);
9690 }
9691
9692 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9693 {
9694 if (data.opts_type & OPTS_TYPE_ST_HEX)
9695 {
9696 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9697 }
9698 else
9699 {
9700 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9701 }
9702
9703 u32 *digest = (u32 *) hash_buf->digest;
9704
9705 salt_t *salt = hash_buf->salt;
9706
9707 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9708 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9709 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9710 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9711
9712 digest[0] = byte_swap_32 (digest[0]);
9713 digest[1] = byte_swap_32 (digest[1]);
9714 digest[2] = byte_swap_32 (digest[2]);
9715 digest[3] = byte_swap_32 (digest[3]);
9716
9717 digest[0] -= MD5M_A;
9718 digest[1] -= MD5M_B;
9719 digest[2] -= MD5M_C;
9720 digest[3] -= MD5M_D;
9721
9722 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9723
9724 uint salt_len = input_len - 32 - 1;
9725
9726 char *salt_buf = input_buf + 32 + 1;
9727
9728 char *salt_buf_ptr = (char *) salt->salt_buf;
9729
9730 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9731
9732 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9733
9734 salt->salt_len = salt_len;
9735
9736 return (PARSER_OK);
9737 }
9738
9739 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9740 {
9741 if (data.opts_type & OPTS_TYPE_ST_HEX)
9742 {
9743 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9744 }
9745 else
9746 {
9747 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9748 }
9749
9750 // unscramble
9751
9752 char clean_input_buf[32] = { 0 };
9753
9754 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9755 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9756
9757 for (int i = 0, j = 0, k = 0; i < 30; i++)
9758 {
9759 if (i == pos[j])
9760 {
9761 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9762
9763 j++;
9764 }
9765 else
9766 {
9767 clean_input_buf[k] = input_buf[i];
9768
9769 k++;
9770 }
9771 }
9772
9773 // base64 decode
9774
9775 u32 *digest = (u32 *) hash_buf->digest;
9776
9777 salt_t *salt = hash_buf->salt;
9778
9779 u32 a, b, c, d, e, f;
9780
9781 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9782 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9783 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9784 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9785 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9786 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9787
9788 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9789 | (((d << 12) | (e << 6) | (f)) << 0);
9790
9791 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9792 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9793 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9794 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9795 e = base64_to_int (clean_input_buf[10] & 0x7f);
9796 f = base64_to_int (clean_input_buf[11] & 0x7f);
9797
9798 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9799 | (((d << 12) | (e << 6) | (f)) << 0);
9800
9801 a = base64_to_int (clean_input_buf[12] & 0x7f);
9802 b = base64_to_int (clean_input_buf[13] & 0x7f);
9803 c = base64_to_int (clean_input_buf[14] & 0x7f);
9804 d = base64_to_int (clean_input_buf[15] & 0x7f);
9805 e = base64_to_int (clean_input_buf[16] & 0x7f);
9806 f = base64_to_int (clean_input_buf[17] & 0x7f);
9807
9808 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9809 | (((d << 12) | (e << 6) | (f)) << 0);
9810
9811 a = base64_to_int (clean_input_buf[18] & 0x7f);
9812 b = base64_to_int (clean_input_buf[19] & 0x7f);
9813 c = base64_to_int (clean_input_buf[20] & 0x7f);
9814 d = base64_to_int (clean_input_buf[21] & 0x7f);
9815 e = base64_to_int (clean_input_buf[22] & 0x7f);
9816 f = base64_to_int (clean_input_buf[23] & 0x7f);
9817
9818 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
9819 | (((d << 12) | (e << 6) | (f)) << 0);
9820
9821 digest[0] = byte_swap_32 (digest[0]);
9822 digest[1] = byte_swap_32 (digest[1]);
9823 digest[2] = byte_swap_32 (digest[2]);
9824 digest[3] = byte_swap_32 (digest[3]);
9825
9826 digest[0] -= MD5M_A;
9827 digest[1] -= MD5M_B;
9828 digest[2] -= MD5M_C;
9829 digest[3] -= MD5M_D;
9830
9831 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
9832
9833 uint salt_len = input_len - 30 - 1;
9834
9835 char *salt_buf = input_buf + 30 + 1;
9836
9837 char *salt_buf_ptr = (char *) salt->salt_buf;
9838
9839 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9840
9841 // max. salt length: salt_buf[32] => 32 - 22 (":Administration Tools:") = 10
9842 if (salt_len > 10) return (PARSER_SALT_LENGTH);
9843
9844 salt->salt_len = salt_len;
9845
9846 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9847
9848 salt->salt_len += 22;
9849
9850 return (PARSER_OK);
9851 }
9852
9853 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9854 {
9855 if (data.opts_type & OPTS_TYPE_ST_HEX)
9856 {
9857 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9858 }
9859 else
9860 {
9861 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9862 }
9863
9864 u32 *digest = (u32 *) hash_buf->digest;
9865
9866 salt_t *salt = hash_buf->salt;
9867
9868 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9869 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9870 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9871 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9872 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
9873
9874 digest[0] -= SHA1M_A;
9875 digest[1] -= SHA1M_B;
9876 digest[2] -= SHA1M_C;
9877 digest[3] -= SHA1M_D;
9878 digest[4] -= SHA1M_E;
9879
9880 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9881
9882 uint salt_len = input_len - 40 - 1;
9883
9884 char *salt_buf = input_buf + 40 + 1;
9885
9886 char *salt_buf_ptr = (char *) salt->salt_buf;
9887
9888 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9889
9890 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9891
9892 salt->salt_len = salt_len;
9893
9894 return (PARSER_OK);
9895 }
9896
9897 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9898 {
9899 if (data.opts_type & OPTS_TYPE_ST_HEX)
9900 {
9901 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9902 }
9903 else
9904 {
9905 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9906 }
9907
9908 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9909
9910 char *iter_pos = input_buf + 6;
9911
9912 salt_t *salt = hash_buf->salt;
9913
9914 uint iter = atoi (iter_pos);
9915
9916 if (iter < 1)
9917 {
9918 iter = ROUNDS_DCC2;
9919 }
9920
9921 salt->salt_iter = iter - 1;
9922
9923 char *salt_pos = strchr (iter_pos, '#');
9924
9925 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9926
9927 salt_pos++;
9928
9929 char *digest_pos = strchr (salt_pos, '#');
9930
9931 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9932
9933 digest_pos++;
9934
9935 uint salt_len = digest_pos - salt_pos - 1;
9936
9937 u32 *digest = (u32 *) hash_buf->digest;
9938
9939 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
9940 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
9941 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
9942 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
9943
9944 char *salt_buf_ptr = (char *) salt->salt_buf;
9945
9946 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9947
9948 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9949
9950 salt->salt_len = salt_len;
9951
9952 return (PARSER_OK);
9953 }
9954
9955 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9956 {
9957 u32 *digest = (u32 *) hash_buf->digest;
9958
9959 salt_t *salt = hash_buf->salt;
9960
9961 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9962
9963 hccap_t in;
9964
9965 memcpy (&in, input_buf, input_len);
9966
9967 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9968
9969 memcpy (digest, in.keymic, 16);
9970
9971 /*
9972 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9973 The phrase "Pairwise key expansion"
9974 Access Point Address (referred to as Authenticator Address AA)
9975 Supplicant Address (referred to as Supplicant Address SA)
9976 Access Point Nonce (referred to as Authenticator Anonce)
9977 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9978 */
9979
9980 uint salt_len = strlen (in.essid);
9981
9982 memcpy (salt->salt_buf, in.essid, salt_len);
9983
9984 salt->salt_len = salt_len;
9985
9986 salt->salt_iter = ROUNDS_WPA2 - 1;
9987
9988 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
9989
9990 memcpy (pke_ptr, "Pairwise key expansion", 23);
9991
9992 if (memcmp (in.mac1, in.mac2, 6) < 0)
9993 {
9994 memcpy (pke_ptr + 23, in.mac1, 6);
9995 memcpy (pke_ptr + 29, in.mac2, 6);
9996 }
9997 else
9998 {
9999 memcpy (pke_ptr + 23, in.mac2, 6);
10000 memcpy (pke_ptr + 29, in.mac1, 6);
10001 }
10002
10003 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
10004 {
10005 memcpy (pke_ptr + 35, in.nonce1, 32);
10006 memcpy (pke_ptr + 67, in.nonce2, 32);
10007 }
10008 else
10009 {
10010 memcpy (pke_ptr + 35, in.nonce2, 32);
10011 memcpy (pke_ptr + 67, in.nonce1, 32);
10012 }
10013
10014 for (int i = 0; i < 25; i++)
10015 {
10016 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
10017 }
10018
10019 wpa->keyver = in.keyver;
10020
10021 if (wpa->keyver > 255)
10022 {
10023 log_info ("ATTENTION!");
10024 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
10025 log_info (" This could be due to a recent aircrack-ng bug.");
10026 log_info (" The key version was automatically reset to a reasonable value.");
10027 log_info ("");
10028
10029 wpa->keyver &= 0xff;
10030 }
10031
10032 wpa->eapol_size = in.eapol_size;
10033
10034 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
10035
10036 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
10037
10038 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
10039
10040 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10041
10042 if (wpa->keyver == 1)
10043 {
10044 // nothing to do
10045 }
10046 else
10047 {
10048 digest[0] = byte_swap_32 (digest[0]);
10049 digest[1] = byte_swap_32 (digest[1]);
10050 digest[2] = byte_swap_32 (digest[2]);
10051 digest[3] = byte_swap_32 (digest[3]);
10052
10053 for (int i = 0; i < 64; i++)
10054 {
10055 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10056 }
10057 }
10058
10059 salt->salt_buf[10] = digest[1];
10060 salt->salt_buf[11] = digest[2];
10061
10062 return (PARSER_OK);
10063 }
10064
10065 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10066 {
10067 u32 *digest = (u32 *) hash_buf->digest;
10068
10069 salt_t *salt = hash_buf->salt;
10070
10071 if (input_len == 0)
10072 {
10073 log_error ("Password Safe v2 container not specified");
10074
10075 exit (-1);
10076 }
10077
10078 FILE *fp = fopen (input_buf, "rb");
10079
10080 if (fp == NULL)
10081 {
10082 log_error ("%s: %s", input_buf, strerror (errno));
10083
10084 exit (-1);
10085 }
10086
10087 psafe2_hdr buf;
10088
10089 memset (&buf, 0, sizeof (psafe2_hdr));
10090
10091 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10092
10093 fclose (fp);
10094
10095 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10096
10097 salt->salt_buf[0] = buf.random[0];
10098 salt->salt_buf[1] = buf.random[1];
10099
10100 salt->salt_len = 8;
10101 salt->salt_iter = 1000;
10102
10103 digest[0] = byte_swap_32 (buf.hash[0]);
10104 digest[1] = byte_swap_32 (buf.hash[1]);
10105 digest[2] = byte_swap_32 (buf.hash[2]);
10106 digest[3] = byte_swap_32 (buf.hash[3]);
10107 digest[4] = byte_swap_32 (buf.hash[4]);
10108
10109 return (PARSER_OK);
10110 }
10111
10112 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10113 {
10114 u32 *digest = (u32 *) hash_buf->digest;
10115
10116 salt_t *salt = hash_buf->salt;
10117
10118 if (input_len == 0)
10119 {
10120 log_error (".psafe3 not specified");
10121
10122 exit (-1);
10123 }
10124
10125 FILE *fp = fopen (input_buf, "rb");
10126
10127 if (fp == NULL)
10128 {
10129 log_error ("%s: %s", input_buf, strerror (errno));
10130
10131 exit (-1);
10132 }
10133
10134 psafe3_t in;
10135
10136 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10137
10138 fclose (fp);
10139
10140 data.hashfile = input_buf; // we will need this in case it gets cracked
10141
10142 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10143
10144 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10145
10146 salt->salt_iter = in.iterations + 1;
10147
10148 salt->salt_buf[0] = in.salt_buf[0];
10149 salt->salt_buf[1] = in.salt_buf[1];
10150 salt->salt_buf[2] = in.salt_buf[2];
10151 salt->salt_buf[3] = in.salt_buf[3];
10152 salt->salt_buf[4] = in.salt_buf[4];
10153 salt->salt_buf[5] = in.salt_buf[5];
10154 salt->salt_buf[6] = in.salt_buf[6];
10155 salt->salt_buf[7] = in.salt_buf[7];
10156
10157 salt->salt_len = 32;
10158
10159 digest[0] = in.hash_buf[0];
10160 digest[1] = in.hash_buf[1];
10161 digest[2] = in.hash_buf[2];
10162 digest[3] = in.hash_buf[3];
10163 digest[4] = in.hash_buf[4];
10164 digest[5] = in.hash_buf[5];
10165 digest[6] = in.hash_buf[6];
10166 digest[7] = in.hash_buf[7];
10167
10168 digest[0] = byte_swap_32 (digest[0]);
10169 digest[1] = byte_swap_32 (digest[1]);
10170 digest[2] = byte_swap_32 (digest[2]);
10171 digest[3] = byte_swap_32 (digest[3]);
10172 digest[4] = byte_swap_32 (digest[4]);
10173 digest[5] = byte_swap_32 (digest[5]);
10174 digest[6] = byte_swap_32 (digest[6]);
10175 digest[7] = byte_swap_32 (digest[7]);
10176
10177 return (PARSER_OK);
10178 }
10179
10180 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10181 {
10182 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10183
10184 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10185
10186 u32 *digest = (u32 *) hash_buf->digest;
10187
10188 salt_t *salt = hash_buf->salt;
10189
10190 char *iter_pos = input_buf + 3;
10191
10192 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10193
10194 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10195
10196 memcpy ((char *) salt->salt_sign, input_buf, 4);
10197
10198 salt->salt_iter = salt_iter;
10199
10200 char *salt_pos = iter_pos + 1;
10201
10202 uint salt_len = 8;
10203
10204 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10205
10206 salt->salt_len = salt_len;
10207
10208 char *hash_pos = salt_pos + salt_len;
10209
10210 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10211
10212 return (PARSER_OK);
10213 }
10214
10215 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10216 {
10217 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10218
10219 u32 *digest = (u32 *) hash_buf->digest;
10220
10221 salt_t *salt = hash_buf->salt;
10222
10223 char *salt_pos = input_buf + 3;
10224
10225 uint iterations_len = 0;
10226
10227 if (memcmp (salt_pos, "rounds=", 7) == 0)
10228 {
10229 salt_pos += 7;
10230
10231 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10232
10233 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10234 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10235
10236 salt_pos[0] = 0x0;
10237
10238 salt->salt_iter = atoi (salt_pos - iterations_len);
10239
10240 salt_pos += 1;
10241
10242 iterations_len += 8;
10243 }
10244 else
10245 {
10246 salt->salt_iter = ROUNDS_MD5CRYPT;
10247 }
10248
10249 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10250
10251 char *hash_pos = strchr (salt_pos, '$');
10252
10253 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10254
10255 uint salt_len = hash_pos - salt_pos;
10256
10257 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10258
10259 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10260
10261 salt->salt_len = salt_len;
10262
10263 hash_pos++;
10264
10265 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10266
10267 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10268
10269 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10270
10271 return (PARSER_OK);
10272 }
10273
10274 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10275 {
10276 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10277
10278 u32 *digest = (u32 *) hash_buf->digest;
10279
10280 salt_t *salt = hash_buf->salt;
10281
10282 char *salt_pos = input_buf + 6;
10283
10284 uint iterations_len = 0;
10285
10286 if (memcmp (salt_pos, "rounds=", 7) == 0)
10287 {
10288 salt_pos += 7;
10289
10290 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10291
10292 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10293 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10294
10295 salt_pos[0] = 0x0;
10296
10297 salt->salt_iter = atoi (salt_pos - iterations_len);
10298
10299 salt_pos += 1;
10300
10301 iterations_len += 8;
10302 }
10303 else
10304 {
10305 salt->salt_iter = ROUNDS_MD5CRYPT;
10306 }
10307
10308 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10309
10310 char *hash_pos = strchr (salt_pos, '$');
10311
10312 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10313
10314 uint salt_len = hash_pos - salt_pos;
10315
10316 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10317
10318 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10319
10320 salt->salt_len = salt_len;
10321
10322 hash_pos++;
10323
10324 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10325
10326 return (PARSER_OK);
10327 }
10328
10329 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10330 {
10331 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10332
10333 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10334
10335 u32 *digest = (u32 *) hash_buf->digest;
10336
10337 salt_t *salt = hash_buf->salt;
10338
10339 char *salt_pos = input_buf + 14;
10340
10341 char *hash_pos = strchr (salt_pos, '*');
10342
10343 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10344
10345 hash_pos++;
10346
10347 uint salt_len = hash_pos - salt_pos - 1;
10348
10349 char *salt_buf_ptr = (char *) salt->salt_buf;
10350
10351 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10352
10353 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10354
10355 salt->salt_len = salt_len;
10356
10357 u8 tmp_buf[100] = { 0 };
10358
10359 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10360
10361 memcpy (digest, tmp_buf, 20);
10362
10363 digest[0] = byte_swap_32 (digest[0]);
10364 digest[1] = byte_swap_32 (digest[1]);
10365 digest[2] = byte_swap_32 (digest[2]);
10366 digest[3] = byte_swap_32 (digest[3]);
10367 digest[4] = byte_swap_32 (digest[4]);
10368
10369 digest[0] -= SHA1M_A;
10370 digest[1] -= SHA1M_B;
10371 digest[2] -= SHA1M_C;
10372 digest[3] -= SHA1M_D;
10373 digest[4] -= SHA1M_E;
10374
10375 return (PARSER_OK);
10376 }
10377
10378 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10379 {
10380 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10381
10382 unsigned char c12 = itoa64_to_int (input_buf[12]);
10383
10384 if (c12 & 3) return (PARSER_HASH_VALUE);
10385
10386 u32 *digest = (u32 *) hash_buf->digest;
10387
10388 salt_t *salt = hash_buf->salt;
10389
10390 // for ascii_digest
10391 salt->salt_sign[0] = input_buf[0];
10392 salt->salt_sign[1] = input_buf[1];
10393
10394 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10395 | itoa64_to_int (input_buf[1]) << 6;
10396
10397 salt->salt_len = 2;
10398
10399 u8 tmp_buf[100] = { 0 };
10400
10401 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10402
10403 memcpy (digest, tmp_buf, 8);
10404
10405 uint tt;
10406
10407 IP (digest[0], digest[1], tt);
10408
10409 digest[2] = 0;
10410 digest[3] = 0;
10411
10412 return (PARSER_OK);
10413 }
10414
10415 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10416 {
10417 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10418
10419 u32 *digest = (u32 *) hash_buf->digest;
10420
10421 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10422 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10423 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10424 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10425
10426 digest[0] = byte_swap_32 (digest[0]);
10427 digest[1] = byte_swap_32 (digest[1]);
10428 digest[2] = byte_swap_32 (digest[2]);
10429 digest[3] = byte_swap_32 (digest[3]);
10430
10431 digest[0] -= MD4M_A;
10432 digest[1] -= MD4M_B;
10433 digest[2] -= MD4M_C;
10434 digest[3] -= MD4M_D;
10435
10436 return (PARSER_OK);
10437 }
10438
10439 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10440 {
10441 if (data.opts_type & OPTS_TYPE_ST_HEX)
10442 {
10443 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10444 }
10445 else
10446 {
10447 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10448 }
10449
10450 u32 *digest = (u32 *) hash_buf->digest;
10451
10452 salt_t *salt = hash_buf->salt;
10453
10454 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10455 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10456 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10457 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10458
10459 digest[0] = byte_swap_32 (digest[0]);
10460 digest[1] = byte_swap_32 (digest[1]);
10461 digest[2] = byte_swap_32 (digest[2]);
10462 digest[3] = byte_swap_32 (digest[3]);
10463
10464 digest[0] -= MD4M_A;
10465 digest[1] -= MD4M_B;
10466 digest[2] -= MD4M_C;
10467 digest[3] -= MD4M_D;
10468
10469 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10470
10471 uint salt_len = input_len - 32 - 1;
10472
10473 char *salt_buf = input_buf + 32 + 1;
10474
10475 char *salt_buf_ptr = (char *) salt->salt_buf;
10476
10477 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10478
10479 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10480
10481 salt->salt_len = salt_len;
10482
10483 return (PARSER_OK);
10484 }
10485
10486 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10487 {
10488 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10489
10490 u32 *digest = (u32 *) hash_buf->digest;
10491
10492 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10493 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10494 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10495 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10496
10497 digest[0] = byte_swap_32 (digest[0]);
10498 digest[1] = byte_swap_32 (digest[1]);
10499 digest[2] = byte_swap_32 (digest[2]);
10500 digest[3] = byte_swap_32 (digest[3]);
10501
10502 digest[0] -= MD5M_A;
10503 digest[1] -= MD5M_B;
10504 digest[2] -= MD5M_C;
10505 digest[3] -= MD5M_D;
10506
10507 return (PARSER_OK);
10508 }
10509
10510 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10511 {
10512 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10513
10514 u32 *digest = (u32 *) hash_buf->digest;
10515
10516 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
10517 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
10518 digest[2] = 0;
10519 digest[3] = 0;
10520
10521 digest[0] = byte_swap_32 (digest[0]);
10522 digest[1] = byte_swap_32 (digest[1]);
10523
10524 return (PARSER_OK);
10525 }
10526
10527 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10528 {
10529 if (data.opts_type & OPTS_TYPE_ST_HEX)
10530 {
10531 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10532 }
10533 else
10534 {
10535 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10536 }
10537
10538 u32 *digest = (u32 *) hash_buf->digest;
10539
10540 salt_t *salt = hash_buf->salt;
10541
10542 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10543 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10544 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10545 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10546
10547 digest[0] = byte_swap_32 (digest[0]);
10548 digest[1] = byte_swap_32 (digest[1]);
10549 digest[2] = byte_swap_32 (digest[2]);
10550 digest[3] = byte_swap_32 (digest[3]);
10551
10552 digest[0] -= MD5M_A;
10553 digest[1] -= MD5M_B;
10554 digest[2] -= MD5M_C;
10555 digest[3] -= MD5M_D;
10556
10557 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10558
10559 uint salt_len = input_len - 32 - 1;
10560
10561 char *salt_buf = input_buf + 32 + 1;
10562
10563 char *salt_buf_ptr = (char *) salt->salt_buf;
10564
10565 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10566
10567 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10568
10569 salt->salt_len = salt_len;
10570
10571 return (PARSER_OK);
10572 }
10573
10574 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10575 {
10576 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10577
10578 u32 *digest = (u32 *) hash_buf->digest;
10579
10580 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10581 | itoa64_to_int (input_buf[ 1]) << 6
10582 | itoa64_to_int (input_buf[ 2]) << 12
10583 | itoa64_to_int (input_buf[ 3]) << 18;
10584 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10585 | itoa64_to_int (input_buf[ 5]) << 6
10586 | itoa64_to_int (input_buf[ 6]) << 12
10587 | itoa64_to_int (input_buf[ 7]) << 18;
10588 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10589 | itoa64_to_int (input_buf[ 9]) << 6
10590 | itoa64_to_int (input_buf[10]) << 12
10591 | itoa64_to_int (input_buf[11]) << 18;
10592 digest[3] = itoa64_to_int (input_buf[12]) << 0
10593 | itoa64_to_int (input_buf[13]) << 6
10594 | itoa64_to_int (input_buf[14]) << 12
10595 | itoa64_to_int (input_buf[15]) << 18;
10596
10597 digest[0] -= MD5M_A;
10598 digest[1] -= MD5M_B;
10599 digest[2] -= MD5M_C;
10600 digest[3] -= MD5M_D;
10601
10602 digest[0] &= 0x00ffffff;
10603 digest[1] &= 0x00ffffff;
10604 digest[2] &= 0x00ffffff;
10605 digest[3] &= 0x00ffffff;
10606
10607 return (PARSER_OK);
10608 }
10609
10610 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10611 {
10612 if (data.opts_type & OPTS_TYPE_ST_HEX)
10613 {
10614 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10615 }
10616 else
10617 {
10618 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10619 }
10620
10621 u32 *digest = (u32 *) hash_buf->digest;
10622
10623 salt_t *salt = hash_buf->salt;
10624
10625 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10626 | itoa64_to_int (input_buf[ 1]) << 6
10627 | itoa64_to_int (input_buf[ 2]) << 12
10628 | itoa64_to_int (input_buf[ 3]) << 18;
10629 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10630 | itoa64_to_int (input_buf[ 5]) << 6
10631 | itoa64_to_int (input_buf[ 6]) << 12
10632 | itoa64_to_int (input_buf[ 7]) << 18;
10633 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10634 | itoa64_to_int (input_buf[ 9]) << 6
10635 | itoa64_to_int (input_buf[10]) << 12
10636 | itoa64_to_int (input_buf[11]) << 18;
10637 digest[3] = itoa64_to_int (input_buf[12]) << 0
10638 | itoa64_to_int (input_buf[13]) << 6
10639 | itoa64_to_int (input_buf[14]) << 12
10640 | itoa64_to_int (input_buf[15]) << 18;
10641
10642 digest[0] -= MD5M_A;
10643 digest[1] -= MD5M_B;
10644 digest[2] -= MD5M_C;
10645 digest[3] -= MD5M_D;
10646
10647 digest[0] &= 0x00ffffff;
10648 digest[1] &= 0x00ffffff;
10649 digest[2] &= 0x00ffffff;
10650 digest[3] &= 0x00ffffff;
10651
10652 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10653
10654 uint salt_len = input_len - 16 - 1;
10655
10656 char *salt_buf = input_buf + 16 + 1;
10657
10658 char *salt_buf_ptr = (char *) salt->salt_buf;
10659
10660 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10661
10662 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10663
10664 salt->salt_len = salt_len;
10665
10666 return (PARSER_OK);
10667 }
10668
10669 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
10670 {
10671 key[0] = (nthash[0] >> 0);
10672 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10673 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10674 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10675 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10676 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10677 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10678 key[7] = (nthash[6] << 1);
10679
10680 key[0] |= 0x01;
10681 key[1] |= 0x01;
10682 key[2] |= 0x01;
10683 key[3] |= 0x01;
10684 key[4] |= 0x01;
10685 key[5] |= 0x01;
10686 key[6] |= 0x01;
10687 key[7] |= 0x01;
10688 }
10689
10690 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10691 {
10692 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10693
10694 u32 *digest = (u32 *) hash_buf->digest;
10695
10696 salt_t *salt = hash_buf->salt;
10697
10698 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10699
10700 /**
10701 * parse line
10702 */
10703
10704 char *user_pos = input_buf;
10705
10706 char *unused_pos = strchr (user_pos, ':');
10707
10708 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10709
10710 uint user_len = unused_pos - user_pos;
10711
10712 if (user_len > 60) return (PARSER_SALT_LENGTH);
10713
10714 unused_pos++;
10715
10716 char *domain_pos = strchr (unused_pos, ':');
10717
10718 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10719
10720 uint unused_len = domain_pos - unused_pos;
10721
10722 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10723
10724 domain_pos++;
10725
10726 char *srvchall_pos = strchr (domain_pos, ':');
10727
10728 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10729
10730 uint domain_len = srvchall_pos - domain_pos;
10731
10732 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10733
10734 srvchall_pos++;
10735
10736 char *hash_pos = strchr (srvchall_pos, ':');
10737
10738 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10739
10740 uint srvchall_len = hash_pos - srvchall_pos;
10741
10742 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10743
10744 hash_pos++;
10745
10746 char *clichall_pos = strchr (hash_pos, ':');
10747
10748 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10749
10750 uint hash_len = clichall_pos - hash_pos;
10751
10752 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10753
10754 clichall_pos++;
10755
10756 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10757
10758 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10759
10760 /**
10761 * store some data for later use
10762 */
10763
10764 netntlm->user_len = user_len * 2;
10765 netntlm->domain_len = domain_len * 2;
10766 netntlm->srvchall_len = srvchall_len / 2;
10767 netntlm->clichall_len = clichall_len / 2;
10768
10769 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10770 char *chall_ptr = (char *) netntlm->chall_buf;
10771
10772 /**
10773 * handle username and domainname
10774 */
10775
10776 for (uint i = 0; i < user_len; i++)
10777 {
10778 *userdomain_ptr++ = user_pos[i];
10779 *userdomain_ptr++ = 0;
10780 }
10781
10782 for (uint i = 0; i < domain_len; i++)
10783 {
10784 *userdomain_ptr++ = domain_pos[i];
10785 *userdomain_ptr++ = 0;
10786 }
10787
10788 /**
10789 * handle server challenge encoding
10790 */
10791
10792 for (uint i = 0; i < srvchall_len; i += 2)
10793 {
10794 const char p0 = srvchall_pos[i + 0];
10795 const char p1 = srvchall_pos[i + 1];
10796
10797 *chall_ptr++ = hex_convert (p1) << 0
10798 | hex_convert (p0) << 4;
10799 }
10800
10801 /**
10802 * handle client challenge encoding
10803 */
10804
10805 for (uint i = 0; i < clichall_len; i += 2)
10806 {
10807 const char p0 = clichall_pos[i + 0];
10808 const char p1 = clichall_pos[i + 1];
10809
10810 *chall_ptr++ = hex_convert (p1) << 0
10811 | hex_convert (p0) << 4;
10812 }
10813
10814 /**
10815 * store data
10816 */
10817
10818 char *salt_buf_ptr = (char *) salt->salt_buf;
10819
10820 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10821
10822 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10823
10824 salt->salt_len = salt_len;
10825
10826 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10827 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10828 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10829 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10830
10831 digest[0] = byte_swap_32 (digest[0]);
10832 digest[1] = byte_swap_32 (digest[1]);
10833 digest[2] = byte_swap_32 (digest[2]);
10834 digest[3] = byte_swap_32 (digest[3]);
10835
10836 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10837
10838 uint digest_tmp[2] = { 0 };
10839
10840 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10841 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
10842
10843 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10844 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10845
10846 /* special case 2: ESS */
10847
10848 if (srvchall_len == 48)
10849 {
10850 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10851 {
10852 uint w[16] = { 0 };
10853
10854 w[ 0] = netntlm->chall_buf[6];
10855 w[ 1] = netntlm->chall_buf[7];
10856 w[ 2] = netntlm->chall_buf[0];
10857 w[ 3] = netntlm->chall_buf[1];
10858 w[ 4] = 0x80;
10859 w[14] = 16 * 8;
10860
10861 uint dgst[4] = { 0 };
10862
10863 dgst[0] = MAGIC_A;
10864 dgst[1] = MAGIC_B;
10865 dgst[2] = MAGIC_C;
10866 dgst[3] = MAGIC_D;
10867
10868 md5_64 (w, dgst);
10869
10870 salt->salt_buf[0] = dgst[0];
10871 salt->salt_buf[1] = dgst[1];
10872 }
10873 }
10874
10875 /* precompute netntlmv1 exploit start */
10876
10877 for (uint i = 0; i < 0x10000; i++)
10878 {
10879 uint key_md4[2] = { i, 0 };
10880 uint key_des[2] = { 0, 0 };
10881
10882 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
10883
10884 uint Kc[16] = { 0 };
10885 uint Kd[16] = { 0 };
10886
10887 _des_keysetup (key_des, Kc, Kd, c_skb);
10888
10889 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10890
10891 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10892
10893 if (data3[0] != digest_tmp[0]) continue;
10894 if (data3[1] != digest_tmp[1]) continue;
10895
10896 salt->salt_buf[2] = i;
10897
10898 salt->salt_len = 24;
10899
10900 break;
10901 }
10902
10903 salt->salt_buf_pc[0] = digest_tmp[0];
10904 salt->salt_buf_pc[1] = digest_tmp[1];
10905
10906 /* precompute netntlmv1 exploit stop */
10907
10908 u32 tt;
10909
10910 IP (digest[0], digest[1], tt);
10911 IP (digest[2], digest[3], tt);
10912
10913 digest[0] = rotr32 (digest[0], 29);
10914 digest[1] = rotr32 (digest[1], 29);
10915 digest[2] = rotr32 (digest[2], 29);
10916 digest[3] = rotr32 (digest[3], 29);
10917
10918 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10919
10920 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
10921 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
10922
10923 return (PARSER_OK);
10924 }
10925
10926 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10927 {
10928 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10929
10930 u32 *digest = (u32 *) hash_buf->digest;
10931
10932 salt_t *salt = hash_buf->salt;
10933
10934 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10935
10936 /**
10937 * parse line
10938 */
10939
10940 char *user_pos = input_buf;
10941
10942 char *unused_pos = strchr (user_pos, ':');
10943
10944 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10945
10946 uint user_len = unused_pos - user_pos;
10947
10948 if (user_len > 60) return (PARSER_SALT_LENGTH);
10949
10950 unused_pos++;
10951
10952 char *domain_pos = strchr (unused_pos, ':');
10953
10954 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10955
10956 uint unused_len = domain_pos - unused_pos;
10957
10958 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10959
10960 domain_pos++;
10961
10962 char *srvchall_pos = strchr (domain_pos, ':');
10963
10964 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10965
10966 uint domain_len = srvchall_pos - domain_pos;
10967
10968 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10969
10970 srvchall_pos++;
10971
10972 char *hash_pos = strchr (srvchall_pos, ':');
10973
10974 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10975
10976 uint srvchall_len = hash_pos - srvchall_pos;
10977
10978 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
10979
10980 hash_pos++;
10981
10982 char *clichall_pos = strchr (hash_pos, ':');
10983
10984 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10985
10986 uint hash_len = clichall_pos - hash_pos;
10987
10988 if (hash_len != 32) return (PARSER_HASH_LENGTH);
10989
10990 clichall_pos++;
10991
10992 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10993
10994 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
10995
10996 if (clichall_len % 2) return (PARSER_SALT_VALUE);
10997
10998 /**
10999 * store some data for later use
11000 */
11001
11002 netntlm->user_len = user_len * 2;
11003 netntlm->domain_len = domain_len * 2;
11004 netntlm->srvchall_len = srvchall_len / 2;
11005 netntlm->clichall_len = clichall_len / 2;
11006
11007 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
11008 char *chall_ptr = (char *) netntlm->chall_buf;
11009
11010 /**
11011 * handle username and domainname
11012 */
11013
11014 for (uint i = 0; i < user_len; i++)
11015 {
11016 *userdomain_ptr++ = toupper (user_pos[i]);
11017 *userdomain_ptr++ = 0;
11018 }
11019
11020 for (uint i = 0; i < domain_len; i++)
11021 {
11022 *userdomain_ptr++ = domain_pos[i];
11023 *userdomain_ptr++ = 0;
11024 }
11025
11026 *userdomain_ptr++ = 0x80;
11027
11028 /**
11029 * handle server challenge encoding
11030 */
11031
11032 for (uint i = 0; i < srvchall_len; i += 2)
11033 {
11034 const char p0 = srvchall_pos[i + 0];
11035 const char p1 = srvchall_pos[i + 1];
11036
11037 *chall_ptr++ = hex_convert (p1) << 0
11038 | hex_convert (p0) << 4;
11039 }
11040
11041 /**
11042 * handle client challenge encoding
11043 */
11044
11045 for (uint i = 0; i < clichall_len; i += 2)
11046 {
11047 const char p0 = clichall_pos[i + 0];
11048 const char p1 = clichall_pos[i + 1];
11049
11050 *chall_ptr++ = hex_convert (p1) << 0
11051 | hex_convert (p0) << 4;
11052 }
11053
11054 *chall_ptr++ = 0x80;
11055
11056 /**
11057 * handle hash itself
11058 */
11059
11060 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11061 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11062 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11063 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11064
11065 digest[0] = byte_swap_32 (digest[0]);
11066 digest[1] = byte_swap_32 (digest[1]);
11067 digest[2] = byte_swap_32 (digest[2]);
11068 digest[3] = byte_swap_32 (digest[3]);
11069
11070 /**
11071 * reuse challange data as salt_buf, its the buffer that is most likely unique
11072 */
11073
11074 salt->salt_buf[0] = 0;
11075 salt->salt_buf[1] = 0;
11076 salt->salt_buf[2] = 0;
11077 salt->salt_buf[3] = 0;
11078 salt->salt_buf[4] = 0;
11079 salt->salt_buf[5] = 0;
11080 salt->salt_buf[6] = 0;
11081 salt->salt_buf[7] = 0;
11082
11083 uint *uptr;
11084
11085 uptr = (uint *) netntlm->userdomain_buf;
11086
11087 for (uint i = 0; i < 16; i += 16)
11088 {
11089 md5_64 (uptr, salt->salt_buf);
11090 }
11091
11092 uptr = (uint *) netntlm->chall_buf;
11093
11094 for (uint i = 0; i < 256; i += 16)
11095 {
11096 md5_64 (uptr, salt->salt_buf);
11097 }
11098
11099 salt->salt_len = 16;
11100
11101 return (PARSER_OK);
11102 }
11103
11104 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11105 {
11106 if (data.opts_type & OPTS_TYPE_ST_HEX)
11107 {
11108 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11109 }
11110 else
11111 {
11112 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11113 }
11114
11115 u32 *digest = (u32 *) hash_buf->digest;
11116
11117 salt_t *salt = hash_buf->salt;
11118
11119 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11120 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11121 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11122 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11123
11124 digest[0] = byte_swap_32 (digest[0]);
11125 digest[1] = byte_swap_32 (digest[1]);
11126 digest[2] = byte_swap_32 (digest[2]);
11127 digest[3] = byte_swap_32 (digest[3]);
11128
11129 digest[0] -= MD5M_A;
11130 digest[1] -= MD5M_B;
11131 digest[2] -= MD5M_C;
11132 digest[3] -= MD5M_D;
11133
11134 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11135
11136 uint salt_len = input_len - 32 - 1;
11137
11138 char *salt_buf = input_buf + 32 + 1;
11139
11140 char *salt_buf_ptr = (char *) salt->salt_buf;
11141
11142 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11143
11144 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11145
11146 salt->salt_len = salt_len;
11147
11148 return (PARSER_OK);
11149 }
11150
11151 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11152 {
11153 if (data.opts_type & OPTS_TYPE_ST_HEX)
11154 {
11155 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11156 }
11157 else
11158 {
11159 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11160 }
11161
11162 u32 *digest = (u32 *) hash_buf->digest;
11163
11164 salt_t *salt = hash_buf->salt;
11165
11166 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11167 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11168 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11169 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11170
11171 digest[0] = byte_swap_32 (digest[0]);
11172 digest[1] = byte_swap_32 (digest[1]);
11173 digest[2] = byte_swap_32 (digest[2]);
11174 digest[3] = byte_swap_32 (digest[3]);
11175
11176 digest[0] -= MD5M_A;
11177 digest[1] -= MD5M_B;
11178 digest[2] -= MD5M_C;
11179 digest[3] -= MD5M_D;
11180
11181 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11182
11183 uint salt_len = input_len - 32 - 1;
11184
11185 char *salt_buf = input_buf + 32 + 1;
11186
11187 char *salt_buf_ptr = (char *) salt->salt_buf;
11188
11189 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11190
11191 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11192
11193 salt->salt_len = salt_len;
11194
11195 return (PARSER_OK);
11196 }
11197
11198 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11199 {
11200 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11201
11202 u32 *digest = (u32 *) hash_buf->digest;
11203
11204 salt_t *salt = hash_buf->salt;
11205
11206 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11207 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11208 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11209 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11210
11211 digest[0] = byte_swap_32 (digest[0]);
11212 digest[1] = byte_swap_32 (digest[1]);
11213 digest[2] = byte_swap_32 (digest[2]);
11214 digest[3] = byte_swap_32 (digest[3]);
11215
11216 digest[0] -= MD5M_A;
11217 digest[1] -= MD5M_B;
11218 digest[2] -= MD5M_C;
11219 digest[3] -= MD5M_D;
11220
11221 /**
11222 * This is a virtual salt. While the algorithm is basically not salted
11223 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11224 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11225 */
11226
11227 char *salt_buf_ptr = (char *) salt->salt_buf;
11228
11229 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11230
11231 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11232
11233 salt->salt_len = salt_len;
11234
11235 return (PARSER_OK);
11236 }
11237
11238 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11239 {
11240 if (data.opts_type & OPTS_TYPE_ST_HEX)
11241 {
11242 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11243 }
11244 else
11245 {
11246 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11247 }
11248
11249 u32 *digest = (u32 *) hash_buf->digest;
11250
11251 salt_t *salt = hash_buf->salt;
11252
11253 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11254 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11255 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11256 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11257
11258 digest[0] = byte_swap_32 (digest[0]);
11259 digest[1] = byte_swap_32 (digest[1]);
11260 digest[2] = byte_swap_32 (digest[2]);
11261 digest[3] = byte_swap_32 (digest[3]);
11262
11263 digest[0] -= MD5M_A;
11264 digest[1] -= MD5M_B;
11265 digest[2] -= MD5M_C;
11266 digest[3] -= MD5M_D;
11267
11268 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11269
11270 uint salt_len = input_len - 32 - 1;
11271
11272 char *salt_buf = input_buf + 32 + 1;
11273
11274 char *salt_buf_ptr = (char *) salt->salt_buf;
11275
11276 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11277
11278 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11279
11280 salt->salt_len = salt_len;
11281
11282 return (PARSER_OK);
11283 }
11284
11285 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11286 {
11287 if (data.opts_type & OPTS_TYPE_ST_HEX)
11288 {
11289 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11290 }
11291 else
11292 {
11293 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11294 }
11295
11296 u32 *digest = (u32 *) hash_buf->digest;
11297
11298 salt_t *salt = hash_buf->salt;
11299
11300 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11301 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11302 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11303 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11304
11305 digest[0] = byte_swap_32 (digest[0]);
11306 digest[1] = byte_swap_32 (digest[1]);
11307 digest[2] = byte_swap_32 (digest[2]);
11308 digest[3] = byte_swap_32 (digest[3]);
11309
11310 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11311
11312 uint salt_len = input_len - 32 - 1;
11313
11314 char *salt_buf = input_buf + 32 + 1;
11315
11316 char *salt_buf_ptr = (char *) salt->salt_buf;
11317
11318 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11319
11320 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11321
11322 salt->salt_len = salt_len;
11323
11324 return (PARSER_OK);
11325 }
11326
11327 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11328 {
11329 if (data.opts_type & OPTS_TYPE_ST_HEX)
11330 {
11331 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11332 }
11333 else
11334 {
11335 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11336 }
11337
11338 u32 *digest = (u32 *) hash_buf->digest;
11339
11340 salt_t *salt = hash_buf->salt;
11341
11342 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11343 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11344 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11345 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11346
11347 digest[0] = byte_swap_32 (digest[0]);
11348 digest[1] = byte_swap_32 (digest[1]);
11349 digest[2] = byte_swap_32 (digest[2]);
11350 digest[3] = byte_swap_32 (digest[3]);
11351
11352 digest[0] -= MD4M_A;
11353 digest[1] -= MD4M_B;
11354 digest[2] -= MD4M_C;
11355 digest[3] -= MD4M_D;
11356
11357 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11358
11359 uint salt_len = input_len - 32 - 1;
11360
11361 char *salt_buf = input_buf + 32 + 1;
11362
11363 char *salt_buf_ptr = (char *) salt->salt_buf;
11364
11365 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11366
11367 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11368
11369 salt->salt_len = salt_len;
11370
11371 return (PARSER_OK);
11372 }
11373
11374 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11375 {
11376 if (data.opts_type & OPTS_TYPE_ST_HEX)
11377 {
11378 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11379 }
11380 else
11381 {
11382 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11383 }
11384
11385 u32 *digest = (u32 *) hash_buf->digest;
11386
11387 salt_t *salt = hash_buf->salt;
11388
11389 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11390 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11391 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11392 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11393
11394 digest[0] = byte_swap_32 (digest[0]);
11395 digest[1] = byte_swap_32 (digest[1]);
11396 digest[2] = byte_swap_32 (digest[2]);
11397 digest[3] = byte_swap_32 (digest[3]);
11398
11399 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11400
11401 uint salt_len = input_len - 32 - 1;
11402
11403 char *salt_buf = input_buf + 32 + 1;
11404
11405 uint salt_pc_block[16] = { 0 };
11406
11407 char *salt_pc_block_ptr = (char *) salt_pc_block;
11408
11409 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11410
11411 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11412
11413 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11414
11415 salt_pc_block[14] = salt_len * 8;
11416
11417 uint salt_pc_digest[4] = { MAGIC_A, MAGIC_B, MAGIC_C, MAGIC_D };
11418
11419 md5_64 (salt_pc_block, salt_pc_digest);
11420
11421 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11422 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11423 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11424 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11425
11426 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11427
11428 memcpy (salt_buf_ptr, salt_buf, salt_len);
11429
11430 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11431
11432 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11433 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11434 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11435 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11436
11437 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11438
11439 return (PARSER_OK);
11440 }
11441
11442 int sha1_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 digest[0] -= SHA1M_A;
11455 digest[1] -= SHA1M_B;
11456 digest[2] -= SHA1M_C;
11457 digest[3] -= SHA1M_D;
11458 digest[4] -= SHA1M_E;
11459
11460 return (PARSER_OK);
11461 }
11462
11463 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11464 {
11465 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11466
11467 u32 *digest = (u32 *) hash_buf->digest;
11468
11469 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11470 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11471 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11472 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11473 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11474
11475 return (PARSER_OK);
11476 }
11477
11478 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11479 {
11480 if (data.opts_type & OPTS_TYPE_ST_HEX)
11481 {
11482 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11483 }
11484 else
11485 {
11486 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11487 }
11488
11489 u32 *digest = (u32 *) hash_buf->digest;
11490
11491 salt_t *salt = hash_buf->salt;
11492
11493 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11494 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11495 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11496 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11497 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11498
11499 digest[0] -= SHA1M_A;
11500 digest[1] -= SHA1M_B;
11501 digest[2] -= SHA1M_C;
11502 digest[3] -= SHA1M_D;
11503 digest[4] -= SHA1M_E;
11504
11505 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11506
11507 uint salt_len = input_len - 40 - 1;
11508
11509 char *salt_buf = input_buf + 40 + 1;
11510
11511 char *salt_buf_ptr = (char *) salt->salt_buf;
11512
11513 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11514
11515 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11516
11517 salt->salt_len = salt_len;
11518
11519 return (PARSER_OK);
11520 }
11521
11522 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11523 {
11524 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11525
11526 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11527
11528 u32 *digest = (u32 *) hash_buf->digest;
11529
11530 u8 tmp_buf[100] = { 0 };
11531
11532 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
11533
11534 memcpy (digest, tmp_buf, 20);
11535
11536 digest[0] = byte_swap_32 (digest[0]);
11537 digest[1] = byte_swap_32 (digest[1]);
11538 digest[2] = byte_swap_32 (digest[2]);
11539 digest[3] = byte_swap_32 (digest[3]);
11540 digest[4] = byte_swap_32 (digest[4]);
11541
11542 digest[0] -= SHA1M_A;
11543 digest[1] -= SHA1M_B;
11544 digest[2] -= SHA1M_C;
11545 digest[3] -= SHA1M_D;
11546 digest[4] -= SHA1M_E;
11547
11548 return (PARSER_OK);
11549 }
11550
11551 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11552 {
11553 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11554
11555 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11556
11557 u32 *digest = (u32 *) hash_buf->digest;
11558
11559 salt_t *salt = hash_buf->salt;
11560
11561 u8 tmp_buf[100] = { 0 };
11562
11563 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
11564
11565 memcpy (digest, tmp_buf, 20);
11566
11567 salt->salt_len = tmp_len - 20;
11568
11569 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11570
11571 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11572 {
11573 char *ptr = (char *) salt->salt_buf;
11574
11575 ptr[salt->salt_len] = 0x80;
11576 }
11577
11578 digest[0] = byte_swap_32 (digest[0]);
11579 digest[1] = byte_swap_32 (digest[1]);
11580 digest[2] = byte_swap_32 (digest[2]);
11581 digest[3] = byte_swap_32 (digest[3]);
11582 digest[4] = byte_swap_32 (digest[4]);
11583
11584 digest[0] -= SHA1M_A;
11585 digest[1] -= SHA1M_B;
11586 digest[2] -= SHA1M_C;
11587 digest[3] -= SHA1M_D;
11588 digest[4] -= SHA1M_E;
11589
11590 return (PARSER_OK);
11591 }
11592
11593 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11594 {
11595 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11596
11597 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11598
11599 u32 *digest = (u32 *) hash_buf->digest;
11600
11601 salt_t *salt = hash_buf->salt;
11602
11603 char *salt_buf = input_buf + 6;
11604
11605 uint salt_len = 8;
11606
11607 char *salt_buf_ptr = (char *) salt->salt_buf;
11608
11609 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11610
11611 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11612
11613 salt->salt_len = salt_len;
11614
11615 char *hash_pos = input_buf + 6 + 8 + 40;
11616
11617 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11618 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11619 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11620 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11621 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11622
11623 digest[0] -= SHA1M_A;
11624 digest[1] -= SHA1M_B;
11625 digest[2] -= SHA1M_C;
11626 digest[3] -= SHA1M_D;
11627 digest[4] -= SHA1M_E;
11628
11629 return (PARSER_OK);
11630 }
11631
11632 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11633 {
11634 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11635
11636 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11637
11638 u32 *digest = (u32 *) hash_buf->digest;
11639
11640 salt_t *salt = hash_buf->salt;
11641
11642 char *salt_buf = input_buf + 6;
11643
11644 uint salt_len = 8;
11645
11646 char *salt_buf_ptr = (char *) salt->salt_buf;
11647
11648 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11649
11650 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11651
11652 salt->salt_len = salt_len;
11653
11654 char *hash_pos = input_buf + 6 + 8;
11655
11656 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11657 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11658 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11659 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11660 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11661
11662 digest[0] -= SHA1M_A;
11663 digest[1] -= SHA1M_B;
11664 digest[2] -= SHA1M_C;
11665 digest[3] -= SHA1M_D;
11666 digest[4] -= SHA1M_E;
11667
11668 return (PARSER_OK);
11669 }
11670
11671 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11672 {
11673 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11674
11675 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11676
11677 u64 *digest = (u64 *) hash_buf->digest;
11678
11679 salt_t *salt = hash_buf->salt;
11680
11681 char *salt_buf = input_buf + 6;
11682
11683 uint salt_len = 8;
11684
11685 char *salt_buf_ptr = (char *) salt->salt_buf;
11686
11687 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11688
11689 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11690
11691 salt->salt_len = salt_len;
11692
11693 char *hash_pos = input_buf + 6 + 8;
11694
11695 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
11696 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
11697 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
11698 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
11699 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
11700 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
11701 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
11702 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
11703
11704 digest[0] -= SHA512M_A;
11705 digest[1] -= SHA512M_B;
11706 digest[2] -= SHA512M_C;
11707 digest[3] -= SHA512M_D;
11708 digest[4] -= SHA512M_E;
11709 digest[5] -= SHA512M_F;
11710 digest[6] -= SHA512M_G;
11711 digest[7] -= SHA512M_H;
11712
11713 return (PARSER_OK);
11714 }
11715
11716 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11717 {
11718 if (data.opts_type & OPTS_TYPE_ST_HEX)
11719 {
11720 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11721 }
11722 else
11723 {
11724 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11725 }
11726
11727 u32 *digest = (u32 *) hash_buf->digest;
11728
11729 salt_t *salt = hash_buf->salt;
11730
11731 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11732 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11733 digest[2] = 0;
11734 digest[3] = 0;
11735
11736 digest[0] = byte_swap_32 (digest[0]);
11737 digest[1] = byte_swap_32 (digest[1]);
11738
11739 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11740
11741 uint salt_len = input_len - 16 - 1;
11742
11743 char *salt_buf = input_buf + 16 + 1;
11744
11745 char *salt_buf_ptr = (char *) salt->salt_buf;
11746
11747 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11748
11749 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11750
11751 salt->salt_len = salt_len;
11752
11753 return (PARSER_OK);
11754 }
11755
11756 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11757 {
11758 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11759
11760 u32 *digest = (u32 *) hash_buf->digest;
11761
11762 salt_t *salt = hash_buf->salt;
11763
11764 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11765 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11766 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11767 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11768 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11769
11770 digest[0] -= SHA1M_A;
11771 digest[1] -= SHA1M_B;
11772 digest[2] -= SHA1M_C;
11773 digest[3] -= SHA1M_D;
11774 digest[4] -= SHA1M_E;
11775
11776 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11777
11778 uint salt_len = input_len - 40 - 1;
11779
11780 char *salt_buf = input_buf + 40 + 1;
11781
11782 char *salt_buf_ptr = (char *) salt->salt_buf;
11783
11784 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11785
11786 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11787
11788 salt->salt_len = salt_len;
11789
11790 return (PARSER_OK);
11791 }
11792
11793 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11794 {
11795 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11796
11797 u32 *digest = (u32 *) hash_buf->digest;
11798
11799 salt_t *salt = hash_buf->salt;
11800
11801 char *hash_pos = input_buf;
11802
11803 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11804 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11805 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
11806 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
11807 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
11808 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
11809 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
11810 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
11811 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
11812 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
11813 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
11814 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
11815 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
11816 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
11817 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
11818 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
11819
11820 char *salt_pos = input_buf + 128;
11821
11822 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
11823 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
11824 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
11825 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
11826
11827 salt->salt_iter = ROUNDS_ORACLET - 1;
11828 salt->salt_len = 16;
11829
11830 return (PARSER_OK);
11831 }
11832
11833 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11834 {
11835 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11836
11837 u32 *digest = (u32 *) hash_buf->digest;
11838
11839 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11840 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11841 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11842 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11843 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11844 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11845 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11846 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11847
11848 digest[0] -= SHA256M_A;
11849 digest[1] -= SHA256M_B;
11850 digest[2] -= SHA256M_C;
11851 digest[3] -= SHA256M_D;
11852 digest[4] -= SHA256M_E;
11853 digest[5] -= SHA256M_F;
11854 digest[6] -= SHA256M_G;
11855 digest[7] -= SHA256M_H;
11856
11857 return (PARSER_OK);
11858 }
11859
11860 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11861 {
11862 if (data.opts_type & OPTS_TYPE_ST_HEX)
11863 {
11864 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11865 }
11866 else
11867 {
11868 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11869 }
11870
11871 u32 *digest = (u32 *) hash_buf->digest;
11872
11873 salt_t *salt = hash_buf->salt;
11874
11875 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11876 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11877 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11878 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11879 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11880 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11881 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11882 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11883
11884 digest[0] -= SHA256M_A;
11885 digest[1] -= SHA256M_B;
11886 digest[2] -= SHA256M_C;
11887 digest[3] -= SHA256M_D;
11888 digest[4] -= SHA256M_E;
11889 digest[5] -= SHA256M_F;
11890 digest[6] -= SHA256M_G;
11891 digest[7] -= SHA256M_H;
11892
11893 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11894
11895 uint salt_len = input_len - 64 - 1;
11896
11897 char *salt_buf = input_buf + 64 + 1;
11898
11899 char *salt_buf_ptr = (char *) salt->salt_buf;
11900
11901 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11902
11903 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11904
11905 salt->salt_len = salt_len;
11906
11907 return (PARSER_OK);
11908 }
11909
11910 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11911 {
11912 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11913
11914 u64 *digest = (u64 *) hash_buf->digest;
11915
11916 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11917 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11918 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11919 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11920 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11921 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11922 digest[6] = 0;
11923 digest[7] = 0;
11924
11925 digest[0] -= SHA384M_A;
11926 digest[1] -= SHA384M_B;
11927 digest[2] -= SHA384M_C;
11928 digest[3] -= SHA384M_D;
11929 digest[4] -= SHA384M_E;
11930 digest[5] -= SHA384M_F;
11931 digest[6] -= 0;
11932 digest[7] -= 0;
11933
11934 return (PARSER_OK);
11935 }
11936
11937 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11938 {
11939 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
11940
11941 u64 *digest = (u64 *) hash_buf->digest;
11942
11943 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11944 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11945 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11946 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11947 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11948 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11949 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11950 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11951
11952 digest[0] -= SHA512M_A;
11953 digest[1] -= SHA512M_B;
11954 digest[2] -= SHA512M_C;
11955 digest[3] -= SHA512M_D;
11956 digest[4] -= SHA512M_E;
11957 digest[5] -= SHA512M_F;
11958 digest[6] -= SHA512M_G;
11959 digest[7] -= SHA512M_H;
11960
11961 return (PARSER_OK);
11962 }
11963
11964 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11965 {
11966 if (data.opts_type & OPTS_TYPE_ST_HEX)
11967 {
11968 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
11969 }
11970 else
11971 {
11972 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
11973 }
11974
11975 u64 *digest = (u64 *) hash_buf->digest;
11976
11977 salt_t *salt = hash_buf->salt;
11978
11979 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11980 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11981 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11982 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11983 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11984 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11985 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11986 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11987
11988 digest[0] -= SHA512M_A;
11989 digest[1] -= SHA512M_B;
11990 digest[2] -= SHA512M_C;
11991 digest[3] -= SHA512M_D;
11992 digest[4] -= SHA512M_E;
11993 digest[5] -= SHA512M_F;
11994 digest[6] -= SHA512M_G;
11995 digest[7] -= SHA512M_H;
11996
11997 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11998
11999 uint salt_len = input_len - 128 - 1;
12000
12001 char *salt_buf = input_buf + 128 + 1;
12002
12003 char *salt_buf_ptr = (char *) salt->salt_buf;
12004
12005 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12006
12007 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12008
12009 salt->salt_len = salt_len;
12010
12011 return (PARSER_OK);
12012 }
12013
12014 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12015 {
12016 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12017
12018 u64 *digest = (u64 *) hash_buf->digest;
12019
12020 salt_t *salt = hash_buf->salt;
12021
12022 char *salt_pos = input_buf + 3;
12023
12024 uint iterations_len = 0;
12025
12026 if (memcmp (salt_pos, "rounds=", 7) == 0)
12027 {
12028 salt_pos += 7;
12029
12030 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12031
12032 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12033 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12034
12035 salt_pos[0] = 0x0;
12036
12037 salt->salt_iter = atoi (salt_pos - iterations_len);
12038
12039 salt_pos += 1;
12040
12041 iterations_len += 8;
12042 }
12043 else
12044 {
12045 salt->salt_iter = ROUNDS_SHA512CRYPT;
12046 }
12047
12048 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12049
12050 char *hash_pos = strchr (salt_pos, '$');
12051
12052 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12053
12054 uint salt_len = hash_pos - salt_pos;
12055
12056 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12057
12058 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12059
12060 salt->salt_len = salt_len;
12061
12062 hash_pos++;
12063
12064 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12065
12066 return (PARSER_OK);
12067 }
12068
12069 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12070 {
12071 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12072
12073 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12074
12075 u64 *digest = (u64 *) hash_buf->digest;
12076
12077 salt_t *salt = hash_buf->salt;
12078
12079 uint keccak_mdlen = input_len / 2;
12080
12081 for (uint i = 0; i < keccak_mdlen / 8; i++)
12082 {
12083 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12084
12085 digest[i] = byte_swap_64 (digest[i]);
12086 }
12087
12088 salt->keccak_mdlen = keccak_mdlen;
12089
12090 return (PARSER_OK);
12091 }
12092
12093 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12094 {
12095 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12096
12097 u32 *digest = (u32 *) hash_buf->digest;
12098
12099 salt_t *salt = hash_buf->salt;
12100
12101 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12102
12103 /**
12104 * Parse that strange long line
12105 */
12106
12107 char *in_off[9];
12108
12109 size_t in_len[9] = { 0 };
12110
12111 in_off[0] = strtok (input_buf, ":");
12112
12113 in_len[0] = strlen (in_off[0]);
12114
12115 size_t i;
12116
12117 for (i = 1; i < 9; i++)
12118 {
12119 in_off[i] = strtok (NULL, ":");
12120
12121 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12122
12123 in_len[i] = strlen (in_off[i]);
12124 }
12125
12126 char *ptr = (char *) ikepsk->msg_buf;
12127
12128 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12129 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12130 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12131 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12132 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12133 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12134
12135 *ptr = 0x80;
12136
12137 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12138
12139 ptr = (char *) ikepsk->nr_buf;
12140
12141 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12142 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12143
12144 *ptr = 0x80;
12145
12146 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12147
12148 /**
12149 * Store to database
12150 */
12151
12152 ptr = in_off[8];
12153
12154 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12155 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12156 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12157 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12158
12159 digest[0] = byte_swap_32 (digest[0]);
12160 digest[1] = byte_swap_32 (digest[1]);
12161 digest[2] = byte_swap_32 (digest[2]);
12162 digest[3] = byte_swap_32 (digest[3]);
12163
12164 salt->salt_len = 32;
12165
12166 salt->salt_buf[0] = ikepsk->nr_buf[0];
12167 salt->salt_buf[1] = ikepsk->nr_buf[1];
12168 salt->salt_buf[2] = ikepsk->nr_buf[2];
12169 salt->salt_buf[3] = ikepsk->nr_buf[3];
12170 salt->salt_buf[4] = ikepsk->nr_buf[4];
12171 salt->salt_buf[5] = ikepsk->nr_buf[5];
12172 salt->salt_buf[6] = ikepsk->nr_buf[6];
12173 salt->salt_buf[7] = ikepsk->nr_buf[7];
12174
12175 return (PARSER_OK);
12176 }
12177
12178 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12179 {
12180 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12181
12182 u32 *digest = (u32 *) hash_buf->digest;
12183
12184 salt_t *salt = hash_buf->salt;
12185
12186 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12187
12188 /**
12189 * Parse that strange long line
12190 */
12191
12192 char *in_off[9];
12193
12194 size_t in_len[9] = { 0 };
12195
12196 in_off[0] = strtok (input_buf, ":");
12197
12198 in_len[0] = strlen (in_off[0]);
12199
12200 size_t i;
12201
12202 for (i = 1; i < 9; i++)
12203 {
12204 in_off[i] = strtok (NULL, ":");
12205
12206 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12207
12208 in_len[i] = strlen (in_off[i]);
12209 }
12210
12211 char *ptr = (char *) ikepsk->msg_buf;
12212
12213 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12214 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12215 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12216 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12217 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12218 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12219
12220 *ptr = 0x80;
12221
12222 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12223
12224 ptr = (char *) ikepsk->nr_buf;
12225
12226 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12227 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12228
12229 *ptr = 0x80;
12230
12231 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12232
12233 /**
12234 * Store to database
12235 */
12236
12237 ptr = in_off[8];
12238
12239 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12240 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12241 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12242 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12243 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12244
12245 salt->salt_len = 32;
12246
12247 salt->salt_buf[0] = ikepsk->nr_buf[0];
12248 salt->salt_buf[1] = ikepsk->nr_buf[1];
12249 salt->salt_buf[2] = ikepsk->nr_buf[2];
12250 salt->salt_buf[3] = ikepsk->nr_buf[3];
12251 salt->salt_buf[4] = ikepsk->nr_buf[4];
12252 salt->salt_buf[5] = ikepsk->nr_buf[5];
12253 salt->salt_buf[6] = ikepsk->nr_buf[6];
12254 salt->salt_buf[7] = ikepsk->nr_buf[7];
12255
12256 return (PARSER_OK);
12257 }
12258
12259 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12260 {
12261 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) 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
12271 digest[0] = byte_swap_32 (digest[0]);
12272 digest[1] = byte_swap_32 (digest[1]);
12273 digest[2] = byte_swap_32 (digest[2]);
12274 digest[3] = byte_swap_32 (digest[3]);
12275 digest[4] = byte_swap_32 (digest[4]);
12276
12277 return (PARSER_OK);
12278 }
12279
12280 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12281 {
12282 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12283
12284 u32 *digest = (u32 *) hash_buf->digest;
12285
12286 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12287 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12288 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12289 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12290 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12291 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12292 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12293 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12294 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12295 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12296 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12297 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12298 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12299 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12300 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12301 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12302
12303 return (PARSER_OK);
12304 }
12305
12306 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12307 {
12308 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12309
12310 u32 *digest = (u32 *) hash_buf->digest;
12311
12312 salt_t *salt = hash_buf->salt;
12313
12314 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12315 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12316 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12317 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12318 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12319
12320 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12321
12322 uint salt_len = input_len - 40 - 1;
12323
12324 char *salt_buf = input_buf + 40 + 1;
12325
12326 char *salt_buf_ptr = (char *) salt->salt_buf;
12327
12328 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12329
12330 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12331
12332 salt->salt_len = salt_len;
12333
12334 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12335
12336 return (PARSER_OK);
12337 }
12338
12339 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12340 {
12341 u32 *digest = (u32 *) hash_buf->digest;
12342
12343 salt_t *salt = hash_buf->salt;
12344
12345 tc_t *tc = (tc_t *) hash_buf->esalt;
12346
12347 if (input_len == 0)
12348 {
12349 log_error ("TrueCrypt container not specified");
12350
12351 exit (-1);
12352 }
12353
12354 FILE *fp = fopen (input_buf, "rb");
12355
12356 if (fp == NULL)
12357 {
12358 log_error ("%s: %s", input_buf, strerror (errno));
12359
12360 exit (-1);
12361 }
12362
12363 char buf[512] = { 0 };
12364
12365 int n = fread (buf, 1, sizeof (buf), fp);
12366
12367 fclose (fp);
12368
12369 if (n != 512) return (PARSER_TC_FILE_SIZE);
12370
12371 memcpy (tc->salt_buf, buf, 64);
12372
12373 memcpy (tc->data_buf, buf + 64, 512 - 64);
12374
12375 salt->salt_buf[0] = tc->salt_buf[0];
12376
12377 salt->salt_len = 4;
12378
12379 salt->salt_iter = 1000 - 1;
12380
12381 digest[0] = tc->data_buf[0];
12382
12383 return (PARSER_OK);
12384 }
12385
12386 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12387 {
12388 u32 *digest = (u32 *) hash_buf->digest;
12389
12390 salt_t *salt = hash_buf->salt;
12391
12392 tc_t *tc = (tc_t *) hash_buf->esalt;
12393
12394 if (input_len == 0)
12395 {
12396 log_error ("TrueCrypt container not specified");
12397
12398 exit (-1);
12399 }
12400
12401 FILE *fp = fopen (input_buf, "rb");
12402
12403 if (fp == NULL)
12404 {
12405 log_error ("%s: %s", input_buf, strerror (errno));
12406
12407 exit (-1);
12408 }
12409
12410 char buf[512] = { 0 };
12411
12412 int n = fread (buf, 1, sizeof (buf), fp);
12413
12414 fclose (fp);
12415
12416 if (n != 512) return (PARSER_TC_FILE_SIZE);
12417
12418 memcpy (tc->salt_buf, buf, 64);
12419
12420 memcpy (tc->data_buf, buf + 64, 512 - 64);
12421
12422 salt->salt_buf[0] = tc->salt_buf[0];
12423
12424 salt->salt_len = 4;
12425
12426 salt->salt_iter = 2000 - 1;
12427
12428 digest[0] = tc->data_buf[0];
12429
12430 return (PARSER_OK);
12431 }
12432
12433 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12434 {
12435 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12436
12437 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12438
12439 u32 *digest = (u32 *) hash_buf->digest;
12440
12441 salt_t *salt = hash_buf->salt;
12442
12443 char *salt_pos = input_buf + 6;
12444
12445 char *hash_pos = strchr (salt_pos, '$');
12446
12447 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12448
12449 uint salt_len = hash_pos - salt_pos;
12450
12451 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12452
12453 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12454
12455 salt->salt_len = salt_len;
12456
12457 salt->salt_iter = 1000;
12458
12459 hash_pos++;
12460
12461 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12462
12463 return (PARSER_OK);
12464 }
12465
12466 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12467 {
12468 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12469
12470 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12471
12472 u32 *digest = (u32 *) hash_buf->digest;
12473
12474 salt_t *salt = hash_buf->salt;
12475
12476 char *iter_pos = input_buf + 7;
12477
12478 char *salt_pos = strchr (iter_pos, '$');
12479
12480 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12481
12482 salt_pos++;
12483
12484 char *hash_pos = strchr (salt_pos, '$');
12485
12486 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12487
12488 uint salt_len = hash_pos - salt_pos;
12489
12490 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12491
12492 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12493
12494 salt->salt_len = salt_len;
12495
12496 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12497
12498 salt->salt_sign[0] = atoi (salt_iter);
12499
12500 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12501
12502 hash_pos++;
12503
12504 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12505
12506 digest[0] = byte_swap_32 (digest[0]);
12507 digest[1] = byte_swap_32 (digest[1]);
12508 digest[2] = byte_swap_32 (digest[2]);
12509 digest[3] = byte_swap_32 (digest[3]);
12510 digest[4] = byte_swap_32 (digest[4]);
12511
12512 return (PARSER_OK);
12513 }
12514
12515 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12516 {
12517 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12518
12519 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12520
12521 u32 *digest = (u32 *) hash_buf->digest;
12522
12523 salt_t *salt = hash_buf->salt;
12524
12525 char *iter_pos = input_buf + 9;
12526
12527 char *salt_pos = strchr (iter_pos, '$');
12528
12529 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12530
12531 salt_pos++;
12532
12533 char *hash_pos = strchr (salt_pos, '$');
12534
12535 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12536
12537 uint salt_len = hash_pos - salt_pos;
12538
12539 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12540
12541 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12542
12543 salt->salt_len = salt_len;
12544
12545 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12546
12547 salt->salt_sign[0] = atoi (salt_iter);
12548
12549 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12550
12551 hash_pos++;
12552
12553 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12554
12555 digest[0] = byte_swap_32 (digest[0]);
12556 digest[1] = byte_swap_32 (digest[1]);
12557 digest[2] = byte_swap_32 (digest[2]);
12558 digest[3] = byte_swap_32 (digest[3]);
12559 digest[4] = byte_swap_32 (digest[4]);
12560 digest[5] = byte_swap_32 (digest[5]);
12561 digest[6] = byte_swap_32 (digest[6]);
12562 digest[7] = byte_swap_32 (digest[7]);
12563
12564 return (PARSER_OK);
12565 }
12566
12567 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12568 {
12569 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12570
12571 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12572
12573 u64 *digest = (u64 *) hash_buf->digest;
12574
12575 salt_t *salt = hash_buf->salt;
12576
12577 char *iter_pos = input_buf + 9;
12578
12579 char *salt_pos = strchr (iter_pos, '$');
12580
12581 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12582
12583 salt_pos++;
12584
12585 char *hash_pos = strchr (salt_pos, '$');
12586
12587 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12588
12589 uint salt_len = hash_pos - salt_pos;
12590
12591 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12592
12593 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12594
12595 salt->salt_len = salt_len;
12596
12597 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12598
12599 salt->salt_sign[0] = atoi (salt_iter);
12600
12601 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12602
12603 hash_pos++;
12604
12605 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12606
12607 digest[0] = byte_swap_64 (digest[0]);
12608 digest[1] = byte_swap_64 (digest[1]);
12609 digest[2] = byte_swap_64 (digest[2]);
12610 digest[3] = byte_swap_64 (digest[3]);
12611 digest[4] = byte_swap_64 (digest[4]);
12612 digest[5] = byte_swap_64 (digest[5]);
12613 digest[6] = byte_swap_64 (digest[6]);
12614 digest[7] = byte_swap_64 (digest[7]);
12615
12616 return (PARSER_OK);
12617 }
12618
12619 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12620 {
12621 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12622
12623 u32 *digest = (u32 *) hash_buf->digest;
12624
12625 salt_t *salt = hash_buf->salt;
12626
12627 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12628
12629 /**
12630 * parse line
12631 */
12632
12633 char *iterations_pos = input_buf;
12634
12635 char *saltbuf_pos = strchr (iterations_pos, ':');
12636
12637 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12638
12639 uint iterations_len = saltbuf_pos - iterations_pos;
12640
12641 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12642
12643 saltbuf_pos++;
12644
12645 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12646
12647 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12648
12649 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12650
12651 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12652
12653 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12654
12655 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12656
12657 cipherbuf_pos++;
12658
12659 /**
12660 * pbkdf2 iterations
12661 */
12662
12663 salt->salt_iter = atoi (iterations_pos) - 1;
12664
12665 /**
12666 * handle salt encoding
12667 */
12668
12669 char *saltbuf_ptr = (char *) salt->salt_buf;
12670
12671 for (uint i = 0; i < saltbuf_len; i += 2)
12672 {
12673 const char p0 = saltbuf_pos[i + 0];
12674 const char p1 = saltbuf_pos[i + 1];
12675
12676 *saltbuf_ptr++ = hex_convert (p1) << 0
12677 | hex_convert (p0) << 4;
12678 }
12679
12680 salt->salt_len = saltbuf_len / 2;
12681
12682 /**
12683 * handle cipher encoding
12684 */
12685
12686 uint *tmp = (uint *) mymalloc (32);
12687
12688 char *cipherbuf_ptr = (char *) tmp;
12689
12690 for (uint i = 2016; i < cipherbuf_len; i += 2)
12691 {
12692 const char p0 = cipherbuf_pos[i + 0];
12693 const char p1 = cipherbuf_pos[i + 1];
12694
12695 *cipherbuf_ptr++ = hex_convert (p1) << 0
12696 | hex_convert (p0) << 4;
12697 }
12698
12699 // iv is stored at salt_buf 4 (length 16)
12700 // data is stored at salt_buf 8 (length 16)
12701
12702 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12703 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12704 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12705 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12706
12707 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12708 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12709 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12710 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12711
12712 free (tmp);
12713
12714 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12715 {
12716 const char p0 = cipherbuf_pos[j + 0];
12717 const char p1 = cipherbuf_pos[j + 1];
12718
12719 agilekey->cipher[i] = hex_convert (p1) << 0
12720 | hex_convert (p0) << 4;
12721 }
12722
12723 /**
12724 * digest buf
12725 */
12726
12727 digest[0] = 0x10101010;
12728 digest[1] = 0x10101010;
12729 digest[2] = 0x10101010;
12730 digest[3] = 0x10101010;
12731
12732 return (PARSER_OK);
12733 }
12734
12735 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12736 {
12737 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12738
12739 u32 *digest = (u32 *) hash_buf->digest;
12740
12741 salt_t *salt = hash_buf->salt;
12742
12743 char *hashbuf_pos = input_buf;
12744
12745 char *iterations_pos = strchr (hashbuf_pos, ':');
12746
12747 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12748
12749 uint hash_len = iterations_pos - hashbuf_pos;
12750
12751 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12752
12753 iterations_pos++;
12754
12755 char *saltbuf_pos = strchr (iterations_pos, ':');
12756
12757 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12758
12759 uint iterations_len = saltbuf_pos - iterations_pos;
12760
12761 saltbuf_pos++;
12762
12763 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12764
12765 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12766
12767 char *salt_buf_ptr = (char *) salt->salt_buf;
12768
12769 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12770
12771 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12772
12773 salt->salt_len = salt_len;
12774
12775 salt->salt_iter = atoi (iterations_pos) - 1;
12776
12777 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
12778 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
12779 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
12780 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
12781
12782 return (PARSER_OK);
12783 }
12784
12785 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12786 {
12787 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12788
12789 u32 *digest = (u32 *) hash_buf->digest;
12790
12791 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12792 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12793 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12794 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12795 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12796 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12797 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12798 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12799
12800 digest[0] = byte_swap_32 (digest[0]);
12801 digest[1] = byte_swap_32 (digest[1]);
12802 digest[2] = byte_swap_32 (digest[2]);
12803 digest[3] = byte_swap_32 (digest[3]);
12804 digest[4] = byte_swap_32 (digest[4]);
12805 digest[5] = byte_swap_32 (digest[5]);
12806 digest[6] = byte_swap_32 (digest[6]);
12807 digest[7] = byte_swap_32 (digest[7]);
12808
12809 return (PARSER_OK);
12810 }
12811
12812 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12813 {
12814 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12815
12816 u32 *digest = (u32 *) hash_buf->digest;
12817
12818 salt_t *salt = hash_buf->salt;
12819
12820 char *salt_pos = input_buf + 3;
12821
12822 uint iterations_len = 0;
12823
12824 if (memcmp (salt_pos, "rounds=", 7) == 0)
12825 {
12826 salt_pos += 7;
12827
12828 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12829
12830 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12831 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12832
12833 salt_pos[0] = 0x0;
12834
12835 salt->salt_iter = atoi (salt_pos - iterations_len);
12836
12837 salt_pos += 1;
12838
12839 iterations_len += 8;
12840 }
12841 else
12842 {
12843 salt->salt_iter = ROUNDS_SHA256CRYPT;
12844 }
12845
12846 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12847
12848 char *hash_pos = strchr (salt_pos, '$');
12849
12850 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12851
12852 uint salt_len = hash_pos - salt_pos;
12853
12854 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12855
12856 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12857
12858 salt->salt_len = salt_len;
12859
12860 hash_pos++;
12861
12862 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12863
12864 return (PARSER_OK);
12865 }
12866
12867 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12868 {
12869 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12870
12871 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12872
12873 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12874
12875 u64 *digest = (u64 *) hash_buf->digest;
12876
12877 salt_t *salt = hash_buf->salt;
12878
12879 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12880
12881 char *iter_pos = input_buf + 4;
12882
12883 char *salt_pos = strchr (iter_pos, '$');
12884
12885 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12886
12887 salt_pos++;
12888
12889 char *hash_pos = strchr (salt_pos, '$');
12890
12891 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12892
12893 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12894
12895 hash_pos++;
12896
12897 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12898 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12899 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12900 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12901 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12902 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12903 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12904 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12905
12906 uint salt_len = hash_pos - salt_pos - 1;
12907
12908 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12909
12910 salt->salt_len = salt_len / 2;
12911
12912 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12913 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12914 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12915 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12916 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
12917 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
12918 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
12919 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
12920
12921 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12922 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12923 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12924 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12925 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12926 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12927 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12928 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12929 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12930 pbkdf2_sha512->salt_buf[9] = 0x80;
12931
12932 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12933
12934 salt->salt_iter = atoi (iter_pos) - 1;
12935
12936 return (PARSER_OK);
12937 }
12938
12939 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12940 {
12941 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12942
12943 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12944
12945 u32 *digest = (u32 *) hash_buf->digest;
12946
12947 salt_t *salt = hash_buf->salt;
12948
12949 char *salt_pos = input_buf + 14;
12950
12951 char *hash_pos = strchr (salt_pos, '*');
12952
12953 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12954
12955 hash_pos++;
12956
12957 uint salt_len = hash_pos - salt_pos - 1;
12958
12959 char *salt_buf_ptr = (char *) salt->salt_buf;
12960
12961 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
12962
12963 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12964
12965 salt->salt_len = salt_len;
12966
12967 u8 tmp_buf[100] = { 0 };
12968
12969 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
12970
12971 memcpy (digest, tmp_buf, 32);
12972
12973 digest[0] = byte_swap_32 (digest[0]);
12974 digest[1] = byte_swap_32 (digest[1]);
12975 digest[2] = byte_swap_32 (digest[2]);
12976 digest[3] = byte_swap_32 (digest[3]);
12977 digest[4] = byte_swap_32 (digest[4]);
12978 digest[5] = byte_swap_32 (digest[5]);
12979 digest[6] = byte_swap_32 (digest[6]);
12980 digest[7] = byte_swap_32 (digest[7]);
12981
12982 digest[0] -= SHA256M_A;
12983 digest[1] -= SHA256M_B;
12984 digest[2] -= SHA256M_C;
12985 digest[3] -= SHA256M_D;
12986 digest[4] -= SHA256M_E;
12987 digest[5] -= SHA256M_F;
12988 digest[6] -= SHA256M_G;
12989 digest[7] -= SHA256M_H;
12990
12991 return (PARSER_OK);
12992 }
12993
12994 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12995 {
12996 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
12997
12998 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12999
13000 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
13001
13002 u64 *digest = (u64 *) hash_buf->digest;
13003
13004 salt_t *salt = hash_buf->salt;
13005
13006 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13007
13008 char *iter_pos = input_buf + 19;
13009
13010 char *salt_pos = strchr (iter_pos, '.');
13011
13012 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13013
13014 salt_pos++;
13015
13016 char *hash_pos = strchr (salt_pos, '.');
13017
13018 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13019
13020 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13021
13022 hash_pos++;
13023
13024 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13025 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13026 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13027 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13028 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13029 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13030 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13031 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13032
13033 uint salt_len = hash_pos - salt_pos - 1;
13034
13035 salt_len /= 2;
13036
13037 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13038
13039 uint i;
13040
13041 for (i = 0; i < salt_len; i++)
13042 {
13043 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13044 }
13045
13046 salt_buf_ptr[salt_len + 3] = 0x01;
13047 salt_buf_ptr[salt_len + 4] = 0x80;
13048
13049 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13050
13051 salt->salt_len = salt_len;
13052
13053 salt->salt_iter = atoi (iter_pos) - 1;
13054
13055 return (PARSER_OK);
13056 }
13057
13058 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13059 {
13060 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13061
13062 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13063
13064 u64 *digest = (u64 *) hash_buf->digest;
13065
13066 salt_t *salt = hash_buf->salt;
13067
13068 u8 tmp_buf[120] = { 0 };
13069
13070 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13071
13072 memcpy (digest, tmp_buf, 64);
13073
13074 digest[0] = byte_swap_64 (digest[0]);
13075 digest[1] = byte_swap_64 (digest[1]);
13076 digest[2] = byte_swap_64 (digest[2]);
13077 digest[3] = byte_swap_64 (digest[3]);
13078 digest[4] = byte_swap_64 (digest[4]);
13079 digest[5] = byte_swap_64 (digest[5]);
13080 digest[6] = byte_swap_64 (digest[6]);
13081 digest[7] = byte_swap_64 (digest[7]);
13082
13083 digest[0] -= SHA512M_A;
13084 digest[1] -= SHA512M_B;
13085 digest[2] -= SHA512M_C;
13086 digest[3] -= SHA512M_D;
13087 digest[4] -= SHA512M_E;
13088 digest[5] -= SHA512M_F;
13089 digest[6] -= SHA512M_G;
13090 digest[7] -= SHA512M_H;
13091
13092 salt->salt_len = tmp_len - 64;
13093
13094 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13095
13096 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13097 {
13098 char *ptr = (char *) salt->salt_buf;
13099
13100 ptr[salt->salt_len] = 0x80;
13101 }
13102
13103 return (PARSER_OK);
13104 }
13105
13106 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13107 {
13108 if (data.opts_type & OPTS_TYPE_ST_HEX)
13109 {
13110 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13111 }
13112 else
13113 {
13114 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13115 }
13116
13117 u32 *digest = (u32 *) hash_buf->digest;
13118
13119 salt_t *salt = hash_buf->salt;
13120
13121 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13122 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13123 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13124 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13125
13126 digest[0] = byte_swap_32 (digest[0]);
13127 digest[1] = byte_swap_32 (digest[1]);
13128 digest[2] = byte_swap_32 (digest[2]);
13129 digest[3] = byte_swap_32 (digest[3]);
13130
13131 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13132
13133 uint salt_len = input_len - 32 - 1;
13134
13135 char *salt_buf = input_buf + 32 + 1;
13136
13137 char *salt_buf_ptr = (char *) salt->salt_buf;
13138
13139 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13140
13141 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13142
13143 salt->salt_len = salt_len;
13144
13145 return (PARSER_OK);
13146 }
13147
13148 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13149 {
13150 if (data.opts_type & OPTS_TYPE_ST_HEX)
13151 {
13152 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13153 }
13154 else
13155 {
13156 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13157 }
13158
13159 u32 *digest = (u32 *) hash_buf->digest;
13160
13161 salt_t *salt = hash_buf->salt;
13162
13163 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13164 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13165 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13166 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13167 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13168
13169 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13170
13171 uint salt_len = input_len - 40 - 1;
13172
13173 char *salt_buf = input_buf + 40 + 1;
13174
13175 char *salt_buf_ptr = (char *) salt->salt_buf;
13176
13177 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13178
13179 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13180
13181 salt->salt_len = salt_len;
13182
13183 return (PARSER_OK);
13184 }
13185
13186 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13187 {
13188 if (data.opts_type & OPTS_TYPE_ST_HEX)
13189 {
13190 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13191 }
13192 else
13193 {
13194 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13195 }
13196
13197 u32 *digest = (u32 *) hash_buf->digest;
13198
13199 salt_t *salt = hash_buf->salt;
13200
13201 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13202 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13203 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13204 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13205 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13206 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13207 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13208 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13209
13210 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13211
13212 uint salt_len = input_len - 64 - 1;
13213
13214 char *salt_buf = input_buf + 64 + 1;
13215
13216 char *salt_buf_ptr = (char *) salt->salt_buf;
13217
13218 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13219
13220 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13221
13222 salt->salt_len = salt_len;
13223
13224 return (PARSER_OK);
13225 }
13226
13227 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13228 {
13229 if (data.opts_type & OPTS_TYPE_ST_HEX)
13230 {
13231 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13232 }
13233 else
13234 {
13235 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13236 }
13237
13238 u64 *digest = (u64 *) hash_buf->digest;
13239
13240 salt_t *salt = hash_buf->salt;
13241
13242 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
13243 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
13244 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
13245 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
13246 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
13247 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
13248 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
13249 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
13250
13251 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13252
13253 uint salt_len = input_len - 128 - 1;
13254
13255 char *salt_buf = input_buf + 128 + 1;
13256
13257 char *salt_buf_ptr = (char *) salt->salt_buf;
13258
13259 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13260
13261 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13262
13263 salt->salt_len = salt_len;
13264
13265 return (PARSER_OK);
13266 }
13267
13268 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13269 {
13270 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13271
13272 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13273
13274 u32 *digest = (u32 *) hash_buf->digest;
13275
13276 salt_t *salt = hash_buf->salt;
13277
13278 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13279
13280 /**
13281 * parse line
13282 */
13283
13284 char *user_pos = input_buf + 10 + 1;
13285
13286 char *realm_pos = strchr (user_pos, '$');
13287
13288 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13289
13290 uint user_len = realm_pos - user_pos;
13291
13292 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13293
13294 realm_pos++;
13295
13296 char *salt_pos = strchr (realm_pos, '$');
13297
13298 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13299
13300 uint realm_len = salt_pos - realm_pos;
13301
13302 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13303
13304 salt_pos++;
13305
13306 char *data_pos = strchr (salt_pos, '$');
13307
13308 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13309
13310 uint salt_len = data_pos - salt_pos;
13311
13312 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13313
13314 data_pos++;
13315
13316 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13317
13318 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13319
13320 /**
13321 * copy data
13322 */
13323
13324 memcpy (krb5pa->user, user_pos, user_len);
13325 memcpy (krb5pa->realm, realm_pos, realm_len);
13326 memcpy (krb5pa->salt, salt_pos, salt_len);
13327
13328 char *timestamp_ptr = (char *) krb5pa->timestamp;
13329
13330 for (uint i = 0; i < (36 * 2); i += 2)
13331 {
13332 const char p0 = data_pos[i + 0];
13333 const char p1 = data_pos[i + 1];
13334
13335 *timestamp_ptr++ = hex_convert (p1) << 0
13336 | hex_convert (p0) << 4;
13337 }
13338
13339 char *checksum_ptr = (char *) krb5pa->checksum;
13340
13341 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13342 {
13343 const char p0 = data_pos[i + 0];
13344 const char p1 = data_pos[i + 1];
13345
13346 *checksum_ptr++ = hex_convert (p1) << 0
13347 | hex_convert (p0) << 4;
13348 }
13349
13350 /**
13351 * copy some data to generic buffers to make sorting happy
13352 */
13353
13354 salt->salt_buf[0] = krb5pa->timestamp[0];
13355 salt->salt_buf[1] = krb5pa->timestamp[1];
13356 salt->salt_buf[2] = krb5pa->timestamp[2];
13357 salt->salt_buf[3] = krb5pa->timestamp[3];
13358 salt->salt_buf[4] = krb5pa->timestamp[4];
13359 salt->salt_buf[5] = krb5pa->timestamp[5];
13360 salt->salt_buf[6] = krb5pa->timestamp[6];
13361 salt->salt_buf[7] = krb5pa->timestamp[7];
13362 salt->salt_buf[8] = krb5pa->timestamp[8];
13363
13364 salt->salt_len = 36;
13365
13366 digest[0] = krb5pa->checksum[0];
13367 digest[1] = krb5pa->checksum[1];
13368 digest[2] = krb5pa->checksum[2];
13369 digest[3] = krb5pa->checksum[3];
13370
13371 return (PARSER_OK);
13372 }
13373
13374 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13375 {
13376 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13377
13378 u32 *digest = (u32 *) hash_buf->digest;
13379
13380 salt_t *salt = hash_buf->salt;
13381
13382 /**
13383 * parse line
13384 */
13385
13386 char *salt_pos = input_buf;
13387
13388 char *hash_pos = strchr (salt_pos, '$');
13389
13390 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13391
13392 uint salt_len = hash_pos - salt_pos;
13393
13394 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13395
13396 hash_pos++;
13397
13398 uint hash_len = input_len - 1 - salt_len;
13399
13400 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13401
13402 /**
13403 * valid some data
13404 */
13405
13406 uint user_len = 0;
13407
13408 for (uint i = 0; i < salt_len; i++)
13409 {
13410 if (salt_pos[i] == ' ') continue;
13411
13412 user_len++;
13413 }
13414
13415 // SAP user names cannot be longer than 12 characters
13416 if (user_len > 12) return (PARSER_SALT_LENGTH);
13417
13418 // SAP user name cannot start with ! or ?
13419 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13420
13421 /**
13422 * copy data
13423 */
13424
13425 char *salt_buf_ptr = (char *) salt->salt_buf;
13426
13427 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13428
13429 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13430
13431 salt->salt_len = salt_len;
13432
13433 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
13434 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
13435 digest[2] = 0;
13436 digest[3] = 0;
13437
13438 digest[0] = byte_swap_32 (digest[0]);
13439 digest[1] = byte_swap_32 (digest[1]);
13440
13441 return (PARSER_OK);
13442 }
13443
13444 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13445 {
13446 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13447
13448 u32 *digest = (u32 *) hash_buf->digest;
13449
13450 salt_t *salt = hash_buf->salt;
13451
13452 /**
13453 * parse line
13454 */
13455
13456 char *salt_pos = input_buf;
13457
13458 char *hash_pos = strchr (salt_pos, '$');
13459
13460 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13461
13462 uint salt_len = hash_pos - salt_pos;
13463
13464 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13465
13466 hash_pos++;
13467
13468 uint hash_len = input_len - 1 - salt_len;
13469
13470 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13471
13472 /**
13473 * valid some data
13474 */
13475
13476 uint user_len = 0;
13477
13478 for (uint i = 0; i < salt_len; i++)
13479 {
13480 if (salt_pos[i] == ' ') continue;
13481
13482 user_len++;
13483 }
13484
13485 // SAP user names cannot be longer than 12 characters
13486 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
13487 // so far nobody complained so we stay with this because it helps in optimization
13488 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
13489
13490 if (user_len > 12) return (PARSER_SALT_LENGTH);
13491
13492 // SAP user name cannot start with ! or ?
13493 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13494
13495 /**
13496 * copy data
13497 */
13498
13499 char *salt_buf_ptr = (char *) salt->salt_buf;
13500
13501 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13502
13503 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13504
13505 salt->salt_len = salt_len;
13506
13507 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13508 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13509 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13510 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13511 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13512
13513 return (PARSER_OK);
13514 }
13515
13516 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13517 {
13518 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13519
13520 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13521
13522 u64 *digest = (u64 *) hash_buf->digest;
13523
13524 salt_t *salt = hash_buf->salt;
13525
13526 char *iter_pos = input_buf + 3;
13527
13528 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13529
13530 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13531
13532 memcpy ((char *) salt->salt_sign, input_buf, 4);
13533
13534 salt->salt_iter = salt_iter;
13535
13536 char *salt_pos = iter_pos + 1;
13537
13538 uint salt_len = 8;
13539
13540 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13541
13542 salt->salt_len = salt_len;
13543
13544 char *hash_pos = salt_pos + salt_len;
13545
13546 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13547
13548 // ugly hack start
13549
13550 char *tmp = (char *) salt->salt_buf_pc;
13551
13552 tmp[0] = hash_pos[42];
13553
13554 // ugly hack end
13555
13556 digest[ 0] = byte_swap_64 (digest[ 0]);
13557 digest[ 1] = byte_swap_64 (digest[ 1]);
13558 digest[ 2] = byte_swap_64 (digest[ 2]);
13559 digest[ 3] = byte_swap_64 (digest[ 3]);
13560 digest[ 4] = 0;
13561 digest[ 5] = 0;
13562 digest[ 6] = 0;
13563 digest[ 7] = 0;
13564
13565 return (PARSER_OK);
13566 }
13567
13568 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13569 {
13570 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13571
13572 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13573
13574 u32 *digest = (u32 *) hash_buf->digest;
13575
13576 salt_t *salt = hash_buf->salt;
13577
13578 char *salt_buf = input_buf + 6;
13579
13580 uint salt_len = 16;
13581
13582 char *salt_buf_ptr = (char *) salt->salt_buf;
13583
13584 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13585
13586 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13587
13588 salt->salt_len = salt_len;
13589
13590 char *hash_pos = input_buf + 6 + 16;
13591
13592 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13593 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13594 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13595 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13596 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13597 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
13598 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
13599 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
13600
13601 return (PARSER_OK);
13602 }
13603
13604 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13605 {
13606 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13607
13608 u32 *digest = (u32 *) hash_buf->digest;
13609
13610 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13611 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13612 digest[2] = 0;
13613 digest[3] = 0;
13614
13615 return (PARSER_OK);
13616 }
13617
13618 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13619 {
13620 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13621
13622 u32 *digest = (u32 *) hash_buf->digest;
13623
13624 salt_t *salt = hash_buf->salt;
13625
13626 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13627
13628 char *saltbuf_pos = input_buf;
13629
13630 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13631
13632 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13633
13634 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13635
13636 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13637 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13638
13639 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13640
13641 hashbuf_pos++;
13642
13643 uint hashbuf_len = input_len - saltbuf_len - 1;
13644
13645 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13646
13647 char *salt_ptr = (char *) saltbuf_pos;
13648 char *rakp_ptr = (char *) rakp->salt_buf;
13649
13650 uint i;
13651 uint j;
13652
13653 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13654 {
13655 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
13656 }
13657
13658 rakp_ptr[j] = 0x80;
13659
13660 rakp->salt_len = j;
13661
13662 for (i = 0; i < 64; i++)
13663 {
13664 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13665 }
13666
13667 salt->salt_buf[0] = rakp->salt_buf[0];
13668 salt->salt_buf[1] = rakp->salt_buf[1];
13669 salt->salt_buf[2] = rakp->salt_buf[2];
13670 salt->salt_buf[3] = rakp->salt_buf[3];
13671 salt->salt_buf[4] = rakp->salt_buf[4];
13672 salt->salt_buf[5] = rakp->salt_buf[5];
13673 salt->salt_buf[6] = rakp->salt_buf[6];
13674 salt->salt_buf[7] = rakp->salt_buf[7];
13675
13676 salt->salt_len = 32; // muss min. 32 haben
13677
13678 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13679 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13680 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13681 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13682 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13683
13684 return (PARSER_OK);
13685 }
13686
13687 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13688 {
13689 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13690
13691 u32 *digest = (u32 *) hash_buf->digest;
13692
13693 salt_t *salt = hash_buf->salt;
13694
13695 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13696
13697 char *salt_pos = input_buf + 1;
13698
13699 memcpy (salt->salt_buf, salt_pos, 8);
13700
13701 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13702 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13703
13704 salt->salt_len = 8;
13705
13706 char *hash_pos = salt_pos + 8;
13707
13708 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13709 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13710 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13711 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13712 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13713
13714 digest[0] -= SHA1M_A;
13715 digest[1] -= SHA1M_B;
13716 digest[2] -= SHA1M_C;
13717 digest[3] -= SHA1M_D;
13718 digest[4] -= SHA1M_E;
13719
13720 return (PARSER_OK);
13721 }
13722
13723 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13724 {
13725 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13726
13727 u32 *digest = (u32 *) hash_buf->digest;
13728
13729 salt_t *salt = hash_buf->salt;
13730
13731 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13732 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13733 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13734 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13735
13736 digest[0] = byte_swap_32 (digest[0]);
13737 digest[1] = byte_swap_32 (digest[1]);
13738 digest[2] = byte_swap_32 (digest[2]);
13739 digest[3] = byte_swap_32 (digest[3]);
13740
13741 digest[0] -= MD5M_A;
13742 digest[1] -= MD5M_B;
13743 digest[2] -= MD5M_C;
13744 digest[3] -= MD5M_D;
13745
13746 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13747
13748 char *salt_buf_ptr = input_buf + 32 + 1;
13749
13750 u32 *salt_buf = salt->salt_buf;
13751
13752 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
13753 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
13754 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
13755 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
13756
13757 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13758 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13759 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13760 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13761
13762 salt->salt_len = 16 + 1;
13763
13764 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13765
13766 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13767
13768 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
13769
13770 return (PARSER_OK);
13771 }
13772
13773 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13774 {
13775 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13776
13777 u32 *digest = (u32 *) hash_buf->digest;
13778
13779 salt_t *salt = hash_buf->salt;
13780
13781 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13782
13783 /**
13784 * parse line
13785 */
13786
13787 char *hashbuf_pos = input_buf;
13788
13789 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13790
13791 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13792
13793 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13794
13795 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13796
13797 saltbuf_pos++;
13798
13799 char *iteration_pos = strchr (saltbuf_pos, ':');
13800
13801 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13802
13803 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13804
13805 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13806
13807 iteration_pos++;
13808
13809 char *databuf_pos = strchr (iteration_pos, ':');
13810
13811 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13812
13813 const uint iteration_len = databuf_pos - iteration_pos;
13814
13815 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13816 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13817
13818 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13819
13820 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13821 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13822
13823 databuf_pos++;
13824
13825 // digest
13826
13827 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13828 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13829 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13830 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13831 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13832 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
13833 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
13834 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
13835
13836 // salt
13837
13838 char *saltbuf_ptr = (char *) salt->salt_buf;
13839
13840 for (uint i = 0; i < saltbuf_len; i += 2)
13841 {
13842 const char p0 = saltbuf_pos[i + 0];
13843 const char p1 = saltbuf_pos[i + 1];
13844
13845 *saltbuf_ptr++ = hex_convert (p1) << 0
13846 | hex_convert (p0) << 4;
13847 }
13848
13849 salt->salt_buf[4] = 0x01000000;
13850 salt->salt_buf[5] = 0x80;
13851
13852 salt->salt_len = saltbuf_len / 2;
13853
13854 // iteration
13855
13856 salt->salt_iter = atoi (iteration_pos) - 1;
13857
13858 // data
13859
13860 char *databuf_ptr = (char *) cloudkey->data_buf;
13861
13862 for (uint i = 0; i < databuf_len; i += 2)
13863 {
13864 const char p0 = databuf_pos[i + 0];
13865 const char p1 = databuf_pos[i + 1];
13866
13867 *databuf_ptr++ = hex_convert (p1) << 0
13868 | hex_convert (p0) << 4;
13869 }
13870
13871 *databuf_ptr++ = 0x80;
13872
13873 for (uint i = 0; i < 512; i++)
13874 {
13875 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13876 }
13877
13878 cloudkey->data_len = databuf_len / 2;
13879
13880 return (PARSER_OK);
13881 }
13882
13883 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13884 {
13885 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13886
13887 u32 *digest = (u32 *) hash_buf->digest;
13888
13889 salt_t *salt = hash_buf->salt;
13890
13891 /**
13892 * parse line
13893 */
13894
13895 char *hashbuf_pos = input_buf;
13896
13897 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13898
13899 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13900
13901 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13902
13903 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13904
13905 domainbuf_pos++;
13906
13907 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13908
13909 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13910
13911 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13912
13913 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13914
13915 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13916
13917 saltbuf_pos++;
13918
13919 char *iteration_pos = strchr (saltbuf_pos, ':');
13920
13921 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13922
13923 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13924
13925 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13926
13927 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13928
13929 iteration_pos++;
13930
13931 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13932
13933 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13934 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13935
13936 // ok, the plan for this algorithm is the following:
13937 // we have 2 salts here, the domain-name and a random salt
13938 // while both are used in the initial transformation,
13939 // only the random salt is used in the following iterations
13940 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13941 // and one that includes only the real salt (stored into salt_buf[]).
13942 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13943
13944 u8 tmp_buf[100] = { 0 };
13945
13946 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
13947
13948 memcpy (digest, tmp_buf, 20);
13949
13950 digest[0] = byte_swap_32 (digest[0]);
13951 digest[1] = byte_swap_32 (digest[1]);
13952 digest[2] = byte_swap_32 (digest[2]);
13953 digest[3] = byte_swap_32 (digest[3]);
13954 digest[4] = byte_swap_32 (digest[4]);
13955
13956 // domain
13957
13958 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13959
13960 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
13961
13962 char *len_ptr = NULL;
13963
13964 for (uint i = 0; i < domainbuf_len; i++)
13965 {
13966 if (salt_buf_pc_ptr[i] == '.')
13967 {
13968 len_ptr = &salt_buf_pc_ptr[i];
13969
13970 *len_ptr = 0;
13971 }
13972 else
13973 {
13974 *len_ptr += 1;
13975 }
13976 }
13977
13978 salt->salt_buf_pc[7] = domainbuf_len;
13979
13980 // "real" salt
13981
13982 char *salt_buf_ptr = (char *) salt->salt_buf;
13983
13984 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
13985
13986 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13987
13988 salt->salt_len = salt_len;
13989
13990 // iteration
13991
13992 salt->salt_iter = atoi (iteration_pos);
13993
13994 return (PARSER_OK);
13995 }
13996
13997 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13998 {
13999 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
14000
14001 u32 *digest = (u32 *) hash_buf->digest;
14002
14003 salt_t *salt = hash_buf->salt;
14004
14005 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14006 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14007 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14008 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14009 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14010
14011 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14012
14013 uint salt_len = input_len - 40 - 1;
14014
14015 char *salt_buf = input_buf + 40 + 1;
14016
14017 char *salt_buf_ptr = (char *) salt->salt_buf;
14018
14019 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14020
14021 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14022
14023 salt->salt_len = salt_len;
14024
14025 return (PARSER_OK);
14026 }
14027
14028 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14029 {
14030 const u8 ascii_to_ebcdic[] =
14031 {
14032 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14033 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14034 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14035 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14036 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14037 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14038 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14039 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14040 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14041 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14042 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14043 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14044 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14045 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14046 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14047 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14048 };
14049
14050 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14051
14052 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14053
14054 u32 *digest = (u32 *) hash_buf->digest;
14055
14056 salt_t *salt = hash_buf->salt;
14057
14058 char *salt_pos = input_buf + 6 + 1;
14059
14060 char *digest_pos = strchr (salt_pos, '*');
14061
14062 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14063
14064 uint salt_len = digest_pos - salt_pos;
14065
14066 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14067
14068 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14069
14070 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14071
14072 digest_pos++;
14073
14074 char *salt_buf_ptr = (char *) salt->salt_buf;
14075 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14076
14077 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14078
14079 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14080
14081 salt->salt_len = salt_len;
14082
14083 for (uint i = 0; i < salt_len; i++)
14084 {
14085 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14086 }
14087 for (uint i = salt_len; i < 8; i++)
14088 {
14089 salt_buf_pc_ptr[i] = 0x40;
14090 }
14091
14092 uint tt;
14093
14094 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14095
14096 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14097 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14098
14099 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14100 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14101
14102 digest[0] = byte_swap_32 (digest[0]);
14103 digest[1] = byte_swap_32 (digest[1]);
14104
14105 IP (digest[0], digest[1], tt);
14106
14107 digest[0] = rotr32 (digest[0], 29);
14108 digest[1] = rotr32 (digest[1], 29);
14109 digest[2] = 0;
14110 digest[3] = 0;
14111
14112 return (PARSER_OK);
14113 }
14114
14115 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14116 {
14117 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14118
14119 u32 *digest = (u32 *) hash_buf->digest;
14120
14121 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14122 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14123 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14124 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14125
14126 digest[0] = byte_swap_32 (digest[0]);
14127 digest[1] = byte_swap_32 (digest[1]);
14128 digest[2] = byte_swap_32 (digest[2]);
14129 digest[3] = byte_swap_32 (digest[3]);
14130
14131 return (PARSER_OK);
14132 }
14133
14134 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14135 {
14136 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14137
14138 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14139
14140 u32 *digest = (u32 *) hash_buf->digest;
14141
14142 salt_t *salt = hash_buf->salt;
14143
14144 u8 tmp_buf[120] = { 0 };
14145
14146 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14147
14148 tmp_buf[3] += -4; // dont ask!
14149
14150 memcpy (salt->salt_buf, tmp_buf, 5);
14151
14152 salt->salt_len = 5;
14153
14154 memcpy (digest, tmp_buf + 5, 9);
14155
14156 // yes, only 9 byte are needed to crack, but 10 to display
14157
14158 salt->salt_buf_pc[7] = input_buf[20];
14159
14160 return (PARSER_OK);
14161 }
14162
14163 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14164 {
14165 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14166
14167 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14168
14169 u32 *digest = (u32 *) hash_buf->digest;
14170
14171 salt_t *salt = hash_buf->salt;
14172
14173 u8 tmp_buf[120] = { 0 };
14174
14175 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14176
14177 tmp_buf[3] += -4; // dont ask!
14178
14179 // salt
14180
14181 memcpy (salt->salt_buf, tmp_buf, 16);
14182
14183 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)
14184
14185 // iteration
14186
14187 char tmp_iter_buf[11] = { 0 };
14188
14189 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14190
14191 tmp_iter_buf[10] = 0;
14192
14193 salt->salt_iter = atoi (tmp_iter_buf);
14194
14195 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14196 {
14197 return (PARSER_SALT_ITERATION);
14198 }
14199
14200 salt->salt_iter--; // first round in init
14201
14202 // 2 additional bytes for display only
14203
14204 salt->salt_buf_pc[0] = tmp_buf[26];
14205 salt->salt_buf_pc[1] = tmp_buf[27];
14206
14207 // digest
14208
14209 memcpy (digest, tmp_buf + 28, 8);
14210
14211 digest[0] = byte_swap_32 (digest[0]);
14212 digest[1] = byte_swap_32 (digest[1]);
14213 digest[2] = 0;
14214 digest[3] = 0;
14215
14216 return (PARSER_OK);
14217 }
14218
14219 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14220 {
14221 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14222
14223 u32 *digest = (u32 *) hash_buf->digest;
14224
14225 salt_t *salt = hash_buf->salt;
14226
14227 char *salt_buf_pos = input_buf;
14228
14229 char *hash_buf_pos = salt_buf_pos + 6;
14230
14231 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
14232 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
14233 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
14234 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
14235 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
14236 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
14237 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
14238 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
14239
14240 digest[0] -= SHA256M_A;
14241 digest[1] -= SHA256M_B;
14242 digest[2] -= SHA256M_C;
14243 digest[3] -= SHA256M_D;
14244 digest[4] -= SHA256M_E;
14245 digest[5] -= SHA256M_F;
14246 digest[6] -= SHA256M_G;
14247 digest[7] -= SHA256M_H;
14248
14249 char *salt_buf_ptr = (char *) salt->salt_buf;
14250
14251 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14252
14253 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14254
14255 salt->salt_len = salt_len;
14256
14257 return (PARSER_OK);
14258 }
14259
14260 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14261 {
14262 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14263
14264 u32 *digest = (u32 *) hash_buf->digest;
14265
14266 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14267
14268 salt_t *salt = hash_buf->salt;
14269
14270 char *salt_buf = input_buf + 6;
14271
14272 char *digest_buf = strchr (salt_buf, '$');
14273
14274 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14275
14276 uint salt_len = digest_buf - salt_buf;
14277
14278 digest_buf++; // skip the '$' symbol
14279
14280 char *salt_buf_ptr = (char *) salt->salt_buf;
14281
14282 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14283
14284 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14285
14286 salt->salt_len = salt_len;
14287
14288 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14289 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14290 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14291 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14292
14293 digest[0] = byte_swap_32 (digest[0]);
14294 digest[1] = byte_swap_32 (digest[1]);
14295 digest[2] = byte_swap_32 (digest[2]);
14296 digest[3] = byte_swap_32 (digest[3]);
14297
14298 digest[0] -= MD5M_A;
14299 digest[1] -= MD5M_B;
14300 digest[2] -= MD5M_C;
14301 digest[3] -= MD5M_D;
14302
14303 return (PARSER_OK);
14304 }
14305
14306 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14307 {
14308 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14309
14310 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14311
14312 u32 *digest = (u32 *) hash_buf->digest;
14313
14314 salt_t *salt = hash_buf->salt;
14315
14316 char *salt_buf = input_buf + 3;
14317
14318 char *digest_buf = strchr (salt_buf, '$');
14319
14320 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14321
14322 uint salt_len = digest_buf - salt_buf;
14323
14324 digest_buf++; // skip the '$' symbol
14325
14326 char *salt_buf_ptr = (char *) salt->salt_buf;
14327
14328 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14329
14330 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14331
14332 salt_buf_ptr[salt_len] = 0x2d;
14333
14334 salt->salt_len = salt_len + 1;
14335
14336 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14337 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14338 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14339 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14340
14341 digest[0] = byte_swap_32 (digest[0]);
14342 digest[1] = byte_swap_32 (digest[1]);
14343 digest[2] = byte_swap_32 (digest[2]);
14344 digest[3] = byte_swap_32 (digest[3]);
14345
14346 digest[0] -= MD5M_A;
14347 digest[1] -= MD5M_B;
14348 digest[2] -= MD5M_C;
14349 digest[3] -= MD5M_D;
14350
14351 return (PARSER_OK);
14352 }
14353
14354 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14355 {
14356 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14357
14358 u32 *digest = (u32 *) hash_buf->digest;
14359
14360 u8 tmp_buf[100] = { 0 };
14361
14362 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
14363
14364 memcpy (digest, tmp_buf, 20);
14365
14366 digest[0] = byte_swap_32 (digest[0]);
14367 digest[1] = byte_swap_32 (digest[1]);
14368 digest[2] = byte_swap_32 (digest[2]);
14369 digest[3] = byte_swap_32 (digest[3]);
14370 digest[4] = byte_swap_32 (digest[4]);
14371
14372 digest[0] -= SHA1M_A;
14373 digest[1] -= SHA1M_B;
14374 digest[2] -= SHA1M_C;
14375 digest[3] -= SHA1M_D;
14376 digest[4] -= SHA1M_E;
14377
14378 return (PARSER_OK);
14379 }
14380
14381 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14382 {
14383 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14384
14385 u32 *digest = (u32 *) hash_buf->digest;
14386
14387 salt_t *salt = hash_buf->salt;
14388
14389 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14390 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14391 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14392 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14393
14394 digest[0] = byte_swap_32 (digest[0]);
14395 digest[1] = byte_swap_32 (digest[1]);
14396 digest[2] = byte_swap_32 (digest[2]);
14397 digest[3] = byte_swap_32 (digest[3]);
14398
14399 digest[0] -= MD5M_A;
14400 digest[1] -= MD5M_B;
14401 digest[2] -= MD5M_C;
14402 digest[3] -= MD5M_D;
14403
14404 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14405
14406 uint salt_len = input_len - 32 - 1;
14407
14408 char *salt_buf = input_buf + 32 + 1;
14409
14410 char *salt_buf_ptr = (char *) salt->salt_buf;
14411
14412 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14413
14414 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14415
14416 /*
14417 * add static "salt" part
14418 */
14419
14420 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14421
14422 salt_len += 8;
14423
14424 salt->salt_len = salt_len;
14425
14426 return (PARSER_OK);
14427 }
14428
14429 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14430 {
14431 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14432
14433 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14434
14435 u32 *digest = (u32 *) hash_buf->digest;
14436
14437 salt_t *salt = hash_buf->salt;
14438
14439 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14440
14441 /**
14442 * parse line
14443 */
14444
14445 char *saltlen_pos = input_buf + 1 + 3 + 1;
14446
14447 char *saltbuf_pos = strchr (saltlen_pos, '$');
14448
14449 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14450
14451 uint saltlen_len = saltbuf_pos - saltlen_pos;
14452
14453 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14454
14455 saltbuf_pos++;
14456
14457 char *keylen_pos = strchr (saltbuf_pos, '$');
14458
14459 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14460
14461 uint saltbuf_len = keylen_pos - saltbuf_pos;
14462
14463 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14464
14465 keylen_pos++;
14466
14467 char *keybuf_pos = strchr (keylen_pos, '$');
14468
14469 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14470
14471 uint keylen_len = keybuf_pos - keylen_pos;
14472
14473 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14474
14475 keybuf_pos++;
14476
14477 char *databuf_pos = strchr (keybuf_pos, '$');
14478
14479 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14480
14481 uint keybuf_len = databuf_pos - keybuf_pos;
14482
14483 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14484
14485 databuf_pos++;
14486
14487 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14488
14489 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14490
14491 /**
14492 * copy data
14493 */
14494
14495 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
14496 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
14497 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
14498 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
14499
14500 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
14501 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
14502 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
14503 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
14504
14505 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14506 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14507 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14508 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14509
14510 salt->salt_len = 16;
14511 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14512
14513 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14514 {
14515 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
14516 }
14517
14518 return (PARSER_OK);
14519 }
14520
14521 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14522 {
14523 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14524
14525 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14526
14527 u32 *digest = (u32 *) hash_buf->digest;
14528
14529 salt_t *salt = hash_buf->salt;
14530
14531 /**
14532 * parse line
14533 */
14534
14535 // first is the N salt parameter
14536
14537 char *N_pos = input_buf + 6;
14538
14539 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14540
14541 N_pos++;
14542
14543 salt->scrypt_N = atoi (N_pos);
14544
14545 // r
14546
14547 char *r_pos = strchr (N_pos, ':');
14548
14549 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14550
14551 r_pos++;
14552
14553 salt->scrypt_r = atoi (r_pos);
14554
14555 // p
14556
14557 char *p_pos = strchr (r_pos, ':');
14558
14559 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14560
14561 p_pos++;
14562
14563 salt->scrypt_p = atoi (p_pos);
14564
14565 // salt
14566
14567 char *saltbuf_pos = strchr (p_pos, ':');
14568
14569 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14570
14571 saltbuf_pos++;
14572
14573 char *hash_pos = strchr (saltbuf_pos, ':');
14574
14575 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14576
14577 hash_pos++;
14578
14579 // base64 decode
14580
14581 u8 tmp_buf[33] = { 0 };
14582
14583 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14584
14585 char *salt_buf_ptr = (char *) salt->salt_buf;
14586
14587 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14588
14589 salt->salt_len = tmp_len;
14590 salt->salt_iter = 1;
14591
14592 // digest - base64 decode
14593
14594 memset (tmp_buf, 0, sizeof (tmp_buf));
14595
14596 tmp_len = input_len - (hash_pos - input_buf);
14597
14598 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14599
14600 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
14601
14602 memcpy (digest, tmp_buf, 32);
14603
14604 return (PARSER_OK);
14605 }
14606
14607 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14608 {
14609 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14610
14611 u32 *digest = (u32 *) hash_buf->digest;
14612
14613 salt_t *salt = hash_buf->salt;
14614
14615 /**
14616 * parse line
14617 */
14618
14619 char decrypted[76] = { 0 }; // iv + hash
14620
14621 juniper_decrypt_hash (input_buf, decrypted);
14622
14623 char *md5crypt_hash = decrypted + 12;
14624
14625 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14626
14627 salt->salt_iter = ROUNDS_MD5CRYPT;
14628
14629 char *salt_pos = md5crypt_hash + 3;
14630
14631 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14632
14633 salt->salt_len = hash_pos - salt_pos; // should be 8
14634
14635 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14636
14637 hash_pos++;
14638
14639 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14640
14641 return (PARSER_OK);
14642 }
14643
14644 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14645 {
14646 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14647
14648 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14649
14650 u32 *digest = (u32 *) hash_buf->digest;
14651
14652 salt_t *salt = hash_buf->salt;
14653
14654 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14655
14656 /**
14657 * parse line
14658 */
14659
14660 // first is *raw* salt
14661
14662 char *salt_pos = input_buf + 3;
14663
14664 char *hash_pos = strchr (salt_pos, '$');
14665
14666 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14667
14668 uint salt_len = hash_pos - salt_pos;
14669
14670 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14671
14672 hash_pos++;
14673
14674 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14675
14676 memcpy (salt_buf_ptr, salt_pos, 14);
14677
14678 salt_buf_ptr[17] = 0x01;
14679 salt_buf_ptr[18] = 0x80;
14680
14681 // add some stuff to normal salt to make sorted happy
14682
14683 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14684 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14685 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14686 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14687
14688 salt->salt_len = salt_len;
14689 salt->salt_iter = ROUNDS_CISCO8 - 1;
14690
14691 // base64 decode hash
14692
14693 u8 tmp_buf[100] = { 0 };
14694
14695 uint hash_len = input_len - 3 - salt_len - 1;
14696
14697 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14698
14699 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14700
14701 memcpy (digest, tmp_buf, 32);
14702
14703 digest[0] = byte_swap_32 (digest[0]);
14704 digest[1] = byte_swap_32 (digest[1]);
14705 digest[2] = byte_swap_32 (digest[2]);
14706 digest[3] = byte_swap_32 (digest[3]);
14707 digest[4] = byte_swap_32 (digest[4]);
14708 digest[5] = byte_swap_32 (digest[5]);
14709 digest[6] = byte_swap_32 (digest[6]);
14710 digest[7] = byte_swap_32 (digest[7]);
14711
14712 return (PARSER_OK);
14713 }
14714
14715 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14716 {
14717 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14718
14719 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14720
14721 u32 *digest = (u32 *) hash_buf->digest;
14722
14723 salt_t *salt = hash_buf->salt;
14724
14725 /**
14726 * parse line
14727 */
14728
14729 // first is *raw* salt
14730
14731 char *salt_pos = input_buf + 3;
14732
14733 char *hash_pos = strchr (salt_pos, '$');
14734
14735 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14736
14737 uint salt_len = hash_pos - salt_pos;
14738
14739 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14740
14741 salt->salt_len = salt_len;
14742 hash_pos++;
14743
14744 char *salt_buf_ptr = (char *) salt->salt_buf;
14745
14746 memcpy (salt_buf_ptr, salt_pos, salt_len);
14747 salt_buf_ptr[salt_len] = 0;
14748
14749 // base64 decode hash
14750
14751 u8 tmp_buf[100] = { 0 };
14752
14753 uint hash_len = input_len - 3 - salt_len - 1;
14754
14755 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14756
14757 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14758
14759 memcpy (digest, tmp_buf, 32);
14760
14761 // fixed:
14762 salt->scrypt_N = 16384;
14763 salt->scrypt_r = 1;
14764 salt->scrypt_p = 1;
14765 salt->salt_iter = 1;
14766
14767 return (PARSER_OK);
14768 }
14769
14770 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14771 {
14772 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14773
14774 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14775
14776 u32 *digest = (u32 *) hash_buf->digest;
14777
14778 salt_t *salt = hash_buf->salt;
14779
14780 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14781
14782 /**
14783 * parse line
14784 */
14785
14786 char *version_pos = input_buf + 8 + 1;
14787
14788 char *verifierHashSize_pos = strchr (version_pos, '*');
14789
14790 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14791
14792 u32 version_len = verifierHashSize_pos - version_pos;
14793
14794 if (version_len != 4) return (PARSER_SALT_LENGTH);
14795
14796 verifierHashSize_pos++;
14797
14798 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14799
14800 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14801
14802 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14803
14804 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14805
14806 keySize_pos++;
14807
14808 char *saltSize_pos = strchr (keySize_pos, '*');
14809
14810 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14811
14812 u32 keySize_len = saltSize_pos - keySize_pos;
14813
14814 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14815
14816 saltSize_pos++;
14817
14818 char *osalt_pos = strchr (saltSize_pos, '*');
14819
14820 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14821
14822 u32 saltSize_len = osalt_pos - saltSize_pos;
14823
14824 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14825
14826 osalt_pos++;
14827
14828 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14829
14830 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14831
14832 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14833
14834 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14835
14836 encryptedVerifier_pos++;
14837
14838 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14839
14840 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14841
14842 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14843
14844 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14845
14846 encryptedVerifierHash_pos++;
14847
14848 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;
14849
14850 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14851
14852 const uint version = atoi (version_pos);
14853
14854 if (version != 2007) return (PARSER_SALT_VALUE);
14855
14856 const uint verifierHashSize = atoi (verifierHashSize_pos);
14857
14858 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14859
14860 const uint keySize = atoi (keySize_pos);
14861
14862 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14863
14864 office2007->keySize = keySize;
14865
14866 const uint saltSize = atoi (saltSize_pos);
14867
14868 if (saltSize != 16) return (PARSER_SALT_VALUE);
14869
14870 /**
14871 * salt
14872 */
14873
14874 salt->salt_len = 16;
14875 salt->salt_iter = ROUNDS_OFFICE2007;
14876
14877 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
14878 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
14879 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
14880 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
14881
14882 /**
14883 * esalt
14884 */
14885
14886 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
14887 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
14888 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
14889 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
14890
14891 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
14892 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
14893 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
14894 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
14895 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
14896
14897 /**
14898 * digest
14899 */
14900
14901 digest[0] = office2007->encryptedVerifierHash[0];
14902 digest[1] = office2007->encryptedVerifierHash[1];
14903 digest[2] = office2007->encryptedVerifierHash[2];
14904 digest[3] = office2007->encryptedVerifierHash[3];
14905
14906 return (PARSER_OK);
14907 }
14908
14909 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14910 {
14911 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14912
14913 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14914
14915 u32 *digest = (u32 *) hash_buf->digest;
14916
14917 salt_t *salt = hash_buf->salt;
14918
14919 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14920
14921 /**
14922 * parse line
14923 */
14924
14925 char *version_pos = input_buf + 8 + 1;
14926
14927 char *spinCount_pos = strchr (version_pos, '*');
14928
14929 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14930
14931 u32 version_len = spinCount_pos - version_pos;
14932
14933 if (version_len != 4) return (PARSER_SALT_LENGTH);
14934
14935 spinCount_pos++;
14936
14937 char *keySize_pos = strchr (spinCount_pos, '*');
14938
14939 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14940
14941 u32 spinCount_len = keySize_pos - spinCount_pos;
14942
14943 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14944
14945 keySize_pos++;
14946
14947 char *saltSize_pos = strchr (keySize_pos, '*');
14948
14949 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14950
14951 u32 keySize_len = saltSize_pos - keySize_pos;
14952
14953 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14954
14955 saltSize_pos++;
14956
14957 char *osalt_pos = strchr (saltSize_pos, '*');
14958
14959 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14960
14961 u32 saltSize_len = osalt_pos - saltSize_pos;
14962
14963 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14964
14965 osalt_pos++;
14966
14967 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14968
14969 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14970
14971 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14972
14973 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14974
14975 encryptedVerifier_pos++;
14976
14977 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14978
14979 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14980
14981 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14982
14983 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14984
14985 encryptedVerifierHash_pos++;
14986
14987 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;
14988
14989 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14990
14991 const uint version = atoi (version_pos);
14992
14993 if (version != 2010) return (PARSER_SALT_VALUE);
14994
14995 const uint spinCount = atoi (spinCount_pos);
14996
14997 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14998
14999 const uint keySize = atoi (keySize_pos);
15000
15001 if (keySize != 128) return (PARSER_SALT_VALUE);
15002
15003 const uint saltSize = atoi (saltSize_pos);
15004
15005 if (saltSize != 16) return (PARSER_SALT_VALUE);
15006
15007 /**
15008 * salt
15009 */
15010
15011 salt->salt_len = 16;
15012 salt->salt_iter = spinCount;
15013
15014 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15015 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15016 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15017 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15018
15019 /**
15020 * esalt
15021 */
15022
15023 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15024 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15025 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15026 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15027
15028 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15029 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15030 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15031 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15032 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15033 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15034 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15035 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15036
15037 /**
15038 * digest
15039 */
15040
15041 digest[0] = office2010->encryptedVerifierHash[0];
15042 digest[1] = office2010->encryptedVerifierHash[1];
15043 digest[2] = office2010->encryptedVerifierHash[2];
15044 digest[3] = office2010->encryptedVerifierHash[3];
15045
15046 return (PARSER_OK);
15047 }
15048
15049 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15050 {
15051 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15052
15053 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15054
15055 u32 *digest = (u32 *) hash_buf->digest;
15056
15057 salt_t *salt = hash_buf->salt;
15058
15059 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15060
15061 /**
15062 * parse line
15063 */
15064
15065 char *version_pos = input_buf + 8 + 1;
15066
15067 char *spinCount_pos = strchr (version_pos, '*');
15068
15069 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15070
15071 u32 version_len = spinCount_pos - version_pos;
15072
15073 if (version_len != 4) return (PARSER_SALT_LENGTH);
15074
15075 spinCount_pos++;
15076
15077 char *keySize_pos = strchr (spinCount_pos, '*');
15078
15079 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15080
15081 u32 spinCount_len = keySize_pos - spinCount_pos;
15082
15083 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15084
15085 keySize_pos++;
15086
15087 char *saltSize_pos = strchr (keySize_pos, '*');
15088
15089 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15090
15091 u32 keySize_len = saltSize_pos - keySize_pos;
15092
15093 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15094
15095 saltSize_pos++;
15096
15097 char *osalt_pos = strchr (saltSize_pos, '*');
15098
15099 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15100
15101 u32 saltSize_len = osalt_pos - saltSize_pos;
15102
15103 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15104
15105 osalt_pos++;
15106
15107 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15108
15109 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15110
15111 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15112
15113 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15114
15115 encryptedVerifier_pos++;
15116
15117 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15118
15119 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15120
15121 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15122
15123 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15124
15125 encryptedVerifierHash_pos++;
15126
15127 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;
15128
15129 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15130
15131 const uint version = atoi (version_pos);
15132
15133 if (version != 2013) return (PARSER_SALT_VALUE);
15134
15135 const uint spinCount = atoi (spinCount_pos);
15136
15137 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15138
15139 const uint keySize = atoi (keySize_pos);
15140
15141 if (keySize != 256) return (PARSER_SALT_VALUE);
15142
15143 const uint saltSize = atoi (saltSize_pos);
15144
15145 if (saltSize != 16) return (PARSER_SALT_VALUE);
15146
15147 /**
15148 * salt
15149 */
15150
15151 salt->salt_len = 16;
15152 salt->salt_iter = spinCount;
15153
15154 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15155 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15156 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15157 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15158
15159 /**
15160 * esalt
15161 */
15162
15163 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15164 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15165 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15166 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15167
15168 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15169 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15170 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15171 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15172 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15173 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15174 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15175 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15176
15177 /**
15178 * digest
15179 */
15180
15181 digest[0] = office2013->encryptedVerifierHash[0];
15182 digest[1] = office2013->encryptedVerifierHash[1];
15183 digest[2] = office2013->encryptedVerifierHash[2];
15184 digest[3] = office2013->encryptedVerifierHash[3];
15185
15186 return (PARSER_OK);
15187 }
15188
15189 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15190 {
15191 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15192
15193 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15194
15195 u32 *digest = (u32 *) hash_buf->digest;
15196
15197 salt_t *salt = hash_buf->salt;
15198
15199 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15200
15201 /**
15202 * parse line
15203 */
15204
15205 char *version_pos = input_buf + 11;
15206
15207 char *osalt_pos = strchr (version_pos, '*');
15208
15209 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15210
15211 u32 version_len = osalt_pos - version_pos;
15212
15213 if (version_len != 1) return (PARSER_SALT_LENGTH);
15214
15215 osalt_pos++;
15216
15217 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15218
15219 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15220
15221 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15222
15223 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15224
15225 encryptedVerifier_pos++;
15226
15227 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15228
15229 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15230
15231 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15232
15233 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15234
15235 encryptedVerifierHash_pos++;
15236
15237 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15238
15239 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15240
15241 const uint version = *version_pos - 0x30;
15242
15243 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15244
15245 /**
15246 * esalt
15247 */
15248
15249 oldoffice01->version = version;
15250
15251 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15252 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15253 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15254 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15255
15256 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15257 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15258 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15259 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15260
15261 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15262 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15263 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15264 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15265
15266 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15267 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15268 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15269 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15270
15271 /**
15272 * salt
15273 */
15274
15275 salt->salt_len = 16;
15276
15277 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15278 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15279 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15280 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15281
15282 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15283 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15284 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15285 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15286
15287 // this is a workaround as office produces multiple documents with the same salt
15288
15289 salt->salt_len += 32;
15290
15291 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15292 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15293 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15294 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15295 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15296 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15297 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15298 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15299
15300 /**
15301 * digest
15302 */
15303
15304 digest[0] = oldoffice01->encryptedVerifierHash[0];
15305 digest[1] = oldoffice01->encryptedVerifierHash[1];
15306 digest[2] = oldoffice01->encryptedVerifierHash[2];
15307 digest[3] = oldoffice01->encryptedVerifierHash[3];
15308
15309 return (PARSER_OK);
15310 }
15311
15312 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15313 {
15314 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15315 }
15316
15317 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15318 {
15319 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15320
15321 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15322
15323 u32 *digest = (u32 *) hash_buf->digest;
15324
15325 salt_t *salt = hash_buf->salt;
15326
15327 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15328
15329 /**
15330 * parse line
15331 */
15332
15333 char *version_pos = input_buf + 11;
15334
15335 char *osalt_pos = strchr (version_pos, '*');
15336
15337 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15338
15339 u32 version_len = osalt_pos - version_pos;
15340
15341 if (version_len != 1) return (PARSER_SALT_LENGTH);
15342
15343 osalt_pos++;
15344
15345 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15346
15347 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15348
15349 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15350
15351 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15352
15353 encryptedVerifier_pos++;
15354
15355 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15356
15357 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15358
15359 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15360
15361 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15362
15363 encryptedVerifierHash_pos++;
15364
15365 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15366
15367 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15368
15369 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15370
15371 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15372
15373 rc4key_pos++;
15374
15375 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15376
15377 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15378
15379 const uint version = *version_pos - 0x30;
15380
15381 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15382
15383 /**
15384 * esalt
15385 */
15386
15387 oldoffice01->version = version;
15388
15389 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15390 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15391 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15392 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15393
15394 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15395 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15396 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15397 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15398
15399 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15400 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15401 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15402 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15403
15404 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15405 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15406 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15407 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15408
15409 oldoffice01->rc4key[1] = 0;
15410 oldoffice01->rc4key[0] = 0;
15411
15412 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15413 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15414 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15415 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15416 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15417 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15418 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15419 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15420 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15421 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15422
15423 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15424 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15425
15426 /**
15427 * salt
15428 */
15429
15430 salt->salt_len = 16;
15431
15432 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15433 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15434 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15435 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15436
15437 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15438 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15439 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15440 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15441
15442 // this is a workaround as office produces multiple documents with the same salt
15443
15444 salt->salt_len += 32;
15445
15446 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15447 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15448 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15449 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15450 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15451 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15452 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15453 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15454
15455 /**
15456 * digest
15457 */
15458
15459 digest[0] = oldoffice01->rc4key[0];
15460 digest[1] = oldoffice01->rc4key[1];
15461 digest[2] = 0;
15462 digest[3] = 0;
15463
15464 return (PARSER_OK);
15465 }
15466
15467 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15468 {
15469 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15470
15471 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15472
15473 u32 *digest = (u32 *) hash_buf->digest;
15474
15475 salt_t *salt = hash_buf->salt;
15476
15477 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15478
15479 /**
15480 * parse line
15481 */
15482
15483 char *version_pos = input_buf + 11;
15484
15485 char *osalt_pos = strchr (version_pos, '*');
15486
15487 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15488
15489 u32 version_len = osalt_pos - version_pos;
15490
15491 if (version_len != 1) return (PARSER_SALT_LENGTH);
15492
15493 osalt_pos++;
15494
15495 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15496
15497 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15498
15499 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15500
15501 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15502
15503 encryptedVerifier_pos++;
15504
15505 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15506
15507 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15508
15509 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15510
15511 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15512
15513 encryptedVerifierHash_pos++;
15514
15515 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15516
15517 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15518
15519 const uint version = *version_pos - 0x30;
15520
15521 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15522
15523 /**
15524 * esalt
15525 */
15526
15527 oldoffice34->version = version;
15528
15529 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15530 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15531 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15532 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15533
15534 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15535 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15536 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15537 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15538
15539 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15540 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15541 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15542 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15543 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15544
15545 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15546 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15547 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15548 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15549 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15550
15551 /**
15552 * salt
15553 */
15554
15555 salt->salt_len = 16;
15556
15557 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15558 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15559 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15560 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15561
15562 // this is a workaround as office produces multiple documents with the same salt
15563
15564 salt->salt_len += 32;
15565
15566 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15567 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15568 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15569 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15570 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15571 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15572 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15573 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15574
15575 /**
15576 * digest
15577 */
15578
15579 digest[0] = oldoffice34->encryptedVerifierHash[0];
15580 digest[1] = oldoffice34->encryptedVerifierHash[1];
15581 digest[2] = oldoffice34->encryptedVerifierHash[2];
15582 digest[3] = oldoffice34->encryptedVerifierHash[3];
15583
15584 return (PARSER_OK);
15585 }
15586
15587 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15588 {
15589 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15590
15591 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15592 }
15593
15594 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15595 {
15596 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15597
15598 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15599
15600 u32 *digest = (u32 *) hash_buf->digest;
15601
15602 salt_t *salt = hash_buf->salt;
15603
15604 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15605
15606 /**
15607 * parse line
15608 */
15609
15610 char *version_pos = input_buf + 11;
15611
15612 char *osalt_pos = strchr (version_pos, '*');
15613
15614 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15615
15616 u32 version_len = osalt_pos - version_pos;
15617
15618 if (version_len != 1) return (PARSER_SALT_LENGTH);
15619
15620 osalt_pos++;
15621
15622 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15623
15624 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15625
15626 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15627
15628 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15629
15630 encryptedVerifier_pos++;
15631
15632 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15633
15634 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15635
15636 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15637
15638 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15639
15640 encryptedVerifierHash_pos++;
15641
15642 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15643
15644 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15645
15646 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15647
15648 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15649
15650 rc4key_pos++;
15651
15652 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15653
15654 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15655
15656 const uint version = *version_pos - 0x30;
15657
15658 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15659
15660 /**
15661 * esalt
15662 */
15663
15664 oldoffice34->version = version;
15665
15666 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15667 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15668 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15669 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15670
15671 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15672 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15673 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15674 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15675
15676 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15677 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15678 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15679 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15680 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15681
15682 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15683 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15684 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15685 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15686 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15687
15688 oldoffice34->rc4key[1] = 0;
15689 oldoffice34->rc4key[0] = 0;
15690
15691 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15692 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15693 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15694 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15695 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15696 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15697 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15698 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15699 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15700 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15701
15702 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15703 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15704
15705 /**
15706 * salt
15707 */
15708
15709 salt->salt_len = 16;
15710
15711 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15712 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15713 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15714 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15715
15716 // this is a workaround as office produces multiple documents with the same salt
15717
15718 salt->salt_len += 32;
15719
15720 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15721 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15722 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15723 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15724 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15725 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15726 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15727 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15728
15729 /**
15730 * digest
15731 */
15732
15733 digest[0] = oldoffice34->rc4key[0];
15734 digest[1] = oldoffice34->rc4key[1];
15735 digest[2] = 0;
15736 digest[3] = 0;
15737
15738 return (PARSER_OK);
15739 }
15740
15741 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15742 {
15743 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15744
15745 u32 *digest = (u32 *) hash_buf->digest;
15746
15747 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15748 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15749 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15750 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15751
15752 digest[0] = byte_swap_32 (digest[0]);
15753 digest[1] = byte_swap_32 (digest[1]);
15754 digest[2] = byte_swap_32 (digest[2]);
15755 digest[3] = byte_swap_32 (digest[3]);
15756
15757 return (PARSER_OK);
15758 }
15759
15760 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15761 {
15762 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15763
15764 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15765
15766 u32 *digest = (u32 *) hash_buf->digest;
15767
15768 salt_t *salt = hash_buf->salt;
15769
15770 char *signature_pos = input_buf;
15771
15772 char *salt_pos = strchr (signature_pos, '$');
15773
15774 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15775
15776 u32 signature_len = salt_pos - signature_pos;
15777
15778 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15779
15780 salt_pos++;
15781
15782 char *hash_pos = strchr (salt_pos, '$');
15783
15784 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15785
15786 u32 salt_len = hash_pos - salt_pos;
15787
15788 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15789
15790 hash_pos++;
15791
15792 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
15793
15794 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15795
15796 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
15797 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
15798 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
15799 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
15800 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
15801
15802 digest[0] -= SHA1M_A;
15803 digest[1] -= SHA1M_B;
15804 digest[2] -= SHA1M_C;
15805 digest[3] -= SHA1M_D;
15806 digest[4] -= SHA1M_E;
15807
15808 char *salt_buf_ptr = (char *) salt->salt_buf;
15809
15810 memcpy (salt_buf_ptr, salt_pos, salt_len);
15811
15812 salt->salt_len = salt_len;
15813
15814 return (PARSER_OK);
15815 }
15816
15817 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15818 {
15819 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15820
15821 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15822
15823 u32 *digest = (u32 *) hash_buf->digest;
15824
15825 salt_t *salt = hash_buf->salt;
15826
15827 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15828
15829 /**
15830 * parse line
15831 */
15832
15833 char *iter_pos = input_buf + 14;
15834
15835 const int iter = atoi (iter_pos);
15836
15837 if (iter < 1) return (PARSER_SALT_ITERATION);
15838
15839 salt->salt_iter = iter - 1;
15840
15841 char *salt_pos = strchr (iter_pos, '$');
15842
15843 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15844
15845 salt_pos++;
15846
15847 char *hash_pos = strchr (salt_pos, '$');
15848
15849 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15850
15851 const uint salt_len = hash_pos - salt_pos;
15852
15853 hash_pos++;
15854
15855 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15856
15857 memcpy (salt_buf_ptr, salt_pos, salt_len);
15858
15859 salt->salt_len = salt_len;
15860
15861 salt_buf_ptr[salt_len + 3] = 0x01;
15862 salt_buf_ptr[salt_len + 4] = 0x80;
15863
15864 // add some stuff to normal salt to make sorted happy
15865
15866 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15867 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15868 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15869 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15870 salt->salt_buf[4] = salt->salt_iter;
15871
15872 // base64 decode hash
15873
15874 u8 tmp_buf[100] = { 0 };
15875
15876 uint hash_len = input_len - (hash_pos - input_buf);
15877
15878 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15879
15880 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15881
15882 memcpy (digest, tmp_buf, 32);
15883
15884 digest[0] = byte_swap_32 (digest[0]);
15885 digest[1] = byte_swap_32 (digest[1]);
15886 digest[2] = byte_swap_32 (digest[2]);
15887 digest[3] = byte_swap_32 (digest[3]);
15888 digest[4] = byte_swap_32 (digest[4]);
15889 digest[5] = byte_swap_32 (digest[5]);
15890 digest[6] = byte_swap_32 (digest[6]);
15891 digest[7] = byte_swap_32 (digest[7]);
15892
15893 return (PARSER_OK);
15894 }
15895
15896 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15897 {
15898 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15899
15900 u32 *digest = (u32 *) hash_buf->digest;
15901
15902 salt_t *salt = hash_buf->salt;
15903
15904 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15905 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15906 digest[2] = 0;
15907 digest[3] = 0;
15908
15909 digest[0] = byte_swap_32 (digest[0]);
15910 digest[1] = byte_swap_32 (digest[1]);
15911
15912 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15913 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15914 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15915
15916 char iter_c = input_buf[17];
15917 char iter_d = input_buf[19];
15918
15919 // atm only defaults, let's see if there's more request
15920 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15921 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15922
15923 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15924
15925 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
15926 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
15927 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
15928 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
15929
15930 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15931 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15932 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15933 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15934
15935 salt->salt_len = 16;
15936
15937 return (PARSER_OK);
15938 }
15939
15940 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15941 {
15942 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
15943
15944 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15945
15946 u32 *digest = (u32 *) hash_buf->digest;
15947
15948 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
15949
15950 salt_t *salt = hash_buf->salt;
15951
15952 char *salt_pos = input_buf + 10;
15953
15954 char *hash_pos = strchr (salt_pos, '$');
15955
15956 uint salt_len = hash_pos - salt_pos;
15957
15958 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15959
15960 hash_pos++;
15961
15962 uint hash_len = input_len - 10 - salt_len - 1;
15963
15964 // base64 decode salt
15965
15966 u8 tmp_buf[100] = { 0 };
15967
15968 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
15969
15970 if (salt_len > 55) return (PARSER_SALT_LENGTH);
15971
15972 tmp_buf[salt_len] = 0x80;
15973
15974 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
15975
15976 salt->salt_len = salt_len;
15977
15978 // base64 decode salt
15979
15980 memset (tmp_buf, 0, sizeof (tmp_buf));
15981
15982 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15983
15984 uint user_len = hash_len - 32;
15985
15986 const u8 *tmp_hash = tmp_buf + user_len;
15987
15988 user_len--; // skip the trailing space
15989
15990 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
15991 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
15992 digest[2] = hex_to_u32 (&tmp_hash[16]);
15993 digest[3] = hex_to_u32 (&tmp_hash[24]);
15994
15995 digest[0] = byte_swap_32 (digest[0]);
15996 digest[1] = byte_swap_32 (digest[1]);
15997 digest[2] = byte_swap_32 (digest[2]);
15998 digest[3] = byte_swap_32 (digest[3]);
15999
16000 // store username for host only (output hash if cracked)
16001
16002 memset (cram_md5->user, 0, sizeof (cram_md5->user));
16003 memcpy (cram_md5->user, tmp_buf, user_len);
16004
16005 return (PARSER_OK);
16006 }
16007
16008 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16009 {
16010 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16011
16012 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16013
16014 u32 *digest = (u32 *) hash_buf->digest;
16015
16016 salt_t *salt = hash_buf->salt;
16017
16018 char *iter_pos = input_buf + 10;
16019
16020 u32 iter = atoi (iter_pos);
16021
16022 if (iter < 1)
16023 {
16024 return (PARSER_SALT_ITERATION);
16025 }
16026
16027 iter--; // first iteration is special
16028
16029 salt->salt_iter = iter;
16030
16031 char *base64_pos = strchr (iter_pos, '}');
16032
16033 if (base64_pos == NULL)
16034 {
16035 return (PARSER_SIGNATURE_UNMATCHED);
16036 }
16037
16038 base64_pos++;
16039
16040 // base64 decode salt
16041
16042 u32 base64_len = input_len - (base64_pos - input_buf);
16043
16044 u8 tmp_buf[100] = { 0 };
16045
16046 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16047
16048 if (decoded_len < 24)
16049 {
16050 return (PARSER_SALT_LENGTH);
16051 }
16052
16053 // copy the salt
16054
16055 uint salt_len = decoded_len - 20;
16056
16057 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16058 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16059
16060 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16061
16062 salt->salt_len = salt_len;
16063
16064 // set digest
16065
16066 u32 *digest_ptr = (u32*) tmp_buf;
16067
16068 digest[0] = byte_swap_32 (digest_ptr[0]);
16069 digest[1] = byte_swap_32 (digest_ptr[1]);
16070 digest[2] = byte_swap_32 (digest_ptr[2]);
16071 digest[3] = byte_swap_32 (digest_ptr[3]);
16072 digest[4] = byte_swap_32 (digest_ptr[4]);
16073
16074 return (PARSER_OK);
16075 }
16076
16077 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16078 {
16079 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16080
16081 u32 *digest = (u32 *) hash_buf->digest;
16082
16083 salt_t *salt = hash_buf->salt;
16084
16085 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16086 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16087 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16088 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16089 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16090
16091 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16092
16093 uint salt_len = input_len - 40 - 1;
16094
16095 char *salt_buf = input_buf + 40 + 1;
16096
16097 char *salt_buf_ptr = (char *) salt->salt_buf;
16098
16099 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16100
16101 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16102
16103 salt->salt_len = salt_len;
16104
16105 return (PARSER_OK);
16106 }
16107
16108 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16109 {
16110 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16111
16112 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16113
16114 u32 *digest = (u32 *) hash_buf->digest;
16115
16116 salt_t *salt = hash_buf->salt;
16117
16118 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16119
16120 /**
16121 * parse line
16122 */
16123
16124 char *V_pos = input_buf + 5;
16125
16126 char *R_pos = strchr (V_pos, '*');
16127
16128 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16129
16130 u32 V_len = R_pos - V_pos;
16131
16132 R_pos++;
16133
16134 char *bits_pos = strchr (R_pos, '*');
16135
16136 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16137
16138 u32 R_len = bits_pos - R_pos;
16139
16140 bits_pos++;
16141
16142 char *P_pos = strchr (bits_pos, '*');
16143
16144 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16145
16146 u32 bits_len = P_pos - bits_pos;
16147
16148 P_pos++;
16149
16150 char *enc_md_pos = strchr (P_pos, '*');
16151
16152 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16153
16154 u32 P_len = enc_md_pos - P_pos;
16155
16156 enc_md_pos++;
16157
16158 char *id_len_pos = strchr (enc_md_pos, '*');
16159
16160 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16161
16162 u32 enc_md_len = id_len_pos - enc_md_pos;
16163
16164 id_len_pos++;
16165
16166 char *id_buf_pos = strchr (id_len_pos, '*');
16167
16168 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16169
16170 u32 id_len_len = id_buf_pos - id_len_pos;
16171
16172 id_buf_pos++;
16173
16174 char *u_len_pos = strchr (id_buf_pos, '*');
16175
16176 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16177
16178 u32 id_buf_len = u_len_pos - id_buf_pos;
16179
16180 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16181
16182 u_len_pos++;
16183
16184 char *u_buf_pos = strchr (u_len_pos, '*');
16185
16186 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16187
16188 u32 u_len_len = u_buf_pos - u_len_pos;
16189
16190 u_buf_pos++;
16191
16192 char *o_len_pos = strchr (u_buf_pos, '*');
16193
16194 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16195
16196 u32 u_buf_len = o_len_pos - u_buf_pos;
16197
16198 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16199
16200 o_len_pos++;
16201
16202 char *o_buf_pos = strchr (o_len_pos, '*');
16203
16204 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16205
16206 u32 o_len_len = o_buf_pos - o_len_pos;
16207
16208 o_buf_pos++;
16209
16210 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;
16211
16212 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16213
16214 // validate data
16215
16216 const int V = atoi (V_pos);
16217 const int R = atoi (R_pos);
16218 const int P = atoi (P_pos);
16219
16220 if (V != 1) return (PARSER_SALT_VALUE);
16221 if (R != 2) return (PARSER_SALT_VALUE);
16222
16223 const int enc_md = atoi (enc_md_pos);
16224
16225 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16226
16227 const int id_len = atoi (id_len_pos);
16228 const int u_len = atoi (u_len_pos);
16229 const int o_len = atoi (o_len_pos);
16230
16231 if (id_len != 16) return (PARSER_SALT_VALUE);
16232 if (u_len != 32) return (PARSER_SALT_VALUE);
16233 if (o_len != 32) return (PARSER_SALT_VALUE);
16234
16235 const int bits = atoi (bits_pos);
16236
16237 if (bits != 40) return (PARSER_SALT_VALUE);
16238
16239 // copy data to esalt
16240
16241 pdf->V = V;
16242 pdf->R = R;
16243 pdf->P = P;
16244
16245 pdf->enc_md = enc_md;
16246
16247 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16248 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16249 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16250 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16251 pdf->id_len = id_len;
16252
16253 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16254 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16255 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16256 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16257 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16258 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16259 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16260 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16261 pdf->u_len = u_len;
16262
16263 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16264 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16265 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16266 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16267 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16268 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16269 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16270 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16271 pdf->o_len = o_len;
16272
16273 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16274 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16275 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16276 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16277
16278 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16279 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16280 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16281 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16282 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16283 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16284 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16285 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16286
16287 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16288 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16289 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16290 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16291 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16292 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16293 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16294 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16295
16296 // we use ID for salt, maybe needs to change, we will see...
16297
16298 salt->salt_buf[0] = pdf->id_buf[0];
16299 salt->salt_buf[1] = pdf->id_buf[1];
16300 salt->salt_buf[2] = pdf->id_buf[2];
16301 salt->salt_buf[3] = pdf->id_buf[3];
16302 salt->salt_len = pdf->id_len;
16303
16304 digest[0] = pdf->u_buf[0];
16305 digest[1] = pdf->u_buf[1];
16306 digest[2] = pdf->u_buf[2];
16307 digest[3] = pdf->u_buf[3];
16308
16309 return (PARSER_OK);
16310 }
16311
16312 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16313 {
16314 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16315 }
16316
16317 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16318 {
16319 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16320
16321 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16322
16323 u32 *digest = (u32 *) hash_buf->digest;
16324
16325 salt_t *salt = hash_buf->salt;
16326
16327 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16328
16329 /**
16330 * parse line
16331 */
16332
16333 char *V_pos = input_buf + 5;
16334
16335 char *R_pos = strchr (V_pos, '*');
16336
16337 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16338
16339 u32 V_len = R_pos - V_pos;
16340
16341 R_pos++;
16342
16343 char *bits_pos = strchr (R_pos, '*');
16344
16345 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16346
16347 u32 R_len = bits_pos - R_pos;
16348
16349 bits_pos++;
16350
16351 char *P_pos = strchr (bits_pos, '*');
16352
16353 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16354
16355 u32 bits_len = P_pos - bits_pos;
16356
16357 P_pos++;
16358
16359 char *enc_md_pos = strchr (P_pos, '*');
16360
16361 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16362
16363 u32 P_len = enc_md_pos - P_pos;
16364
16365 enc_md_pos++;
16366
16367 char *id_len_pos = strchr (enc_md_pos, '*');
16368
16369 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16370
16371 u32 enc_md_len = id_len_pos - enc_md_pos;
16372
16373 id_len_pos++;
16374
16375 char *id_buf_pos = strchr (id_len_pos, '*');
16376
16377 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16378
16379 u32 id_len_len = id_buf_pos - id_len_pos;
16380
16381 id_buf_pos++;
16382
16383 char *u_len_pos = strchr (id_buf_pos, '*');
16384
16385 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16386
16387 u32 id_buf_len = u_len_pos - id_buf_pos;
16388
16389 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16390
16391 u_len_pos++;
16392
16393 char *u_buf_pos = strchr (u_len_pos, '*');
16394
16395 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16396
16397 u32 u_len_len = u_buf_pos - u_len_pos;
16398
16399 u_buf_pos++;
16400
16401 char *o_len_pos = strchr (u_buf_pos, '*');
16402
16403 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16404
16405 u32 u_buf_len = o_len_pos - u_buf_pos;
16406
16407 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16408
16409 o_len_pos++;
16410
16411 char *o_buf_pos = strchr (o_len_pos, '*');
16412
16413 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16414
16415 u32 o_len_len = o_buf_pos - o_len_pos;
16416
16417 o_buf_pos++;
16418
16419 char *rc4key_pos = strchr (o_buf_pos, ':');
16420
16421 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16422
16423 u32 o_buf_len = rc4key_pos - o_buf_pos;
16424
16425 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16426
16427 rc4key_pos++;
16428
16429 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;
16430
16431 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16432
16433 // validate data
16434
16435 const int V = atoi (V_pos);
16436 const int R = atoi (R_pos);
16437 const int P = atoi (P_pos);
16438
16439 if (V != 1) return (PARSER_SALT_VALUE);
16440 if (R != 2) return (PARSER_SALT_VALUE);
16441
16442 const int enc_md = atoi (enc_md_pos);
16443
16444 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16445
16446 const int id_len = atoi (id_len_pos);
16447 const int u_len = atoi (u_len_pos);
16448 const int o_len = atoi (o_len_pos);
16449
16450 if (id_len != 16) return (PARSER_SALT_VALUE);
16451 if (u_len != 32) return (PARSER_SALT_VALUE);
16452 if (o_len != 32) return (PARSER_SALT_VALUE);
16453
16454 const int bits = atoi (bits_pos);
16455
16456 if (bits != 40) return (PARSER_SALT_VALUE);
16457
16458 // copy data to esalt
16459
16460 pdf->V = V;
16461 pdf->R = R;
16462 pdf->P = P;
16463
16464 pdf->enc_md = enc_md;
16465
16466 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16467 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16468 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16469 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16470 pdf->id_len = id_len;
16471
16472 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16473 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16474 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16475 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16476 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16477 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16478 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16479 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16480 pdf->u_len = u_len;
16481
16482 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16483 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16484 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16485 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16486 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16487 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16488 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16489 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16490 pdf->o_len = o_len;
16491
16492 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16493 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16494 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16495 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16496
16497 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16498 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16499 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16500 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16501 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16502 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16503 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16504 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16505
16506 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16507 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16508 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16509 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16510 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16511 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16512 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16513 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16514
16515 pdf->rc4key[1] = 0;
16516 pdf->rc4key[0] = 0;
16517
16518 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16519 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16520 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16521 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16522 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16523 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16524 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16525 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16526 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16527 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16528
16529 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16530 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16531
16532 // we use ID for salt, maybe needs to change, we will see...
16533
16534 salt->salt_buf[0] = pdf->id_buf[0];
16535 salt->salt_buf[1] = pdf->id_buf[1];
16536 salt->salt_buf[2] = pdf->id_buf[2];
16537 salt->salt_buf[3] = pdf->id_buf[3];
16538 salt->salt_buf[4] = pdf->u_buf[0];
16539 salt->salt_buf[5] = pdf->u_buf[1];
16540 salt->salt_buf[6] = pdf->o_buf[0];
16541 salt->salt_buf[7] = pdf->o_buf[1];
16542 salt->salt_len = pdf->id_len + 16;
16543
16544 digest[0] = pdf->rc4key[0];
16545 digest[1] = pdf->rc4key[1];
16546 digest[2] = 0;
16547 digest[3] = 0;
16548
16549 return (PARSER_OK);
16550 }
16551
16552 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16553 {
16554 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16555
16556 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16557
16558 u32 *digest = (u32 *) hash_buf->digest;
16559
16560 salt_t *salt = hash_buf->salt;
16561
16562 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16563
16564 /**
16565 * parse line
16566 */
16567
16568 char *V_pos = input_buf + 5;
16569
16570 char *R_pos = strchr (V_pos, '*');
16571
16572 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16573
16574 u32 V_len = R_pos - V_pos;
16575
16576 R_pos++;
16577
16578 char *bits_pos = strchr (R_pos, '*');
16579
16580 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16581
16582 u32 R_len = bits_pos - R_pos;
16583
16584 bits_pos++;
16585
16586 char *P_pos = strchr (bits_pos, '*');
16587
16588 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16589
16590 u32 bits_len = P_pos - bits_pos;
16591
16592 P_pos++;
16593
16594 char *enc_md_pos = strchr (P_pos, '*');
16595
16596 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16597
16598 u32 P_len = enc_md_pos - P_pos;
16599
16600 enc_md_pos++;
16601
16602 char *id_len_pos = strchr (enc_md_pos, '*');
16603
16604 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16605
16606 u32 enc_md_len = id_len_pos - enc_md_pos;
16607
16608 id_len_pos++;
16609
16610 char *id_buf_pos = strchr (id_len_pos, '*');
16611
16612 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16613
16614 u32 id_len_len = id_buf_pos - id_len_pos;
16615
16616 id_buf_pos++;
16617
16618 char *u_len_pos = strchr (id_buf_pos, '*');
16619
16620 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16621
16622 u32 id_buf_len = u_len_pos - id_buf_pos;
16623
16624 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16625
16626 u_len_pos++;
16627
16628 char *u_buf_pos = strchr (u_len_pos, '*');
16629
16630 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16631
16632 u32 u_len_len = u_buf_pos - u_len_pos;
16633
16634 u_buf_pos++;
16635
16636 char *o_len_pos = strchr (u_buf_pos, '*');
16637
16638 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16639
16640 u32 u_buf_len = o_len_pos - u_buf_pos;
16641
16642 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16643
16644 o_len_pos++;
16645
16646 char *o_buf_pos = strchr (o_len_pos, '*');
16647
16648 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16649
16650 u32 o_len_len = o_buf_pos - o_len_pos;
16651
16652 o_buf_pos++;
16653
16654 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;
16655
16656 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16657
16658 // validate data
16659
16660 const int V = atoi (V_pos);
16661 const int R = atoi (R_pos);
16662 const int P = atoi (P_pos);
16663
16664 int vr_ok = 0;
16665
16666 if ((V == 2) && (R == 3)) vr_ok = 1;
16667 if ((V == 4) && (R == 4)) vr_ok = 1;
16668
16669 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16670
16671 const int id_len = atoi (id_len_pos);
16672 const int u_len = atoi (u_len_pos);
16673 const int o_len = atoi (o_len_pos);
16674
16675 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16676
16677 if (u_len != 32) return (PARSER_SALT_VALUE);
16678 if (o_len != 32) return (PARSER_SALT_VALUE);
16679
16680 const int bits = atoi (bits_pos);
16681
16682 if (bits != 128) return (PARSER_SALT_VALUE);
16683
16684 int enc_md = 1;
16685
16686 if (R >= 4)
16687 {
16688 enc_md = atoi (enc_md_pos);
16689 }
16690
16691 // copy data to esalt
16692
16693 pdf->V = V;
16694 pdf->R = R;
16695 pdf->P = P;
16696
16697 pdf->enc_md = enc_md;
16698
16699 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16700 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16701 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16702 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16703
16704 if (id_len == 32)
16705 {
16706 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
16707 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
16708 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
16709 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
16710 }
16711
16712 pdf->id_len = id_len;
16713
16714 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16715 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16716 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16717 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16718 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16719 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16720 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16721 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16722 pdf->u_len = u_len;
16723
16724 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16725 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16726 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16727 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16728 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16729 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16730 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16731 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16732 pdf->o_len = o_len;
16733
16734 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16735 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16736 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16737 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16738
16739 if (id_len == 32)
16740 {
16741 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16742 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16743 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16744 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16745 }
16746
16747 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16748 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16749 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16750 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16751 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16752 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16753 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16754 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16755
16756 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16757 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16758 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16759 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16760 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16761 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16762 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16763 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16764
16765 // precompute rc4 data for later use
16766
16767 uint padding[8] =
16768 {
16769 0x5e4ebf28,
16770 0x418a754e,
16771 0x564e0064,
16772 0x0801faff,
16773 0xb6002e2e,
16774 0x803e68d0,
16775 0xfea90c2f,
16776 0x7a695364
16777 };
16778
16779 // md5
16780
16781 uint salt_pc_block[32] = { 0 };
16782
16783 char *salt_pc_ptr = (char *) salt_pc_block;
16784
16785 memcpy (salt_pc_ptr, padding, 32);
16786 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16787
16788 uint salt_pc_digest[4] = { 0 };
16789
16790 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16791
16792 pdf->rc4data[0] = salt_pc_digest[0];
16793 pdf->rc4data[1] = salt_pc_digest[1];
16794
16795 // we use ID for salt, maybe needs to change, we will see...
16796
16797 salt->salt_buf[0] = pdf->id_buf[0];
16798 salt->salt_buf[1] = pdf->id_buf[1];
16799 salt->salt_buf[2] = pdf->id_buf[2];
16800 salt->salt_buf[3] = pdf->id_buf[3];
16801 salt->salt_buf[4] = pdf->u_buf[0];
16802 salt->salt_buf[5] = pdf->u_buf[1];
16803 salt->salt_buf[6] = pdf->o_buf[0];
16804 salt->salt_buf[7] = pdf->o_buf[1];
16805 salt->salt_len = pdf->id_len + 16;
16806
16807 salt->salt_iter = ROUNDS_PDF14;
16808
16809 digest[0] = pdf->u_buf[0];
16810 digest[1] = pdf->u_buf[1];
16811 digest[2] = 0;
16812 digest[3] = 0;
16813
16814 return (PARSER_OK);
16815 }
16816
16817 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16818 {
16819 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16820
16821 if (ret != PARSER_OK)
16822 {
16823 return ret;
16824 }
16825
16826 u32 *digest = (u32 *) hash_buf->digest;
16827
16828 salt_t *salt = hash_buf->salt;
16829
16830 digest[0] -= SHA256M_A;
16831 digest[1] -= SHA256M_B;
16832 digest[2] -= SHA256M_C;
16833 digest[3] -= SHA256M_D;
16834 digest[4] -= SHA256M_E;
16835 digest[5] -= SHA256M_F;
16836 digest[6] -= SHA256M_G;
16837 digest[7] -= SHA256M_H;
16838
16839 salt->salt_buf[2] = 0x80;
16840
16841 return (PARSER_OK);
16842 }
16843
16844 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16845 {
16846 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16847
16848 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16849
16850 u32 *digest = (u32 *) hash_buf->digest;
16851
16852 salt_t *salt = hash_buf->salt;
16853
16854 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16855
16856 /**
16857 * parse line
16858 */
16859
16860 char *V_pos = input_buf + 5;
16861
16862 char *R_pos = strchr (V_pos, '*');
16863
16864 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16865
16866 u32 V_len = R_pos - V_pos;
16867
16868 R_pos++;
16869
16870 char *bits_pos = strchr (R_pos, '*');
16871
16872 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16873
16874 u32 R_len = bits_pos - R_pos;
16875
16876 bits_pos++;
16877
16878 char *P_pos = strchr (bits_pos, '*');
16879
16880 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16881
16882 u32 bits_len = P_pos - bits_pos;
16883
16884 P_pos++;
16885
16886 char *enc_md_pos = strchr (P_pos, '*');
16887
16888 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16889
16890 u32 P_len = enc_md_pos - P_pos;
16891
16892 enc_md_pos++;
16893
16894 char *id_len_pos = strchr (enc_md_pos, '*');
16895
16896 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16897
16898 u32 enc_md_len = id_len_pos - enc_md_pos;
16899
16900 id_len_pos++;
16901
16902 char *id_buf_pos = strchr (id_len_pos, '*');
16903
16904 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16905
16906 u32 id_len_len = id_buf_pos - id_len_pos;
16907
16908 id_buf_pos++;
16909
16910 char *u_len_pos = strchr (id_buf_pos, '*');
16911
16912 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16913
16914 u32 id_buf_len = u_len_pos - id_buf_pos;
16915
16916 u_len_pos++;
16917
16918 char *u_buf_pos = strchr (u_len_pos, '*');
16919
16920 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16921
16922 u32 u_len_len = u_buf_pos - u_len_pos;
16923
16924 u_buf_pos++;
16925
16926 char *o_len_pos = strchr (u_buf_pos, '*');
16927
16928 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16929
16930 u32 u_buf_len = o_len_pos - u_buf_pos;
16931
16932 o_len_pos++;
16933
16934 char *o_buf_pos = strchr (o_len_pos, '*');
16935
16936 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16937
16938 u32 o_len_len = o_buf_pos - o_len_pos;
16939
16940 o_buf_pos++;
16941
16942 char *last = strchr (o_buf_pos, '*');
16943
16944 if (last == NULL) last = input_buf + input_len;
16945
16946 u32 o_buf_len = last - o_buf_pos;
16947
16948 // validate data
16949
16950 const int V = atoi (V_pos);
16951 const int R = atoi (R_pos);
16952
16953 int vr_ok = 0;
16954
16955 if ((V == 5) && (R == 5)) vr_ok = 1;
16956 if ((V == 5) && (R == 6)) vr_ok = 1;
16957
16958 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16959
16960 const int bits = atoi (bits_pos);
16961
16962 if (bits != 256) return (PARSER_SALT_VALUE);
16963
16964 int enc_md = atoi (enc_md_pos);
16965
16966 if (enc_md != 1) return (PARSER_SALT_VALUE);
16967
16968 const uint id_len = atoi (id_len_pos);
16969 const uint u_len = atoi (u_len_pos);
16970 const uint o_len = atoi (o_len_pos);
16971
16972 if (V_len > 6) return (PARSER_SALT_LENGTH);
16973 if (R_len > 6) return (PARSER_SALT_LENGTH);
16974 if (P_len > 6) return (PARSER_SALT_LENGTH);
16975 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
16976 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
16977 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
16978 if (bits_len > 6) return (PARSER_SALT_LENGTH);
16979 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
16980
16981 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
16982 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
16983 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
16984
16985 // copy data to esalt
16986
16987 if (u_len < 40) return (PARSER_SALT_VALUE);
16988
16989 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
16990 {
16991 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
16992 }
16993
16994 salt->salt_buf[0] = pdf->u_buf[8];
16995 salt->salt_buf[1] = pdf->u_buf[9];
16996
16997 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16998 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16999
17000 salt->salt_len = 8;
17001 salt->salt_iter = ROUNDS_PDF17L8;
17002
17003 digest[0] = pdf->u_buf[0];
17004 digest[1] = pdf->u_buf[1];
17005 digest[2] = pdf->u_buf[2];
17006 digest[3] = pdf->u_buf[3];
17007 digest[4] = pdf->u_buf[4];
17008 digest[5] = pdf->u_buf[5];
17009 digest[6] = pdf->u_buf[6];
17010 digest[7] = pdf->u_buf[7];
17011
17012 return (PARSER_OK);
17013 }
17014
17015 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17016 {
17017 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17018
17019 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17020
17021 u32 *digest = (u32 *) hash_buf->digest;
17022
17023 salt_t *salt = hash_buf->salt;
17024
17025 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17026
17027 /**
17028 * parse line
17029 */
17030
17031 // iterations
17032
17033 char *iter_pos = input_buf + 7;
17034
17035 u32 iter = atoi (iter_pos);
17036
17037 if (iter < 1) return (PARSER_SALT_ITERATION);
17038 if (iter > 999999) return (PARSER_SALT_ITERATION);
17039
17040 // first is *raw* salt
17041
17042 char *salt_pos = strchr (iter_pos, ':');
17043
17044 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17045
17046 salt_pos++;
17047
17048 char *hash_pos = strchr (salt_pos, ':');
17049
17050 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17051
17052 u32 salt_len = hash_pos - salt_pos;
17053
17054 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17055
17056 hash_pos++;
17057
17058 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17059
17060 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17061
17062 // decode salt
17063
17064 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17065
17066 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17067
17068 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17069
17070 salt_buf_ptr[salt_len + 3] = 0x01;
17071 salt_buf_ptr[salt_len + 4] = 0x80;
17072
17073 salt->salt_len = salt_len;
17074 salt->salt_iter = iter - 1;
17075
17076 // decode hash
17077
17078 u8 tmp_buf[100] = { 0 };
17079
17080 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17081
17082 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17083
17084 memcpy (digest, tmp_buf, 16);
17085
17086 digest[0] = byte_swap_32 (digest[0]);
17087 digest[1] = byte_swap_32 (digest[1]);
17088 digest[2] = byte_swap_32 (digest[2]);
17089 digest[3] = byte_swap_32 (digest[3]);
17090
17091 // add some stuff to normal salt to make sorted happy
17092
17093 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17094 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17095 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17096 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17097 salt->salt_buf[4] = salt->salt_iter;
17098
17099 return (PARSER_OK);
17100 }
17101
17102 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17103 {
17104 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17105
17106 u32 *digest = (u32 *) hash_buf->digest;
17107
17108 salt_t *salt = hash_buf->salt;
17109
17110 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17111 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17112 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17113 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17114
17115 digest[0] = byte_swap_32 (digest[0]);
17116 digest[1] = byte_swap_32 (digest[1]);
17117 digest[2] = byte_swap_32 (digest[2]);
17118 digest[3] = byte_swap_32 (digest[3]);
17119
17120 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17121
17122 uint salt_len = input_len - 32 - 1;
17123
17124 char *salt_buf = input_buf + 32 + 1;
17125
17126 char *salt_buf_ptr = (char *) salt->salt_buf;
17127
17128 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17129
17130 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17131
17132 salt->salt_len = salt_len;
17133
17134 return (PARSER_OK);
17135 }
17136
17137 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17138 {
17139 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17140
17141 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17142
17143 u32 *digest = (u32 *) hash_buf->digest;
17144
17145 salt_t *salt = hash_buf->salt;
17146
17147 char *user_pos = input_buf + 10;
17148
17149 char *salt_pos = strchr (user_pos, '*');
17150
17151 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17152
17153 salt_pos++;
17154
17155 char *hash_pos = strchr (salt_pos, '*');
17156
17157 hash_pos++;
17158
17159 uint hash_len = input_len - (hash_pos - input_buf);
17160
17161 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17162
17163 uint user_len = salt_pos - user_pos - 1;
17164
17165 uint salt_len = hash_pos - salt_pos - 1;
17166
17167 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17168
17169 /*
17170 * store digest
17171 */
17172
17173 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17174 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17175 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17176 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17177
17178 digest[0] = byte_swap_32 (digest[0]);
17179 digest[1] = byte_swap_32 (digest[1]);
17180 digest[2] = byte_swap_32 (digest[2]);
17181 digest[3] = byte_swap_32 (digest[3]);
17182
17183 digest[0] -= MD5M_A;
17184 digest[1] -= MD5M_B;
17185 digest[2] -= MD5M_C;
17186 digest[3] -= MD5M_D;
17187
17188 /*
17189 * store salt
17190 */
17191
17192 char *salt_buf_ptr = (char *) salt->salt_buf;
17193
17194 // first 4 bytes are the "challenge"
17195
17196 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
17197 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
17198 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
17199 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
17200
17201 // append the user name
17202
17203 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17204
17205 salt->salt_len = 4 + user_len;
17206
17207 return (PARSER_OK);
17208 }
17209
17210 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17211 {
17212 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17213
17214 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17215
17216 u32 *digest = (u32 *) hash_buf->digest;
17217
17218 salt_t *salt = hash_buf->salt;
17219
17220 char *salt_pos = input_buf + 9;
17221
17222 char *hash_pos = strchr (salt_pos, '*');
17223
17224 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17225
17226 hash_pos++;
17227
17228 uint hash_len = input_len - (hash_pos - input_buf);
17229
17230 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17231
17232 uint salt_len = hash_pos - salt_pos - 1;
17233
17234 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17235
17236 /*
17237 * store digest
17238 */
17239
17240 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17241 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17242 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17243 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17244 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
17245
17246 /*
17247 * store salt
17248 */
17249
17250 char *salt_buf_ptr = (char *) salt->salt_buf;
17251
17252 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17253
17254 salt->salt_len = salt_len;
17255
17256 return (PARSER_OK);
17257 }
17258
17259 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17260 {
17261 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17262
17263 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17264
17265 u32 *digest = (u32 *) hash_buf->digest;
17266
17267 salt_t *salt = hash_buf->salt;
17268
17269 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17270
17271 /**
17272 * parse line
17273 */
17274
17275 char *cry_master_len_pos = input_buf + 9;
17276
17277 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17278
17279 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17280
17281 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17282
17283 cry_master_buf_pos++;
17284
17285 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17286
17287 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17288
17289 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17290
17291 cry_salt_len_pos++;
17292
17293 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17294
17295 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17296
17297 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17298
17299 cry_salt_buf_pos++;
17300
17301 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17302
17303 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17304
17305 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17306
17307 cry_rounds_pos++;
17308
17309 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17310
17311 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17312
17313 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17314
17315 ckey_len_pos++;
17316
17317 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17318
17319 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17320
17321 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
17322
17323 ckey_buf_pos++;
17324
17325 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17326
17327 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17328
17329 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17330
17331 public_key_len_pos++;
17332
17333 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17334
17335 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17336
17337 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
17338
17339 public_key_buf_pos++;
17340
17341 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;
17342
17343 const uint cry_master_len = atoi (cry_master_len_pos);
17344 const uint cry_salt_len = atoi (cry_salt_len_pos);
17345 const uint ckey_len = atoi (ckey_len_pos);
17346 const uint public_key_len = atoi (public_key_len_pos);
17347
17348 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17349 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17350 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17351 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17352
17353 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
17354 {
17355 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
17356
17357 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17358 }
17359
17360 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
17361 {
17362 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
17363
17364 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17365 }
17366
17367 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
17368 {
17369 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
17370
17371 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17372 }
17373
17374 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17375 bitcoin_wallet->ckey_len = ckey_len / 2;
17376 bitcoin_wallet->public_key_len = public_key_len / 2;
17377
17378 /*
17379 * store digest (should be unique enought, hopefully)
17380 */
17381
17382 digest[0] = bitcoin_wallet->cry_master_buf[0];
17383 digest[1] = bitcoin_wallet->cry_master_buf[1];
17384 digest[2] = bitcoin_wallet->cry_master_buf[2];
17385 digest[3] = bitcoin_wallet->cry_master_buf[3];
17386
17387 /*
17388 * store salt
17389 */
17390
17391 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17392
17393 const uint cry_rounds = atoi (cry_rounds_pos);
17394
17395 salt->salt_iter = cry_rounds - 1;
17396
17397 char *salt_buf_ptr = (char *) salt->salt_buf;
17398
17399 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17400
17401 salt->salt_len = salt_len;
17402
17403 return (PARSER_OK);
17404 }
17405
17406 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17407 {
17408 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17409
17410 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17411
17412 u32 *digest = (u32 *) hash_buf->digest;
17413
17414 salt_t *salt = hash_buf->salt;
17415
17416 sip_t *sip = (sip_t *) hash_buf->esalt;
17417
17418 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17419
17420 char *temp_input_buf = (char *) mymalloc (input_len + 1);
17421
17422 memcpy (temp_input_buf, input_buf, input_len);
17423
17424 // URI_server:
17425
17426 char *URI_server_pos = temp_input_buf + 6;
17427
17428 char *URI_client_pos = strchr (URI_server_pos, '*');
17429
17430 if (URI_client_pos == NULL)
17431 {
17432 myfree (temp_input_buf);
17433
17434 return (PARSER_SEPARATOR_UNMATCHED);
17435 }
17436
17437 URI_client_pos[0] = 0;
17438 URI_client_pos++;
17439
17440 uint URI_server_len = strlen (URI_server_pos);
17441
17442 if (URI_server_len > 512)
17443 {
17444 myfree (temp_input_buf);
17445
17446 return (PARSER_SALT_LENGTH);
17447 }
17448
17449 // URI_client:
17450
17451 char *user_pos = strchr (URI_client_pos, '*');
17452
17453 if (user_pos == NULL)
17454 {
17455 myfree (temp_input_buf);
17456
17457 return (PARSER_SEPARATOR_UNMATCHED);
17458 }
17459
17460 user_pos[0] = 0;
17461 user_pos++;
17462
17463 uint URI_client_len = strlen (URI_client_pos);
17464
17465 if (URI_client_len > 512)
17466 {
17467 myfree (temp_input_buf);
17468
17469 return (PARSER_SALT_LENGTH);
17470 }
17471
17472 // user:
17473
17474 char *realm_pos = strchr (user_pos, '*');
17475
17476 if (realm_pos == NULL)
17477 {
17478 myfree (temp_input_buf);
17479
17480 return (PARSER_SEPARATOR_UNMATCHED);
17481 }
17482
17483 realm_pos[0] = 0;
17484 realm_pos++;
17485
17486 uint user_len = strlen (user_pos);
17487
17488 if (user_len > 116)
17489 {
17490 myfree (temp_input_buf);
17491
17492 return (PARSER_SALT_LENGTH);
17493 }
17494
17495 // realm:
17496
17497 char *method_pos = strchr (realm_pos, '*');
17498
17499 if (method_pos == NULL)
17500 {
17501 myfree (temp_input_buf);
17502
17503 return (PARSER_SEPARATOR_UNMATCHED);
17504 }
17505
17506 method_pos[0] = 0;
17507 method_pos++;
17508
17509 uint realm_len = strlen (realm_pos);
17510
17511 if (realm_len > 116)
17512 {
17513 myfree (temp_input_buf);
17514
17515 return (PARSER_SALT_LENGTH);
17516 }
17517
17518 // method:
17519
17520 char *URI_prefix_pos = strchr (method_pos, '*');
17521
17522 if (URI_prefix_pos == NULL)
17523 {
17524 myfree (temp_input_buf);
17525
17526 return (PARSER_SEPARATOR_UNMATCHED);
17527 }
17528
17529 URI_prefix_pos[0] = 0;
17530 URI_prefix_pos++;
17531
17532 uint method_len = strlen (method_pos);
17533
17534 if (method_len > 246)
17535 {
17536 myfree (temp_input_buf);
17537
17538 return (PARSER_SALT_LENGTH);
17539 }
17540
17541 // URI_prefix:
17542
17543 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17544
17545 if (URI_resource_pos == NULL)
17546 {
17547 myfree (temp_input_buf);
17548
17549 return (PARSER_SEPARATOR_UNMATCHED);
17550 }
17551
17552 URI_resource_pos[0] = 0;
17553 URI_resource_pos++;
17554
17555 uint URI_prefix_len = strlen (URI_prefix_pos);
17556
17557 if (URI_prefix_len > 245)
17558 {
17559 myfree (temp_input_buf);
17560
17561 return (PARSER_SALT_LENGTH);
17562 }
17563
17564 // URI_resource:
17565
17566 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17567
17568 if (URI_suffix_pos == NULL)
17569 {
17570 myfree (temp_input_buf);
17571
17572 return (PARSER_SEPARATOR_UNMATCHED);
17573 }
17574
17575 URI_suffix_pos[0] = 0;
17576 URI_suffix_pos++;
17577
17578 uint URI_resource_len = strlen (URI_resource_pos);
17579
17580 if (URI_resource_len < 1 || URI_resource_len > 246)
17581 {
17582 myfree (temp_input_buf);
17583
17584 return (PARSER_SALT_LENGTH);
17585 }
17586
17587 // URI_suffix:
17588
17589 char *nonce_pos = strchr (URI_suffix_pos, '*');
17590
17591 if (nonce_pos == NULL)
17592 {
17593 myfree (temp_input_buf);
17594
17595 return (PARSER_SEPARATOR_UNMATCHED);
17596 }
17597
17598 nonce_pos[0] = 0;
17599 nonce_pos++;
17600
17601 uint URI_suffix_len = strlen (URI_suffix_pos);
17602
17603 if (URI_suffix_len > 245)
17604 {
17605 myfree (temp_input_buf);
17606
17607 return (PARSER_SALT_LENGTH);
17608 }
17609
17610 // nonce:
17611
17612 char *nonce_client_pos = strchr (nonce_pos, '*');
17613
17614 if (nonce_client_pos == NULL)
17615 {
17616 myfree (temp_input_buf);
17617
17618 return (PARSER_SEPARATOR_UNMATCHED);
17619 }
17620
17621 nonce_client_pos[0] = 0;
17622 nonce_client_pos++;
17623
17624 uint nonce_len = strlen (nonce_pos);
17625
17626 if (nonce_len < 1 || nonce_len > 50)
17627 {
17628 myfree (temp_input_buf);
17629
17630 return (PARSER_SALT_LENGTH);
17631 }
17632
17633 // nonce_client:
17634
17635 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17636
17637 if (nonce_count_pos == NULL)
17638 {
17639 myfree (temp_input_buf);
17640
17641 return (PARSER_SEPARATOR_UNMATCHED);
17642 }
17643
17644 nonce_count_pos[0] = 0;
17645 nonce_count_pos++;
17646
17647 uint nonce_client_len = strlen (nonce_client_pos);
17648
17649 if (nonce_client_len > 50)
17650 {
17651 myfree (temp_input_buf);
17652
17653 return (PARSER_SALT_LENGTH);
17654 }
17655
17656 // nonce_count:
17657
17658 char *qop_pos = strchr (nonce_count_pos, '*');
17659
17660 if (qop_pos == NULL)
17661 {
17662 myfree (temp_input_buf);
17663
17664 return (PARSER_SEPARATOR_UNMATCHED);
17665 }
17666
17667 qop_pos[0] = 0;
17668 qop_pos++;
17669
17670 uint nonce_count_len = strlen (nonce_count_pos);
17671
17672 if (nonce_count_len > 50)
17673 {
17674 myfree (temp_input_buf);
17675
17676 return (PARSER_SALT_LENGTH);
17677 }
17678
17679 // qop:
17680
17681 char *directive_pos = strchr (qop_pos, '*');
17682
17683 if (directive_pos == NULL)
17684 {
17685 myfree (temp_input_buf);
17686
17687 return (PARSER_SEPARATOR_UNMATCHED);
17688 }
17689
17690 directive_pos[0] = 0;
17691 directive_pos++;
17692
17693 uint qop_len = strlen (qop_pos);
17694
17695 if (qop_len > 50)
17696 {
17697 myfree (temp_input_buf);
17698
17699 return (PARSER_SALT_LENGTH);
17700 }
17701
17702 // directive
17703
17704 char *digest_pos = strchr (directive_pos, '*');
17705
17706 if (digest_pos == NULL)
17707 {
17708 myfree (temp_input_buf);
17709
17710 return (PARSER_SEPARATOR_UNMATCHED);
17711 }
17712
17713 digest_pos[0] = 0;
17714 digest_pos++;
17715
17716 uint directive_len = strlen (directive_pos);
17717
17718 if (directive_len != 3)
17719 {
17720 myfree (temp_input_buf);
17721
17722 return (PARSER_SALT_LENGTH);
17723 }
17724
17725 if (memcmp (directive_pos, "MD5", 3))
17726 {
17727 log_info ("ERROR: only the MD5 directive is currently supported\n");
17728
17729 myfree (temp_input_buf);
17730
17731 return (PARSER_SIP_AUTH_DIRECTIVE);
17732 }
17733
17734 /*
17735 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17736 */
17737
17738 uint md5_len = 0;
17739
17740 uint md5_max_len = 4 * 64;
17741
17742 uint md5_remaining_len = md5_max_len;
17743
17744 uint tmp_md5_buf[64] = { 0 };
17745
17746 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17747
17748 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17749
17750 md5_len += method_len + 1;
17751 tmp_md5_ptr += method_len + 1;
17752
17753 if (URI_prefix_len > 0)
17754 {
17755 md5_remaining_len = md5_max_len - md5_len;
17756
17757 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17758
17759 md5_len += URI_prefix_len + 1;
17760 tmp_md5_ptr += URI_prefix_len + 1;
17761 }
17762
17763 md5_remaining_len = md5_max_len - md5_len;
17764
17765 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17766
17767 md5_len += URI_resource_len;
17768 tmp_md5_ptr += URI_resource_len;
17769
17770 if (URI_suffix_len > 0)
17771 {
17772 md5_remaining_len = md5_max_len - md5_len;
17773
17774 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17775
17776 md5_len += 1 + URI_suffix_len;
17777 }
17778
17779 uint tmp_digest[4] = { 0 };
17780
17781 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17782
17783 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17784 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17785 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17786 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17787
17788 /*
17789 * esalt
17790 */
17791
17792 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17793
17794 uint esalt_len = 0;
17795
17796 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17797
17798 // there are 2 possibilities for the esalt:
17799
17800 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17801 {
17802 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_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:%s:%s:%s:%08x%08x%08x%08x",
17812 nonce_pos,
17813 nonce_count_pos,
17814 nonce_client_pos,
17815 qop_pos,
17816 tmp_digest[0],
17817 tmp_digest[1],
17818 tmp_digest[2],
17819 tmp_digest[3]);
17820 }
17821 else
17822 {
17823 esalt_len = 1 + nonce_len + 1 + 32;
17824
17825 if (esalt_len > max_esalt_len)
17826 {
17827 myfree (temp_input_buf);
17828
17829 return (PARSER_SALT_LENGTH);
17830 }
17831
17832 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17833 nonce_pos,
17834 tmp_digest[0],
17835 tmp_digest[1],
17836 tmp_digest[2],
17837 tmp_digest[3]);
17838 }
17839
17840 // add 0x80 to esalt
17841
17842 esalt_buf_ptr[esalt_len] = 0x80;
17843
17844 sip->esalt_len = esalt_len;
17845
17846 /*
17847 * actual salt
17848 */
17849
17850 char *sip_salt_ptr = (char *) sip->salt_buf;
17851
17852 uint salt_len = user_len + 1 + realm_len + 1;
17853
17854 uint max_salt_len = 119;
17855
17856 if (salt_len > max_salt_len)
17857 {
17858 myfree (temp_input_buf);
17859
17860 return (PARSER_SALT_LENGTH);
17861 }
17862
17863 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17864
17865 sip->salt_len = salt_len;
17866
17867 /*
17868 * fake salt (for sorting)
17869 */
17870
17871 char *salt_buf_ptr = (char *) salt->salt_buf;
17872
17873 max_salt_len = 55;
17874
17875 uint fake_salt_len = salt_len;
17876
17877 if (fake_salt_len > max_salt_len)
17878 {
17879 fake_salt_len = max_salt_len;
17880 }
17881
17882 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17883
17884 salt->salt_len = fake_salt_len;
17885
17886 /*
17887 * digest
17888 */
17889
17890 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
17891 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
17892 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
17893 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
17894
17895 digest[0] = byte_swap_32 (digest[0]);
17896 digest[1] = byte_swap_32 (digest[1]);
17897 digest[2] = byte_swap_32 (digest[2]);
17898 digest[3] = byte_swap_32 (digest[3]);
17899
17900 myfree (temp_input_buf);
17901
17902 return (PARSER_OK);
17903 }
17904
17905 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17906 {
17907 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17908
17909 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17910
17911 u32 *digest = (u32 *) hash_buf->digest;
17912
17913 salt_t *salt = hash_buf->salt;
17914
17915 // digest
17916
17917 char *digest_pos = input_buf;
17918
17919 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
17920 digest[1] = 0;
17921 digest[2] = 0;
17922 digest[3] = 0;
17923
17924 // salt
17925
17926 char *salt_buf = input_buf + 8 + 1;
17927
17928 uint salt_len = 8;
17929
17930 char *salt_buf_ptr = (char *) salt->salt_buf;
17931
17932 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17933
17934 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17935
17936 salt->salt_len = salt_len;
17937
17938 return (PARSER_OK);
17939 }
17940
17941 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17942 {
17943 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
17944
17945 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17946
17947 u32 *digest = (u32 *) hash_buf->digest;
17948
17949 salt_t *salt = hash_buf->salt;
17950
17951 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
17952
17953 /**
17954 * parse line
17955 */
17956
17957 char *p_buf_pos = input_buf + 4;
17958
17959 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
17960
17961 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17962
17963 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
17964
17965 NumCyclesPower_pos++;
17966
17967 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
17968
17969 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17970
17971 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
17972
17973 salt_len_pos++;
17974
17975 char *salt_buf_pos = strchr (salt_len_pos, '$');
17976
17977 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17978
17979 u32 salt_len_len = salt_buf_pos - salt_len_pos;
17980
17981 salt_buf_pos++;
17982
17983 char *iv_len_pos = strchr (salt_buf_pos, '$');
17984
17985 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17986
17987 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
17988
17989 iv_len_pos++;
17990
17991 char *iv_buf_pos = strchr (iv_len_pos, '$');
17992
17993 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17994
17995 u32 iv_len_len = iv_buf_pos - iv_len_pos;
17996
17997 iv_buf_pos++;
17998
17999 char *crc_buf_pos = strchr (iv_buf_pos, '$');
18000
18001 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18002
18003 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
18004
18005 crc_buf_pos++;
18006
18007 char *data_len_pos = strchr (crc_buf_pos, '$');
18008
18009 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18010
18011 u32 crc_buf_len = data_len_pos - crc_buf_pos;
18012
18013 data_len_pos++;
18014
18015 char *unpack_size_pos = strchr (data_len_pos, '$');
18016
18017 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18018
18019 u32 data_len_len = unpack_size_pos - data_len_pos;
18020
18021 unpack_size_pos++;
18022
18023 char *data_buf_pos = strchr (unpack_size_pos, '$');
18024
18025 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18026
18027 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
18028
18029 data_buf_pos++;
18030
18031 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;
18032
18033 const uint iter = atoi (NumCyclesPower_pos);
18034 const uint crc = atoi (crc_buf_pos);
18035 const uint p_buf = atoi (p_buf_pos);
18036 const uint salt_len = atoi (salt_len_pos);
18037 const uint iv_len = atoi (iv_len_pos);
18038 const uint unpack_size = atoi (unpack_size_pos);
18039 const uint data_len = atoi (data_len_pos);
18040
18041 /**
18042 * verify some data
18043 */
18044
18045 if (p_buf != 0) return (PARSER_SALT_VALUE);
18046 if (salt_len != 0) return (PARSER_SALT_VALUE);
18047
18048 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
18049
18050 if (data_len > 384) return (PARSER_SALT_VALUE);
18051
18052 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
18053
18054 /**
18055 * store data
18056 */
18057
18058 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
18059 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
18060 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
18061 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
18062
18063 seven_zip->iv_len = iv_len;
18064
18065 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
18066
18067 seven_zip->salt_len = 0;
18068
18069 seven_zip->crc = crc;
18070
18071 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
18072 {
18073 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
18074
18075 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
18076 }
18077
18078 seven_zip->data_len = data_len;
18079
18080 seven_zip->unpack_size = unpack_size;
18081
18082 // real salt
18083
18084 salt->salt_buf[0] = seven_zip->data_buf[0];
18085 salt->salt_buf[1] = seven_zip->data_buf[1];
18086 salt->salt_buf[2] = seven_zip->data_buf[2];
18087 salt->salt_buf[3] = seven_zip->data_buf[3];
18088
18089 salt->salt_len = 16;
18090
18091 salt->salt_sign[0] = iter;
18092
18093 salt->salt_iter = 1 << iter;
18094
18095 /**
18096 * digest
18097 */
18098
18099 digest[0] = crc;
18100 digest[1] = 0;
18101 digest[2] = 0;
18102 digest[3] = 0;
18103
18104 return (PARSER_OK);
18105 }
18106
18107 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18108 {
18109 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
18110
18111 u32 *digest = (u32 *) hash_buf->digest;
18112
18113 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18114 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18115 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18116 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18117 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18118 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18119 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18120 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18121
18122 digest[0] = byte_swap_32 (digest[0]);
18123 digest[1] = byte_swap_32 (digest[1]);
18124 digest[2] = byte_swap_32 (digest[2]);
18125 digest[3] = byte_swap_32 (digest[3]);
18126 digest[4] = byte_swap_32 (digest[4]);
18127 digest[5] = byte_swap_32 (digest[5]);
18128 digest[6] = byte_swap_32 (digest[6]);
18129 digest[7] = byte_swap_32 (digest[7]);
18130
18131 return (PARSER_OK);
18132 }
18133
18134 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18135 {
18136 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18137
18138 u32 *digest = (u32 *) hash_buf->digest;
18139
18140 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18141 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18142 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18143 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18144 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18145 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18146 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18147 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18148 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18149 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18150 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18151 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18152 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18153 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18154 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18155 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18156
18157 digest[ 0] = byte_swap_32 (digest[ 0]);
18158 digest[ 1] = byte_swap_32 (digest[ 1]);
18159 digest[ 2] = byte_swap_32 (digest[ 2]);
18160 digest[ 3] = byte_swap_32 (digest[ 3]);
18161 digest[ 4] = byte_swap_32 (digest[ 4]);
18162 digest[ 5] = byte_swap_32 (digest[ 5]);
18163 digest[ 6] = byte_swap_32 (digest[ 6]);
18164 digest[ 7] = byte_swap_32 (digest[ 7]);
18165 digest[ 8] = byte_swap_32 (digest[ 8]);
18166 digest[ 9] = byte_swap_32 (digest[ 9]);
18167 digest[10] = byte_swap_32 (digest[10]);
18168 digest[11] = byte_swap_32 (digest[11]);
18169 digest[12] = byte_swap_32 (digest[12]);
18170 digest[13] = byte_swap_32 (digest[13]);
18171 digest[14] = byte_swap_32 (digest[14]);
18172 digest[15] = byte_swap_32 (digest[15]);
18173
18174 return (PARSER_OK);
18175 }
18176
18177 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18178 {
18179 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
18180
18181 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18182
18183 u32 *digest = (u32 *) hash_buf->digest;
18184
18185 salt_t *salt = hash_buf->salt;
18186
18187 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
18188
18189 /**
18190 * parse line
18191 */
18192
18193 // iterations
18194
18195 char *iter_pos = input_buf + 4;
18196
18197 u32 iter = atoi (iter_pos);
18198
18199 if (iter < 1) return (PARSER_SALT_ITERATION);
18200 if (iter > 999999) return (PARSER_SALT_ITERATION);
18201
18202 // first is *raw* salt
18203
18204 char *salt_pos = strchr (iter_pos, ':');
18205
18206 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18207
18208 salt_pos++;
18209
18210 char *hash_pos = strchr (salt_pos, ':');
18211
18212 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18213
18214 u32 salt_len = hash_pos - salt_pos;
18215
18216 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18217
18218 hash_pos++;
18219
18220 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18221
18222 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18223
18224 // decode salt
18225
18226 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
18227
18228 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18229
18230 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18231
18232 salt_buf_ptr[salt_len + 3] = 0x01;
18233 salt_buf_ptr[salt_len + 4] = 0x80;
18234
18235 salt->salt_len = salt_len;
18236 salt->salt_iter = iter - 1;
18237
18238 // decode hash
18239
18240 u8 tmp_buf[100] = { 0 };
18241
18242 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18243
18244 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18245
18246 memcpy (digest, tmp_buf, 16);
18247
18248 // add some stuff to normal salt to make sorted happy
18249
18250 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
18251 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
18252 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
18253 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
18254 salt->salt_buf[4] = salt->salt_iter;
18255
18256 return (PARSER_OK);
18257 }
18258
18259 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18260 {
18261 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
18262
18263 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
18264
18265 u32 *digest = (u32 *) hash_buf->digest;
18266
18267 salt_t *salt = hash_buf->salt;
18268
18269 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
18270
18271 /**
18272 * parse line
18273 */
18274
18275 // iterations
18276
18277 char *iter_pos = input_buf + 5;
18278
18279 u32 iter = atoi (iter_pos);
18280
18281 if (iter < 1) return (PARSER_SALT_ITERATION);
18282 if (iter > 999999) return (PARSER_SALT_ITERATION);
18283
18284 // first is *raw* salt
18285
18286 char *salt_pos = strchr (iter_pos, ':');
18287
18288 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18289
18290 salt_pos++;
18291
18292 char *hash_pos = strchr (salt_pos, ':');
18293
18294 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18295
18296 u32 salt_len = hash_pos - salt_pos;
18297
18298 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18299
18300 hash_pos++;
18301
18302 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18303
18304 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18305
18306 // decode salt
18307
18308 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18309
18310 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18311
18312 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18313
18314 salt_buf_ptr[salt_len + 3] = 0x01;
18315 salt_buf_ptr[salt_len + 4] = 0x80;
18316
18317 salt->salt_len = salt_len;
18318 salt->salt_iter = iter - 1;
18319
18320 // decode hash
18321
18322 u8 tmp_buf[100] = { 0 };
18323
18324 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18325
18326 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18327
18328 memcpy (digest, tmp_buf, 16);
18329
18330 digest[0] = byte_swap_32 (digest[0]);
18331 digest[1] = byte_swap_32 (digest[1]);
18332 digest[2] = byte_swap_32 (digest[2]);
18333 digest[3] = byte_swap_32 (digest[3]);
18334
18335 // add some stuff to normal salt to make sorted happy
18336
18337 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18338 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18339 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18340 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18341 salt->salt_buf[4] = salt->salt_iter;
18342
18343 return (PARSER_OK);
18344 }
18345
18346 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18347 {
18348 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18349
18350 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18351
18352 u64 *digest = (u64 *) hash_buf->digest;
18353
18354 salt_t *salt = hash_buf->salt;
18355
18356 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18357
18358 /**
18359 * parse line
18360 */
18361
18362 // iterations
18363
18364 char *iter_pos = input_buf + 7;
18365
18366 u32 iter = atoi (iter_pos);
18367
18368 if (iter < 1) return (PARSER_SALT_ITERATION);
18369 if (iter > 999999) return (PARSER_SALT_ITERATION);
18370
18371 // first is *raw* salt
18372
18373 char *salt_pos = strchr (iter_pos, ':');
18374
18375 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18376
18377 salt_pos++;
18378
18379 char *hash_pos = strchr (salt_pos, ':');
18380
18381 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18382
18383 u32 salt_len = hash_pos - salt_pos;
18384
18385 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18386
18387 hash_pos++;
18388
18389 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18390
18391 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18392
18393 // decode salt
18394
18395 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18396
18397 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18398
18399 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18400
18401 salt_buf_ptr[salt_len + 3] = 0x01;
18402 salt_buf_ptr[salt_len + 4] = 0x80;
18403
18404 salt->salt_len = salt_len;
18405 salt->salt_iter = iter - 1;
18406
18407 // decode hash
18408
18409 u8 tmp_buf[100] = { 0 };
18410
18411 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18412
18413 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18414
18415 memcpy (digest, tmp_buf, 64);
18416
18417 digest[0] = byte_swap_64 (digest[0]);
18418 digest[1] = byte_swap_64 (digest[1]);
18419 digest[2] = byte_swap_64 (digest[2]);
18420 digest[3] = byte_swap_64 (digest[3]);
18421 digest[4] = byte_swap_64 (digest[4]);
18422 digest[5] = byte_swap_64 (digest[5]);
18423 digest[6] = byte_swap_64 (digest[6]);
18424 digest[7] = byte_swap_64 (digest[7]);
18425
18426 // add some stuff to normal salt to make sorted happy
18427
18428 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18429 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18430 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18431 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18432 salt->salt_buf[4] = salt->salt_iter;
18433
18434 return (PARSER_OK);
18435 }
18436
18437 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18438 {
18439 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18440
18441 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18442
18443 uint *digest = (uint *) hash_buf->digest;
18444
18445 salt_t *salt = hash_buf->salt;
18446
18447 /**
18448 * parse line
18449 */
18450
18451 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18452
18453 char *hash_pos = strchr (salt_pos, '$');
18454
18455 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18456
18457 u32 salt_len = hash_pos - salt_pos;
18458
18459 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18460
18461 hash_pos++;
18462
18463 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18464
18465 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18466
18467 // decode hash
18468
18469 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
18470 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
18471 digest[ 2] = 0;
18472 digest[ 3] = 0;
18473 digest[ 4] = 0;
18474 digest[ 5] = 0;
18475 digest[ 6] = 0;
18476 digest[ 7] = 0;
18477 digest[ 8] = 0;
18478 digest[ 9] = 0;
18479 digest[10] = 0;
18480 digest[11] = 0;
18481 digest[12] = 0;
18482 digest[13] = 0;
18483 digest[14] = 0;
18484 digest[15] = 0;
18485
18486 // decode salt
18487
18488 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18489 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18490
18491 salt->salt_iter = ROUNDS_ECRYPTFS;
18492 salt->salt_len = 8;
18493
18494 return (PARSER_OK);
18495 }
18496
18497 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18498 {
18499 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18500
18501 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18502
18503 unsigned char c19 = itoa64_to_int (input_buf[19]);
18504
18505 if (c19 & 3) return (PARSER_HASH_VALUE);
18506
18507 salt_t *salt = hash_buf->salt;
18508
18509 u32 *digest = (u32 *) hash_buf->digest;
18510
18511 // iteration count
18512
18513 salt->salt_iter = itoa64_to_int (input_buf[1])
18514 | itoa64_to_int (input_buf[2]) << 6
18515 | itoa64_to_int (input_buf[3]) << 12
18516 | itoa64_to_int (input_buf[4]) << 18;
18517
18518 // set salt
18519
18520 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18521 | itoa64_to_int (input_buf[6]) << 6
18522 | itoa64_to_int (input_buf[7]) << 12
18523 | itoa64_to_int (input_buf[8]) << 18;
18524
18525 salt->salt_len = 4;
18526
18527 u8 tmp_buf[100] = { 0 };
18528
18529 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
18530
18531 memcpy (digest, tmp_buf, 8);
18532
18533 uint tt;
18534
18535 IP (digest[0], digest[1], tt);
18536
18537 digest[0] = rotr32 (digest[0], 31);
18538 digest[1] = rotr32 (digest[1], 31);
18539 digest[2] = 0;
18540 digest[3] = 0;
18541
18542 return (PARSER_OK);
18543 }
18544
18545 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18546 {
18547 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18548
18549 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18550
18551 u32 *digest = (u32 *) hash_buf->digest;
18552
18553 salt_t *salt = hash_buf->salt;
18554
18555 /**
18556 * parse line
18557 */
18558
18559 char *type_pos = input_buf + 6 + 1;
18560
18561 char *salt_pos = strchr (type_pos, '*');
18562
18563 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18564
18565 u32 type_len = salt_pos - type_pos;
18566
18567 if (type_len != 1) return (PARSER_SALT_LENGTH);
18568
18569 salt_pos++;
18570
18571 char *crypted_pos = strchr (salt_pos, '*');
18572
18573 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18574
18575 u32 salt_len = crypted_pos - salt_pos;
18576
18577 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18578
18579 crypted_pos++;
18580
18581 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18582
18583 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18584
18585 /**
18586 * copy data
18587 */
18588
18589 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18590 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18591
18592 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18593 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18594
18595 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
18596 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
18597 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
18598 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
18599
18600 salt->salt_len = 24;
18601 salt->salt_iter = ROUNDS_RAR3;
18602
18603 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18604 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18605
18606 digest[0] = 0xc43d7b00;
18607 digest[1] = 0x40070000;
18608 digest[2] = 0;
18609 digest[3] = 0;
18610
18611 return (PARSER_OK);
18612 }
18613
18614 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18615 {
18616 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
18617
18618 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
18619
18620 u32 *digest = (u32 *) hash_buf->digest;
18621
18622 salt_t *salt = hash_buf->salt;
18623
18624 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
18625
18626 /**
18627 * parse line
18628 */
18629
18630 char *param0_pos = input_buf + 1 + 4 + 1;
18631
18632 char *param1_pos = strchr (param0_pos, '$');
18633
18634 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18635
18636 u32 param0_len = param1_pos - param0_pos;
18637
18638 param1_pos++;
18639
18640 char *param2_pos = strchr (param1_pos, '$');
18641
18642 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18643
18644 u32 param1_len = param2_pos - param1_pos;
18645
18646 param2_pos++;
18647
18648 char *param3_pos = strchr (param2_pos, '$');
18649
18650 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18651
18652 u32 param2_len = param3_pos - param2_pos;
18653
18654 param3_pos++;
18655
18656 char *param4_pos = strchr (param3_pos, '$');
18657
18658 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18659
18660 u32 param3_len = param4_pos - param3_pos;
18661
18662 param4_pos++;
18663
18664 char *param5_pos = strchr (param4_pos, '$');
18665
18666 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18667
18668 u32 param4_len = param5_pos - param4_pos;
18669
18670 param5_pos++;
18671
18672 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
18673
18674 char *salt_buf = param1_pos;
18675 char *iv = param3_pos;
18676 char *pswcheck = param5_pos;
18677
18678 const uint salt_len = atoi (param0_pos);
18679 const uint iterations = atoi (param2_pos);
18680 const uint pswcheck_len = atoi (param4_pos);
18681
18682 /**
18683 * verify some data
18684 */
18685
18686 if (param1_len != 32) return (PARSER_SALT_VALUE);
18687 if (param3_len != 32) return (PARSER_SALT_VALUE);
18688 if (param5_len != 16) return (PARSER_SALT_VALUE);
18689
18690 if (salt_len != 16) return (PARSER_SALT_VALUE);
18691 if (iterations == 0) return (PARSER_SALT_VALUE);
18692 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
18693
18694 /**
18695 * store data
18696 */
18697
18698 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
18699 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
18700 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
18701 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
18702
18703 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
18704 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
18705 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
18706 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
18707
18708 salt->salt_len = 16;
18709
18710 salt->salt_sign[0] = iterations;
18711
18712 salt->salt_iter = ((1 << iterations) + 32) - 1;
18713
18714 /**
18715 * digest buf
18716 */
18717
18718 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
18719 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
18720 digest[2] = 0;
18721 digest[3] = 0;
18722
18723 return (PARSER_OK);
18724 }
18725
18726 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18727 {
18728 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18729
18730 u32 *digest = (u32 *) hash_buf->digest;
18731
18732 salt_t *salt = hash_buf->salt;
18733
18734 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18735 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18736 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18737 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18738 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18739 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18740 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18741 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18742
18743 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18744
18745 uint salt_len = input_len - 64 - 1;
18746
18747 char *salt_buf = input_buf + 64 + 1;
18748
18749 char *salt_buf_ptr = (char *) salt->salt_buf;
18750
18751 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18752
18753 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18754
18755 salt->salt_len = salt_len;
18756
18757 /**
18758 * we can precompute the first sha256 transform
18759 */
18760
18761 uint w[16] = { 0 };
18762
18763 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18764 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18765 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18766 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18767 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18768 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18769 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18770 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18771 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18772 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18773 w[10] = byte_swap_32 (salt->salt_buf[10]);
18774 w[11] = byte_swap_32 (salt->salt_buf[11]);
18775 w[12] = byte_swap_32 (salt->salt_buf[12]);
18776 w[13] = byte_swap_32 (salt->salt_buf[13]);
18777 w[14] = byte_swap_32 (salt->salt_buf[14]);
18778 w[15] = byte_swap_32 (salt->salt_buf[15]);
18779
18780 uint pc256[8] = { SHA256M_A, SHA256M_B, SHA256M_C, SHA256M_D, SHA256M_E, SHA256M_F, SHA256M_G, SHA256M_H };
18781
18782 sha256_64 (w, pc256);
18783
18784 salt->salt_buf_pc[0] = pc256[0];
18785 salt->salt_buf_pc[1] = pc256[1];
18786 salt->salt_buf_pc[2] = pc256[2];
18787 salt->salt_buf_pc[3] = pc256[3];
18788 salt->salt_buf_pc[4] = pc256[4];
18789 salt->salt_buf_pc[5] = pc256[5];
18790 salt->salt_buf_pc[6] = pc256[6];
18791 salt->salt_buf_pc[7] = pc256[7];
18792
18793 digest[0] -= pc256[0];
18794 digest[1] -= pc256[1];
18795 digest[2] -= pc256[2];
18796 digest[3] -= pc256[3];
18797 digest[4] -= pc256[4];
18798 digest[5] -= pc256[5];
18799 digest[6] -= pc256[6];
18800 digest[7] -= pc256[7];
18801
18802 return (PARSER_OK);
18803 }
18804
18805 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18806 {
18807 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18808
18809 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18810
18811 u32 *digest = (u32 *) hash_buf->digest;
18812
18813 salt_t *salt = hash_buf->salt;
18814
18815 /**
18816 * parse line
18817 */
18818
18819 char *data_len_pos = input_buf + 1 + 10 + 1;
18820
18821 char *data_buf_pos = strchr (data_len_pos, '$');
18822
18823 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18824
18825 u32 data_len_len = data_buf_pos - data_len_pos;
18826
18827 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18828 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18829
18830 data_buf_pos++;
18831
18832 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18833
18834 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18835
18836 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18837
18838 u32 data_len = atoi (data_len_pos);
18839
18840 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18841
18842 /**
18843 * salt
18844 */
18845
18846 char *salt_pos = data_buf_pos;
18847
18848 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18849 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18850 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
18851 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
18852
18853 // this is actually the CT, which is also the hash later (if matched)
18854
18855 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
18856 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
18857 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
18858 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
18859
18860 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18861
18862 salt->salt_iter = 10 - 1;
18863
18864 /**
18865 * digest buf
18866 */
18867
18868 digest[0] = salt->salt_buf[4];
18869 digest[1] = salt->salt_buf[5];
18870 digest[2] = salt->salt_buf[6];
18871 digest[3] = salt->salt_buf[7];
18872
18873 return (PARSER_OK);
18874 }
18875
18876 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18877 {
18878 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
18879
18880 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18881
18882 u32 *digest = (u32 *) hash_buf->digest;
18883
18884 salt_t *salt = hash_buf->salt;
18885
18886 /**
18887 * parse line
18888 */
18889
18890 char *salt_pos = input_buf + 11 + 1;
18891
18892 char *iter_pos = strchr (salt_pos, ',');
18893
18894 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18895
18896 u32 salt_len = iter_pos - salt_pos;
18897
18898 if (salt_len != 20) return (PARSER_SALT_LENGTH);
18899
18900 iter_pos++;
18901
18902 char *hash_pos = strchr (iter_pos, ',');
18903
18904 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18905
18906 u32 iter_len = hash_pos - iter_pos;
18907
18908 if (iter_len > 5) return (PARSER_SALT_LENGTH);
18909
18910 hash_pos++;
18911
18912 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
18913
18914 if (hash_len != 64) return (PARSER_HASH_LENGTH);
18915
18916 /**
18917 * salt
18918 */
18919
18920 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18921 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18922 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
18923 salt->salt_buf[3] = 0x00018000;
18924
18925 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18926 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18927 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
18928 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
18929
18930 salt->salt_len = salt_len / 2;
18931
18932 salt->salt_iter = atoi (iter_pos) - 1;
18933
18934 /**
18935 * digest buf
18936 */
18937
18938 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18939 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18940 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18941 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18942 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18943 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
18944 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
18945 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
18946
18947 return (PARSER_OK);
18948 }
18949
18950 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18951 {
18952 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
18953
18954 u32 *digest = (u32 *) hash_buf->digest;
18955
18956 salt_t *salt = hash_buf->salt;
18957
18958 /**
18959 * parse line
18960 */
18961
18962 char *hash_pos = input_buf + 64;
18963 char *salt1_pos = input_buf + 128;
18964 char *salt2_pos = input_buf;
18965
18966 /**
18967 * salt
18968 */
18969
18970 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
18971 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
18972 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
18973 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
18974
18975 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
18976 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
18977 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
18978 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
18979
18980 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
18981 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
18982 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
18983 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
18984
18985 salt->salt_len = 48;
18986
18987 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
18988
18989 /**
18990 * digest buf
18991 */
18992
18993 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18994 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18995 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18996 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18997 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18998 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
18999 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
19000 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
19001
19002 return (PARSER_OK);
19003 }
19004
19005 /**
19006 * parallel running threads
19007 */
19008
19009 #ifdef WIN
19010
19011 BOOL WINAPI sigHandler_default (DWORD sig)
19012 {
19013 switch (sig)
19014 {
19015 case CTRL_CLOSE_EVENT:
19016
19017 /*
19018 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
19019 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
19020 * function otherwise it is too late (e.g. after returning from this function)
19021 */
19022
19023 myabort ();
19024
19025 SetConsoleCtrlHandler (NULL, TRUE);
19026
19027 hc_sleep (10);
19028
19029 return TRUE;
19030
19031 case CTRL_C_EVENT:
19032 case CTRL_LOGOFF_EVENT:
19033 case CTRL_SHUTDOWN_EVENT:
19034
19035 myabort ();
19036
19037 SetConsoleCtrlHandler (NULL, TRUE);
19038
19039 return TRUE;
19040 }
19041
19042 return FALSE;
19043 }
19044
19045 BOOL WINAPI sigHandler_benchmark (DWORD sig)
19046 {
19047 switch (sig)
19048 {
19049 case CTRL_CLOSE_EVENT:
19050
19051 myabort ();
19052
19053 SetConsoleCtrlHandler (NULL, TRUE);
19054
19055 hc_sleep (10);
19056
19057 return TRUE;
19058
19059 case CTRL_C_EVENT:
19060 case CTRL_LOGOFF_EVENT:
19061 case CTRL_SHUTDOWN_EVENT:
19062
19063 myquit ();
19064
19065 SetConsoleCtrlHandler (NULL, TRUE);
19066
19067 return TRUE;
19068 }
19069
19070 return FALSE;
19071 }
19072
19073 void hc_signal (BOOL WINAPI (callback) (DWORD))
19074 {
19075 if (callback == NULL)
19076 {
19077 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
19078 }
19079 else
19080 {
19081 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
19082 }
19083 }
19084
19085 #else
19086
19087 void sigHandler_default (int sig)
19088 {
19089 myabort ();
19090
19091 signal (sig, NULL);
19092 }
19093
19094 void sigHandler_benchmark (int sig)
19095 {
19096 myquit ();
19097
19098 signal (sig, NULL);
19099 }
19100
19101 void hc_signal (void (callback) (int))
19102 {
19103 if (callback == NULL) callback = SIG_DFL;
19104
19105 signal (SIGINT, callback);
19106 signal (SIGTERM, callback);
19107 signal (SIGABRT, callback);
19108 }
19109
19110 #endif
19111
19112 void status_display ();
19113
19114 void *thread_keypress (void *p)
19115 {
19116 int benchmark = *((int *) p);
19117
19118 uint quiet = data.quiet;
19119
19120 tty_break();
19121
19122 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
19123 {
19124 int ch = tty_getchar();
19125
19126 if (ch == -1) break;
19127
19128 if (ch == 0) continue;
19129
19130 #ifdef _POSIX
19131 if (ch != '\n')
19132 #endif
19133
19134 hc_thread_mutex_lock (mux_display);
19135
19136 log_info ("");
19137
19138 switch (ch)
19139 {
19140 case 's':
19141 case '\n':
19142
19143 log_info ("");
19144
19145 status_display ();
19146
19147 log_info ("");
19148
19149 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19150 if (quiet == 0) fflush (stdout);
19151
19152 break;
19153
19154 case 'b':
19155
19156 log_info ("");
19157
19158 bypass ();
19159
19160 log_info ("");
19161
19162 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19163 if (quiet == 0) fflush (stdout);
19164
19165 break;
19166
19167 case 'p':
19168
19169 log_info ("");
19170
19171 SuspendThreads ();
19172
19173 log_info ("");
19174
19175 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19176 if (quiet == 0) fflush (stdout);
19177
19178 break;
19179
19180 case 'r':
19181
19182 log_info ("");
19183
19184 ResumeThreads ();
19185
19186 log_info ("");
19187
19188 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19189 if (quiet == 0) fflush (stdout);
19190
19191 break;
19192
19193 case 'c':
19194
19195 log_info ("");
19196
19197 if (benchmark == 1) break;
19198
19199 stop_at_checkpoint ();
19200
19201 log_info ("");
19202
19203 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19204 if (quiet == 0) fflush (stdout);
19205
19206 break;
19207
19208 case 'q':
19209
19210 log_info ("");
19211
19212 if (benchmark == 1)
19213 {
19214 myquit ();
19215 }
19216 else
19217 {
19218 myabort ();
19219 }
19220
19221 break;
19222 }
19223
19224 hc_thread_mutex_unlock (mux_display);
19225 }
19226
19227 tty_fix();
19228
19229 return (p);
19230 }
19231
19232 /**
19233 * rules common
19234 */
19235
19236 bool class_num (const u8 c)
19237 {
19238 return ((c >= '0') && (c <= '9'));
19239 }
19240
19241 bool class_lower (const u8 c)
19242 {
19243 return ((c >= 'a') && (c <= 'z'));
19244 }
19245
19246 bool class_upper (const u8 c)
19247 {
19248 return ((c >= 'A') && (c <= 'Z'));
19249 }
19250
19251 bool class_alpha (const u8 c)
19252 {
19253 return (class_lower (c) || class_upper (c));
19254 }
19255
19256 int conv_ctoi (const u8 c)
19257 {
19258 if (class_num (c))
19259 {
19260 return c - '0';
19261 }
19262 else if (class_upper (c))
19263 {
19264 return c - 'A' + 10;
19265 }
19266
19267 return -1;
19268 }
19269
19270 int conv_itoc (const u8 c)
19271 {
19272 if (c < 10)
19273 {
19274 return c + '0';
19275 }
19276 else if (c < 37)
19277 {
19278 return c + 'A' - 10;
19279 }
19280
19281 return -1;
19282 }
19283
19284 /**
19285 * device rules
19286 */
19287
19288 #define INCR_POS if (++rule_pos == rule_len) return (-1)
19289 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
19290 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
19291 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
19292 #define MAX_KERNEL_RULES 255
19293 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
19294 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19295 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19296
19297 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
19298 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
19299 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19300 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19301
19302 int cpu_rule_to_kernel_rule (char rule_buf[BUFSIZ], uint rule_len, kernel_rule_t *rule)
19303 {
19304 uint rule_pos;
19305 uint rule_cnt;
19306
19307 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19308 {
19309 switch (rule_buf[rule_pos])
19310 {
19311 case ' ':
19312 rule_cnt--;
19313 break;
19314
19315 case RULE_OP_MANGLE_NOOP:
19316 SET_NAME (rule, rule_buf[rule_pos]);
19317 break;
19318
19319 case RULE_OP_MANGLE_LREST:
19320 SET_NAME (rule, rule_buf[rule_pos]);
19321 break;
19322
19323 case RULE_OP_MANGLE_UREST:
19324 SET_NAME (rule, rule_buf[rule_pos]);
19325 break;
19326
19327 case RULE_OP_MANGLE_LREST_UFIRST:
19328 SET_NAME (rule, rule_buf[rule_pos]);
19329 break;
19330
19331 case RULE_OP_MANGLE_UREST_LFIRST:
19332 SET_NAME (rule, rule_buf[rule_pos]);
19333 break;
19334
19335 case RULE_OP_MANGLE_TREST:
19336 SET_NAME (rule, rule_buf[rule_pos]);
19337 break;
19338
19339 case RULE_OP_MANGLE_TOGGLE_AT:
19340 SET_NAME (rule, rule_buf[rule_pos]);
19341 SET_P0_CONV (rule, rule_buf[rule_pos]);
19342 break;
19343
19344 case RULE_OP_MANGLE_REVERSE:
19345 SET_NAME (rule, rule_buf[rule_pos]);
19346 break;
19347
19348 case RULE_OP_MANGLE_DUPEWORD:
19349 SET_NAME (rule, rule_buf[rule_pos]);
19350 break;
19351
19352 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19353 SET_NAME (rule, rule_buf[rule_pos]);
19354 SET_P0_CONV (rule, rule_buf[rule_pos]);
19355 break;
19356
19357 case RULE_OP_MANGLE_REFLECT:
19358 SET_NAME (rule, rule_buf[rule_pos]);
19359 break;
19360
19361 case RULE_OP_MANGLE_ROTATE_LEFT:
19362 SET_NAME (rule, rule_buf[rule_pos]);
19363 break;
19364
19365 case RULE_OP_MANGLE_ROTATE_RIGHT:
19366 SET_NAME (rule, rule_buf[rule_pos]);
19367 break;
19368
19369 case RULE_OP_MANGLE_APPEND:
19370 SET_NAME (rule, rule_buf[rule_pos]);
19371 SET_P0 (rule, rule_buf[rule_pos]);
19372 break;
19373
19374 case RULE_OP_MANGLE_PREPEND:
19375 SET_NAME (rule, rule_buf[rule_pos]);
19376 SET_P0 (rule, rule_buf[rule_pos]);
19377 break;
19378
19379 case RULE_OP_MANGLE_DELETE_FIRST:
19380 SET_NAME (rule, rule_buf[rule_pos]);
19381 break;
19382
19383 case RULE_OP_MANGLE_DELETE_LAST:
19384 SET_NAME (rule, rule_buf[rule_pos]);
19385 break;
19386
19387 case RULE_OP_MANGLE_DELETE_AT:
19388 SET_NAME (rule, rule_buf[rule_pos]);
19389 SET_P0_CONV (rule, rule_buf[rule_pos]);
19390 break;
19391
19392 case RULE_OP_MANGLE_EXTRACT:
19393 SET_NAME (rule, rule_buf[rule_pos]);
19394 SET_P0_CONV (rule, rule_buf[rule_pos]);
19395 SET_P1_CONV (rule, rule_buf[rule_pos]);
19396 break;
19397
19398 case RULE_OP_MANGLE_OMIT:
19399 SET_NAME (rule, rule_buf[rule_pos]);
19400 SET_P0_CONV (rule, rule_buf[rule_pos]);
19401 SET_P1_CONV (rule, rule_buf[rule_pos]);
19402 break;
19403
19404 case RULE_OP_MANGLE_INSERT:
19405 SET_NAME (rule, rule_buf[rule_pos]);
19406 SET_P0_CONV (rule, rule_buf[rule_pos]);
19407 SET_P1 (rule, rule_buf[rule_pos]);
19408 break;
19409
19410 case RULE_OP_MANGLE_OVERSTRIKE:
19411 SET_NAME (rule, rule_buf[rule_pos]);
19412 SET_P0_CONV (rule, rule_buf[rule_pos]);
19413 SET_P1 (rule, rule_buf[rule_pos]);
19414 break;
19415
19416 case RULE_OP_MANGLE_TRUNCATE_AT:
19417 SET_NAME (rule, rule_buf[rule_pos]);
19418 SET_P0_CONV (rule, rule_buf[rule_pos]);
19419 break;
19420
19421 case RULE_OP_MANGLE_REPLACE:
19422 SET_NAME (rule, rule_buf[rule_pos]);
19423 SET_P0 (rule, rule_buf[rule_pos]);
19424 SET_P1 (rule, rule_buf[rule_pos]);
19425 break;
19426
19427 case RULE_OP_MANGLE_PURGECHAR:
19428 return (-1);
19429 break;
19430
19431 case RULE_OP_MANGLE_TOGGLECASE_REC:
19432 return (-1);
19433 break;
19434
19435 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19436 SET_NAME (rule, rule_buf[rule_pos]);
19437 SET_P0_CONV (rule, rule_buf[rule_pos]);
19438 break;
19439
19440 case RULE_OP_MANGLE_DUPECHAR_LAST:
19441 SET_NAME (rule, rule_buf[rule_pos]);
19442 SET_P0_CONV (rule, rule_buf[rule_pos]);
19443 break;
19444
19445 case RULE_OP_MANGLE_DUPECHAR_ALL:
19446 SET_NAME (rule, rule_buf[rule_pos]);
19447 break;
19448
19449 case RULE_OP_MANGLE_SWITCH_FIRST:
19450 SET_NAME (rule, rule_buf[rule_pos]);
19451 break;
19452
19453 case RULE_OP_MANGLE_SWITCH_LAST:
19454 SET_NAME (rule, rule_buf[rule_pos]);
19455 break;
19456
19457 case RULE_OP_MANGLE_SWITCH_AT:
19458 SET_NAME (rule, rule_buf[rule_pos]);
19459 SET_P0_CONV (rule, rule_buf[rule_pos]);
19460 SET_P1_CONV (rule, rule_buf[rule_pos]);
19461 break;
19462
19463 case RULE_OP_MANGLE_CHR_SHIFTL:
19464 SET_NAME (rule, rule_buf[rule_pos]);
19465 SET_P0_CONV (rule, rule_buf[rule_pos]);
19466 break;
19467
19468 case RULE_OP_MANGLE_CHR_SHIFTR:
19469 SET_NAME (rule, rule_buf[rule_pos]);
19470 SET_P0_CONV (rule, rule_buf[rule_pos]);
19471 break;
19472
19473 case RULE_OP_MANGLE_CHR_INCR:
19474 SET_NAME (rule, rule_buf[rule_pos]);
19475 SET_P0_CONV (rule, rule_buf[rule_pos]);
19476 break;
19477
19478 case RULE_OP_MANGLE_CHR_DECR:
19479 SET_NAME (rule, rule_buf[rule_pos]);
19480 SET_P0_CONV (rule, rule_buf[rule_pos]);
19481 break;
19482
19483 case RULE_OP_MANGLE_REPLACE_NP1:
19484 SET_NAME (rule, rule_buf[rule_pos]);
19485 SET_P0_CONV (rule, rule_buf[rule_pos]);
19486 break;
19487
19488 case RULE_OP_MANGLE_REPLACE_NM1:
19489 SET_NAME (rule, rule_buf[rule_pos]);
19490 SET_P0_CONV (rule, rule_buf[rule_pos]);
19491 break;
19492
19493 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19494 SET_NAME (rule, rule_buf[rule_pos]);
19495 SET_P0_CONV (rule, rule_buf[rule_pos]);
19496 break;
19497
19498 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19499 SET_NAME (rule, rule_buf[rule_pos]);
19500 SET_P0_CONV (rule, rule_buf[rule_pos]);
19501 break;
19502
19503 case RULE_OP_MANGLE_TITLE:
19504 SET_NAME (rule, rule_buf[rule_pos]);
19505 break;
19506
19507 default:
19508 return (-1);
19509 break;
19510 }
19511 }
19512
19513 if (rule_pos < rule_len) return (-1);
19514
19515 return (0);
19516 }
19517
19518 int kernel_rule_to_cpu_rule (char rule_buf[BUFSIZ], kernel_rule_t *rule)
19519 {
19520 uint rule_cnt;
19521 uint rule_pos;
19522 uint rule_len = BUFSIZ - 1; // maximum possible len
19523
19524 char rule_cmd;
19525
19526 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19527 {
19528 GET_NAME (rule);
19529
19530 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19531
19532 switch (rule_cmd)
19533 {
19534 case RULE_OP_MANGLE_NOOP:
19535 rule_buf[rule_pos] = rule_cmd;
19536 break;
19537
19538 case RULE_OP_MANGLE_LREST:
19539 rule_buf[rule_pos] = rule_cmd;
19540 break;
19541
19542 case RULE_OP_MANGLE_UREST:
19543 rule_buf[rule_pos] = rule_cmd;
19544 break;
19545
19546 case RULE_OP_MANGLE_LREST_UFIRST:
19547 rule_buf[rule_pos] = rule_cmd;
19548 break;
19549
19550 case RULE_OP_MANGLE_UREST_LFIRST:
19551 rule_buf[rule_pos] = rule_cmd;
19552 break;
19553
19554 case RULE_OP_MANGLE_TREST:
19555 rule_buf[rule_pos] = rule_cmd;
19556 break;
19557
19558 case RULE_OP_MANGLE_TOGGLE_AT:
19559 rule_buf[rule_pos] = rule_cmd;
19560 GET_P0_CONV (rule);
19561 break;
19562
19563 case RULE_OP_MANGLE_REVERSE:
19564 rule_buf[rule_pos] = rule_cmd;
19565 break;
19566
19567 case RULE_OP_MANGLE_DUPEWORD:
19568 rule_buf[rule_pos] = rule_cmd;
19569 break;
19570
19571 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19572 rule_buf[rule_pos] = rule_cmd;
19573 GET_P0_CONV (rule);
19574 break;
19575
19576 case RULE_OP_MANGLE_REFLECT:
19577 rule_buf[rule_pos] = rule_cmd;
19578 break;
19579
19580 case RULE_OP_MANGLE_ROTATE_LEFT:
19581 rule_buf[rule_pos] = rule_cmd;
19582 break;
19583
19584 case RULE_OP_MANGLE_ROTATE_RIGHT:
19585 rule_buf[rule_pos] = rule_cmd;
19586 break;
19587
19588 case RULE_OP_MANGLE_APPEND:
19589 rule_buf[rule_pos] = rule_cmd;
19590 GET_P0 (rule);
19591 break;
19592
19593 case RULE_OP_MANGLE_PREPEND:
19594 rule_buf[rule_pos] = rule_cmd;
19595 GET_P0 (rule);
19596 break;
19597
19598 case RULE_OP_MANGLE_DELETE_FIRST:
19599 rule_buf[rule_pos] = rule_cmd;
19600 break;
19601
19602 case RULE_OP_MANGLE_DELETE_LAST:
19603 rule_buf[rule_pos] = rule_cmd;
19604 break;
19605
19606 case RULE_OP_MANGLE_DELETE_AT:
19607 rule_buf[rule_pos] = rule_cmd;
19608 GET_P0_CONV (rule);
19609 break;
19610
19611 case RULE_OP_MANGLE_EXTRACT:
19612 rule_buf[rule_pos] = rule_cmd;
19613 GET_P0_CONV (rule);
19614 GET_P1_CONV (rule);
19615 break;
19616
19617 case RULE_OP_MANGLE_OMIT:
19618 rule_buf[rule_pos] = rule_cmd;
19619 GET_P0_CONV (rule);
19620 GET_P1_CONV (rule);
19621 break;
19622
19623 case RULE_OP_MANGLE_INSERT:
19624 rule_buf[rule_pos] = rule_cmd;
19625 GET_P0_CONV (rule);
19626 GET_P1 (rule);
19627 break;
19628
19629 case RULE_OP_MANGLE_OVERSTRIKE:
19630 rule_buf[rule_pos] = rule_cmd;
19631 GET_P0_CONV (rule);
19632 GET_P1 (rule);
19633 break;
19634
19635 case RULE_OP_MANGLE_TRUNCATE_AT:
19636 rule_buf[rule_pos] = rule_cmd;
19637 GET_P0_CONV (rule);
19638 break;
19639
19640 case RULE_OP_MANGLE_REPLACE:
19641 rule_buf[rule_pos] = rule_cmd;
19642 GET_P0 (rule);
19643 GET_P1 (rule);
19644 break;
19645
19646 case RULE_OP_MANGLE_PURGECHAR:
19647 return (-1);
19648 break;
19649
19650 case RULE_OP_MANGLE_TOGGLECASE_REC:
19651 return (-1);
19652 break;
19653
19654 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19655 rule_buf[rule_pos] = rule_cmd;
19656 GET_P0_CONV (rule);
19657 break;
19658
19659 case RULE_OP_MANGLE_DUPECHAR_LAST:
19660 rule_buf[rule_pos] = rule_cmd;
19661 GET_P0_CONV (rule);
19662 break;
19663
19664 case RULE_OP_MANGLE_DUPECHAR_ALL:
19665 rule_buf[rule_pos] = rule_cmd;
19666 break;
19667
19668 case RULE_OP_MANGLE_SWITCH_FIRST:
19669 rule_buf[rule_pos] = rule_cmd;
19670 break;
19671
19672 case RULE_OP_MANGLE_SWITCH_LAST:
19673 rule_buf[rule_pos] = rule_cmd;
19674 break;
19675
19676 case RULE_OP_MANGLE_SWITCH_AT:
19677 rule_buf[rule_pos] = rule_cmd;
19678 GET_P0_CONV (rule);
19679 GET_P1_CONV (rule);
19680 break;
19681
19682 case RULE_OP_MANGLE_CHR_SHIFTL:
19683 rule_buf[rule_pos] = rule_cmd;
19684 GET_P0_CONV (rule);
19685 break;
19686
19687 case RULE_OP_MANGLE_CHR_SHIFTR:
19688 rule_buf[rule_pos] = rule_cmd;
19689 GET_P0_CONV (rule);
19690 break;
19691
19692 case RULE_OP_MANGLE_CHR_INCR:
19693 rule_buf[rule_pos] = rule_cmd;
19694 GET_P0_CONV (rule);
19695 break;
19696
19697 case RULE_OP_MANGLE_CHR_DECR:
19698 rule_buf[rule_pos] = rule_cmd;
19699 GET_P0_CONV (rule);
19700 break;
19701
19702 case RULE_OP_MANGLE_REPLACE_NP1:
19703 rule_buf[rule_pos] = rule_cmd;
19704 GET_P0_CONV (rule);
19705 break;
19706
19707 case RULE_OP_MANGLE_REPLACE_NM1:
19708 rule_buf[rule_pos] = rule_cmd;
19709 GET_P0_CONV (rule);
19710 break;
19711
19712 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19713 rule_buf[rule_pos] = rule_cmd;
19714 GET_P0_CONV (rule);
19715 break;
19716
19717 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19718 rule_buf[rule_pos] = rule_cmd;
19719 GET_P0_CONV (rule);
19720 break;
19721
19722 case RULE_OP_MANGLE_TITLE:
19723 rule_buf[rule_pos] = rule_cmd;
19724 break;
19725
19726 case 0:
19727 return rule_pos - 1;
19728 break;
19729
19730 default:
19731 return (-1);
19732 break;
19733 }
19734 }
19735
19736 if (rule_cnt > 0)
19737 {
19738 return rule_pos;
19739 }
19740
19741 return (-1);
19742 }
19743
19744 /**
19745 * CPU rules : this is from hashcat sources, cpu based rules
19746 */
19747
19748 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19749 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19750
19751 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19752 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19753 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19754
19755 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19756 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19757 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19758
19759 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19760 {
19761 int pos;
19762
19763 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19764
19765 return (arr_len);
19766 }
19767
19768 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19769 {
19770 int pos;
19771
19772 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19773
19774 return (arr_len);
19775 }
19776
19777 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19778 {
19779 int pos;
19780
19781 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19782
19783 return (arr_len);
19784 }
19785
19786 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19787 {
19788 int l;
19789 int r;
19790
19791 for (l = 0; l < arr_len; l++)
19792 {
19793 r = arr_len - 1 - l;
19794
19795 if (l >= r) break;
19796
19797 MANGLE_SWITCH (arr, l, r);
19798 }
19799
19800 return (arr_len);
19801 }
19802
19803 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19804 {
19805 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19806
19807 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19808
19809 return (arr_len * 2);
19810 }
19811
19812 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19813 {
19814 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19815
19816 int orig_len = arr_len;
19817
19818 int i;
19819
19820 for (i = 0; i < times; i++)
19821 {
19822 memcpy (&arr[arr_len], arr, orig_len);
19823
19824 arr_len += orig_len;
19825 }
19826
19827 return (arr_len);
19828 }
19829
19830 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19831 {
19832 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19833
19834 mangle_double (arr, arr_len);
19835
19836 mangle_reverse (arr + arr_len, arr_len);
19837
19838 return (arr_len * 2);
19839 }
19840
19841 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19842 {
19843 int l;
19844 int r;
19845
19846 for (l = 0, r = arr_len - 1; r > 0; r--)
19847 {
19848 MANGLE_SWITCH (arr, l, r);
19849 }
19850
19851 return (arr_len);
19852 }
19853
19854 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19855 {
19856 int l;
19857 int r;
19858
19859 for (l = 0, r = arr_len - 1; l < r; l++)
19860 {
19861 MANGLE_SWITCH (arr, l, r);
19862 }
19863
19864 return (arr_len);
19865 }
19866
19867 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19868 {
19869 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19870
19871 arr[arr_len] = c;
19872
19873 return (arr_len + 1);
19874 }
19875
19876 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19877 {
19878 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19879
19880 int arr_pos;
19881
19882 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19883 {
19884 arr[arr_pos + 1] = arr[arr_pos];
19885 }
19886
19887 arr[0] = c;
19888
19889 return (arr_len + 1);
19890 }
19891
19892 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19893 {
19894 if (upos >= arr_len) return (arr_len);
19895
19896 int arr_pos;
19897
19898 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
19899 {
19900 arr[arr_pos] = arr[arr_pos + 1];
19901 }
19902
19903 return (arr_len - 1);
19904 }
19905
19906 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19907 {
19908 if (upos >= arr_len) return (arr_len);
19909
19910 if ((upos + ulen) > arr_len) return (arr_len);
19911
19912 int arr_pos;
19913
19914 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
19915 {
19916 arr[arr_pos] = arr[upos + arr_pos];
19917 }
19918
19919 return (ulen);
19920 }
19921
19922 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19923 {
19924 if (upos >= arr_len) return (arr_len);
19925
19926 if ((upos + ulen) >= arr_len) return (arr_len);
19927
19928 int arr_pos;
19929
19930 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
19931 {
19932 arr[arr_pos] = arr[arr_pos + ulen];
19933 }
19934
19935 return (arr_len - ulen);
19936 }
19937
19938 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19939 {
19940 if (upos >= arr_len) return (arr_len);
19941
19942 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19943
19944 int arr_pos;
19945
19946 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
19947 {
19948 arr[arr_pos + 1] = arr[arr_pos];
19949 }
19950
19951 arr[upos] = c;
19952
19953 return (arr_len + 1);
19954 }
19955
19956 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)
19957 {
19958 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
19959
19960 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
19961
19962 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
19963
19964 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
19965
19966 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
19967
19968 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
19969
19970 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
19971
19972 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
19973
19974 return (arr_len + arr2_cpy);
19975 }
19976
19977 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19978 {
19979 if (upos >= arr_len) return (arr_len);
19980
19981 arr[upos] = c;
19982
19983 return (arr_len);
19984 }
19985
19986 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19987 {
19988 if (upos >= arr_len) return (arr_len);
19989
19990 memset (arr + upos, 0, arr_len - upos);
19991
19992 return (upos);
19993 }
19994
19995 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
19996 {
19997 int arr_pos;
19998
19999 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
20000 {
20001 if (arr[arr_pos] != oldc) continue;
20002
20003 arr[arr_pos] = newc;
20004 }
20005
20006 return (arr_len);
20007 }
20008
20009 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
20010 {
20011 int arr_pos;
20012
20013 int ret_len;
20014
20015 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
20016 {
20017 if (arr[arr_pos] == c) continue;
20018
20019 arr[ret_len] = arr[arr_pos];
20020
20021 ret_len++;
20022 }
20023
20024 return (ret_len);
20025 }
20026
20027 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
20028 {
20029 if (ulen > arr_len) return (arr_len);
20030
20031 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20032
20033 char cs[100] = { 0 };
20034
20035 memcpy (cs, arr, ulen);
20036
20037 int i;
20038
20039 for (i = 0; i < ulen; i++)
20040 {
20041 char c = cs[i];
20042
20043 arr_len = mangle_insert (arr, arr_len, i, c);
20044 }
20045
20046 return (arr_len);
20047 }
20048
20049 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
20050 {
20051 if (ulen > arr_len) return (arr_len);
20052
20053 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20054
20055 int upos = arr_len - ulen;
20056
20057 int i;
20058
20059 for (i = 0; i < ulen; i++)
20060 {
20061 char c = arr[upos + i];
20062
20063 arr_len = mangle_append (arr, arr_len, c);
20064 }
20065
20066 return (arr_len);
20067 }
20068
20069 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
20070 {
20071 if ( arr_len == 0) return (arr_len);
20072 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
20073
20074 char c = arr[upos];
20075
20076 int i;
20077
20078 for (i = 0; i < ulen; i++)
20079 {
20080 arr_len = mangle_insert (arr, arr_len, upos, c);
20081 }
20082
20083 return (arr_len);
20084 }
20085
20086 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
20087 {
20088 if ( arr_len == 0) return (arr_len);
20089 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
20090
20091 int arr_pos;
20092
20093 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
20094 {
20095 int new_pos = arr_pos * 2;
20096
20097 arr[new_pos] = arr[arr_pos];
20098
20099 arr[new_pos + 1] = arr[arr_pos];
20100 }
20101
20102 return (arr_len * 2);
20103 }
20104
20105 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20106 {
20107 if (upos >= arr_len) return (arr_len);
20108 if (upos2 >= arr_len) return (arr_len);
20109
20110 MANGLE_SWITCH (arr, upos, upos2);
20111
20112 return (arr_len);
20113 }
20114
20115 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20116 {
20117 MANGLE_SWITCH (arr, upos, upos2);
20118
20119 return (arr_len);
20120 }
20121
20122 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
20123 {
20124 if (upos >= arr_len) return (arr_len);
20125
20126 arr[upos] <<= 1;
20127
20128 return (arr_len);
20129 }
20130
20131 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
20132 {
20133 if (upos >= arr_len) return (arr_len);
20134
20135 arr[upos] >>= 1;
20136
20137 return (arr_len);
20138 }
20139
20140 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
20141 {
20142 if (upos >= arr_len) return (arr_len);
20143
20144 arr[upos] += 1;
20145
20146 return (arr_len);
20147 }
20148
20149 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
20150 {
20151 if (upos >= arr_len) return (arr_len);
20152
20153 arr[upos] -= 1;
20154
20155 return (arr_len);
20156 }
20157
20158 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
20159 {
20160 int upper_next = 1;
20161
20162 int pos;
20163
20164 for (pos = 0; pos < arr_len; pos++)
20165 {
20166 if (arr[pos] == ' ')
20167 {
20168 upper_next = 1;
20169
20170 continue;
20171 }
20172
20173 if (upper_next)
20174 {
20175 upper_next = 0;
20176
20177 MANGLE_UPPER_AT (arr, pos);
20178 }
20179 else
20180 {
20181 MANGLE_LOWER_AT (arr, pos);
20182 }
20183 }
20184
20185 return (arr_len);
20186 }
20187
20188 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
20189 {
20190 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
20191
20192 u32 j;
20193
20194 u32 rule_pos = 0;
20195
20196 for (j = 0; j < rp_gen_num; j++)
20197 {
20198 u32 r = 0;
20199 u32 p1 = 0;
20200 u32 p2 = 0;
20201 u32 p3 = 0;
20202
20203 switch ((char) get_random_num (0, 9))
20204 {
20205 case 0:
20206 r = get_random_num (0, sizeof (grp_op_nop));
20207 rule_buf[rule_pos++] = grp_op_nop[r];
20208 break;
20209
20210 case 1:
20211 r = get_random_num (0, sizeof (grp_op_pos_p0));
20212 rule_buf[rule_pos++] = grp_op_pos_p0[r];
20213 p1 = get_random_num (0, sizeof (grp_pos));
20214 rule_buf[rule_pos++] = grp_pos[p1];
20215 break;
20216
20217 case 2:
20218 r = get_random_num (0, sizeof (grp_op_pos_p1));
20219 rule_buf[rule_pos++] = grp_op_pos_p1[r];
20220 p1 = get_random_num (1, 6);
20221 rule_buf[rule_pos++] = grp_pos[p1];
20222 break;
20223
20224 case 3:
20225 r = get_random_num (0, sizeof (grp_op_chr));
20226 rule_buf[rule_pos++] = grp_op_chr[r];
20227 p1 = get_random_num (0x20, 0x7e);
20228 rule_buf[rule_pos++] = (char) p1;
20229 break;
20230
20231 case 4:
20232 r = get_random_num (0, sizeof (grp_op_chr_chr));
20233 rule_buf[rule_pos++] = grp_op_chr_chr[r];
20234 p1 = get_random_num (0x20, 0x7e);
20235 rule_buf[rule_pos++] = (char) p1;
20236 p2 = get_random_num (0x20, 0x7e);
20237 while (p1 == p2)
20238 p2 = get_random_num (0x20, 0x7e);
20239 rule_buf[rule_pos++] = (char) p2;
20240 break;
20241
20242 case 5:
20243 r = get_random_num (0, sizeof (grp_op_pos_chr));
20244 rule_buf[rule_pos++] = grp_op_pos_chr[r];
20245 p1 = get_random_num (0, sizeof (grp_pos));
20246 rule_buf[rule_pos++] = grp_pos[p1];
20247 p2 = get_random_num (0x20, 0x7e);
20248 rule_buf[rule_pos++] = (char) p2;
20249 break;
20250
20251 case 6:
20252 r = get_random_num (0, sizeof (grp_op_pos_pos0));
20253 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
20254 p1 = get_random_num (0, sizeof (grp_pos));
20255 rule_buf[rule_pos++] = grp_pos[p1];
20256 p2 = get_random_num (0, sizeof (grp_pos));
20257 while (p1 == p2)
20258 p2 = get_random_num (0, sizeof (grp_pos));
20259 rule_buf[rule_pos++] = grp_pos[p2];
20260 break;
20261
20262 case 7:
20263 r = get_random_num (0, sizeof (grp_op_pos_pos1));
20264 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
20265 p1 = get_random_num (0, sizeof (grp_pos));
20266 rule_buf[rule_pos++] = grp_pos[p1];
20267 p2 = get_random_num (1, sizeof (grp_pos));
20268 while (p1 == p2)
20269 p2 = get_random_num (1, sizeof (grp_pos));
20270 rule_buf[rule_pos++] = grp_pos[p2];
20271 break;
20272
20273 case 8:
20274 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
20275 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
20276 p1 = get_random_num (0, sizeof (grp_pos));
20277 rule_buf[rule_pos++] = grp_pos[p1];
20278 p2 = get_random_num (1, sizeof (grp_pos));
20279 rule_buf[rule_pos++] = grp_pos[p1];
20280 p3 = get_random_num (0, sizeof (grp_pos));
20281 rule_buf[rule_pos++] = grp_pos[p3];
20282 break;
20283 }
20284 }
20285
20286 return (rule_pos);
20287 }
20288
20289 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
20290 {
20291 char mem[BLOCK_SIZE] = { 0 };
20292
20293 if (in == NULL) return (RULE_RC_REJECT_ERROR);
20294
20295 if (out == NULL) return (RULE_RC_REJECT_ERROR);
20296
20297 if (in_len < 1 || in_len > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20298
20299 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
20300
20301 int out_len = in_len;
20302 int mem_len = in_len;
20303
20304 memcpy (out, in, out_len);
20305
20306 int rule_pos;
20307
20308 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
20309 {
20310 int upos, upos2;
20311 int ulen;
20312
20313 switch (rule[rule_pos])
20314 {
20315 case ' ':
20316 break;
20317
20318 case RULE_OP_MANGLE_NOOP:
20319 break;
20320
20321 case RULE_OP_MANGLE_LREST:
20322 out_len = mangle_lrest (out, out_len);
20323 break;
20324
20325 case RULE_OP_MANGLE_UREST:
20326 out_len = mangle_urest (out, out_len);
20327 break;
20328
20329 case RULE_OP_MANGLE_LREST_UFIRST:
20330 out_len = mangle_lrest (out, out_len);
20331 if (out_len) MANGLE_UPPER_AT (out, 0);
20332 break;
20333
20334 case RULE_OP_MANGLE_UREST_LFIRST:
20335 out_len = mangle_urest (out, out_len);
20336 if (out_len) MANGLE_LOWER_AT (out, 0);
20337 break;
20338
20339 case RULE_OP_MANGLE_TREST:
20340 out_len = mangle_trest (out, out_len);
20341 break;
20342
20343 case RULE_OP_MANGLE_TOGGLE_AT:
20344 NEXT_RULEPOS (rule_pos);
20345 NEXT_RPTOI (rule, rule_pos, upos);
20346 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
20347 break;
20348
20349 case RULE_OP_MANGLE_REVERSE:
20350 out_len = mangle_reverse (out, out_len);
20351 break;
20352
20353 case RULE_OP_MANGLE_DUPEWORD:
20354 out_len = mangle_double (out, out_len);
20355 break;
20356
20357 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20358 NEXT_RULEPOS (rule_pos);
20359 NEXT_RPTOI (rule, rule_pos, ulen);
20360 out_len = mangle_double_times (out, out_len, ulen);
20361 break;
20362
20363 case RULE_OP_MANGLE_REFLECT:
20364 out_len = mangle_reflect (out, out_len);
20365 break;
20366
20367 case RULE_OP_MANGLE_ROTATE_LEFT:
20368 mangle_rotate_left (out, out_len);
20369 break;
20370
20371 case RULE_OP_MANGLE_ROTATE_RIGHT:
20372 mangle_rotate_right (out, out_len);
20373 break;
20374
20375 case RULE_OP_MANGLE_APPEND:
20376 NEXT_RULEPOS (rule_pos);
20377 out_len = mangle_append (out, out_len, rule[rule_pos]);
20378 break;
20379
20380 case RULE_OP_MANGLE_PREPEND:
20381 NEXT_RULEPOS (rule_pos);
20382 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
20383 break;
20384
20385 case RULE_OP_MANGLE_DELETE_FIRST:
20386 out_len = mangle_delete_at (out, out_len, 0);
20387 break;
20388
20389 case RULE_OP_MANGLE_DELETE_LAST:
20390 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
20391 break;
20392
20393 case RULE_OP_MANGLE_DELETE_AT:
20394 NEXT_RULEPOS (rule_pos);
20395 NEXT_RPTOI (rule, rule_pos, upos);
20396 out_len = mangle_delete_at (out, out_len, upos);
20397 break;
20398
20399 case RULE_OP_MANGLE_EXTRACT:
20400 NEXT_RULEPOS (rule_pos);
20401 NEXT_RPTOI (rule, rule_pos, upos);
20402 NEXT_RULEPOS (rule_pos);
20403 NEXT_RPTOI (rule, rule_pos, ulen);
20404 out_len = mangle_extract (out, out_len, upos, ulen);
20405 break;
20406
20407 case RULE_OP_MANGLE_OMIT:
20408 NEXT_RULEPOS (rule_pos);
20409 NEXT_RPTOI (rule, rule_pos, upos);
20410 NEXT_RULEPOS (rule_pos);
20411 NEXT_RPTOI (rule, rule_pos, ulen);
20412 out_len = mangle_omit (out, out_len, upos, ulen);
20413 break;
20414
20415 case RULE_OP_MANGLE_INSERT:
20416 NEXT_RULEPOS (rule_pos);
20417 NEXT_RPTOI (rule, rule_pos, upos);
20418 NEXT_RULEPOS (rule_pos);
20419 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
20420 break;
20421
20422 case RULE_OP_MANGLE_OVERSTRIKE:
20423 NEXT_RULEPOS (rule_pos);
20424 NEXT_RPTOI (rule, rule_pos, upos);
20425 NEXT_RULEPOS (rule_pos);
20426 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
20427 break;
20428
20429 case RULE_OP_MANGLE_TRUNCATE_AT:
20430 NEXT_RULEPOS (rule_pos);
20431 NEXT_RPTOI (rule, rule_pos, upos);
20432 out_len = mangle_truncate_at (out, out_len, upos);
20433 break;
20434
20435 case RULE_OP_MANGLE_REPLACE:
20436 NEXT_RULEPOS (rule_pos);
20437 NEXT_RULEPOS (rule_pos);
20438 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
20439 break;
20440
20441 case RULE_OP_MANGLE_PURGECHAR:
20442 NEXT_RULEPOS (rule_pos);
20443 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
20444 break;
20445
20446 case RULE_OP_MANGLE_TOGGLECASE_REC:
20447 /* todo */
20448 break;
20449
20450 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20451 NEXT_RULEPOS (rule_pos);
20452 NEXT_RPTOI (rule, rule_pos, ulen);
20453 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
20454 break;
20455
20456 case RULE_OP_MANGLE_DUPECHAR_LAST:
20457 NEXT_RULEPOS (rule_pos);
20458 NEXT_RPTOI (rule, rule_pos, ulen);
20459 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
20460 break;
20461
20462 case RULE_OP_MANGLE_DUPECHAR_ALL:
20463 out_len = mangle_dupechar (out, out_len);
20464 break;
20465
20466 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20467 NEXT_RULEPOS (rule_pos);
20468 NEXT_RPTOI (rule, rule_pos, ulen);
20469 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20470 break;
20471
20472 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20473 NEXT_RULEPOS (rule_pos);
20474 NEXT_RPTOI (rule, rule_pos, ulen);
20475 out_len = mangle_dupeblock_append (out, out_len, ulen);
20476 break;
20477
20478 case RULE_OP_MANGLE_SWITCH_FIRST:
20479 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20480 break;
20481
20482 case RULE_OP_MANGLE_SWITCH_LAST:
20483 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20484 break;
20485
20486 case RULE_OP_MANGLE_SWITCH_AT:
20487 NEXT_RULEPOS (rule_pos);
20488 NEXT_RPTOI (rule, rule_pos, upos);
20489 NEXT_RULEPOS (rule_pos);
20490 NEXT_RPTOI (rule, rule_pos, upos2);
20491 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20492 break;
20493
20494 case RULE_OP_MANGLE_CHR_SHIFTL:
20495 NEXT_RULEPOS (rule_pos);
20496 NEXT_RPTOI (rule, rule_pos, upos);
20497 mangle_chr_shiftl (out, out_len, upos);
20498 break;
20499
20500 case RULE_OP_MANGLE_CHR_SHIFTR:
20501 NEXT_RULEPOS (rule_pos);
20502 NEXT_RPTOI (rule, rule_pos, upos);
20503 mangle_chr_shiftr (out, out_len, upos);
20504 break;
20505
20506 case RULE_OP_MANGLE_CHR_INCR:
20507 NEXT_RULEPOS (rule_pos);
20508 NEXT_RPTOI (rule, rule_pos, upos);
20509 mangle_chr_incr (out, out_len, upos);
20510 break;
20511
20512 case RULE_OP_MANGLE_CHR_DECR:
20513 NEXT_RULEPOS (rule_pos);
20514 NEXT_RPTOI (rule, rule_pos, upos);
20515 mangle_chr_decr (out, out_len, upos);
20516 break;
20517
20518 case RULE_OP_MANGLE_REPLACE_NP1:
20519 NEXT_RULEPOS (rule_pos);
20520 NEXT_RPTOI (rule, rule_pos, upos);
20521 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20522 break;
20523
20524 case RULE_OP_MANGLE_REPLACE_NM1:
20525 NEXT_RULEPOS (rule_pos);
20526 NEXT_RPTOI (rule, rule_pos, upos);
20527 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20528 break;
20529
20530 case RULE_OP_MANGLE_TITLE:
20531 out_len = mangle_title (out, out_len);
20532 break;
20533
20534 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20535 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20536 NEXT_RULEPOS (rule_pos);
20537 NEXT_RPTOI (rule, rule_pos, upos);
20538 NEXT_RULEPOS (rule_pos);
20539 NEXT_RPTOI (rule, rule_pos, ulen);
20540 NEXT_RULEPOS (rule_pos);
20541 NEXT_RPTOI (rule, rule_pos, upos2);
20542 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20543 break;
20544
20545 case RULE_OP_MANGLE_APPEND_MEMORY:
20546 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20547 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20548 memcpy (out + out_len, mem, mem_len);
20549 out_len += mem_len;
20550 break;
20551
20552 case RULE_OP_MANGLE_PREPEND_MEMORY:
20553 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20554 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20555 memcpy (mem + mem_len, out, out_len);
20556 out_len += mem_len;
20557 memcpy (out, mem, out_len);
20558 break;
20559
20560 case RULE_OP_MEMORIZE_WORD:
20561 memcpy (mem, out, out_len);
20562 mem_len = out_len;
20563 break;
20564
20565 case RULE_OP_REJECT_LESS:
20566 NEXT_RULEPOS (rule_pos);
20567 NEXT_RPTOI (rule, rule_pos, upos);
20568 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20569 break;
20570
20571 case RULE_OP_REJECT_GREATER:
20572 NEXT_RULEPOS (rule_pos);
20573 NEXT_RPTOI (rule, rule_pos, upos);
20574 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20575 break;
20576
20577 case RULE_OP_REJECT_CONTAIN:
20578 NEXT_RULEPOS (rule_pos);
20579 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20580 break;
20581
20582 case RULE_OP_REJECT_NOT_CONTAIN:
20583 NEXT_RULEPOS (rule_pos);
20584 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20585 break;
20586
20587 case RULE_OP_REJECT_EQUAL_FIRST:
20588 NEXT_RULEPOS (rule_pos);
20589 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20590 break;
20591
20592 case RULE_OP_REJECT_EQUAL_LAST:
20593 NEXT_RULEPOS (rule_pos);
20594 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20595 break;
20596
20597 case RULE_OP_REJECT_EQUAL_AT:
20598 NEXT_RULEPOS (rule_pos);
20599 NEXT_RPTOI (rule, rule_pos, upos);
20600 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20601 NEXT_RULEPOS (rule_pos);
20602 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20603 break;
20604
20605 case RULE_OP_REJECT_CONTAINS:
20606 NEXT_RULEPOS (rule_pos);
20607 NEXT_RPTOI (rule, rule_pos, upos);
20608 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20609 NEXT_RULEPOS (rule_pos);
20610 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20611 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20612 break;
20613
20614 case RULE_OP_REJECT_MEMORY:
20615 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20616 break;
20617
20618 default:
20619 return (RULE_RC_SYNTAX_ERROR);
20620 break;
20621 }
20622 }
20623
20624 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20625
20626 return (out_len);
20627 }