Added new hash mode -m 12900 = Android FDE (Samsung DEK)
[hashcat.git] / src / shared.c
1 /**
2 * Author......: Jens Steube <jens.steube@gmail.com>
3 * License.....: MIT
4 */
5
6 #include <shared.h>
7 #include <limits.h>
8
9 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
10 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
11
12 /**
13 * tuning tools
14 */
15
16 #define GET_ACCEL(x) KERNEL_ACCEL_ ## x
17 #define GET_LOOPS(x) KERNEL_LOOPS_ ## x
18
19 /**
20 * bit rotate
21 */
22
23 uint32_t rotl32 (const uint32_t a, const uint n)
24 {
25 return ((a << n) | (a >> (32 - n)));
26 }
27
28 uint32_t rotr32 (const uint32_t a, const uint n)
29 {
30 return ((a >> n) | (a << (32 - n)));
31 }
32
33 uint64_t rotl64 (const uint64_t a, const uint n)
34 {
35 return ((a << n) | (a >> (64 - n)));
36 }
37
38 uint64_t rotr64 (const uint64_t a, const uint n)
39 {
40 return ((a >> n) | (a << (64 - n)));
41 }
42
43 /**
44 * ciphers for use on cpu
45 */
46
47 #include "cpu-des.c"
48 #include "cpu-aes.c"
49
50 /**
51 * hashes for use on cpu
52 */
53
54 #include "cpu-md5.c"
55 #include "cpu-sha256.c"
56
57 /**
58 * logging
59 */
60
61 int last_len = 0;
62
63 void log_final (FILE *fp, const char *fmt, va_list ap)
64 {
65 if (last_len)
66 {
67 fputc ('\r', fp);
68
69 for (int i = 0; i < last_len; i++)
70 {
71 fputc (' ', fp);
72 }
73
74 fputc ('\r', fp);
75 }
76
77 char s[4096];
78
79 int max_len = (int) sizeof (s);
80
81 int len = vsnprintf (s, max_len, fmt, ap);
82
83 if (len > max_len) len = max_len;
84
85 fwrite (s, len, 1, fp);
86
87 fflush (fp);
88
89 last_len = len;
90 }
91
92 void log_out_nn (FILE *fp, const char *fmt, ...)
93 {
94 if (SUPPRESS_OUTPUT) return;
95
96 va_list ap;
97
98 va_start (ap, fmt);
99
100 log_final (fp, fmt, ap);
101
102 va_end (ap);
103 }
104
105 void log_info_nn (const char *fmt, ...)
106 {
107 if (SUPPRESS_OUTPUT) return;
108
109 va_list ap;
110
111 va_start (ap, fmt);
112
113 log_final (stdout, fmt, ap);
114
115 va_end (ap);
116 }
117
118 void log_error_nn (const char *fmt, ...)
119 {
120 if (SUPPRESS_OUTPUT) return;
121
122 va_list ap;
123
124 va_start (ap, fmt);
125
126 log_final (stderr, fmt, ap);
127
128 va_end (ap);
129 }
130
131 void log_out (FILE *fp, const char *fmt, ...)
132 {
133 if (SUPPRESS_OUTPUT) return;
134
135 va_list ap;
136
137 va_start (ap, fmt);
138
139 log_final (fp, fmt, ap);
140
141 va_end (ap);
142
143 fputc ('\n', fp);
144
145 last_len = 0;
146 }
147
148 void log_info (const char *fmt, ...)
149 {
150 if (SUPPRESS_OUTPUT) return;
151
152 va_list ap;
153
154 va_start (ap, fmt);
155
156 log_final (stdout, fmt, ap);
157
158 va_end (ap);
159
160 fputc ('\n', stdout);
161
162 last_len = 0;
163 }
164
165 void log_error (const char *fmt, ...)
166 {
167 if (SUPPRESS_OUTPUT) return;
168
169 fputc ('\n', stderr);
170 fputc ('\n', stderr);
171
172 va_list ap;
173
174 va_start (ap, fmt);
175
176 log_final (stderr, fmt, ap);
177
178 va_end (ap);
179
180 fputc ('\n', stderr);
181 fputc ('\n', stderr);
182
183 last_len = 0;
184 }
185
186 /**
187 * converter
188 */
189
190 uint byte_swap_32 (const uint n)
191 {
192 return (n & 0xff000000) >> 24
193 | (n & 0x00ff0000) >> 8
194 | (n & 0x0000ff00) << 8
195 | (n & 0x000000ff) << 24;
196 }
197
198 uint64_t byte_swap_64 (const uint64_t n)
199 {
200 return (n & 0xff00000000000000ULL) >> 56
201 | (n & 0x00ff000000000000ULL) >> 40
202 | (n & 0x0000ff0000000000ULL) >> 24
203 | (n & 0x000000ff00000000ULL) >> 8
204 | (n & 0x00000000ff000000ULL) << 8
205 | (n & 0x0000000000ff0000ULL) << 24
206 | (n & 0x000000000000ff00ULL) << 40
207 | (n & 0x00000000000000ffULL) << 56;
208 }
209
210 char int_to_base32 (const char c)
211 {
212 static const char tbl[0x20] =
213 {
214 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
215 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
216 };
217
218 return tbl[(const uint8_t) c];
219 }
220
221 char base32_to_int (const char c)
222 {
223 if ((c >= 'A') && (c <= 'Z')) return c - 'A';
224 else if ((c >= '2') && (c <= '7')) return c - '2' + 26;
225
226 return 0;
227 }
228
229 char int_to_itoa32 (const char c)
230 {
231 static const char tbl[0x20] =
232 {
233 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
234 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
235 };
236
237 return tbl[(const uint8_t) c];
238 }
239
240 char itoa32_to_int (const char c)
241 {
242 if ((c >= '0') && (c <= '9')) return c - '0';
243 else if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10;
244
245 return 0;
246 }
247
248 char int_to_itoa64 (const char c)
249 {
250 static const char tbl[0x40] =
251 {
252 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
253 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
254 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
255 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
256 };
257
258 return tbl[(const uint8_t) c];
259 }
260
261 char itoa64_to_int (const char c)
262 {
263 static const char tbl[0x100] =
264 {
265 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
266 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
267 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01,
268 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
269 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
270 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
271 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
272 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
273 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
274 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
275 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
276 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
277 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
278 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
279 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
280 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
281 };
282
283 return tbl[(const uint8_t) c];
284 }
285
286 char int_to_base64 (const char c)
287 {
288 static const char tbl[0x40] =
289 {
290 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
291 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
292 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
293 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f,
294 };
295
296 return tbl[(const uint8_t) c];
297 }
298
299 char base64_to_int (const char c)
300 {
301 static const char tbl[0x100] =
302 {
303 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
304 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
305 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
306 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
308 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
309 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
310 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 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 };
320
321 return tbl[(const uint8_t) c];
322 }
323
324 char int_to_bf64 (const char c)
325 {
326 static const char tbl[0x40] =
327 {
328 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
329 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
330 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
331 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
332 };
333
334 return tbl[(const uint8_t) c];
335 }
336
337 char bf64_to_int (const char c)
338 {
339 static const char tbl[0x100] =
340 {
341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
342 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
344 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
346 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
347 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
348 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00,
349 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 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 };
358
359 return tbl[(const uint8_t) c];
360 }
361
362 char int_to_lotus64 (const char c)
363 {
364 if (c < 10) return '0' + c;
365 else if (c < 36) return 'A' + c - 10;
366 else if (c < 62) return 'a' + c - 36;
367 else if (c == 62) return '+';
368 else if (c == 63) return '/';
369
370 return 0;
371 }
372
373 char lotus64_to_int (const char c)
374 {
375 if ((c >= '0') && (c <= '9')) return c - '0';
376 else if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10;
377 else if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36;
378 else if (c == '+') return 62;
379 else if (c == '/') return 63;
380 else
381
382 return 0;
383 }
384
385 int base32_decode (char (*f) (const char), char *in_buf, int in_len, char *out_buf)
386 {
387 char *in_ptr = in_buf;
388
389 char *out_ptr = out_buf;
390
391 for (int i = 0; i < in_len; i += 8)
392 {
393 char out_val0 = f (in_ptr[0] & 0x7f);
394 char out_val1 = f (in_ptr[1] & 0x7f);
395 char out_val2 = f (in_ptr[2] & 0x7f);
396 char out_val3 = f (in_ptr[3] & 0x7f);
397 char out_val4 = f (in_ptr[4] & 0x7f);
398 char out_val5 = f (in_ptr[5] & 0x7f);
399 char out_val6 = f (in_ptr[6] & 0x7f);
400 char out_val7 = f (in_ptr[7] & 0x7f);
401
402 out_ptr[0] = ((out_val0 << 3) & 0xf8) | ((out_val1 >> 2) & 0x07);
403 out_ptr[1] = ((out_val1 << 6) & 0xc0) | ((out_val2 << 1) & 0x3e) | ((out_val3 >> 4) & 0x01);
404 out_ptr[2] = ((out_val3 << 4) & 0xf0) | ((out_val4 >> 1) & 0x0f);
405 out_ptr[3] = ((out_val4 << 7) & 0x80) | ((out_val5 << 2) & 0x7c) | ((out_val6 >> 3) & 0x03);
406 out_ptr[4] = ((out_val6 << 5) & 0xe0) | ((out_val7 >> 0) & 0x1f);
407
408 in_ptr += 8;
409 out_ptr += 5;
410 }
411
412 for (int i = 0; i < in_len; i++)
413 {
414 if (in_buf[i] != '=') continue;
415
416 in_len = i;
417 }
418
419 int out_len = (in_len * 5) / 8;
420
421 return out_len;
422 }
423
424 int base32_encode (char (*f) (const char), char *in_buf, int in_len, char *out_buf)
425 {
426 char *in_ptr = in_buf;
427
428 char *out_ptr = out_buf;
429
430 for (int i = 0; i < in_len; i += 5)
431 {
432 char out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f));
433 char out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03));
434 char out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f));
435 char out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f));
436 char out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01));
437 char out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f));
438 char out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07));
439 char out_val7 = f ( ((in_ptr[4] >> 0) & 0x1f));
440
441 out_ptr[0] = out_val0 & 0x7f;
442 out_ptr[1] = out_val1 & 0x7f;
443 out_ptr[2] = out_val2 & 0x7f;
444 out_ptr[3] = out_val3 & 0x7f;
445 out_ptr[4] = out_val4 & 0x7f;
446 out_ptr[5] = out_val5 & 0x7f;
447 out_ptr[6] = out_val6 & 0x7f;
448 out_ptr[7] = out_val7 & 0x7f;
449
450 in_ptr += 5;
451 out_ptr += 8;
452 }
453
454 int out_len = (in_len * 8) / 5;
455
456 for (int i = 0; i < (7 - (in_len % 7)); i++)
457 {
458 out_len++;
459
460 out_buf[out_len] = '=';
461 }
462
463 return out_len;
464 }
465
466 int base64_decode (char (*f) (const char), char *in_buf, int in_len, char *out_buf)
467 {
468 char *in_ptr = in_buf;
469
470 char *out_ptr = out_buf;
471
472 for (int i = 0; i < in_len; i += 4)
473 {
474 char out_val0 = f (in_ptr[0] & 0x7f);
475 char out_val1 = f (in_ptr[1] & 0x7f);
476 char out_val2 = f (in_ptr[2] & 0x7f);
477 char out_val3 = f (in_ptr[3] & 0x7f);
478
479 out_ptr[0] = ((out_val0 << 2) & 0xfc) | ((out_val1 >> 4) & 0x03);
480 out_ptr[1] = ((out_val1 << 4) & 0xf0) | ((out_val2 >> 2) & 0x0f);
481 out_ptr[2] = ((out_val2 << 6) & 0xc0) | ((out_val3 >> 0) & 0x3f);
482
483 in_ptr += 4;
484 out_ptr += 3;
485 }
486
487 for (int i = 0; i < in_len; i++)
488 {
489 if (in_buf[i] != '=') continue;
490
491 in_len = i;
492 }
493
494 int out_len = (in_len * 6) / 8;
495
496 return out_len;
497 }
498
499 int base64_encode (char (*f) (const char), char *in_buf, int in_len, char *out_buf)
500 {
501 char *in_ptr = in_buf;
502
503 char *out_ptr = out_buf;
504
505 for (int i = 0; i < in_len; i += 3)
506 {
507 char out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f));
508 char out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f));
509 char out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03));
510 char out_val3 = f ( ((in_ptr[2] >> 0) & 0x3f));
511
512 out_ptr[0] = out_val0 & 0x7f;
513 out_ptr[1] = out_val1 & 0x7f;
514 out_ptr[2] = out_val2 & 0x7f;
515 out_ptr[3] = out_val3 & 0x7f;
516
517 in_ptr += 3;
518 out_ptr += 4;
519 }
520
521 int out_len = (in_len * 8) / 6;
522
523 for (int i = 0; i < (3 - (in_len % 3)); i++)
524 {
525 out_len++;
526
527 out_buf[out_len] = '=';
528 }
529
530 return out_len;
531 }
532
533 static void AES128_decrypt_cbc (const uint key[4], const uint iv[4], const uint in[16], uint out[16])
534 {
535 AES_KEY skey;
536
537 AES_set_decrypt_key ((unsigned char *) key, 128, &skey);
538
539 uint _iv[4];
540
541 _iv[0] = iv[0];
542 _iv[1] = iv[1];
543 _iv[2] = iv[2];
544 _iv[3] = iv[3];
545
546 for (int i = 0; i < 16; i += 4)
547 {
548 uint _in[4];
549 uint _out[4];
550
551 _in[0] = in[i + 0];
552 _in[1] = in[i + 1];
553 _in[2] = in[i + 2];
554 _in[3] = in[i + 3];
555
556 AES_decrypt (&skey, (char *) _in, (char *) _out);
557
558 _out[0] ^= _iv[0];
559 _out[1] ^= _iv[1];
560 _out[2] ^= _iv[2];
561 _out[3] ^= _iv[3];
562
563 out[i + 0] = _out[0];
564 out[i + 1] = _out[1];
565 out[i + 2] = _out[2];
566 out[i + 3] = _out[3];
567
568 _iv[0] = _in[0];
569 _iv[1] = _in[1];
570 _iv[2] = _in[2];
571 _iv[3] = _in[3];
572 }
573 }
574
575 static void juniper_decrypt_hash (char *in, char *out)
576 {
577 // base64 decode
578
579 char base64_buf[100];
580
581 memset (base64_buf, 0, sizeof (base64_buf));
582
583 base64_decode (base64_to_int, in, DISPLAY_LEN_MIN_501, base64_buf);
584
585 // iv stuff
586
587 uint juniper_iv[4] = { 0 };
588
589 memcpy (juniper_iv, base64_buf, 12);
590
591 memcpy (out, juniper_iv, 12);
592
593 // reversed key
594
595 uint juniper_key[4];
596
597 juniper_key[0] = byte_swap_32 (0xa6707a7e);
598 juniper_key[1] = byte_swap_32 (0x8df91059);
599 juniper_key[2] = byte_swap_32 (0xdea70ae5);
600 juniper_key[3] = byte_swap_32 (0x2f9c2442);
601
602 // AES decrypt
603
604 uint *in_ptr = (uint *) (base64_buf + 12);
605 uint *out_ptr = (uint *) (out + 12);
606
607 AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr);
608 }
609
610 uint is_valid_hex_char (const char c)
611 {
612 if ((c >= '0') && (c <= '9')) return 1;
613 if ((c >= 'A') && (c <= 'F')) return 1;
614 if ((c >= 'a') && (c <= 'f')) return 1;
615
616 return 0;
617 }
618
619 char hex_convert (const char c)
620 {
621 return (c & 15) + (c >> 6) * 9;
622 }
623
624 char hex_to_char (const char hex[2])
625 {
626 char v = 0;
627
628 v |= (hex_convert (hex[1]) << 0);
629 v |= (hex_convert (hex[0]) << 4);
630
631 return (v);
632 }
633
634 uint hex_to_uint (const char hex[8])
635 {
636 uint v = 0;
637
638 v |= hex_convert (hex[7]) << 0;
639 v |= hex_convert (hex[6]) << 4;
640 v |= hex_convert (hex[5]) << 8;
641 v |= hex_convert (hex[4]) << 12;
642 v |= hex_convert (hex[3]) << 16;
643 v |= hex_convert (hex[2]) << 20;
644 v |= hex_convert (hex[1]) << 24;
645 v |= hex_convert (hex[0]) << 28;
646
647 return (v);
648 }
649
650 uint64_t hex_to_uint64_t (const char hex[16])
651 {
652 uint64_t v = 0;
653
654 v |= ((uint64_t) hex_convert (hex[15]) << 0);
655 v |= ((uint64_t) hex_convert (hex[14]) << 4);
656 v |= ((uint64_t) hex_convert (hex[13]) << 8);
657 v |= ((uint64_t) hex_convert (hex[12]) << 12);
658 v |= ((uint64_t) hex_convert (hex[11]) << 16);
659 v |= ((uint64_t) hex_convert (hex[10]) << 20);
660 v |= ((uint64_t) hex_convert (hex[ 9]) << 24);
661 v |= ((uint64_t) hex_convert (hex[ 8]) << 28);
662 v |= ((uint64_t) hex_convert (hex[ 7]) << 32);
663 v |= ((uint64_t) hex_convert (hex[ 6]) << 36);
664 v |= ((uint64_t) hex_convert (hex[ 5]) << 40);
665 v |= ((uint64_t) hex_convert (hex[ 4]) << 44);
666 v |= ((uint64_t) hex_convert (hex[ 3]) << 48);
667 v |= ((uint64_t) hex_convert (hex[ 2]) << 52);
668 v |= ((uint64_t) hex_convert (hex[ 1]) << 56);
669 v |= ((uint64_t) hex_convert (hex[ 0]) << 60);
670
671 return (v);
672 }
673
674 void bin_to_hex_lower (uint v, char hex[8])
675 {
676 hex[0] = v >> 28 & 15;
677 hex[1] = v >> 24 & 15;
678 hex[2] = v >> 20 & 15;
679 hex[3] = v >> 16 & 15;
680 hex[4] = v >> 12 & 15;
681 hex[5] = v >> 8 & 15;
682 hex[6] = v >> 4 & 15;
683 hex[7] = v >> 0 & 15;
684
685 uint add;
686
687 hex[0] += 6; add = ((hex[0] & 0x10) >> 4) * 39; hex[0] += 42 + add;
688 hex[1] += 6; add = ((hex[1] & 0x10) >> 4) * 39; hex[1] += 42 + add;
689 hex[2] += 6; add = ((hex[2] & 0x10) >> 4) * 39; hex[2] += 42 + add;
690 hex[3] += 6; add = ((hex[3] & 0x10) >> 4) * 39; hex[3] += 42 + add;
691 hex[4] += 6; add = ((hex[4] & 0x10) >> 4) * 39; hex[4] += 42 + add;
692 hex[5] += 6; add = ((hex[5] & 0x10) >> 4) * 39; hex[5] += 42 + add;
693 hex[6] += 6; add = ((hex[6] & 0x10) >> 4) * 39; hex[6] += 42 + add;
694 hex[7] += 6; add = ((hex[7] & 0x10) >> 4) * 39; hex[7] += 42 + add;
695 }
696
697 void phpass_decode (unsigned char digest[16], unsigned char buf[22])
698 {
699 int l;
700
701 l = itoa64_to_int (buf[ 0]) << 0;
702 l |= itoa64_to_int (buf[ 1]) << 6;
703 l |= itoa64_to_int (buf[ 2]) << 12;
704 l |= itoa64_to_int (buf[ 3]) << 18;
705
706 digest[ 0] = (l >> 0) & 0xff;
707 digest[ 1] = (l >> 8) & 0xff;
708 digest[ 2] = (l >> 16) & 0xff;
709
710 l = itoa64_to_int (buf[ 4]) << 0;
711 l |= itoa64_to_int (buf[ 5]) << 6;
712 l |= itoa64_to_int (buf[ 6]) << 12;
713 l |= itoa64_to_int (buf[ 7]) << 18;
714
715 digest[ 3] = (l >> 0) & 0xff;
716 digest[ 4] = (l >> 8) & 0xff;
717 digest[ 5] = (l >> 16) & 0xff;
718
719 l = itoa64_to_int (buf[ 8]) << 0;
720 l |= itoa64_to_int (buf[ 9]) << 6;
721 l |= itoa64_to_int (buf[10]) << 12;
722 l |= itoa64_to_int (buf[11]) << 18;
723
724 digest[ 6] = (l >> 0) & 0xff;
725 digest[ 7] = (l >> 8) & 0xff;
726 digest[ 8] = (l >> 16) & 0xff;
727
728 l = itoa64_to_int (buf[12]) << 0;
729 l |= itoa64_to_int (buf[13]) << 6;
730 l |= itoa64_to_int (buf[14]) << 12;
731 l |= itoa64_to_int (buf[15]) << 18;
732
733 digest[ 9] = (l >> 0) & 0xff;
734 digest[10] = (l >> 8) & 0xff;
735 digest[11] = (l >> 16) & 0xff;
736
737 l = itoa64_to_int (buf[16]) << 0;
738 l |= itoa64_to_int (buf[17]) << 6;
739 l |= itoa64_to_int (buf[18]) << 12;
740 l |= itoa64_to_int (buf[19]) << 18;
741
742 digest[12] = (l >> 0) & 0xff;
743 digest[13] = (l >> 8) & 0xff;
744 digest[14] = (l >> 16) & 0xff;
745
746 l = itoa64_to_int (buf[20]) << 0;
747 l |= itoa64_to_int (buf[21]) << 6;
748
749 digest[15] = (l >> 0) & 0xff;
750 }
751
752 void phpass_encode (unsigned char digest[16], unsigned char buf[22])
753 {
754 int l;
755
756 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
757
758 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
759 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
760 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
761 buf[ 3] = int_to_itoa64 (l & 0x3f);
762
763 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
764
765 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
766 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
767 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
768 buf[ 7] = int_to_itoa64 (l & 0x3f);
769
770 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
771
772 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
773 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
774 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
775 buf[11] = int_to_itoa64 (l & 0x3f);
776
777 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
778
779 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
780 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
781 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
782 buf[15] = int_to_itoa64 (l & 0x3f);
783
784 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
785
786 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
787 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
788 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
789 buf[19] = int_to_itoa64 (l & 0x3f);
790
791 l = (digest[15] << 0);
792
793 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
794 buf[21] = int_to_itoa64 (l & 0x3f);
795 }
796
797 void md5crypt_decode (unsigned char digest[16], unsigned char buf[22])
798 {
799 int l;
800
801 l = itoa64_to_int (buf[ 0]) << 0;
802 l |= itoa64_to_int (buf[ 1]) << 6;
803 l |= itoa64_to_int (buf[ 2]) << 12;
804 l |= itoa64_to_int (buf[ 3]) << 18;
805
806 digest[ 0] = (l >> 16) & 0xff;
807 digest[ 6] = (l >> 8) & 0xff;
808 digest[12] = (l >> 0) & 0xff;
809
810 l = itoa64_to_int (buf[ 4]) << 0;
811 l |= itoa64_to_int (buf[ 5]) << 6;
812 l |= itoa64_to_int (buf[ 6]) << 12;
813 l |= itoa64_to_int (buf[ 7]) << 18;
814
815 digest[ 1] = (l >> 16) & 0xff;
816 digest[ 7] = (l >> 8) & 0xff;
817 digest[13] = (l >> 0) & 0xff;
818
819 l = itoa64_to_int (buf[ 8]) << 0;
820 l |= itoa64_to_int (buf[ 9]) << 6;
821 l |= itoa64_to_int (buf[10]) << 12;
822 l |= itoa64_to_int (buf[11]) << 18;
823
824 digest[ 2] = (l >> 16) & 0xff;
825 digest[ 8] = (l >> 8) & 0xff;
826 digest[14] = (l >> 0) & 0xff;
827
828 l = itoa64_to_int (buf[12]) << 0;
829 l |= itoa64_to_int (buf[13]) << 6;
830 l |= itoa64_to_int (buf[14]) << 12;
831 l |= itoa64_to_int (buf[15]) << 18;
832
833 digest[ 3] = (l >> 16) & 0xff;
834 digest[ 9] = (l >> 8) & 0xff;
835 digest[15] = (l >> 0) & 0xff;
836
837 l = itoa64_to_int (buf[16]) << 0;
838 l |= itoa64_to_int (buf[17]) << 6;
839 l |= itoa64_to_int (buf[18]) << 12;
840 l |= itoa64_to_int (buf[19]) << 18;
841
842 digest[ 4] = (l >> 16) & 0xff;
843 digest[10] = (l >> 8) & 0xff;
844 digest[ 5] = (l >> 0) & 0xff;
845
846 l = itoa64_to_int (buf[20]) << 0;
847 l |= itoa64_to_int (buf[21]) << 6;
848
849 digest[11] = (l >> 0) & 0xff;
850 }
851
852 void md5crypt_encode (unsigned char digest[16], unsigned char buf[22])
853 {
854 int l;
855
856 l = (digest[ 0] << 16) | (digest[ 6] << 8) | (digest[12] << 0);
857
858 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
859 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
860 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
861 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
862
863 l = (digest[ 1] << 16) | (digest[ 7] << 8) | (digest[13] << 0);
864
865 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
866 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
867 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
868 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
869
870 l = (digest[ 2] << 16) | (digest[ 8] << 8) | (digest[14] << 0);
871
872 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
873 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
874 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
875 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
876
877 l = (digest[ 3] << 16) | (digest[ 9] << 8) | (digest[15] << 0);
878
879 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
880 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
881 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
882 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
883
884 l = (digest[ 4] << 16) | (digest[10] << 8) | (digest[ 5] << 0);
885
886 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
887 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
888 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
889 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
890
891 l = (digest[11] << 0);
892
893 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
894 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
895 }
896
897 void sha512crypt_decode (unsigned char digest[64], unsigned char buf[86])
898 {
899 int l;
900
901 l = itoa64_to_int (buf[ 0]) << 0;
902 l |= itoa64_to_int (buf[ 1]) << 6;
903 l |= itoa64_to_int (buf[ 2]) << 12;
904 l |= itoa64_to_int (buf[ 3]) << 18;
905
906 digest[ 0] = (l >> 16) & 0xff;
907 digest[21] = (l >> 8) & 0xff;
908 digest[42] = (l >> 0) & 0xff;
909
910 l = itoa64_to_int (buf[ 4]) << 0;
911 l |= itoa64_to_int (buf[ 5]) << 6;
912 l |= itoa64_to_int (buf[ 6]) << 12;
913 l |= itoa64_to_int (buf[ 7]) << 18;
914
915 digest[22] = (l >> 16) & 0xff;
916 digest[43] = (l >> 8) & 0xff;
917 digest[ 1] = (l >> 0) & 0xff;
918
919 l = itoa64_to_int (buf[ 8]) << 0;
920 l |= itoa64_to_int (buf[ 9]) << 6;
921 l |= itoa64_to_int (buf[10]) << 12;
922 l |= itoa64_to_int (buf[11]) << 18;
923
924 digest[44] = (l >> 16) & 0xff;
925 digest[ 2] = (l >> 8) & 0xff;
926 digest[23] = (l >> 0) & 0xff;
927
928 l = itoa64_to_int (buf[12]) << 0;
929 l |= itoa64_to_int (buf[13]) << 6;
930 l |= itoa64_to_int (buf[14]) << 12;
931 l |= itoa64_to_int (buf[15]) << 18;
932
933 digest[ 3] = (l >> 16) & 0xff;
934 digest[24] = (l >> 8) & 0xff;
935 digest[45] = (l >> 0) & 0xff;
936
937 l = itoa64_to_int (buf[16]) << 0;
938 l |= itoa64_to_int (buf[17]) << 6;
939 l |= itoa64_to_int (buf[18]) << 12;
940 l |= itoa64_to_int (buf[19]) << 18;
941
942 digest[25] = (l >> 16) & 0xff;
943 digest[46] = (l >> 8) & 0xff;
944 digest[ 4] = (l >> 0) & 0xff;
945
946 l = itoa64_to_int (buf[20]) << 0;
947 l |= itoa64_to_int (buf[21]) << 6;
948 l |= itoa64_to_int (buf[22]) << 12;
949 l |= itoa64_to_int (buf[23]) << 18;
950
951 digest[47] = (l >> 16) & 0xff;
952 digest[ 5] = (l >> 8) & 0xff;
953 digest[26] = (l >> 0) & 0xff;
954
955 l = itoa64_to_int (buf[24]) << 0;
956 l |= itoa64_to_int (buf[25]) << 6;
957 l |= itoa64_to_int (buf[26]) << 12;
958 l |= itoa64_to_int (buf[27]) << 18;
959
960 digest[ 6] = (l >> 16) & 0xff;
961 digest[27] = (l >> 8) & 0xff;
962 digest[48] = (l >> 0) & 0xff;
963
964 l = itoa64_to_int (buf[28]) << 0;
965 l |= itoa64_to_int (buf[29]) << 6;
966 l |= itoa64_to_int (buf[30]) << 12;
967 l |= itoa64_to_int (buf[31]) << 18;
968
969 digest[28] = (l >> 16) & 0xff;
970 digest[49] = (l >> 8) & 0xff;
971 digest[ 7] = (l >> 0) & 0xff;
972
973 l = itoa64_to_int (buf[32]) << 0;
974 l |= itoa64_to_int (buf[33]) << 6;
975 l |= itoa64_to_int (buf[34]) << 12;
976 l |= itoa64_to_int (buf[35]) << 18;
977
978 digest[50] = (l >> 16) & 0xff;
979 digest[ 8] = (l >> 8) & 0xff;
980 digest[29] = (l >> 0) & 0xff;
981
982 l = itoa64_to_int (buf[36]) << 0;
983 l |= itoa64_to_int (buf[37]) << 6;
984 l |= itoa64_to_int (buf[38]) << 12;
985 l |= itoa64_to_int (buf[39]) << 18;
986
987 digest[ 9] = (l >> 16) & 0xff;
988 digest[30] = (l >> 8) & 0xff;
989 digest[51] = (l >> 0) & 0xff;
990
991 l = itoa64_to_int (buf[40]) << 0;
992 l |= itoa64_to_int (buf[41]) << 6;
993 l |= itoa64_to_int (buf[42]) << 12;
994 l |= itoa64_to_int (buf[43]) << 18;
995
996 digest[31] = (l >> 16) & 0xff;
997 digest[52] = (l >> 8) & 0xff;
998 digest[10] = (l >> 0) & 0xff;
999
1000 l = itoa64_to_int (buf[44]) << 0;
1001 l |= itoa64_to_int (buf[45]) << 6;
1002 l |= itoa64_to_int (buf[46]) << 12;
1003 l |= itoa64_to_int (buf[47]) << 18;
1004
1005 digest[53] = (l >> 16) & 0xff;
1006 digest[11] = (l >> 8) & 0xff;
1007 digest[32] = (l >> 0) & 0xff;
1008
1009 l = itoa64_to_int (buf[48]) << 0;
1010 l |= itoa64_to_int (buf[49]) << 6;
1011 l |= itoa64_to_int (buf[50]) << 12;
1012 l |= itoa64_to_int (buf[51]) << 18;
1013
1014 digest[12] = (l >> 16) & 0xff;
1015 digest[33] = (l >> 8) & 0xff;
1016 digest[54] = (l >> 0) & 0xff;
1017
1018 l = itoa64_to_int (buf[52]) << 0;
1019 l |= itoa64_to_int (buf[53]) << 6;
1020 l |= itoa64_to_int (buf[54]) << 12;
1021 l |= itoa64_to_int (buf[55]) << 18;
1022
1023 digest[34] = (l >> 16) & 0xff;
1024 digest[55] = (l >> 8) & 0xff;
1025 digest[13] = (l >> 0) & 0xff;
1026
1027 l = itoa64_to_int (buf[56]) << 0;
1028 l |= itoa64_to_int (buf[57]) << 6;
1029 l |= itoa64_to_int (buf[58]) << 12;
1030 l |= itoa64_to_int (buf[59]) << 18;
1031
1032 digest[56] = (l >> 16) & 0xff;
1033 digest[14] = (l >> 8) & 0xff;
1034 digest[35] = (l >> 0) & 0xff;
1035
1036 l = itoa64_to_int (buf[60]) << 0;
1037 l |= itoa64_to_int (buf[61]) << 6;
1038 l |= itoa64_to_int (buf[62]) << 12;
1039 l |= itoa64_to_int (buf[63]) << 18;
1040
1041 digest[15] = (l >> 16) & 0xff;
1042 digest[36] = (l >> 8) & 0xff;
1043 digest[57] = (l >> 0) & 0xff;
1044
1045 l = itoa64_to_int (buf[64]) << 0;
1046 l |= itoa64_to_int (buf[65]) << 6;
1047 l |= itoa64_to_int (buf[66]) << 12;
1048 l |= itoa64_to_int (buf[67]) << 18;
1049
1050 digest[37] = (l >> 16) & 0xff;
1051 digest[58] = (l >> 8) & 0xff;
1052 digest[16] = (l >> 0) & 0xff;
1053
1054 l = itoa64_to_int (buf[68]) << 0;
1055 l |= itoa64_to_int (buf[69]) << 6;
1056 l |= itoa64_to_int (buf[70]) << 12;
1057 l |= itoa64_to_int (buf[71]) << 18;
1058
1059 digest[59] = (l >> 16) & 0xff;
1060 digest[17] = (l >> 8) & 0xff;
1061 digest[38] = (l >> 0) & 0xff;
1062
1063 l = itoa64_to_int (buf[72]) << 0;
1064 l |= itoa64_to_int (buf[73]) << 6;
1065 l |= itoa64_to_int (buf[74]) << 12;
1066 l |= itoa64_to_int (buf[75]) << 18;
1067
1068 digest[18] = (l >> 16) & 0xff;
1069 digest[39] = (l >> 8) & 0xff;
1070 digest[60] = (l >> 0) & 0xff;
1071
1072 l = itoa64_to_int (buf[76]) << 0;
1073 l |= itoa64_to_int (buf[77]) << 6;
1074 l |= itoa64_to_int (buf[78]) << 12;
1075 l |= itoa64_to_int (buf[79]) << 18;
1076
1077 digest[40] = (l >> 16) & 0xff;
1078 digest[61] = (l >> 8) & 0xff;
1079 digest[19] = (l >> 0) & 0xff;
1080
1081 l = itoa64_to_int (buf[80]) << 0;
1082 l |= itoa64_to_int (buf[81]) << 6;
1083 l |= itoa64_to_int (buf[82]) << 12;
1084 l |= itoa64_to_int (buf[83]) << 18;
1085
1086 digest[62] = (l >> 16) & 0xff;
1087 digest[20] = (l >> 8) & 0xff;
1088 digest[41] = (l >> 0) & 0xff;
1089
1090 l = itoa64_to_int (buf[84]) << 0;
1091 l |= itoa64_to_int (buf[85]) << 6;
1092
1093 digest[63] = (l >> 0) & 0xff;
1094 }
1095
1096 void sha512crypt_encode (unsigned char digest[64], unsigned char buf[86])
1097 {
1098 int l;
1099
1100 l = (digest[ 0] << 16) | (digest[21] << 8) | (digest[42] << 0);
1101
1102 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1103 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1104 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1105 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
1106
1107 l = (digest[22] << 16) | (digest[43] << 8) | (digest[ 1] << 0);
1108
1109 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1110 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1111 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1112 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
1113
1114 l = (digest[44] << 16) | (digest[ 2] << 8) | (digest[23] << 0);
1115
1116 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1117 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1118 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1119 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
1120
1121 l = (digest[ 3] << 16) | (digest[24] << 8) | (digest[45] << 0);
1122
1123 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1124 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1125 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1126 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
1127
1128 l = (digest[25] << 16) | (digest[46] << 8) | (digest[ 4] << 0);
1129
1130 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1131 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1132 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1133 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
1134
1135 l = (digest[47] << 16) | (digest[ 5] << 8) | (digest[26] << 0);
1136
1137 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1138 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1139 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1140 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
1141
1142 l = (digest[ 6] << 16) | (digest[27] << 8) | (digest[48] << 0);
1143
1144 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1145 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1146 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1147 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
1148
1149 l = (digest[28] << 16) | (digest[49] << 8) | (digest[ 7] << 0);
1150
1151 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1152 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1153 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1154 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
1155
1156 l = (digest[50] << 16) | (digest[ 8] << 8) | (digest[29] << 0);
1157
1158 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1159 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1160 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1161 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
1162
1163 l = (digest[ 9] << 16) | (digest[30] << 8) | (digest[51] << 0);
1164
1165 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1166 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1167 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1168 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
1169
1170 l = (digest[31] << 16) | (digest[52] << 8) | (digest[10] << 0);
1171
1172 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1173 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1174 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1175 buf[43] = int_to_itoa64 (l & 0x3f); l >>= 6;
1176
1177 l = (digest[53] << 16) | (digest[11] << 8) | (digest[32] << 0);
1178
1179 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1180 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1181 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1182 buf[47] = int_to_itoa64 (l & 0x3f); l >>= 6;
1183
1184 l = (digest[12] << 16) | (digest[33] << 8) | (digest[54] << 0);
1185
1186 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1187 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1188 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1189 buf[51] = int_to_itoa64 (l & 0x3f); l >>= 6;
1190
1191 l = (digest[34] << 16) | (digest[55] << 8) | (digest[13] << 0);
1192
1193 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1194 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1195 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1196 buf[55] = int_to_itoa64 (l & 0x3f); l >>= 6;
1197
1198 l = (digest[56] << 16) | (digest[14] << 8) | (digest[35] << 0);
1199
1200 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1201 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1202 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1203 buf[59] = int_to_itoa64 (l & 0x3f); l >>= 6;
1204
1205 l = (digest[15] << 16) | (digest[36] << 8) | (digest[57] << 0);
1206
1207 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1208 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1209 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1210 buf[63] = int_to_itoa64 (l & 0x3f); l >>= 6;
1211
1212 l = (digest[37] << 16) | (digest[58] << 8) | (digest[16] << 0);
1213
1214 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1215 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1216 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1217 buf[67] = int_to_itoa64 (l & 0x3f); l >>= 6;
1218
1219 l = (digest[59] << 16) | (digest[17] << 8) | (digest[38] << 0);
1220
1221 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1222 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1223 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1224 buf[71] = int_to_itoa64 (l & 0x3f); l >>= 6;
1225
1226 l = (digest[18] << 16) | (digest[39] << 8) | (digest[60] << 0);
1227
1228 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1229 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1230 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1231 buf[75] = int_to_itoa64 (l & 0x3f); l >>= 6;
1232
1233 l = (digest[40] << 16) | (digest[61] << 8) | (digest[19] << 0);
1234
1235 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1236 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1237 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1238 buf[79] = int_to_itoa64 (l & 0x3f); l >>= 6;
1239
1240 l = (digest[62] << 16) | (digest[20] << 8) | (digest[41] << 0);
1241
1242 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1243 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1244 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1245 buf[83] = int_to_itoa64 (l & 0x3f); l >>= 6;
1246
1247 l = 0 | 0 | (digest[63] << 0);
1248
1249 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1250 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1251 }
1252
1253 void sha1aix_decode (unsigned char digest[20], unsigned char buf[27])
1254 {
1255 int l;
1256
1257 l = itoa64_to_int (buf[ 0]) << 0;
1258 l |= itoa64_to_int (buf[ 1]) << 6;
1259 l |= itoa64_to_int (buf[ 2]) << 12;
1260 l |= itoa64_to_int (buf[ 3]) << 18;
1261
1262 digest[ 2] = (l >> 0) & 0xff;
1263 digest[ 1] = (l >> 8) & 0xff;
1264 digest[ 0] = (l >> 16) & 0xff;
1265
1266 l = itoa64_to_int (buf[ 4]) << 0;
1267 l |= itoa64_to_int (buf[ 5]) << 6;
1268 l |= itoa64_to_int (buf[ 6]) << 12;
1269 l |= itoa64_to_int (buf[ 7]) << 18;
1270
1271 digest[ 5] = (l >> 0) & 0xff;
1272 digest[ 4] = (l >> 8) & 0xff;
1273 digest[ 3] = (l >> 16) & 0xff;
1274
1275 l = itoa64_to_int (buf[ 8]) << 0;
1276 l |= itoa64_to_int (buf[ 9]) << 6;
1277 l |= itoa64_to_int (buf[10]) << 12;
1278 l |= itoa64_to_int (buf[11]) << 18;
1279
1280 digest[ 8] = (l >> 0) & 0xff;
1281 digest[ 7] = (l >> 8) & 0xff;
1282 digest[ 6] = (l >> 16) & 0xff;
1283
1284 l = itoa64_to_int (buf[12]) << 0;
1285 l |= itoa64_to_int (buf[13]) << 6;
1286 l |= itoa64_to_int (buf[14]) << 12;
1287 l |= itoa64_to_int (buf[15]) << 18;
1288
1289 digest[11] = (l >> 0) & 0xff;
1290 digest[10] = (l >> 8) & 0xff;
1291 digest[ 9] = (l >> 16) & 0xff;
1292
1293 l = itoa64_to_int (buf[16]) << 0;
1294 l |= itoa64_to_int (buf[17]) << 6;
1295 l |= itoa64_to_int (buf[18]) << 12;
1296 l |= itoa64_to_int (buf[19]) << 18;
1297
1298 digest[14] = (l >> 0) & 0xff;
1299 digest[13] = (l >> 8) & 0xff;
1300 digest[12] = (l >> 16) & 0xff;
1301
1302 l = itoa64_to_int (buf[20]) << 0;
1303 l |= itoa64_to_int (buf[21]) << 6;
1304 l |= itoa64_to_int (buf[22]) << 12;
1305 l |= itoa64_to_int (buf[23]) << 18;
1306
1307 digest[17] = (l >> 0) & 0xff;
1308 digest[16] = (l >> 8) & 0xff;
1309 digest[15] = (l >> 16) & 0xff;
1310
1311 l = itoa64_to_int (buf[24]) << 0;
1312 l |= itoa64_to_int (buf[25]) << 6;
1313 l |= itoa64_to_int (buf[26]) << 12;
1314
1315 digest[19] = (l >> 8) & 0xff;
1316 digest[18] = (l >> 16) & 0xff;
1317 }
1318
1319 void sha1aix_encode (unsigned char digest[20], unsigned char buf[27])
1320 {
1321 int l;
1322
1323 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1324
1325 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1326 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1327 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1328 buf[ 3] = int_to_itoa64 (l & 0x3f);
1329
1330 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1331
1332 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1333 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1334 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1335 buf[ 7] = int_to_itoa64 (l & 0x3f);
1336
1337 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1338
1339 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1340 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1341 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1342 buf[11] = int_to_itoa64 (l & 0x3f);
1343
1344 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1345
1346 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1347 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1348 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1349 buf[15] = int_to_itoa64 (l & 0x3f);
1350
1351 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1352
1353 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1354 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1355 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1356 buf[19] = int_to_itoa64 (l & 0x3f);
1357
1358 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1359
1360 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1361 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1362 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1363 buf[23] = int_to_itoa64 (l & 0x3f);
1364
1365 l = 0 | (digest[19] << 8) | (digest[18] << 16);
1366
1367 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1368 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1369 buf[26] = int_to_itoa64 (l & 0x3f);
1370 }
1371
1372 void sha256aix_decode (unsigned char digest[32], unsigned char buf[43])
1373 {
1374 int l;
1375
1376 l = itoa64_to_int (buf[ 0]) << 0;
1377 l |= itoa64_to_int (buf[ 1]) << 6;
1378 l |= itoa64_to_int (buf[ 2]) << 12;
1379 l |= itoa64_to_int (buf[ 3]) << 18;
1380
1381 digest[ 2] = (l >> 0) & 0xff;
1382 digest[ 1] = (l >> 8) & 0xff;
1383 digest[ 0] = (l >> 16) & 0xff;
1384
1385 l = itoa64_to_int (buf[ 4]) << 0;
1386 l |= itoa64_to_int (buf[ 5]) << 6;
1387 l |= itoa64_to_int (buf[ 6]) << 12;
1388 l |= itoa64_to_int (buf[ 7]) << 18;
1389
1390 digest[ 5] = (l >> 0) & 0xff;
1391 digest[ 4] = (l >> 8) & 0xff;
1392 digest[ 3] = (l >> 16) & 0xff;
1393
1394 l = itoa64_to_int (buf[ 8]) << 0;
1395 l |= itoa64_to_int (buf[ 9]) << 6;
1396 l |= itoa64_to_int (buf[10]) << 12;
1397 l |= itoa64_to_int (buf[11]) << 18;
1398
1399 digest[ 8] = (l >> 0) & 0xff;
1400 digest[ 7] = (l >> 8) & 0xff;
1401 digest[ 6] = (l >> 16) & 0xff;
1402
1403 l = itoa64_to_int (buf[12]) << 0;
1404 l |= itoa64_to_int (buf[13]) << 6;
1405 l |= itoa64_to_int (buf[14]) << 12;
1406 l |= itoa64_to_int (buf[15]) << 18;
1407
1408 digest[11] = (l >> 0) & 0xff;
1409 digest[10] = (l >> 8) & 0xff;
1410 digest[ 9] = (l >> 16) & 0xff;
1411
1412 l = itoa64_to_int (buf[16]) << 0;
1413 l |= itoa64_to_int (buf[17]) << 6;
1414 l |= itoa64_to_int (buf[18]) << 12;
1415 l |= itoa64_to_int (buf[19]) << 18;
1416
1417 digest[14] = (l >> 0) & 0xff;
1418 digest[13] = (l >> 8) & 0xff;
1419 digest[12] = (l >> 16) & 0xff;
1420
1421 l = itoa64_to_int (buf[20]) << 0;
1422 l |= itoa64_to_int (buf[21]) << 6;
1423 l |= itoa64_to_int (buf[22]) << 12;
1424 l |= itoa64_to_int (buf[23]) << 18;
1425
1426 digest[17] = (l >> 0) & 0xff;
1427 digest[16] = (l >> 8) & 0xff;
1428 digest[15] = (l >> 16) & 0xff;
1429
1430 l = itoa64_to_int (buf[24]) << 0;
1431 l |= itoa64_to_int (buf[25]) << 6;
1432 l |= itoa64_to_int (buf[26]) << 12;
1433 l |= itoa64_to_int (buf[27]) << 18;
1434
1435 digest[20] = (l >> 0) & 0xff;
1436 digest[19] = (l >> 8) & 0xff;
1437 digest[18] = (l >> 16) & 0xff;
1438
1439 l = itoa64_to_int (buf[28]) << 0;
1440 l |= itoa64_to_int (buf[29]) << 6;
1441 l |= itoa64_to_int (buf[30]) << 12;
1442 l |= itoa64_to_int (buf[31]) << 18;
1443
1444 digest[23] = (l >> 0) & 0xff;
1445 digest[22] = (l >> 8) & 0xff;
1446 digest[21] = (l >> 16) & 0xff;
1447
1448 l = itoa64_to_int (buf[32]) << 0;
1449 l |= itoa64_to_int (buf[33]) << 6;
1450 l |= itoa64_to_int (buf[34]) << 12;
1451 l |= itoa64_to_int (buf[35]) << 18;
1452
1453 digest[26] = (l >> 0) & 0xff;
1454 digest[25] = (l >> 8) & 0xff;
1455 digest[24] = (l >> 16) & 0xff;
1456
1457 l = itoa64_to_int (buf[36]) << 0;
1458 l |= itoa64_to_int (buf[37]) << 6;
1459 l |= itoa64_to_int (buf[38]) << 12;
1460 l |= itoa64_to_int (buf[39]) << 18;
1461
1462 digest[29] = (l >> 0) & 0xff;
1463 digest[28] = (l >> 8) & 0xff;
1464 digest[27] = (l >> 16) & 0xff;
1465
1466 l = itoa64_to_int (buf[40]) << 0;
1467 l |= itoa64_to_int (buf[41]) << 6;
1468 l |= itoa64_to_int (buf[42]) << 12;
1469
1470 //digest[32] = (l >> 0) & 0xff;
1471 digest[31] = (l >> 8) & 0xff;
1472 digest[30] = (l >> 16) & 0xff;
1473 }
1474
1475 void sha256aix_encode (unsigned char digest[32], unsigned char buf[43])
1476 {
1477 int l;
1478
1479 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1480
1481 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1482 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1483 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1484 buf[ 3] = int_to_itoa64 (l & 0x3f);
1485
1486 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1487
1488 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1489 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1490 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1491 buf[ 7] = int_to_itoa64 (l & 0x3f);
1492
1493 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1494
1495 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1496 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1497 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1498 buf[11] = int_to_itoa64 (l & 0x3f);
1499
1500 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1501
1502 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1503 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1504 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1505 buf[15] = int_to_itoa64 (l & 0x3f);
1506
1507 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1508
1509 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1510 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1511 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1512 buf[19] = int_to_itoa64 (l & 0x3f);
1513
1514 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1515
1516 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1517 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1518 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1519 buf[23] = int_to_itoa64 (l & 0x3f);
1520
1521 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1522
1523 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1524 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1525 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1526 buf[27] = int_to_itoa64 (l & 0x3f);
1527
1528 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1529
1530 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1531 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1532 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1533 buf[31] = int_to_itoa64 (l & 0x3f);
1534
1535 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1536
1537 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1538 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1539 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1540 buf[35] = int_to_itoa64 (l & 0x3f);
1541
1542 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1543
1544 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1545 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1546 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1547 buf[39] = int_to_itoa64 (l & 0x3f);
1548
1549 l = 0 | (digest[31] << 8) | (digest[30] << 16);
1550
1551 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1552 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1553 buf[42] = int_to_itoa64 (l & 0x3f);
1554 }
1555
1556 void sha512aix_decode (unsigned char digest[64], unsigned char buf[86])
1557 {
1558 int l;
1559
1560 l = itoa64_to_int (buf[ 0]) << 0;
1561 l |= itoa64_to_int (buf[ 1]) << 6;
1562 l |= itoa64_to_int (buf[ 2]) << 12;
1563 l |= itoa64_to_int (buf[ 3]) << 18;
1564
1565 digest[ 2] = (l >> 0) & 0xff;
1566 digest[ 1] = (l >> 8) & 0xff;
1567 digest[ 0] = (l >> 16) & 0xff;
1568
1569 l = itoa64_to_int (buf[ 4]) << 0;
1570 l |= itoa64_to_int (buf[ 5]) << 6;
1571 l |= itoa64_to_int (buf[ 6]) << 12;
1572 l |= itoa64_to_int (buf[ 7]) << 18;
1573
1574 digest[ 5] = (l >> 0) & 0xff;
1575 digest[ 4] = (l >> 8) & 0xff;
1576 digest[ 3] = (l >> 16) & 0xff;
1577
1578 l = itoa64_to_int (buf[ 8]) << 0;
1579 l |= itoa64_to_int (buf[ 9]) << 6;
1580 l |= itoa64_to_int (buf[10]) << 12;
1581 l |= itoa64_to_int (buf[11]) << 18;
1582
1583 digest[ 8] = (l >> 0) & 0xff;
1584 digest[ 7] = (l >> 8) & 0xff;
1585 digest[ 6] = (l >> 16) & 0xff;
1586
1587 l = itoa64_to_int (buf[12]) << 0;
1588 l |= itoa64_to_int (buf[13]) << 6;
1589 l |= itoa64_to_int (buf[14]) << 12;
1590 l |= itoa64_to_int (buf[15]) << 18;
1591
1592 digest[11] = (l >> 0) & 0xff;
1593 digest[10] = (l >> 8) & 0xff;
1594 digest[ 9] = (l >> 16) & 0xff;
1595
1596 l = itoa64_to_int (buf[16]) << 0;
1597 l |= itoa64_to_int (buf[17]) << 6;
1598 l |= itoa64_to_int (buf[18]) << 12;
1599 l |= itoa64_to_int (buf[19]) << 18;
1600
1601 digest[14] = (l >> 0) & 0xff;
1602 digest[13] = (l >> 8) & 0xff;
1603 digest[12] = (l >> 16) & 0xff;
1604
1605 l = itoa64_to_int (buf[20]) << 0;
1606 l |= itoa64_to_int (buf[21]) << 6;
1607 l |= itoa64_to_int (buf[22]) << 12;
1608 l |= itoa64_to_int (buf[23]) << 18;
1609
1610 digest[17] = (l >> 0) & 0xff;
1611 digest[16] = (l >> 8) & 0xff;
1612 digest[15] = (l >> 16) & 0xff;
1613
1614 l = itoa64_to_int (buf[24]) << 0;
1615 l |= itoa64_to_int (buf[25]) << 6;
1616 l |= itoa64_to_int (buf[26]) << 12;
1617 l |= itoa64_to_int (buf[27]) << 18;
1618
1619 digest[20] = (l >> 0) & 0xff;
1620 digest[19] = (l >> 8) & 0xff;
1621 digest[18] = (l >> 16) & 0xff;
1622
1623 l = itoa64_to_int (buf[28]) << 0;
1624 l |= itoa64_to_int (buf[29]) << 6;
1625 l |= itoa64_to_int (buf[30]) << 12;
1626 l |= itoa64_to_int (buf[31]) << 18;
1627
1628 digest[23] = (l >> 0) & 0xff;
1629 digest[22] = (l >> 8) & 0xff;
1630 digest[21] = (l >> 16) & 0xff;
1631
1632 l = itoa64_to_int (buf[32]) << 0;
1633 l |= itoa64_to_int (buf[33]) << 6;
1634 l |= itoa64_to_int (buf[34]) << 12;
1635 l |= itoa64_to_int (buf[35]) << 18;
1636
1637 digest[26] = (l >> 0) & 0xff;
1638 digest[25] = (l >> 8) & 0xff;
1639 digest[24] = (l >> 16) & 0xff;
1640
1641 l = itoa64_to_int (buf[36]) << 0;
1642 l |= itoa64_to_int (buf[37]) << 6;
1643 l |= itoa64_to_int (buf[38]) << 12;
1644 l |= itoa64_to_int (buf[39]) << 18;
1645
1646 digest[29] = (l >> 0) & 0xff;
1647 digest[28] = (l >> 8) & 0xff;
1648 digest[27] = (l >> 16) & 0xff;
1649
1650 l = itoa64_to_int (buf[40]) << 0;
1651 l |= itoa64_to_int (buf[41]) << 6;
1652 l |= itoa64_to_int (buf[42]) << 12;
1653 l |= itoa64_to_int (buf[43]) << 18;
1654
1655 digest[32] = (l >> 0) & 0xff;
1656 digest[31] = (l >> 8) & 0xff;
1657 digest[30] = (l >> 16) & 0xff;
1658
1659 l = itoa64_to_int (buf[44]) << 0;
1660 l |= itoa64_to_int (buf[45]) << 6;
1661 l |= itoa64_to_int (buf[46]) << 12;
1662 l |= itoa64_to_int (buf[47]) << 18;
1663
1664 digest[35] = (l >> 0) & 0xff;
1665 digest[34] = (l >> 8) & 0xff;
1666 digest[33] = (l >> 16) & 0xff;
1667
1668 l = itoa64_to_int (buf[48]) << 0;
1669 l |= itoa64_to_int (buf[49]) << 6;
1670 l |= itoa64_to_int (buf[50]) << 12;
1671 l |= itoa64_to_int (buf[51]) << 18;
1672
1673 digest[38] = (l >> 0) & 0xff;
1674 digest[37] = (l >> 8) & 0xff;
1675 digest[36] = (l >> 16) & 0xff;
1676
1677 l = itoa64_to_int (buf[52]) << 0;
1678 l |= itoa64_to_int (buf[53]) << 6;
1679 l |= itoa64_to_int (buf[54]) << 12;
1680 l |= itoa64_to_int (buf[55]) << 18;
1681
1682 digest[41] = (l >> 0) & 0xff;
1683 digest[40] = (l >> 8) & 0xff;
1684 digest[39] = (l >> 16) & 0xff;
1685
1686 l = itoa64_to_int (buf[56]) << 0;
1687 l |= itoa64_to_int (buf[57]) << 6;
1688 l |= itoa64_to_int (buf[58]) << 12;
1689 l |= itoa64_to_int (buf[59]) << 18;
1690
1691 digest[44] = (l >> 0) & 0xff;
1692 digest[43] = (l >> 8) & 0xff;
1693 digest[42] = (l >> 16) & 0xff;
1694
1695 l = itoa64_to_int (buf[60]) << 0;
1696 l |= itoa64_to_int (buf[61]) << 6;
1697 l |= itoa64_to_int (buf[62]) << 12;
1698 l |= itoa64_to_int (buf[63]) << 18;
1699
1700 digest[47] = (l >> 0) & 0xff;
1701 digest[46] = (l >> 8) & 0xff;
1702 digest[45] = (l >> 16) & 0xff;
1703
1704 l = itoa64_to_int (buf[64]) << 0;
1705 l |= itoa64_to_int (buf[65]) << 6;
1706 l |= itoa64_to_int (buf[66]) << 12;
1707 l |= itoa64_to_int (buf[67]) << 18;
1708
1709 digest[50] = (l >> 0) & 0xff;
1710 digest[49] = (l >> 8) & 0xff;
1711 digest[48] = (l >> 16) & 0xff;
1712
1713 l = itoa64_to_int (buf[68]) << 0;
1714 l |= itoa64_to_int (buf[69]) << 6;
1715 l |= itoa64_to_int (buf[70]) << 12;
1716 l |= itoa64_to_int (buf[71]) << 18;
1717
1718 digest[53] = (l >> 0) & 0xff;
1719 digest[52] = (l >> 8) & 0xff;
1720 digest[51] = (l >> 16) & 0xff;
1721
1722 l = itoa64_to_int (buf[72]) << 0;
1723 l |= itoa64_to_int (buf[73]) << 6;
1724 l |= itoa64_to_int (buf[74]) << 12;
1725 l |= itoa64_to_int (buf[75]) << 18;
1726
1727 digest[56] = (l >> 0) & 0xff;
1728 digest[55] = (l >> 8) & 0xff;
1729 digest[54] = (l >> 16) & 0xff;
1730
1731 l = itoa64_to_int (buf[76]) << 0;
1732 l |= itoa64_to_int (buf[77]) << 6;
1733 l |= itoa64_to_int (buf[78]) << 12;
1734 l |= itoa64_to_int (buf[79]) << 18;
1735
1736 digest[59] = (l >> 0) & 0xff;
1737 digest[58] = (l >> 8) & 0xff;
1738 digest[57] = (l >> 16) & 0xff;
1739
1740 l = itoa64_to_int (buf[80]) << 0;
1741 l |= itoa64_to_int (buf[81]) << 6;
1742 l |= itoa64_to_int (buf[82]) << 12;
1743 l |= itoa64_to_int (buf[83]) << 18;
1744
1745 digest[62] = (l >> 0) & 0xff;
1746 digest[61] = (l >> 8) & 0xff;
1747 digest[60] = (l >> 16) & 0xff;
1748
1749 l = itoa64_to_int (buf[84]) << 0;
1750 l |= itoa64_to_int (buf[85]) << 6;
1751
1752 digest[63] = (l >> 16) & 0xff;
1753 }
1754
1755 void sha512aix_encode (unsigned char digest[64], unsigned char buf[86])
1756 {
1757 int l;
1758
1759 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1760
1761 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1762 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1763 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1764 buf[ 3] = int_to_itoa64 (l & 0x3f);
1765
1766 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1767
1768 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1769 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1770 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1771 buf[ 7] = int_to_itoa64 (l & 0x3f);
1772
1773 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1774
1775 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1776 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1777 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1778 buf[11] = int_to_itoa64 (l & 0x3f);
1779
1780 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1781
1782 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1783 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1784 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1785 buf[15] = int_to_itoa64 (l & 0x3f);
1786
1787 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1788
1789 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1790 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1791 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1792 buf[19] = int_to_itoa64 (l & 0x3f);
1793
1794 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1795
1796 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1797 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1798 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1799 buf[23] = int_to_itoa64 (l & 0x3f);
1800
1801 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1802
1803 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1804 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1805 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1806 buf[27] = int_to_itoa64 (l & 0x3f);
1807
1808 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1809
1810 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1811 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1812 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1813 buf[31] = int_to_itoa64 (l & 0x3f);
1814
1815 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1816
1817 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1818 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1819 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1820 buf[35] = int_to_itoa64 (l & 0x3f);
1821
1822 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1823
1824 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1825 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1826 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1827 buf[39] = int_to_itoa64 (l & 0x3f);
1828
1829 l = (digest[32] << 0) | (digest[31] << 8) | (digest[30] << 16);
1830
1831 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1832 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1833 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1834 buf[43] = int_to_itoa64 (l & 0x3f);
1835
1836 l = (digest[35] << 0) | (digest[34] << 8) | (digest[33] << 16);
1837
1838 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1839 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1840 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1841 buf[47] = int_to_itoa64 (l & 0x3f);
1842
1843 l = (digest[38] << 0) | (digest[37] << 8) | (digest[36] << 16);
1844
1845 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1846 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1847 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1848 buf[51] = int_to_itoa64 (l & 0x3f);
1849
1850 l = (digest[41] << 0) | (digest[40] << 8) | (digest[39] << 16);
1851
1852 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1853 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1854 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1855 buf[55] = int_to_itoa64 (l & 0x3f);
1856
1857 l = (digest[44] << 0) | (digest[43] << 8) | (digest[42] << 16);
1858
1859 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1860 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1861 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1862 buf[59] = int_to_itoa64 (l & 0x3f);
1863
1864 l = (digest[47] << 0) | (digest[46] << 8) | (digest[45] << 16);
1865
1866 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1867 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1868 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1869 buf[63] = int_to_itoa64 (l & 0x3f);
1870
1871 l = (digest[50] << 0) | (digest[49] << 8) | (digest[48] << 16);
1872
1873 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1874 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1875 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1876 buf[67] = int_to_itoa64 (l & 0x3f);
1877
1878 l = (digest[53] << 0) | (digest[52] << 8) | (digest[51] << 16);
1879
1880 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1881 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1882 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1883 buf[71] = int_to_itoa64 (l & 0x3f);
1884
1885 l = (digest[56] << 0) | (digest[55] << 8) | (digest[54] << 16);
1886
1887 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1888 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1889 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1890 buf[75] = int_to_itoa64 (l & 0x3f);
1891
1892 l = (digest[59] << 0) | (digest[58] << 8) | (digest[57] << 16);
1893
1894 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1895 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1896 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1897 buf[79] = int_to_itoa64 (l & 0x3f);
1898
1899 l = (digest[62] << 0) | (digest[61] << 8) | (digest[60] << 16);
1900
1901 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1902 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1903 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1904 buf[83] = int_to_itoa64 (l & 0x3f);
1905
1906 l = 0 | 0 | (digest[63] << 16);
1907
1908 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1909 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1910 }
1911
1912 void sha256crypt_decode (unsigned char digest[32], unsigned char buf[43])
1913 {
1914 int l;
1915
1916 l = itoa64_to_int (buf[ 0]) << 0;
1917 l |= itoa64_to_int (buf[ 1]) << 6;
1918 l |= itoa64_to_int (buf[ 2]) << 12;
1919 l |= itoa64_to_int (buf[ 3]) << 18;
1920
1921 digest[ 0] = (l >> 16) & 0xff;
1922 digest[10] = (l >> 8) & 0xff;
1923 digest[20] = (l >> 0) & 0xff;
1924
1925 l = itoa64_to_int (buf[ 4]) << 0;
1926 l |= itoa64_to_int (buf[ 5]) << 6;
1927 l |= itoa64_to_int (buf[ 6]) << 12;
1928 l |= itoa64_to_int (buf[ 7]) << 18;
1929
1930 digest[21] = (l >> 16) & 0xff;
1931 digest[ 1] = (l >> 8) & 0xff;
1932 digest[11] = (l >> 0) & 0xff;
1933
1934 l = itoa64_to_int (buf[ 8]) << 0;
1935 l |= itoa64_to_int (buf[ 9]) << 6;
1936 l |= itoa64_to_int (buf[10]) << 12;
1937 l |= itoa64_to_int (buf[11]) << 18;
1938
1939 digest[12] = (l >> 16) & 0xff;
1940 digest[22] = (l >> 8) & 0xff;
1941 digest[ 2] = (l >> 0) & 0xff;
1942
1943 l = itoa64_to_int (buf[12]) << 0;
1944 l |= itoa64_to_int (buf[13]) << 6;
1945 l |= itoa64_to_int (buf[14]) << 12;
1946 l |= itoa64_to_int (buf[15]) << 18;
1947
1948 digest[ 3] = (l >> 16) & 0xff;
1949 digest[13] = (l >> 8) & 0xff;
1950 digest[23] = (l >> 0) & 0xff;
1951
1952 l = itoa64_to_int (buf[16]) << 0;
1953 l |= itoa64_to_int (buf[17]) << 6;
1954 l |= itoa64_to_int (buf[18]) << 12;
1955 l |= itoa64_to_int (buf[19]) << 18;
1956
1957 digest[24] = (l >> 16) & 0xff;
1958 digest[ 4] = (l >> 8) & 0xff;
1959 digest[14] = (l >> 0) & 0xff;
1960
1961 l = itoa64_to_int (buf[20]) << 0;
1962 l |= itoa64_to_int (buf[21]) << 6;
1963 l |= itoa64_to_int (buf[22]) << 12;
1964 l |= itoa64_to_int (buf[23]) << 18;
1965
1966 digest[15] = (l >> 16) & 0xff;
1967 digest[25] = (l >> 8) & 0xff;
1968 digest[ 5] = (l >> 0) & 0xff;
1969
1970 l = itoa64_to_int (buf[24]) << 0;
1971 l |= itoa64_to_int (buf[25]) << 6;
1972 l |= itoa64_to_int (buf[26]) << 12;
1973 l |= itoa64_to_int (buf[27]) << 18;
1974
1975 digest[ 6] = (l >> 16) & 0xff;
1976 digest[16] = (l >> 8) & 0xff;
1977 digest[26] = (l >> 0) & 0xff;
1978
1979 l = itoa64_to_int (buf[28]) << 0;
1980 l |= itoa64_to_int (buf[29]) << 6;
1981 l |= itoa64_to_int (buf[30]) << 12;
1982 l |= itoa64_to_int (buf[31]) << 18;
1983
1984 digest[27] = (l >> 16) & 0xff;
1985 digest[ 7] = (l >> 8) & 0xff;
1986 digest[17] = (l >> 0) & 0xff;
1987
1988 l = itoa64_to_int (buf[32]) << 0;
1989 l |= itoa64_to_int (buf[33]) << 6;
1990 l |= itoa64_to_int (buf[34]) << 12;
1991 l |= itoa64_to_int (buf[35]) << 18;
1992
1993 digest[18] = (l >> 16) & 0xff;
1994 digest[28] = (l >> 8) & 0xff;
1995 digest[ 8] = (l >> 0) & 0xff;
1996
1997 l = itoa64_to_int (buf[36]) << 0;
1998 l |= itoa64_to_int (buf[37]) << 6;
1999 l |= itoa64_to_int (buf[38]) << 12;
2000 l |= itoa64_to_int (buf[39]) << 18;
2001
2002 digest[ 9] = (l >> 16) & 0xff;
2003 digest[19] = (l >> 8) & 0xff;
2004 digest[29] = (l >> 0) & 0xff;
2005
2006 l = itoa64_to_int (buf[40]) << 0;
2007 l |= itoa64_to_int (buf[41]) << 6;
2008 l |= itoa64_to_int (buf[42]) << 12;
2009
2010 digest[31] = (l >> 8) & 0xff;
2011 digest[30] = (l >> 0) & 0xff;
2012 }
2013
2014 void sha256crypt_encode (unsigned char digest[32], unsigned char buf[43])
2015 {
2016 int l;
2017
2018 l = (digest[ 0] << 16) | (digest[10] << 8) | (digest[20] << 0);
2019
2020 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2021 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2022 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2023 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
2024
2025 l = (digest[21] << 16) | (digest[ 1] << 8) | (digest[11] << 0);
2026
2027 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2028 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2029 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2030 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
2031
2032 l = (digest[12] << 16) | (digest[22] << 8) | (digest[ 2] << 0);
2033
2034 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2035 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2036 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2037 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
2038
2039 l = (digest[ 3] << 16) | (digest[13] << 8) | (digest[23] << 0);
2040
2041 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2042 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2043 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2044 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
2045
2046 l = (digest[24] << 16) | (digest[ 4] << 8) | (digest[14] << 0);
2047
2048 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2049 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2050 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2051 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
2052
2053 l = (digest[15] << 16) | (digest[25] << 8) | (digest[ 5] << 0);
2054
2055 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2056 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2057 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2058 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
2059
2060 l = (digest[ 6] << 16) | (digest[16] << 8) | (digest[26] << 0);
2061
2062 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2063 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2064 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2065 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
2066
2067 l = (digest[27] << 16) | (digest[ 7] << 8) | (digest[17] << 0);
2068
2069 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2070 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2071 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2072 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
2073
2074 l = (digest[18] << 16) | (digest[28] << 8) | (digest[ 8] << 0);
2075
2076 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2077 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2078 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2079 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
2080
2081 l = (digest[ 9] << 16) | (digest[19] << 8) | (digest[29] << 0);
2082
2083 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2084 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2085 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2086 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
2087
2088 l = 0 | (digest[31] << 8) | (digest[30] << 0);
2089
2090 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2091 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2092 buf[42] = int_to_itoa64 (l & 0x3f);
2093 }
2094
2095 void drupal7_decode (unsigned char digest[64], unsigned char buf[44])
2096 {
2097 int l;
2098
2099 l = itoa64_to_int (buf[ 0]) << 0;
2100 l |= itoa64_to_int (buf[ 1]) << 6;
2101 l |= itoa64_to_int (buf[ 2]) << 12;
2102 l |= itoa64_to_int (buf[ 3]) << 18;
2103
2104 digest[ 0] = (l >> 0) & 0xff;
2105 digest[ 1] = (l >> 8) & 0xff;
2106 digest[ 2] = (l >> 16) & 0xff;
2107
2108 l = itoa64_to_int (buf[ 4]) << 0;
2109 l |= itoa64_to_int (buf[ 5]) << 6;
2110 l |= itoa64_to_int (buf[ 6]) << 12;
2111 l |= itoa64_to_int (buf[ 7]) << 18;
2112
2113 digest[ 3] = (l >> 0) & 0xff;
2114 digest[ 4] = (l >> 8) & 0xff;
2115 digest[ 5] = (l >> 16) & 0xff;
2116
2117 l = itoa64_to_int (buf[ 8]) << 0;
2118 l |= itoa64_to_int (buf[ 9]) << 6;
2119 l |= itoa64_to_int (buf[10]) << 12;
2120 l |= itoa64_to_int (buf[11]) << 18;
2121
2122 digest[ 6] = (l >> 0) & 0xff;
2123 digest[ 7] = (l >> 8) & 0xff;
2124 digest[ 8] = (l >> 16) & 0xff;
2125
2126 l = itoa64_to_int (buf[12]) << 0;
2127 l |= itoa64_to_int (buf[13]) << 6;
2128 l |= itoa64_to_int (buf[14]) << 12;
2129 l |= itoa64_to_int (buf[15]) << 18;
2130
2131 digest[ 9] = (l >> 0) & 0xff;
2132 digest[10] = (l >> 8) & 0xff;
2133 digest[11] = (l >> 16) & 0xff;
2134
2135 l = itoa64_to_int (buf[16]) << 0;
2136 l |= itoa64_to_int (buf[17]) << 6;
2137 l |= itoa64_to_int (buf[18]) << 12;
2138 l |= itoa64_to_int (buf[19]) << 18;
2139
2140 digest[12] = (l >> 0) & 0xff;
2141 digest[13] = (l >> 8) & 0xff;
2142 digest[14] = (l >> 16) & 0xff;
2143
2144 l = itoa64_to_int (buf[20]) << 0;
2145 l |= itoa64_to_int (buf[21]) << 6;
2146 l |= itoa64_to_int (buf[22]) << 12;
2147 l |= itoa64_to_int (buf[23]) << 18;
2148
2149 digest[15] = (l >> 0) & 0xff;
2150 digest[16] = (l >> 8) & 0xff;
2151 digest[17] = (l >> 16) & 0xff;
2152
2153 l = itoa64_to_int (buf[24]) << 0;
2154 l |= itoa64_to_int (buf[25]) << 6;
2155 l |= itoa64_to_int (buf[26]) << 12;
2156 l |= itoa64_to_int (buf[27]) << 18;
2157
2158 digest[18] = (l >> 0) & 0xff;
2159 digest[19] = (l >> 8) & 0xff;
2160 digest[20] = (l >> 16) & 0xff;
2161
2162 l = itoa64_to_int (buf[28]) << 0;
2163 l |= itoa64_to_int (buf[29]) << 6;
2164 l |= itoa64_to_int (buf[30]) << 12;
2165 l |= itoa64_to_int (buf[31]) << 18;
2166
2167 digest[21] = (l >> 0) & 0xff;
2168 digest[22] = (l >> 8) & 0xff;
2169 digest[23] = (l >> 16) & 0xff;
2170
2171 l = itoa64_to_int (buf[32]) << 0;
2172 l |= itoa64_to_int (buf[33]) << 6;
2173 l |= itoa64_to_int (buf[34]) << 12;
2174 l |= itoa64_to_int (buf[35]) << 18;
2175
2176 digest[24] = (l >> 0) & 0xff;
2177 digest[25] = (l >> 8) & 0xff;
2178 digest[26] = (l >> 16) & 0xff;
2179
2180 l = itoa64_to_int (buf[36]) << 0;
2181 l |= itoa64_to_int (buf[37]) << 6;
2182 l |= itoa64_to_int (buf[38]) << 12;
2183 l |= itoa64_to_int (buf[39]) << 18;
2184
2185 digest[27] = (l >> 0) & 0xff;
2186 digest[28] = (l >> 8) & 0xff;
2187 digest[29] = (l >> 16) & 0xff;
2188
2189 l = itoa64_to_int (buf[40]) << 0;
2190 l |= itoa64_to_int (buf[41]) << 6;
2191 l |= itoa64_to_int (buf[42]) << 12;
2192 l |= itoa64_to_int (buf[43]) << 18;
2193
2194 digest[30] = (l >> 0) & 0xff;
2195 digest[31] = (l >> 8) & 0xff;
2196 digest[32] = (l >> 16) & 0xff;
2197
2198 digest[33] = 0;
2199 digest[34] = 0;
2200 digest[35] = 0;
2201 digest[36] = 0;
2202 digest[37] = 0;
2203 digest[38] = 0;
2204 digest[39] = 0;
2205 digest[40] = 0;
2206 digest[41] = 0;
2207 digest[42] = 0;
2208 digest[43] = 0;
2209 digest[44] = 0;
2210 digest[45] = 0;
2211 digest[46] = 0;
2212 digest[47] = 0;
2213 digest[48] = 0;
2214 digest[49] = 0;
2215 digest[50] = 0;
2216 digest[51] = 0;
2217 digest[52] = 0;
2218 digest[53] = 0;
2219 digest[54] = 0;
2220 digest[55] = 0;
2221 digest[56] = 0;
2222 digest[57] = 0;
2223 digest[58] = 0;
2224 digest[59] = 0;
2225 digest[60] = 0;
2226 digest[61] = 0;
2227 digest[62] = 0;
2228 digest[63] = 0;
2229 }
2230
2231 void drupal7_encode (unsigned char digest[64], unsigned char buf[43])
2232 {
2233 int l;
2234
2235 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
2236
2237 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2238 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2239 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2240 buf[ 3] = int_to_itoa64 (l & 0x3f);
2241
2242 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
2243
2244 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2245 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2246 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2247 buf[ 7] = int_to_itoa64 (l & 0x3f);
2248
2249 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
2250
2251 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2252 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2253 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2254 buf[11] = int_to_itoa64 (l & 0x3f);
2255
2256 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
2257
2258 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2259 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2260 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2261 buf[15] = int_to_itoa64 (l & 0x3f);
2262
2263 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
2264
2265 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2266 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2267 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2268 buf[19] = int_to_itoa64 (l & 0x3f);
2269
2270 l = (digest[15] << 0) | (digest[16] << 8) | (digest[17] << 16);
2271
2272 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2273 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2274 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2275 buf[23] = int_to_itoa64 (l & 0x3f);
2276
2277 l = (digest[18] << 0) | (digest[19] << 8) | (digest[20] << 16);
2278
2279 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2280 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2281 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2282 buf[27] = int_to_itoa64 (l & 0x3f);
2283
2284 l = (digest[21] << 0) | (digest[22] << 8) | (digest[23] << 16);
2285
2286 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2287 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2288 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2289 buf[31] = int_to_itoa64 (l & 0x3f);
2290
2291 l = (digest[24] << 0) | (digest[25] << 8) | (digest[26] << 16);
2292
2293 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2294 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2295 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2296 buf[35] = int_to_itoa64 (l & 0x3f);
2297
2298 l = (digest[27] << 0) | (digest[28] << 8) | (digest[29] << 16);
2299
2300 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2301 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2302 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2303 buf[39] = int_to_itoa64 (l & 0x3f);
2304
2305 l = (digest[30] << 0) | (digest[31] << 8) | (digest[32] << 16);
2306
2307 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2308 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2309 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
2310 //buf[43] = int_to_itoa64 (l & 0x3f);
2311 }
2312
2313 /**
2314 * tty
2315 */
2316
2317 #ifdef LINUX
2318 static struct termio savemodes;
2319 static int havemodes = 0;
2320
2321 int tty_break()
2322 {
2323 struct termio modmodes;
2324
2325 if (ioctl (fileno (stdin), TCGETA, &savemodes) < 0) return -1;
2326
2327 havemodes = 1;
2328
2329 modmodes = savemodes;
2330 modmodes.c_lflag &= ~ICANON;
2331 modmodes.c_cc[VMIN] = 1;
2332 modmodes.c_cc[VTIME] = 0;
2333
2334 return ioctl (fileno (stdin), TCSETAW, &modmodes);
2335 }
2336
2337 int tty_getchar()
2338 {
2339 fd_set rfds;
2340
2341 FD_ZERO (&rfds);
2342
2343 FD_SET (fileno (stdin), &rfds);
2344
2345 struct timeval tv;
2346
2347 tv.tv_sec = 1;
2348 tv.tv_usec = 0;
2349
2350 int retval = select (1, &rfds, NULL, NULL, &tv);
2351
2352 if (retval == 0) return 0;
2353 if (retval == -1) return -1;
2354
2355 return getchar();
2356 }
2357
2358 int tty_fix()
2359 {
2360 if (!havemodes) return 0;
2361
2362 return ioctl (fileno (stdin), TCSETAW, &savemodes);
2363 }
2364 #endif
2365
2366 #ifdef OSX
2367 static struct termios savemodes;
2368 static int havemodes = 0;
2369
2370 int tty_break()
2371 {
2372 struct termios modmodes;
2373
2374 if (ioctl (fileno (stdin), TIOCGETA, &savemodes) < 0) return -1;
2375
2376 havemodes = 1;
2377
2378 modmodes = savemodes;
2379 modmodes.c_lflag &= ~ICANON;
2380 modmodes.c_cc[VMIN] = 1;
2381 modmodes.c_cc[VTIME] = 0;
2382
2383 return ioctl (fileno (stdin), TIOCSETAW, &modmodes);
2384 }
2385
2386 int tty_getchar()
2387 {
2388 fd_set rfds;
2389
2390 FD_ZERO (&rfds);
2391
2392 FD_SET (fileno (stdin), &rfds);
2393
2394 struct timeval tv;
2395
2396 tv.tv_sec = 1;
2397 tv.tv_usec = 0;
2398
2399 int retval = select (1, &rfds, NULL, NULL, &tv);
2400
2401 if (retval == 0) return 0;
2402 if (retval == -1) return -1;
2403
2404 return getchar();
2405 }
2406
2407 int tty_fix()
2408 {
2409 if (!havemodes) return 0;
2410
2411 return ioctl (fileno (stdin), TIOCSETAW, &savemodes);
2412 }
2413 #endif
2414
2415 #ifdef WIN
2416 static DWORD saveMode = 0;
2417
2418 int tty_break()
2419 {
2420 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2421
2422 GetConsoleMode (stdinHandle, &saveMode);
2423 SetConsoleMode (stdinHandle, ENABLE_PROCESSED_INPUT);
2424
2425 return 0;
2426 }
2427
2428 int tty_getchar()
2429 {
2430 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2431
2432 DWORD rc = WaitForSingleObject (stdinHandle, 1000);
2433
2434 if (rc == WAIT_TIMEOUT) return 0;
2435 if (rc == WAIT_ABANDONED) return -1;
2436 if (rc == WAIT_FAILED) return -1;
2437
2438 // The whole ReadConsoleInput () part is a workaround.
2439 // For some unknown reason, maybe a mingw bug, a random signal
2440 // is sent to stdin which unblocks WaitForSingleObject () and sets rc 0.
2441 // Then it wants to read with getche () a keyboard input
2442 // which has never been made.
2443
2444 INPUT_RECORD buf[100];
2445
2446 DWORD num = 0;
2447
2448 ReadConsoleInput (stdinHandle, buf, 100, &num);
2449
2450 FlushConsoleInputBuffer (stdinHandle);
2451
2452 for (uint i = 0; i < num; i++)
2453 {
2454 if (buf[i].EventType != KEY_EVENT) continue;
2455
2456 KEY_EVENT_RECORD KeyEvent = buf[i].Event.KeyEvent;
2457
2458 if (KeyEvent.bKeyDown != TRUE) continue;
2459
2460 return KeyEvent.uChar.AsciiChar;
2461 }
2462
2463 return 0;
2464 }
2465
2466 int tty_fix()
2467 {
2468 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2469
2470 SetConsoleMode (stdinHandle, saveMode);
2471
2472 return 0;
2473 }
2474 #endif
2475
2476 /**
2477 * mem alloc
2478 */
2479
2480 #define MSG_ENOMEM "Insufficient memory available"
2481
2482 void *mycalloc (size_t nmemb, size_t size)
2483 {
2484 void *p = calloc (nmemb, size);
2485
2486 if (p == NULL)
2487 {
2488 log_error ("ERROR: %s", MSG_ENOMEM);
2489
2490 exit (-1);
2491 }
2492
2493 return (p);
2494 }
2495
2496 void *mymalloc (size_t size)
2497 {
2498 void *p = malloc (size);
2499
2500 if (p == NULL)
2501 {
2502 log_error ("ERROR: %s", MSG_ENOMEM);
2503
2504 exit (-1);
2505 }
2506
2507 memset (p, 0, size);
2508
2509 return (p);
2510 }
2511
2512 void myfree (void *ptr)
2513 {
2514 if (ptr == NULL) return;
2515
2516 free (ptr);
2517 }
2518
2519 void *myrealloc (void *ptr, size_t oldsz, size_t add)
2520 {
2521 void *p = realloc (ptr, oldsz + add);
2522
2523 if (p == NULL)
2524 {
2525 log_error ("ERROR: %s", MSG_ENOMEM);
2526
2527 exit (-1);
2528 }
2529
2530 memset ((char *) p + oldsz, 0, add);
2531
2532 return (p);
2533 }
2534
2535 char *mystrdup (const char *s)
2536 {
2537 const size_t len = strlen (s);
2538
2539 char *b = (char *) mymalloc (len + 1);
2540
2541 memcpy (b, s, len);
2542
2543 return (b);
2544 }
2545
2546 FILE *logfile_open (char *logfile)
2547 {
2548 FILE *fp = fopen (logfile, "ab");
2549
2550 if (fp == NULL)
2551 {
2552 fp = stdout;
2553 }
2554
2555 return fp;
2556 }
2557
2558 void logfile_close (FILE *fp)
2559 {
2560 if (fp == stdout) return;
2561
2562 fclose (fp);
2563 }
2564
2565 void logfile_append (const char *fmt, ...)
2566 {
2567 if (data.logfile_disable == 1) return;
2568
2569 FILE *fp = logfile_open (data.logfile);
2570
2571 va_list ap;
2572
2573 va_start (ap, fmt);
2574
2575 vfprintf (fp, fmt, ap);
2576
2577 va_end (ap);
2578
2579 fputc ('\n', fp);
2580
2581 fflush (fp);
2582
2583 logfile_close (fp);
2584 }
2585
2586 int logfile_generate_id ()
2587 {
2588 const int n = rand ();
2589
2590 time_t t;
2591
2592 time (&t);
2593
2594 return t + n;
2595 }
2596
2597 char *logfile_generate_topid ()
2598 {
2599 const int id = logfile_generate_id ();
2600
2601 char *topid = (char *) mymalloc (1 + 16 + 1);
2602
2603 sprintf (topid, "TOP%08x", id);
2604
2605 return topid;
2606 }
2607
2608 char *logfile_generate_subid ()
2609 {
2610 const int id = logfile_generate_id ();
2611
2612 char *subid = (char *) mymalloc (1 + 16 + 1);
2613
2614 sprintf (subid, "SUB%08x", id);
2615
2616 return subid;
2617 }
2618
2619 /**
2620 * system
2621 */
2622
2623 #ifdef _WIN
2624 void fsync (int fd)
2625 {
2626 HANDLE h = (HANDLE) _get_osfhandle (fd);
2627
2628 FlushFileBuffers (h);
2629 }
2630 #endif
2631
2632 /**
2633 * thermal
2634 */
2635
2636 #ifdef _WIN
2637 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2638 {
2639 NvU32 pGpuCount;
2640
2641 if (hc_NvAPI_EnumPhysicalGPUs (nvGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2642
2643 if (pGpuCount == 0)
2644 {
2645 log_info ("WARN: No NvAPI adapters found");
2646
2647 return (0);
2648 }
2649
2650 return (pGpuCount);
2651 }
2652 #endif
2653
2654 #ifdef LINUX
2655 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2656 {
2657 int pGpuCount = 0;
2658
2659 for (uint i = 0; i < DEVICES_MAX; i++)
2660 {
2661 if (hc_NVML_nvmlDeviceGetHandleByIndex (data.hm_dll, 1, i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2662
2663 //can be used to determine if the device by index matches the cuda device by index
2664 //char name[100]; memset (name, 0, sizeof (name));
2665 //hc_NVML_nvmlDeviceGetName (data.hm_dll, nvGPUHandle[i], name, sizeof (name) - 1);
2666
2667 pGpuCount++;
2668 }
2669
2670 if (pGpuCount == 0)
2671 {
2672 log_info ("WARN: No NVML adapters found");
2673
2674 return (0);
2675 }
2676
2677 return (pGpuCount);
2678 }
2679 #endif
2680
2681 void hm_close (HM_LIB hm_dll)
2682 {
2683 #ifdef _POSIX
2684 dlclose (hm_dll);
2685
2686 #elif _WIN
2687 FreeLibrary (hm_dll);
2688
2689 #endif
2690 }
2691
2692 HM_LIB hm_init ()
2693 {
2694 HM_LIB hm_dll = NULL;
2695
2696 if (data.vendor_id == VENDOR_ID_AMD)
2697 {
2698 #ifdef _POSIX
2699 hm_dll = dlopen ("libatiadlxx.so", RTLD_LAZY | RTLD_GLOBAL);
2700
2701 #elif _WIN
2702 hm_dll = LoadLibrary ("atiadlxx.dll");
2703
2704 if (hm_dll == NULL)
2705 {
2706 hm_dll = LoadLibrary ("atiadlxy.dll");
2707 }
2708
2709 #endif
2710 }
2711
2712 #ifdef LINUX
2713 if (data.vendor_id == VENDOR_ID_NV)
2714 {
2715 hm_dll = dlopen ("libnvidia-ml.so", RTLD_LAZY | RTLD_GLOBAL);
2716 }
2717 #endif
2718
2719 return hm_dll;
2720 }
2721
2722 int get_adapters_num_amd (HM_LIB hm_dll, int *iNumberAdapters)
2723 {
2724 if (hc_ADL_Adapter_NumberOfAdapters_Get (hm_dll, iNumberAdapters) != ADL_OK) return -1;
2725
2726 if (iNumberAdapters == 0)
2727 {
2728 log_info ("WARN: No ADL adapters found.");
2729
2730 return -1;
2731 }
2732
2733 return 0;
2734 }
2735
2736 /*
2737 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2738 {
2739 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2740 ADLODParameters lpOdParameters;
2741
2742 lpOdParameters.iSize = sizeof (ADLODParameters);
2743 size_t plevels_size = 0;
2744
2745 if (hc_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2746
2747 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2748 __func__, iAdapterIndex,
2749 lpOdParameters.iNumberOfPerformanceLevels,
2750 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2751 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2752
2753 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2754
2755 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2756
2757 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2758
2759 if (hc_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2760
2761 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2762 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2763 __func__, iAdapterIndex, j,
2764 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2765
2766 myfree (lpOdPerformanceLevels);
2767
2768 return 0;
2769 }
2770 */
2771
2772 LPAdapterInfo hm_get_adapter_info_amd (HM_LIB hm_dll, int iNumberAdapters)
2773 {
2774 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2775
2776 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2777
2778 if (hc_ADL_Adapter_AdapterInfo_Get (hm_dll, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2779
2780 return lpAdapterInfo;
2781 }
2782
2783 /*
2784 //
2785 // does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2786 //
2787
2788 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2789 {
2790 uint32_t idx = -1;
2791
2792 for (uint i = 0; i < num_adl_adapters; i++)
2793 {
2794 int opencl_bus_num = hm_device[i].busid;
2795 int opencl_dev_num = hm_device[i].devid;
2796
2797 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2798 {
2799 idx = i;
2800
2801 break;
2802 }
2803 }
2804
2805 if (idx >= DEVICES_MAX) return -1;
2806
2807 return idx;
2808 }
2809
2810 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2811 {
2812 for (uint i = 0; i < opencl_num_devices; i++)
2813 {
2814 cl_device_topology_amd device_topology;
2815
2816 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2817
2818 hm_device[i].busid = device_topology.pcie.bus;
2819 hm_device[i].devid = device_topology.pcie.device;
2820 }
2821 }
2822 */
2823
2824 void hm_sort_adl_adapters_by_busid_devid (uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2825 {
2826 // basically bubble sort
2827
2828 for (int i = 0; i < num_adl_adapters; i++)
2829 {
2830 for (int j = 0; j < num_adl_adapters - 1; j++)
2831 {
2832 // get info of adapter [x]
2833
2834 uint32_t adapter_index_x = valid_adl_device_list[j];
2835 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2836
2837 uint32_t bus_num_x = info_x.iBusNumber;
2838 uint32_t dev_num_x = info_x.iDeviceNumber;
2839
2840 // get info of adapter [y]
2841
2842 uint32_t adapter_index_y = valid_adl_device_list[j + 1];
2843 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2844
2845 uint32_t bus_num_y = info_y.iBusNumber;
2846 uint32_t dev_num_y = info_y.iDeviceNumber;
2847
2848 uint need_swap = 0;
2849
2850 if (bus_num_y < bus_num_x)
2851 {
2852 need_swap = 1;
2853 }
2854 else if (bus_num_y == bus_num_x)
2855 {
2856 if (dev_num_y < dev_num_x)
2857 {
2858 need_swap = 1;
2859 }
2860 }
2861
2862 if (need_swap == 1)
2863 {
2864 uint32_t temp = valid_adl_device_list[j + 1];
2865
2866 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2867 valid_adl_device_list[j + 0] = temp;
2868 }
2869 }
2870 }
2871 }
2872
2873 uint32_t *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2874 {
2875 *num_adl_adapters = 0;
2876
2877 uint32_t *adl_adapters = NULL;
2878
2879 int *bus_numbers = NULL;
2880 int *device_numbers = NULL;
2881
2882 for (int i = 0; i < iNumberAdapters; i++)
2883 {
2884 AdapterInfo info = lpAdapterInfo[i];
2885
2886 if ((info.strUDID == NULL) || (strlen (info.strUDID) < 1)) continue;
2887
2888 #ifdef WIN
2889 if (info.iVendorID != 1002) continue;
2890 #else
2891 if (info.iVendorID != 0x1002) continue;
2892 #endif
2893
2894 if (info.iBusNumber < 0) continue;
2895 if (info.iDeviceNumber < 0) continue;
2896
2897 int found = 0;
2898
2899 for (int pos = 0; pos < *num_adl_adapters; pos++)
2900 {
2901 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2902 {
2903 found = 1;
2904 break;
2905 }
2906 }
2907
2908 if (found) continue;
2909
2910 // add it to the list
2911
2912 adl_adapters = (uint32_t *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2913
2914 adl_adapters[*num_adl_adapters] = i;
2915
2916 // rest is just bookkeeping
2917
2918 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2919 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2920
2921 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2922 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2923
2924 (*num_adl_adapters)++;
2925 }
2926
2927 myfree (bus_numbers);
2928 myfree (device_numbers);
2929
2930 // sort the list by increasing bus id, device id number
2931
2932 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2933
2934 return adl_adapters;
2935 }
2936
2937 int hm_check_fanspeed_control (HM_LIB hm_dll, hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2938 {
2939 // loop through all valid devices
2940
2941 for (int i = 0; i < num_adl_adapters; i++)
2942 {
2943 uint32_t adapter_index = valid_adl_device_list[i];
2944
2945 // get AdapterInfo
2946
2947 AdapterInfo info = lpAdapterInfo[adapter_index];
2948
2949 // unfortunately this doesn't work since bus id and dev id are not unique
2950 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2951 // if (opencl_device_index == -1) continue;
2952
2953 int opencl_device_index = i;
2954
2955 // if (hm_show_performance_level (hm_dll, info.iAdapterIndex) != 0) return -1;
2956
2957 // get fanspeed info
2958
2959 if (hm_device[opencl_device_index].od_version == 5)
2960 {
2961 ADLFanSpeedInfo FanSpeedInfo;
2962
2963 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2964
2965 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2966
2967 if (hc_ADL_Overdrive5_FanSpeedInfo_Get (hm_dll, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2968
2969 // check read and write capability in fanspeedinfo
2970
2971 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2972 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2973 {
2974 hm_device[opencl_device_index].fan_supported = 1;
2975 }
2976 else
2977 {
2978 hm_device[opencl_device_index].fan_supported = 0;
2979 }
2980 }
2981 else // od_version == 6
2982 {
2983 ADLOD6FanSpeedInfo faninfo;
2984
2985 memset (&faninfo, 0, sizeof (faninfo));
2986
2987 if (hc_ADL_Overdrive6_FanSpeed_Get (hm_dll, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
2988
2989 // check read capability in fanspeedinfo
2990
2991 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
2992 {
2993 hm_device[opencl_device_index].fan_supported = 1;
2994 }
2995 else
2996 {
2997 hm_device[opencl_device_index].fan_supported = 0;
2998 }
2999 }
3000 }
3001
3002 return 0;
3003 }
3004
3005 int hm_get_overdrive_version (HM_LIB hm_dll, hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3006 {
3007 for (int i = 0; i < num_adl_adapters; i++)
3008 {
3009 uint32_t adapter_index = valid_adl_device_list[i];
3010
3011 // get AdapterInfo
3012
3013 AdapterInfo info = lpAdapterInfo[adapter_index];
3014
3015 // get overdrive version
3016
3017 int od_supported = 0;
3018 int od_enabled = 0;
3019 int od_version = 0;
3020
3021 if (hc_ADL_Overdrive_Caps (hm_dll, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3022
3023 // store the overdrive version in hm_device
3024
3025 // unfortunately this doesn't work since bus id and dev id are not unique
3026 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3027 // if (opencl_device_index == -1) continue;
3028
3029 int opencl_device_index = i;
3030
3031 hm_device[opencl_device_index].od_version = od_version;
3032 }
3033
3034 return 0;
3035 }
3036
3037 int hm_get_adapter_index_amd (hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3038 {
3039 for (int i = 0; i < num_adl_adapters; i++)
3040 {
3041 uint32_t adapter_index = valid_adl_device_list[i];
3042
3043 // get AdapterInfo
3044
3045 AdapterInfo info = lpAdapterInfo[adapter_index];
3046
3047 // store the iAdapterIndex in hm_device
3048
3049 // unfortunately this doesn't work since bus id and dev id are not unique
3050 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3051 // if (opencl_device_index == -1) continue;
3052
3053 int opencl_device_index = i;
3054
3055 hm_device[opencl_device_index].adapter_index.amd = info.iAdapterIndex;
3056 }
3057
3058 return num_adl_adapters;
3059 }
3060
3061 int hm_get_temperature_with_device_id (const uint device_id)
3062 {
3063 if (data.vendor_id == VENDOR_ID_AMD)
3064 {
3065 if (data.hm_dll)
3066 {
3067 if (data.hm_device[device_id].od_version == 5)
3068 {
3069 ADLTemperature Temperature;
3070
3071 Temperature.iSize = sizeof (ADLTemperature);
3072
3073 if (hc_ADL_Overdrive5_Temperature_Get (data.hm_dll, data.hm_device[device_id].adapter_index.amd, 0, &Temperature) != ADL_OK) return -1;
3074
3075 return Temperature.iTemperature / 1000;
3076 }
3077 else if (data.hm_device[device_id].od_version == 6)
3078 {
3079 int Temperature = 0;
3080
3081 if (hc_ADL_Overdrive6_Temperature_Get (data.hm_dll, data.hm_device[device_id].adapter_index.amd, &Temperature) != ADL_OK) return -1;
3082
3083 return Temperature / 1000;
3084 }
3085 }
3086 }
3087
3088 if (data.vendor_id == VENDOR_ID_NV)
3089 {
3090 #ifdef LINUX
3091 int temperature = 0;
3092
3093 hc_NVML_nvmlDeviceGetTemperature (data.hm_dll, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_GPU, (unsigned int *) &temperature);
3094
3095 return temperature;
3096 #endif
3097
3098 #ifdef WIN
3099 NV_GPU_THERMAL_SETTINGS pThermalSettings;
3100
3101 pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER;
3102 pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU;
3103 pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN;
3104 pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
3105
3106 if (hc_NvAPI_GPU_GetThermalSettings (data.hm_device[device_id].adapter_index.nv, 0, &pThermalSettings) != NVAPI_OK) return -1;
3107
3108 return pThermalSettings.sensor[0].currentTemp;
3109 #endif
3110 }
3111
3112 return -1;
3113 }
3114
3115 int hm_get_fanspeed_with_device_id (const uint device_id)
3116 {
3117 if (data.hm_device[device_id].fan_supported == 1)
3118 {
3119 if (data.vendor_id == VENDOR_ID_AMD)
3120 {
3121 if (data.hm_dll)
3122 {
3123 if (data.hm_device[device_id].od_version == 5)
3124 {
3125 ADLFanSpeedValue lpFanSpeedValue;
3126
3127 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3128
3129 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3130 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3131 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3132
3133 if (hc_ADL_Overdrive5_FanSpeed_Get (data.hm_dll, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3134
3135 return lpFanSpeedValue.iFanSpeed;
3136 }
3137 else // od_version == 6
3138 {
3139 ADLOD6FanSpeedInfo faninfo;
3140
3141 memset (&faninfo, 0, sizeof (faninfo));
3142
3143 if (hc_ADL_Overdrive6_FanSpeed_Get (data.hm_dll, data.hm_device[device_id].adapter_index.amd, &faninfo) != ADL_OK) return -1;
3144
3145 return faninfo.iFanSpeedPercent;
3146 }
3147 }
3148 }
3149
3150 if (data.vendor_id == VENDOR_ID_NV)
3151 {
3152 #ifdef LINUX
3153 int speed = 0;
3154
3155 hc_NVML_nvmlDeviceGetFanSpeed (data.hm_dll, 1, data.hm_device[device_id].adapter_index.nv, (unsigned int *) &speed);
3156
3157 return speed;
3158 #endif
3159
3160 #ifdef WIN
3161 NvU32 speed = 0;
3162
3163 hc_NvAPI_GPU_GetTachReading (data.hm_device[device_id].adapter_index.nv, &speed);
3164
3165 return speed;
3166 #endif
3167 }
3168 }
3169
3170 return -1;
3171 }
3172
3173 int hm_get_utilization_with_device_id (const uint device_id)
3174 {
3175 if (data.vendor_id == VENDOR_ID_AMD)
3176 {
3177 if (data.hm_dll)
3178 {
3179 ADLPMActivity PMActivity;
3180
3181 PMActivity.iSize = sizeof (ADLPMActivity);
3182
3183 if (hc_ADL_Overdrive_CurrentActivity_Get (data.hm_dll, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3184
3185 return PMActivity.iActivityPercent;
3186 }
3187 }
3188
3189 if (data.vendor_id == VENDOR_ID_NV)
3190 {
3191 #ifdef LINUX
3192 nvmlUtilization_t utilization;
3193
3194 hc_NVML_nvmlDeviceGetUtilizationRates (data.hm_dll, data.hm_device[device_id].adapter_index.nv, &utilization);
3195
3196 return utilization.gpu;
3197 #endif
3198
3199 #ifdef WIN
3200 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3201
3202 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3203
3204 if (hc_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_device[device_id].adapter_index.nv, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3205
3206 return pDynamicPstatesInfoEx.utilization[0].percentage;
3207 #endif
3208 }
3209
3210 return -1;
3211 }
3212
3213 int hm_set_fanspeed_with_device_id_amd (const uint device_id, const int fanspeed)
3214 {
3215 if (data.hm_device[device_id].fan_supported == 1)
3216 {
3217 if (data.hm_dll)
3218 {
3219 if (data.hm_device[device_id].od_version == 5)
3220 {
3221 ADLFanSpeedValue lpFanSpeedValue;
3222
3223 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3224
3225 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3226 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3227 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3228 lpFanSpeedValue.iFanSpeed = fanspeed;
3229
3230 if (hc_ADL_Overdrive5_FanSpeed_Set (data.hm_dll, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3231
3232 return 0;
3233 }
3234 else // od_version == 6
3235 {
3236 ADLOD6FanSpeedValue fan_speed_value;
3237
3238 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3239
3240 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3241 fan_speed_value.iFanSpeed = fanspeed;
3242
3243 if (hc_ADL_Overdrive6_FanSpeed_Set (data.hm_dll, data.hm_device[device_id].adapter_index.amd, &fan_speed_value) != ADL_OK) return -1;
3244
3245 return 0;
3246 }
3247 }
3248 }
3249
3250 return -1;
3251 }
3252
3253 /**
3254 * maskprocessor
3255 */
3256
3257 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3258 {
3259 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3260
3261 if (css_cnt > SP_PW_MAX)
3262 {
3263 log_error ("ERROR: mask length is too long");
3264
3265 exit (-1);
3266 }
3267
3268 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3269 {
3270 uint *uniq_tbl = uniq_tbls[css_pos];
3271
3272 uint *cs_buf = css[css_pos].cs_buf;
3273 uint cs_len = css[css_pos].cs_len;
3274
3275 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3276 {
3277 uint c = cs_buf[cs_pos] & 0xff;
3278
3279 uniq_tbl[c] = 1;
3280 }
3281 }
3282 }
3283
3284 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3285 {
3286 cs_t *cs = &css[css_cnt];
3287
3288 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3289
3290 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3291
3292 memset (css_uniq, 0, css_uniq_sz);
3293
3294 size_t i;
3295
3296 for (i = 0; i < cs->cs_len; i++)
3297 {
3298 const uint u = cs->cs_buf[i];
3299
3300 css_uniq[u] = 1;
3301 }
3302
3303 for (i = 0; i < in_len; i++)
3304 {
3305 uint u = in_buf[i] & 0xff;
3306
3307 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3308
3309 if (css_uniq[u] == 1) continue;
3310
3311 css_uniq[u] = 1;
3312
3313 cs->cs_buf[cs->cs_len] = u;
3314
3315 cs->cs_len++;
3316 }
3317
3318 myfree (css_uniq);
3319 }
3320
3321 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3322 {
3323 size_t in_pos;
3324
3325 for (in_pos = 0; in_pos < in_len; in_pos++)
3326 {
3327 uint p0 = in_buf[in_pos] & 0xff;
3328
3329 if (interpret == 1 && p0 == '?')
3330 {
3331 in_pos++;
3332
3333 if (in_pos == in_len) break;
3334
3335 uint p1 = in_buf[in_pos] & 0xff;
3336
3337 switch (p1)
3338 {
3339 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3340 break;
3341 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3342 break;
3343 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3344 break;
3345 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3346 break;
3347 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3348 break;
3349 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3350 break;
3351 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3352 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3353 break;
3354 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3355 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3356 break;
3357 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3358 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3359 break;
3360 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3361 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3362 break;
3363 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3364 break;
3365 default: log_error ("Syntax error: %s", in_buf);
3366 exit (-1);
3367 }
3368 }
3369 else
3370 {
3371 if (data.hex_charset)
3372 {
3373 in_pos++;
3374
3375 if (in_pos == in_len)
3376 {
3377 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3378
3379 exit (-1);
3380 }
3381
3382 uint p1 = in_buf[in_pos] & 0xff;
3383
3384 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3385 {
3386 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3387
3388 exit (-1);
3389 }
3390
3391 uint chr = 0;
3392
3393 chr = hex_convert (p1) << 0;
3394 chr |= hex_convert (p0) << 4;
3395
3396 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3397 }
3398 else
3399 {
3400 uint chr = p0;
3401
3402 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3403 }
3404 }
3405 }
3406 }
3407
3408 uint64_t mp_get_sum (uint css_cnt, cs_t *css)
3409 {
3410 uint64_t sum = 1;
3411
3412 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3413 {
3414 sum *= css[css_pos].cs_len;
3415 }
3416
3417 return (sum);
3418 }
3419
3420 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3421 {
3422 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3423
3424 uint mask_pos;
3425 uint css_pos;
3426
3427 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3428 {
3429 char p0 = mask_buf[mask_pos];
3430
3431 if (p0 == '?')
3432 {
3433 mask_pos++;
3434
3435 if (mask_pos == mask_len) break;
3436
3437 char p1 = mask_buf[mask_pos];
3438
3439 uint chr = p1;
3440
3441 switch (p1)
3442 {
3443 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3444 break;
3445 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3446 break;
3447 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3448 break;
3449 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3450 break;
3451 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3452 break;
3453 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3454 break;
3455 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3456 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3457 break;
3458 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3459 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3460 break;
3461 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3462 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3463 break;
3464 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3465 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3466 break;
3467 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3468 break;
3469 default: log_error ("ERROR: syntax error: %s", mask_buf);
3470 exit (-1);
3471 }
3472 }
3473 else
3474 {
3475 if (data.hex_charset)
3476 {
3477 mask_pos++;
3478
3479 // if there is no 2nd hex character, show an error:
3480
3481 if (mask_pos == mask_len)
3482 {
3483 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3484
3485 exit (-1);
3486 }
3487
3488 char p1 = mask_buf[mask_pos];
3489
3490 // if they are not valid hex character, show an error:
3491
3492 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3493 {
3494 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3495
3496 exit (-1);
3497 }
3498
3499 uint chr = 0;
3500
3501 chr |= hex_convert (p1) << 0;
3502 chr |= hex_convert (p0) << 4;
3503
3504 mp_add_cs_buf (&chr, 1, css, css_pos);
3505 }
3506 else
3507 {
3508 uint chr = p0;
3509
3510 mp_add_cs_buf (&chr, 1, css, css_pos);
3511 }
3512 }
3513 }
3514
3515 if (css_pos == 0)
3516 {
3517 log_error ("ERROR: invalid mask length (0)");
3518
3519 exit (-1);
3520 }
3521
3522 *css_cnt = css_pos;
3523
3524 return (css);
3525 }
3526
3527 void mp_exec (uint64_t val, char *buf, cs_t *css, int css_cnt)
3528 {
3529 for (int i = 0; i < css_cnt; i++)
3530 {
3531 uint len = css[i].cs_len;
3532 uint64_t next = val / len;
3533 uint pos = val % len;
3534 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3535 val = next;
3536 }
3537 }
3538
3539 void mp_cut_at (char *mask, uint max)
3540 {
3541 uint i;
3542 uint j;
3543 uint mask_len = strlen (mask);
3544
3545 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3546 {
3547 if (mask[i] == '?') i++;
3548 }
3549
3550 mask[i] = 0;
3551 }
3552
3553 void mp_setup_sys (cs_t *mp_sys)
3554 {
3555 uint pos;
3556 uint chr;
3557 uint donec[CHARSIZ];
3558
3559 memset (donec, 0, sizeof (donec));
3560
3561 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3562 mp_sys[0].cs_buf[pos++] = chr;
3563 mp_sys[0].cs_len = pos; }
3564
3565 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3566 mp_sys[1].cs_buf[pos++] = chr;
3567 mp_sys[1].cs_len = pos; }
3568
3569 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3570 mp_sys[2].cs_buf[pos++] = chr;
3571 mp_sys[2].cs_len = pos; }
3572
3573 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3574 mp_sys[3].cs_buf[pos++] = chr;
3575 mp_sys[3].cs_len = pos; }
3576
3577 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3578 mp_sys[4].cs_len = pos; }
3579
3580 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3581 mp_sys[5].cs_len = pos; }
3582 }
3583
3584 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3585 {
3586 FILE *fp = fopen (buf, "rb");
3587
3588 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3589 {
3590 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3591 }
3592 else
3593 {
3594 char mp_file[1024];
3595
3596 memset (mp_file, 0, sizeof (mp_file));
3597
3598 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3599
3600 fclose (fp);
3601
3602 len = in_superchop (mp_file);
3603
3604 if (len == 0)
3605 {
3606 log_info ("WARNING: charset file corrupted");
3607
3608 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3609 }
3610 else
3611 {
3612 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3613 }
3614 }
3615 }
3616
3617 void mp_reset_usr (cs_t *mp_usr, uint index)
3618 {
3619 mp_usr[index].cs_len = 0;
3620
3621 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3622 }
3623
3624 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3625 {
3626 char *new_mask_buf = (char *) mymalloc (256);
3627
3628 uint mask_pos;
3629
3630 uint css_pos;
3631
3632 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3633 {
3634 if (css_pos == len) break;
3635
3636 char p0 = mask_buf[mask_pos];
3637
3638 new_mask_buf[mask_pos] = p0;
3639
3640 if (p0 == '?')
3641 {
3642 mask_pos++;
3643
3644 if (mask_pos == mask_len) break;
3645
3646 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3647 }
3648 else
3649 {
3650 if (data.hex_charset)
3651 {
3652 mask_pos++;
3653
3654 if (mask_pos == mask_len)
3655 {
3656 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3657
3658 exit (-1);
3659 }
3660
3661 char p1 = mask_buf[mask_pos];
3662
3663 // if they are not valid hex character, show an error:
3664
3665 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3666 {
3667 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3668
3669 exit (-1);
3670 }
3671
3672 new_mask_buf[mask_pos] = p1;
3673 }
3674 }
3675 }
3676
3677 if (css_pos == len) return (new_mask_buf);
3678
3679 myfree (new_mask_buf);
3680
3681 return (NULL);
3682 }
3683
3684 /**
3685 * statprocessor
3686 */
3687
3688 uint64_t sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3689 {
3690 uint64_t sum = 1;
3691
3692 uint i;
3693
3694 for (i = start; i < stop; i++)
3695 {
3696 sum *= root_css_buf[i].cs_len;
3697 }
3698
3699 return (sum);
3700 }
3701
3702 void sp_exec (uint64_t ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3703 {
3704 uint64_t v = ctx;
3705
3706 cs_t *cs = &root_css_buf[start];
3707
3708 uint i;
3709
3710 for (i = start; i < stop; i++)
3711 {
3712 const uint64_t m = v % cs->cs_len;
3713 const uint64_t d = v / cs->cs_len;
3714
3715 v = d;
3716
3717 const uint k = cs->cs_buf[m];
3718
3719 pw_buf[i - start] = (char) k;
3720
3721 cs = &markov_css_buf[(i * CHARSIZ) + k];
3722 }
3723 }
3724
3725 int sp_comp_val (const void *p1, const void *p2)
3726 {
3727 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3728 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3729
3730 return b2->val - b1->val;
3731 }
3732
3733 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)
3734 {
3735 uint i;
3736 uint j;
3737 uint k;
3738
3739 /**
3740 * Initialize hcstats
3741 */
3742
3743 uint64_t *root_stats_buf = (uint64_t *) mycalloc (SP_ROOT_CNT, sizeof (uint64_t));
3744
3745 uint64_t *root_stats_ptr = root_stats_buf;
3746
3747 uint64_t *root_stats_buf_by_pos[SP_PW_MAX];
3748
3749 for (i = 0; i < SP_PW_MAX; i++)
3750 {
3751 root_stats_buf_by_pos[i] = root_stats_ptr;
3752
3753 root_stats_ptr += CHARSIZ;
3754 }
3755
3756 uint64_t *markov_stats_buf = (uint64_t *) mycalloc (SP_MARKOV_CNT, sizeof (uint64_t));
3757
3758 uint64_t *markov_stats_ptr = markov_stats_buf;
3759
3760 uint64_t *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3761
3762 for (i = 0; i < SP_PW_MAX; i++)
3763 {
3764 for (j = 0; j < CHARSIZ; j++)
3765 {
3766 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3767
3768 markov_stats_ptr += CHARSIZ;
3769 }
3770 }
3771
3772 /**
3773 * Load hcstats File
3774 */
3775
3776 if (hcstat == NULL)
3777 {
3778 char hcstat_tmp[256];
3779
3780 memset (hcstat_tmp, 0, sizeof (hcstat_tmp));
3781
3782 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
3783
3784 hcstat = hcstat_tmp;
3785 }
3786
3787 FILE *fd = fopen (hcstat, "rb");
3788
3789 if (fd == NULL)
3790 {
3791 log_error ("%s: %s", hcstat, strerror (errno));
3792
3793 exit (-1);
3794 }
3795
3796 if (fread (root_stats_buf, sizeof (uint64_t), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3797 {
3798 log_error ("%s: Could not load data", hcstat);
3799
3800 exit (-1);
3801 }
3802
3803 if (fread (markov_stats_buf, sizeof (uint64_t), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3804 {
3805 log_error ("%s: Could not load data", hcstat);
3806
3807 exit (-1);
3808 }
3809
3810 fclose (fd);
3811
3812 /**
3813 * Markov modifier of hcstat_table on user request
3814 */
3815
3816 if (disable)
3817 {
3818 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (uint64_t));
3819 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (uint64_t));
3820 }
3821
3822 if (classic)
3823 {
3824 /* Add all stats to first position */
3825
3826 for (i = 1; i < SP_PW_MAX; i++)
3827 {
3828 uint64_t *out = root_stats_buf_by_pos[0];
3829 uint64_t *in = root_stats_buf_by_pos[i];
3830
3831 for (j = 0; j < CHARSIZ; j++)
3832 {
3833 *out++ += *in++;
3834 }
3835 }
3836
3837 for (i = 1; i < SP_PW_MAX; i++)
3838 {
3839 uint64_t *out = markov_stats_buf_by_key[0][0];
3840 uint64_t *in = markov_stats_buf_by_key[i][0];
3841
3842 for (j = 0; j < CHARSIZ; j++)
3843 {
3844 for (k = 0; k < CHARSIZ; k++)
3845 {
3846 *out++ += *in++;
3847 }
3848 }
3849 }
3850
3851 /* copy them to all pw_positions */
3852
3853 for (i = 1; i < SP_PW_MAX; i++)
3854 {
3855 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (uint64_t));
3856 }
3857
3858 for (i = 1; i < SP_PW_MAX; i++)
3859 {
3860 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (uint64_t));
3861 }
3862 }
3863
3864 /**
3865 * Initialize tables
3866 */
3867
3868 hcstat_table_t *root_table_ptr = root_table_buf;
3869
3870 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
3871
3872 for (i = 0; i < SP_PW_MAX; i++)
3873 {
3874 root_table_buf_by_pos[i] = root_table_ptr;
3875
3876 root_table_ptr += CHARSIZ;
3877 }
3878
3879 hcstat_table_t *markov_table_ptr = markov_table_buf;
3880
3881 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
3882
3883 for (i = 0; i < SP_PW_MAX; i++)
3884 {
3885 for (j = 0; j < CHARSIZ; j++)
3886 {
3887 markov_table_buf_by_key[i][j] = markov_table_ptr;
3888
3889 markov_table_ptr += CHARSIZ;
3890 }
3891 }
3892
3893 /**
3894 * Convert hcstat to tables
3895 */
3896
3897 for (i = 0; i < SP_ROOT_CNT; i++)
3898 {
3899 uint key = i % CHARSIZ;
3900
3901 root_table_buf[i].key = key;
3902 root_table_buf[i].val = root_stats_buf[i];
3903 }
3904
3905 for (i = 0; i < SP_MARKOV_CNT; i++)
3906 {
3907 uint key = i % CHARSIZ;
3908
3909 markov_table_buf[i].key = key;
3910 markov_table_buf[i].val = markov_stats_buf[i];
3911 }
3912
3913 myfree (root_stats_buf);
3914 myfree (markov_stats_buf);
3915
3916 /**
3917 * Finally sort them
3918 */
3919
3920 for (i = 0; i < SP_PW_MAX; i++)
3921 {
3922 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3923 }
3924
3925 for (i = 0; i < SP_PW_MAX; i++)
3926 {
3927 for (j = 0; j < CHARSIZ; j++)
3928 {
3929 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3930 }
3931 }
3932 }
3933
3934 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])
3935 {
3936 /**
3937 * Convert tables to css
3938 */
3939
3940 for (uint i = 0; i < SP_ROOT_CNT; i++)
3941 {
3942 uint pw_pos = i / CHARSIZ;
3943
3944 cs_t *cs = &root_css_buf[pw_pos];
3945
3946 if (cs->cs_len == threshold) continue;
3947
3948 uint key = root_table_buf[i].key;
3949
3950 if (uniq_tbls[pw_pos][key] == 0) continue;
3951
3952 cs->cs_buf[cs->cs_len] = key;
3953
3954 cs->cs_len++;
3955 }
3956
3957 /**
3958 * Convert table to css
3959 */
3960
3961 for (uint i = 0; i < SP_MARKOV_CNT; i++)
3962 {
3963 uint c = i / CHARSIZ;
3964
3965 cs_t *cs = &markov_css_buf[c];
3966
3967 if (cs->cs_len == threshold) continue;
3968
3969 uint pw_pos = c / CHARSIZ;
3970
3971 uint key = markov_table_buf[i].key;
3972
3973 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
3974
3975 cs->cs_buf[cs->cs_len] = key;
3976
3977 cs->cs_len++;
3978 }
3979
3980 /*
3981 for (uint i = 0; i < 8; i++)
3982 {
3983 for (uint j = 0x20; j < 0x80; j++)
3984 {
3985 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
3986
3987 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
3988
3989 for (uint k = 0; k < 10; k++)
3990 {
3991 printf (" %u\n", ptr->cs_buf[k]);
3992 }
3993 }
3994 }
3995 */
3996 }
3997
3998 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
3999 {
4000 for (uint i = 0; i < SP_PW_MAX; i += 2)
4001 {
4002 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4003
4004 out += CHARSIZ;
4005 in += CHARSIZ;
4006
4007 out->key = 0;
4008 out->val = 1;
4009
4010 out++;
4011
4012 for (uint j = 1; j < CHARSIZ; j++)
4013 {
4014 out->key = j;
4015 out->val = 0;
4016
4017 out++;
4018 }
4019 }
4020 }
4021
4022 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4023 {
4024 for (uint i = 0; i < SP_PW_MAX; i += 2)
4025 {
4026 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4027
4028 out += CHARSIZ * CHARSIZ;
4029 in += CHARSIZ * CHARSIZ;
4030
4031 for (uint j = 0; j < CHARSIZ; j++)
4032 {
4033 out->key = 0;
4034 out->val = 1;
4035
4036 out++;
4037
4038 for (uint k = 1; k < CHARSIZ; k++)
4039 {
4040 out->key = k;
4041 out->val = 0;
4042
4043 out++;
4044 }
4045 }
4046 }
4047 }
4048
4049 /**
4050 * mixed shared functions
4051 */
4052
4053 void dump_hex (const char *s, size_t size)
4054 {
4055 size_t i;
4056
4057 for (i = 0; i < size; i++)
4058 {
4059 log_info_nn ("%02x ", (unsigned char) s[i]);
4060 }
4061
4062 log_info ("");
4063 }
4064
4065 void usage_mini_print (const char *progname)
4066 {
4067 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4068 }
4069
4070 void usage_big_print (const char *progname)
4071 {
4072 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4073 }
4074
4075 char *get_exec_path ()
4076 {
4077 int exec_path_len = 1024;
4078
4079 char *exec_path = (char *) mymalloc (exec_path_len);
4080
4081 #ifdef LINUX
4082
4083 char tmp[32];
4084
4085 sprintf (tmp, "/proc/%d/exe", getpid ());
4086
4087 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4088
4089 #endif
4090
4091 #ifdef WIN
4092
4093 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4094
4095 #endif
4096
4097 exec_path[len] = 0;
4098
4099 return exec_path;
4100 }
4101
4102 char *get_install_dir (const char *progname)
4103 {
4104 char *install_dir = mystrdup (progname);
4105 char *last_slash = NULL;
4106
4107 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4108 {
4109 *last_slash = 0;
4110 }
4111 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4112 {
4113 *last_slash = 0;
4114 }
4115 else
4116 {
4117 install_dir[0] = '.';
4118 install_dir[1] = 0;
4119 }
4120
4121 return (install_dir);
4122 }
4123
4124 char *get_profile_dir (const char *homedir)
4125 {
4126 #define DOT_HASHCAT ".hashcat"
4127
4128 char *profile_dir = (char *) mymalloc (strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1);
4129
4130 sprintf (profile_dir, "%s/%s", homedir, DOT_HASHCAT);
4131
4132 return profile_dir;
4133 }
4134
4135 char *get_session_dir (const char *profile_dir)
4136 {
4137 #define SESSIONS_FOLDER "sessions"
4138
4139 char *session_dir = (char *) mymalloc (strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1);
4140
4141 sprintf (session_dir, "%s/%s", profile_dir, SESSIONS_FOLDER);
4142
4143 return session_dir;
4144 }
4145
4146 void truecrypt_crc32 (char *file, unsigned char keytab[64])
4147 {
4148 uint crc = ~0;
4149
4150 FILE *fd = fopen (file, "rb");
4151
4152 if (fd == NULL)
4153 {
4154 log_error ("%s: %s", file, strerror (errno));
4155
4156 exit (-1);
4157 }
4158
4159 #define MAX_KEY_SIZE (1024 * 1024)
4160
4161 char *buf = (char *) mymalloc (MAX_KEY_SIZE);
4162
4163 int nread = fread (buf, 1, MAX_KEY_SIZE, fd);
4164
4165 int kpos = 0;
4166
4167 for (int fpos = 0; fpos < nread; fpos++)
4168 {
4169 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4170
4171 keytab[kpos++] += (crc >> 24) & 0xff;
4172 keytab[kpos++] += (crc >> 16) & 0xff;
4173 keytab[kpos++] += (crc >> 8) & 0xff;
4174 keytab[kpos++] += (crc >> 0) & 0xff;
4175
4176 if (kpos >= 64) kpos = 0;
4177 }
4178
4179 myfree (buf);
4180
4181 fclose(fd);
4182 }
4183
4184 void set_cpu_affinity (char *cpu_affinity)
4185 {
4186 #ifdef WIN
4187 DWORD_PTR aff_mask = 0;
4188 #endif
4189
4190 #ifdef LINUX
4191 cpu_set_t cpuset;
4192
4193 CPU_ZERO (&cpuset);
4194 #endif
4195
4196 if (cpu_affinity)
4197 {
4198 char *devices = strdup (cpu_affinity);
4199
4200 char *next = strtok (devices, ",");
4201
4202 do
4203 {
4204 uint cpu_id = atoi (next);
4205
4206 if (cpu_id == 0)
4207 {
4208 #ifdef WIN
4209 aff_mask = 0;
4210 #endif
4211
4212 #ifdef LINUX
4213 CPU_ZERO (&cpuset);
4214 #endif
4215
4216 break;
4217 }
4218
4219 if (cpu_id > 32)
4220 {
4221 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4222
4223 exit (-1);
4224 }
4225
4226 #ifdef WIN
4227 aff_mask |= 1 << (cpu_id - 1);
4228 #endif
4229
4230 #ifdef LINUX
4231 CPU_SET ((cpu_id - 1), &cpuset);
4232 #endif
4233
4234 } while ((next = strtok (NULL, ",")) != NULL);
4235
4236 free (devices);
4237 }
4238
4239 #ifdef WIN
4240 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4241 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4242 #endif
4243
4244 #ifdef LINUX
4245 pthread_t thread = pthread_self ();
4246 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4247 #endif
4248 }
4249
4250 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4251 {
4252 char *element, *end;
4253
4254 end = (char *) base + nmemb * size;
4255
4256 for (element = (char *) base; element < end; element += size)
4257 if (!compar (element, key))
4258 return element;
4259
4260 return NULL;
4261 }
4262
4263 int sort_by_salt (const void *v1, const void *v2)
4264 {
4265 const salt_t *s1 = (const salt_t *) v1;
4266 const salt_t *s2 = (const salt_t *) v2;
4267
4268 const int res1 = s1->salt_len - s2->salt_len;
4269
4270 if (res1 != 0) return (res1);
4271
4272 const int res2 = s1->salt_iter - s2->salt_iter;
4273
4274 if (res2 != 0) return (res2);
4275
4276 uint n;
4277
4278 n = 12;
4279
4280 while (n--)
4281 {
4282 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4283 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4284 }
4285
4286 n = 8;
4287
4288 while (n--)
4289 {
4290 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4291 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4292 }
4293
4294 return (0);
4295 }
4296
4297 int sort_by_salt_buf (const void *v1, const void *v2)
4298 {
4299 const pot_t *p1 = (const pot_t *) v1;
4300 const pot_t *p2 = (const pot_t *) v2;
4301
4302 const hash_t *h1 = &p1->hash;
4303 const hash_t *h2 = &p2->hash;
4304
4305 const salt_t *s1 = h1->salt;
4306 const salt_t *s2 = h2->salt;
4307
4308 uint n = 12;
4309
4310 while (n--)
4311 {
4312 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4313 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4314 }
4315
4316 return 0;
4317 }
4318
4319 int sort_by_hash_t_salt (const void *v1, const void *v2)
4320 {
4321 const hash_t *h1 = (const hash_t *) v1;
4322 const hash_t *h2 = (const hash_t *) v2;
4323
4324 const salt_t *s1 = h1->salt;
4325 const salt_t *s2 = h2->salt;
4326
4327 // testphase: this should work
4328 uint n = 12;
4329
4330 while (n--)
4331 {
4332 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4333 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4334 }
4335
4336 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4337 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4338 if (s1->salt_len > s2->salt_len) return ( 1);
4339 if (s1->salt_len < s2->salt_len) return (-1);
4340
4341 uint n = s1->salt_len;
4342
4343 while (n--)
4344 {
4345 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4346 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4347 }
4348 */
4349
4350 return 0;
4351 }
4352
4353 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4354 {
4355 const hash_t *h1 = (const hash_t *) v1;
4356 const hash_t *h2 = (const hash_t *) v2;
4357
4358 const salt_t *s1 = h1->salt;
4359 const salt_t *s2 = h2->salt;
4360
4361 // 12 - 2 (since last 2 uints contain the digest)
4362 uint n = 10;
4363
4364 while (n--)
4365 {
4366 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4367 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4368 }
4369
4370 return 0;
4371 }
4372
4373 int sort_by_hash_no_salt (const void *v1, const void *v2)
4374 {
4375 const hash_t *h1 = (const hash_t *) v1;
4376 const hash_t *h2 = (const hash_t *) v2;
4377
4378 const void *d1 = h1->digest;
4379 const void *d2 = h2->digest;
4380
4381 return data.sort_by_digest (d1, d2);
4382 }
4383
4384 int sort_by_hash (const void *v1, const void *v2)
4385 {
4386 const hash_t *h1 = (const hash_t *) v1;
4387 const hash_t *h2 = (const hash_t *) v2;
4388
4389 if (data.isSalted)
4390 {
4391 const salt_t *s1 = h1->salt;
4392 const salt_t *s2 = h2->salt;
4393
4394 int res = sort_by_salt (s1, s2);
4395
4396 if (res != 0) return (res);
4397 }
4398
4399 const void *d1 = h1->digest;
4400 const void *d2 = h2->digest;
4401
4402 return data.sort_by_digest (d1, d2);
4403 }
4404
4405 int sort_by_pot (const void *v1, const void *v2)
4406 {
4407 const pot_t *p1 = (const pot_t *) v1;
4408 const pot_t *p2 = (const pot_t *) v2;
4409
4410 const hash_t *h1 = &p1->hash;
4411 const hash_t *h2 = &p2->hash;
4412
4413 return sort_by_hash (h1, h2);
4414 }
4415
4416 int sort_by_mtime (const void *p1, const void *p2)
4417 {
4418 const char **f1 = (const char **) p1;
4419 const char **f2 = (const char **) p2;
4420
4421 struct stat s1; stat (*f1, &s1);
4422 struct stat s2; stat (*f2, &s2);
4423
4424 return s2.st_mtime - s1.st_mtime;
4425 }
4426
4427 int sort_by_cpu_rule (const void *p1, const void *p2)
4428 {
4429 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4430 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4431
4432 return memcmp (r1, r2, sizeof (cpu_rule_t));
4433 }
4434
4435 int sort_by_kernel_rule (const void *p1, const void *p2)
4436 {
4437 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4438 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4439
4440 return memcmp (r1, r2, sizeof (kernel_rule_t));
4441 }
4442
4443 int sort_by_stringptr (const void *p1, const void *p2)
4444 {
4445 const char **s1 = (const char **) p1;
4446 const char **s2 = (const char **) p2;
4447
4448 return strcmp (*s1, *s2);
4449 }
4450
4451 int sort_by_dictstat (const void *s1, const void *s2)
4452 {
4453 dictstat_t *d1 = (dictstat_t *) s1;
4454 dictstat_t *d2 = (dictstat_t *) s2;
4455
4456 #ifdef _POSIX
4457 d2->stat.st_atim = d1->stat.st_atim;
4458 #else
4459 d2->stat.st_atime = d1->stat.st_atime;
4460 #endif
4461
4462 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4463 }
4464
4465 int sort_by_bitmap (const void *p1, const void *p2)
4466 {
4467 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4468 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4469
4470 return b1->collisions - b2->collisions;
4471 }
4472
4473 int sort_by_digest_4_2 (const void *v1, const void *v2)
4474 {
4475 const uint32_t *d1 = (const uint32_t *) v1;
4476 const uint32_t *d2 = (const uint32_t *) v2;
4477
4478 uint n = 2;
4479
4480 while (n--)
4481 {
4482 if (d1[n] > d2[n]) return ( 1);
4483 if (d1[n] < d2[n]) return (-1);
4484 }
4485
4486 return (0);
4487 }
4488
4489 int sort_by_digest_4_4 (const void *v1, const void *v2)
4490 {
4491 const uint32_t *d1 = (const uint32_t *) v1;
4492 const uint32_t *d2 = (const uint32_t *) v2;
4493
4494 uint n = 4;
4495
4496 while (n--)
4497 {
4498 if (d1[n] > d2[n]) return ( 1);
4499 if (d1[n] < d2[n]) return (-1);
4500 }
4501
4502 return (0);
4503 }
4504
4505 int sort_by_digest_4_5 (const void *v1, const void *v2)
4506 {
4507 const uint32_t *d1 = (const uint32_t *) v1;
4508 const uint32_t *d2 = (const uint32_t *) v2;
4509
4510 uint n = 5;
4511
4512 while (n--)
4513 {
4514 if (d1[n] > d2[n]) return ( 1);
4515 if (d1[n] < d2[n]) return (-1);
4516 }
4517
4518 return (0);
4519 }
4520
4521 int sort_by_digest_4_6 (const void *v1, const void *v2)
4522 {
4523 const uint32_t *d1 = (const uint32_t *) v1;
4524 const uint32_t *d2 = (const uint32_t *) v2;
4525
4526 uint n = 6;
4527
4528 while (n--)
4529 {
4530 if (d1[n] > d2[n]) return ( 1);
4531 if (d1[n] < d2[n]) return (-1);
4532 }
4533
4534 return (0);
4535 }
4536
4537 int sort_by_digest_4_8 (const void *v1, const void *v2)
4538 {
4539 const uint32_t *d1 = (const uint32_t *) v1;
4540 const uint32_t *d2 = (const uint32_t *) v2;
4541
4542 uint n = 8;
4543
4544 while (n--)
4545 {
4546 if (d1[n] > d2[n]) return ( 1);
4547 if (d1[n] < d2[n]) return (-1);
4548 }
4549
4550 return (0);
4551 }
4552
4553 int sort_by_digest_4_16 (const void *v1, const void *v2)
4554 {
4555 const uint32_t *d1 = (const uint32_t *) v1;
4556 const uint32_t *d2 = (const uint32_t *) v2;
4557
4558 uint n = 16;
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_32 (const void *v1, const void *v2)
4570 {
4571 const uint32_t *d1 = (const uint32_t *) v1;
4572 const uint32_t *d2 = (const uint32_t *) v2;
4573
4574 uint n = 32;
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_64 (const void *v1, const void *v2)
4586 {
4587 const uint32_t *d1 = (const uint32_t *) v1;
4588 const uint32_t *d2 = (const uint32_t *) v2;
4589
4590 uint n = 64;
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_8_8 (const void *v1, const void *v2)
4602 {
4603 const uint64_t *d1 = (const uint64_t *) v1;
4604 const uint64_t *d2 = (const uint64_t *) v2;
4605
4606 uint n = 8;
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_8_16 (const void *v1, const void *v2)
4618 {
4619 const uint64_t *d1 = (const uint64_t *) v1;
4620 const uint64_t *d2 = (const uint64_t *) v2;
4621
4622 uint n = 16;
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_8_25 (const void *v1, const void *v2)
4634 {
4635 const uint64_t *d1 = (const uint64_t *) v1;
4636 const uint64_t *d2 = (const uint64_t *) v2;
4637
4638 uint n = 25;
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_p0p1 (const void *v1, const void *v2)
4650 {
4651 const uint32_t *d1 = (const uint32_t *) v1;
4652 const uint32_t *d2 = (const uint32_t *) v2;
4653
4654 const uint dgst_pos0 = data.dgst_pos0;
4655 const uint dgst_pos1 = data.dgst_pos1;
4656 const uint dgst_pos2 = data.dgst_pos2;
4657 const uint dgst_pos3 = data.dgst_pos3;
4658
4659 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4660 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4661 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4662 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4663 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4664 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4665 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4666 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4667
4668 return (0);
4669 }
4670
4671 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)
4672 {
4673 uint outfile_autohex = data.outfile_autohex;
4674
4675 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4676
4677 FILE *debug_fp = NULL;
4678
4679 if (debug_file != NULL)
4680 {
4681 debug_fp = fopen (debug_file, "ab");
4682 }
4683 else
4684 {
4685 debug_fp = stderr;
4686 }
4687
4688 if (debug_fp == NULL)
4689 {
4690 log_info ("WARNING: Could not open debug-file for writing");
4691 }
4692 else
4693 {
4694 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4695 {
4696 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4697
4698 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4699 }
4700
4701 fwrite (rule_ptr, rule_len, 1, debug_fp);
4702
4703 if (debug_mode == 4)
4704 {
4705 fputc (':', debug_fp);
4706
4707 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4708 }
4709
4710 fputc ('\n', debug_fp);
4711
4712 if (debug_file != NULL) fclose (debug_fp);
4713 }
4714 }
4715
4716 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4717 {
4718 int needs_hexify = 0;
4719
4720 if (outfile_autohex == 1)
4721 {
4722 for (uint i = 0; i < plain_len; i++)
4723 {
4724 if (plain_ptr[i] < 0x20)
4725 {
4726 needs_hexify = 1;
4727
4728 break;
4729 }
4730
4731 if (plain_ptr[i] > 0x7f)
4732 {
4733 needs_hexify = 1;
4734
4735 break;
4736 }
4737 }
4738 }
4739
4740 if (needs_hexify == 1)
4741 {
4742 fprintf (fp, "$HEX[");
4743
4744 for (uint i = 0; i < plain_len; i++)
4745 {
4746 fprintf (fp, "%02x", plain_ptr[i]);
4747 }
4748
4749 fprintf (fp, "]");
4750 }
4751 else
4752 {
4753 fwrite (plain_ptr, plain_len, 1, fp);
4754 }
4755 }
4756
4757 void format_output (FILE *out_fp, char *out_buf, unsigned char *plain_ptr, const uint plain_len, const uint64_t crackpos, unsigned char *username, const uint user_len)
4758 {
4759 uint outfile_format = data.outfile_format;
4760
4761 char separator = data.separator;
4762
4763 if (outfile_format & OUTFILE_FMT_HASH)
4764 {
4765 fprintf (out_fp, "%s", out_buf);
4766
4767 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4768 {
4769 fputc (separator, out_fp);
4770 }
4771 }
4772 else if (data.username)
4773 {
4774 if (username != NULL)
4775 {
4776 for (uint i = 0; i < user_len; i++)
4777 {
4778 fprintf (out_fp, "%c", username[i]);
4779 }
4780
4781 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4782 {
4783 fputc (separator, out_fp);
4784 }
4785 }
4786 }
4787
4788 if (outfile_format & OUTFILE_FMT_PLAIN)
4789 {
4790 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4791
4792 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4793 {
4794 fputc (separator, out_fp);
4795 }
4796 }
4797
4798 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4799 {
4800 for (uint i = 0; i < plain_len; i++)
4801 {
4802 fprintf (out_fp, "%02x", plain_ptr[i]);
4803 }
4804
4805 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4806 {
4807 fputc (separator, out_fp);
4808 }
4809 }
4810
4811 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4812 {
4813 #ifdef _WIN
4814 __mingw_fprintf (out_fp, "%llu", crackpos);
4815 #endif
4816
4817 #ifdef _POSIX
4818 #ifdef __x86_64__
4819 fprintf (out_fp, "%lu", crackpos);
4820 #else
4821 fprintf (out_fp, "%llu", crackpos);
4822 #endif
4823 #endif
4824 }
4825
4826 fputc ('\n', out_fp);
4827 }
4828
4829 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)
4830 {
4831 pot_t pot_key;
4832
4833 pot_key.hash.salt = hashes_buf->salt;
4834 pot_key.hash.digest = hashes_buf->digest;
4835
4836 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4837
4838 if (pot_ptr)
4839 {
4840 log_info_nn ("");
4841
4842 input_buf[input_len] = 0;
4843
4844 // user
4845 unsigned char *username = NULL;
4846 uint user_len = 0;
4847
4848 if (data.username)
4849 {
4850 user_t *user = hashes_buf->hash_info->user;
4851
4852 if (user)
4853 {
4854 username = (unsigned char *) (user->user_name);
4855
4856 user_len = user->user_len;
4857 }
4858 }
4859
4860 // do output the line
4861 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
4862 }
4863 }
4864
4865 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
4866 #define LM_MASKED_PLAIN "[notfound]"
4867
4868 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)
4869 {
4870 // left
4871
4872 pot_t pot_left_key;
4873
4874 pot_left_key.hash.salt = hash_left->salt;
4875 pot_left_key.hash.digest = hash_left->digest;
4876
4877 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4878
4879 // right
4880
4881 uint weak_hash_found = 0;
4882
4883 pot_t pot_right_key;
4884
4885 pot_right_key.hash.salt = hash_right->salt;
4886 pot_right_key.hash.digest = hash_right->digest;
4887
4888 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4889
4890 if (pot_right_ptr == NULL)
4891 {
4892 // special case, if "weak hash"
4893
4894 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
4895 {
4896 weak_hash_found = 1;
4897
4898 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4899
4900 // in theory this is not needed, but we are paranoia:
4901
4902 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4903 pot_right_ptr->plain_len = 0;
4904 }
4905 }
4906
4907 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
4908 {
4909 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
4910
4911 return;
4912 }
4913
4914 // at least one half was found:
4915
4916 log_info_nn ("");
4917
4918 input_buf[input_len] = 0;
4919
4920 // user
4921
4922 unsigned char *username = NULL;
4923 uint user_len = 0;
4924
4925 if (data.username)
4926 {
4927 user_t *user = hash_left->hash_info->user;
4928
4929 if (user)
4930 {
4931 username = (unsigned char *) (user->user_name);
4932
4933 user_len = user->user_len;
4934 }
4935 }
4936
4937 // mask the part which was not found
4938
4939 uint left_part_masked = 0;
4940 uint right_part_masked = 0;
4941
4942 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
4943
4944 if (pot_left_ptr == NULL)
4945 {
4946 left_part_masked = 1;
4947
4948 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4949
4950 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
4951
4952 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
4953 pot_left_ptr->plain_len = mask_plain_len;
4954 }
4955
4956 if (pot_right_ptr == NULL)
4957 {
4958 right_part_masked = 1;
4959
4960 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4961
4962 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4963
4964 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
4965 pot_right_ptr->plain_len = mask_plain_len;
4966 }
4967
4968 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
4969
4970 pot_t pot_ptr;
4971
4972 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
4973
4974 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
4975
4976 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
4977
4978 // do output the line
4979
4980 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
4981
4982 if (weak_hash_found == 1) myfree (pot_right_ptr);
4983
4984 if (left_part_masked == 1) myfree (pot_left_ptr);
4985 if (right_part_masked == 1) myfree (pot_right_ptr);
4986 }
4987
4988 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)
4989 {
4990 pot_t pot_key;
4991
4992 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
4993
4994 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4995
4996 if (pot_ptr == NULL)
4997 {
4998 log_info_nn ("");
4999
5000 input_buf[input_len] = 0;
5001
5002 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5003 }
5004 }
5005
5006 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)
5007 {
5008 // left
5009
5010 pot_t pot_left_key;
5011
5012 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5013
5014 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5015
5016 // right
5017
5018 pot_t pot_right_key;
5019
5020 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5021
5022 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5023
5024 uint weak_hash_found = 0;
5025
5026 if (pot_right_ptr == NULL)
5027 {
5028 // special case, if "weak hash"
5029
5030 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5031 {
5032 weak_hash_found = 1;
5033
5034 // we just need that pot_right_ptr is not a NULL pointer
5035
5036 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5037 }
5038 }
5039
5040 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5041 {
5042 if (weak_hash_found == 1) myfree (pot_right_ptr);
5043
5044 return;
5045 }
5046
5047 // ... at least one part was not cracked
5048
5049 log_info_nn ("");
5050
5051 input_buf[input_len] = 0;
5052
5053 // only show the hash part which is still not cracked
5054
5055 uint user_len = input_len - 32;
5056
5057 char hash_output[user_len + 33];
5058
5059 memset (hash_output, 0, sizeof (hash_output));
5060
5061 memcpy (hash_output, input_buf, input_len);
5062
5063 if (pot_left_ptr != NULL)
5064 {
5065 // only show right part (because left part was already found)
5066
5067 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5068
5069 hash_output[user_len + 16] = 0;
5070 }
5071
5072 if (pot_right_ptr != NULL)
5073 {
5074 // only show left part (because right part was already found)
5075
5076 memcpy (hash_output + user_len, input_buf + user_len, 16);
5077
5078 hash_output[user_len + 16] = 0;
5079 }
5080
5081 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5082
5083 if (weak_hash_found == 1) myfree (pot_right_ptr);
5084 }
5085
5086 uint devices_to_devicemask (char *opencl_devices)
5087 {
5088 uint opencl_devicemask = 0;
5089
5090 if (opencl_devices)
5091 {
5092 char *devices = strdup (opencl_devices);
5093
5094 char *next = strtok (devices, ",");
5095
5096 do
5097 {
5098 uint device_id = atoi (next);
5099
5100 if (device_id < 1 || device_id > 8)
5101 {
5102 log_error ("ERROR: invalid device_id %u specified", device_id);
5103
5104 exit (-1);
5105 }
5106
5107 opencl_devicemask |= 1 << (device_id - 1);
5108
5109 } while ((next = strtok (NULL, ",")) != NULL);
5110
5111 free (devices);
5112 }
5113
5114 return opencl_devicemask;
5115 }
5116
5117 uint get_random_num (uint min, uint max)
5118 {
5119 if (min == max) return (min);
5120
5121 return (uint) ((rand () % (max - min)) + min);
5122 }
5123
5124 uint32_t mydivc32 (const uint32_t dividend, const uint32_t divisor)
5125 {
5126 uint32_t quotient = dividend / divisor;
5127
5128 if (dividend % divisor) quotient++;
5129
5130 return quotient;
5131 }
5132
5133 uint64_t mydivc64 (const uint64_t dividend, const uint64_t divisor)
5134 {
5135 uint64_t quotient = dividend / divisor;
5136
5137 if (dividend % divisor) quotient++;
5138
5139 return quotient;
5140 }
5141
5142 void format_timer_display (struct tm *tm, char *buf, size_t len)
5143 {
5144 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5145 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5146
5147 if (tm->tm_year - 70)
5148 {
5149 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5150 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5151
5152 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5153 }
5154 else if (tm->tm_yday)
5155 {
5156 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5157 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5158
5159 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5160 }
5161 else if (tm->tm_hour)
5162 {
5163 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5164 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5165
5166 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5167 }
5168 else if (tm->tm_min)
5169 {
5170 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5171 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5172
5173 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5174 }
5175 else
5176 {
5177 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5178
5179 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5180 }
5181 }
5182
5183 void format_speed_display (float val, char *buf, size_t len)
5184 {
5185 if (val <= 0)
5186 {
5187 buf[0] = '0';
5188 buf[1] = ' ';
5189 buf[2] = 0;
5190
5191 return;
5192 }
5193
5194 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5195
5196 uint level = 0;
5197
5198 while (val > 99999)
5199 {
5200 val /= 1000;
5201
5202 level++;
5203 }
5204
5205 /* generate output */
5206
5207 if (level == 0)
5208 {
5209 snprintf (buf, len - 1, "%.0f ", val);
5210 }
5211 else
5212 {
5213 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5214 }
5215 }
5216
5217 void lowercase (char *buf, int len)
5218 {
5219 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5220 }
5221
5222 void uppercase (char *buf, int len)
5223 {
5224 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5225 }
5226
5227 int fgetl (FILE *fp, char *line_buf)
5228 {
5229 int line_len = 0;
5230
5231 while (!feof (fp))
5232 {
5233 const int c = fgetc (fp);
5234
5235 if (c == EOF) break;
5236
5237 line_buf[line_len] = (char) c;
5238
5239 line_len++;
5240
5241 if (line_len == BUFSIZ) line_len--;
5242
5243 if (c == '\n') break;
5244 }
5245
5246 if (line_len == 0) return 0;
5247
5248 if (line_buf[line_len - 1] == '\n')
5249 {
5250 line_len--;
5251
5252 line_buf[line_len] = 0;
5253 }
5254
5255 if (line_len == 0) return 0;
5256
5257 if (line_buf[line_len - 1] == '\r')
5258 {
5259 line_len--;
5260
5261 line_buf[line_len] = 0;
5262 }
5263
5264 return (line_len);
5265 }
5266
5267 int in_superchop (char *buf)
5268 {
5269 int len = strlen (buf);
5270
5271 while (len)
5272 {
5273 if (buf[len - 1] == '\n')
5274 {
5275 len--;
5276
5277 continue;
5278 }
5279
5280 if (buf[len - 1] == '\r')
5281 {
5282 len--;
5283
5284 continue;
5285 }
5286
5287 break;
5288 }
5289
5290 buf[len] = 0;
5291
5292 return len;
5293 }
5294
5295 char **scan_directory (const char *path)
5296 {
5297 char *tmp_path = mystrdup (path);
5298
5299 size_t tmp_path_len = strlen (tmp_path);
5300
5301 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5302 {
5303 tmp_path[tmp_path_len - 1] = 0;
5304
5305 tmp_path_len = strlen (tmp_path);
5306 }
5307
5308 char **files = NULL;
5309
5310 int num_files = 0;
5311
5312 DIR *d;
5313
5314 if ((d = opendir (tmp_path)) != NULL)
5315 {
5316 struct dirent *de;
5317
5318 while ((de = readdir (d)) != NULL)
5319 {
5320 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5321
5322 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5323
5324 char *path_file = (char *) mymalloc (path_size + 1);
5325
5326 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5327
5328 path_file[path_size] = 0;
5329
5330 DIR *d_test;
5331
5332 if ((d_test = opendir (path_file)) != NULL)
5333 {
5334 closedir (d_test);
5335
5336 myfree (path_file);
5337 }
5338 else
5339 {
5340 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5341
5342 num_files++;
5343
5344 files[num_files - 1] = path_file;
5345 }
5346 }
5347
5348 closedir (d);
5349 }
5350 else if (errno == ENOTDIR)
5351 {
5352 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5353
5354 num_files++;
5355
5356 files[num_files - 1] = mystrdup (path);
5357 }
5358
5359 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5360
5361 num_files++;
5362
5363 files[num_files - 1] = NULL;
5364
5365 myfree (tmp_path);
5366
5367 return (files);
5368 }
5369
5370 int count_dictionaries (char **dictionary_files)
5371 {
5372 if (dictionary_files == NULL) return 0;
5373
5374 int cnt = 0;
5375
5376 for (int d = 0; dictionary_files[d] != NULL; d++)
5377 {
5378 cnt++;
5379 }
5380
5381 return (cnt);
5382 }
5383
5384 char *stroptitype (const uint opti_type)
5385 {
5386 switch (opti_type)
5387 {
5388 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5389 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5390 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5391 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5392 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5393 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5394 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5395 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5396 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5397 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5398 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5399 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5400 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5401 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5402 }
5403
5404 return (NULL);
5405 }
5406
5407 char *strparser (const uint parser_status)
5408 {
5409 switch (parser_status)
5410 {
5411 case PARSER_OK: return ((char *) PA_000); break;
5412 case PARSER_COMMENT: return ((char *) PA_001); break;
5413 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5414 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5415 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5416 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5417 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5418 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5419 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5420 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5421 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5422 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5423 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5424 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5425 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5426 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5427 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5428 }
5429
5430 return ((char *) PA_255);
5431 }
5432
5433 char *strhashtype (const uint hash_mode)
5434 {
5435 switch (hash_mode)
5436 {
5437 case 0: return ((char *) HT_00000); break;
5438 case 10: return ((char *) HT_00010); break;
5439 case 11: return ((char *) HT_00011); break;
5440 case 12: return ((char *) HT_00012); break;
5441 case 20: return ((char *) HT_00020); break;
5442 case 21: return ((char *) HT_00021); break;
5443 case 22: return ((char *) HT_00022); break;
5444 case 23: return ((char *) HT_00023); break;
5445 case 30: return ((char *) HT_00030); break;
5446 case 40: return ((char *) HT_00040); break;
5447 case 50: return ((char *) HT_00050); break;
5448 case 60: return ((char *) HT_00060); break;
5449 case 100: return ((char *) HT_00100); break;
5450 case 101: return ((char *) HT_00101); break;
5451 case 110: return ((char *) HT_00110); break;
5452 case 111: return ((char *) HT_00111); break;
5453 case 112: return ((char *) HT_00112); break;
5454 case 120: return ((char *) HT_00120); break;
5455 case 121: return ((char *) HT_00121); break;
5456 case 122: return ((char *) HT_00122); break;
5457 case 124: return ((char *) HT_00124); break;
5458 case 130: return ((char *) HT_00130); break;
5459 case 131: return ((char *) HT_00131); break;
5460 case 132: return ((char *) HT_00132); break;
5461 case 133: return ((char *) HT_00133); break;
5462 case 140: return ((char *) HT_00140); break;
5463 case 141: return ((char *) HT_00141); break;
5464 case 150: return ((char *) HT_00150); break;
5465 case 160: return ((char *) HT_00160); break;
5466 case 190: return ((char *) HT_00190); break;
5467 case 200: return ((char *) HT_00200); break;
5468 case 300: return ((char *) HT_00300); break;
5469 case 400: return ((char *) HT_00400); break;
5470 case 500: return ((char *) HT_00500); break;
5471 case 501: return ((char *) HT_00501); break;
5472 case 900: return ((char *) HT_00900); break;
5473 case 910: return ((char *) HT_00910); break;
5474 case 1000: return ((char *) HT_01000); break;
5475 case 1100: return ((char *) HT_01100); break;
5476 case 1400: return ((char *) HT_01400); break;
5477 case 1410: return ((char *) HT_01410); break;
5478 case 1420: return ((char *) HT_01420); break;
5479 case 1421: return ((char *) HT_01421); break;
5480 case 1430: return ((char *) HT_01430); break;
5481 case 1440: return ((char *) HT_01440); break;
5482 case 1441: return ((char *) HT_01441); break;
5483 case 1450: return ((char *) HT_01450); break;
5484 case 1460: return ((char *) HT_01460); break;
5485 case 1500: return ((char *) HT_01500); break;
5486 case 1600: return ((char *) HT_01600); break;
5487 case 1700: return ((char *) HT_01700); break;
5488 case 1710: return ((char *) HT_01710); break;
5489 case 1711: return ((char *) HT_01711); break;
5490 case 1720: return ((char *) HT_01720); break;
5491 case 1722: return ((char *) HT_01722); break;
5492 case 1730: return ((char *) HT_01730); break;
5493 case 1731: return ((char *) HT_01731); break;
5494 case 1740: return ((char *) HT_01740); break;
5495 case 1750: return ((char *) HT_01750); break;
5496 case 1760: return ((char *) HT_01760); break;
5497 case 1800: return ((char *) HT_01800); break;
5498 case 2100: return ((char *) HT_02100); break;
5499 case 2400: return ((char *) HT_02400); break;
5500 case 2410: return ((char *) HT_02410); break;
5501 case 2500: return ((char *) HT_02500); break;
5502 case 2600: return ((char *) HT_02600); break;
5503 case 2611: return ((char *) HT_02611); break;
5504 case 2612: return ((char *) HT_02612); break;
5505 case 2711: return ((char *) HT_02711); break;
5506 case 2811: return ((char *) HT_02811); break;
5507 case 3000: return ((char *) HT_03000); break;
5508 case 3100: return ((char *) HT_03100); break;
5509 case 3200: return ((char *) HT_03200); break;
5510 case 3710: return ((char *) HT_03710); break;
5511 case 3711: return ((char *) HT_03711); break;
5512 case 3800: return ((char *) HT_03800); break;
5513 case 4300: return ((char *) HT_04300); break;
5514 case 4400: return ((char *) HT_04400); break;
5515 case 4500: return ((char *) HT_04500); break;
5516 case 4700: return ((char *) HT_04700); break;
5517 case 4800: return ((char *) HT_04800); break;
5518 case 4900: return ((char *) HT_04900); break;
5519 case 5000: return ((char *) HT_05000); break;
5520 case 5100: return ((char *) HT_05100); break;
5521 case 5200: return ((char *) HT_05200); break;
5522 case 5300: return ((char *) HT_05300); break;
5523 case 5400: return ((char *) HT_05400); break;
5524 case 5500: return ((char *) HT_05500); break;
5525 case 5600: return ((char *) HT_05600); break;
5526 case 5700: return ((char *) HT_05700); break;
5527 case 5800: return ((char *) HT_05800); break;
5528 case 6000: return ((char *) HT_06000); break;
5529 case 6100: return ((char *) HT_06100); break;
5530 case 6211: return ((char *) HT_06211); break;
5531 case 6212: return ((char *) HT_06212); break;
5532 case 6213: return ((char *) HT_06213); break;
5533 case 6221: return ((char *) HT_06221); break;
5534 case 6222: return ((char *) HT_06222); break;
5535 case 6223: return ((char *) HT_06223); break;
5536 case 6231: return ((char *) HT_06231); break;
5537 case 6232: return ((char *) HT_06232); break;
5538 case 6233: return ((char *) HT_06233); break;
5539 case 6241: return ((char *) HT_06241); break;
5540 case 6242: return ((char *) HT_06242); break;
5541 case 6243: return ((char *) HT_06243); break;
5542 case 6300: return ((char *) HT_06300); break;
5543 case 6400: return ((char *) HT_06400); break;
5544 case 6500: return ((char *) HT_06500); break;
5545 case 6600: return ((char *) HT_06600); break;
5546 case 6700: return ((char *) HT_06700); break;
5547 case 6800: return ((char *) HT_06800); break;
5548 case 6900: return ((char *) HT_06900); break;
5549 case 7100: return ((char *) HT_07100); break;
5550 case 7200: return ((char *) HT_07200); break;
5551 case 7300: return ((char *) HT_07300); break;
5552 case 7400: return ((char *) HT_07400); break;
5553 case 7500: return ((char *) HT_07500); break;
5554 case 7600: return ((char *) HT_07600); break;
5555 case 7700: return ((char *) HT_07700); break;
5556 case 7800: return ((char *) HT_07800); break;
5557 case 7900: return ((char *) HT_07900); break;
5558 case 8000: return ((char *) HT_08000); break;
5559 case 8100: return ((char *) HT_08100); break;
5560 case 8200: return ((char *) HT_08200); break;
5561 case 8300: return ((char *) HT_08300); break;
5562 case 8400: return ((char *) HT_08400); break;
5563 case 8500: return ((char *) HT_08500); break;
5564 case 8600: return ((char *) HT_08600); break;
5565 case 8700: return ((char *) HT_08700); break;
5566 case 8800: return ((char *) HT_08800); break;
5567 case 8900: return ((char *) HT_08900); break;
5568 case 9000: return ((char *) HT_09000); break;
5569 case 9100: return ((char *) HT_09100); break;
5570 case 9200: return ((char *) HT_09200); break;
5571 case 9300: return ((char *) HT_09300); break;
5572 case 9400: return ((char *) HT_09400); break;
5573 case 9500: return ((char *) HT_09500); break;
5574 case 9600: return ((char *) HT_09600); break;
5575 case 9700: return ((char *) HT_09700); break;
5576 case 9710: return ((char *) HT_09710); break;
5577 case 9720: return ((char *) HT_09720); break;
5578 case 9800: return ((char *) HT_09800); break;
5579 case 9810: return ((char *) HT_09810); break;
5580 case 9820: return ((char *) HT_09820); break;
5581 case 9900: return ((char *) HT_09900); break;
5582 case 10000: return ((char *) HT_10000); break;
5583 case 10100: return ((char *) HT_10100); break;
5584 case 10200: return ((char *) HT_10200); break;
5585 case 10300: return ((char *) HT_10300); break;
5586 case 10400: return ((char *) HT_10400); break;
5587 case 10410: return ((char *) HT_10410); break;
5588 case 10420: return ((char *) HT_10420); break;
5589 case 10500: return ((char *) HT_10500); break;
5590 case 10600: return ((char *) HT_10600); break;
5591 case 10700: return ((char *) HT_10700); break;
5592 case 10800: return ((char *) HT_10800); break;
5593 case 10900: return ((char *) HT_10900); break;
5594 case 11000: return ((char *) HT_11000); break;
5595 case 11100: return ((char *) HT_11100); break;
5596 case 11200: return ((char *) HT_11200); break;
5597 case 11300: return ((char *) HT_11300); break;
5598 case 11400: return ((char *) HT_11400); break;
5599 case 11500: return ((char *) HT_11500); break;
5600 case 11600: return ((char *) HT_11600); break;
5601 case 11700: return ((char *) HT_11700); break;
5602 case 11800: return ((char *) HT_11800); break;
5603 case 11900: return ((char *) HT_11900); break;
5604 case 12000: return ((char *) HT_12000); break;
5605 case 12100: return ((char *) HT_12100); break;
5606 case 12200: return ((char *) HT_12200); break;
5607 case 12300: return ((char *) HT_12300); break;
5608 case 12400: return ((char *) HT_12400); break;
5609 case 12500: return ((char *) HT_12500); break;
5610 case 12600: return ((char *) HT_12600); break;
5611 case 12700: return ((char *) HT_12700); break;
5612 case 12800: return ((char *) HT_12800); break;
5613 case 12900: return ((char *) HT_12900); break;
5614 }
5615
5616 return ((char *) "Unknown");
5617 }
5618
5619 char *strstatus (const uint devices_status)
5620 {
5621 switch (devices_status)
5622 {
5623 case STATUS_INIT: return ((char *) ST_0000); break;
5624 case STATUS_STARTING: return ((char *) ST_0001); break;
5625 case STATUS_RUNNING: return ((char *) ST_0002); break;
5626 case STATUS_PAUSED: return ((char *) ST_0003); break;
5627 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5628 case STATUS_CRACKED: return ((char *) ST_0005); break;
5629 case STATUS_ABORTED: return ((char *) ST_0006); break;
5630 case STATUS_QUIT: return ((char *) ST_0007); break;
5631 case STATUS_BYPASS: return ((char *) ST_0008); break;
5632 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5633 }
5634
5635 return ((char *) "Unknown");
5636 }
5637
5638 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5639 {
5640 uint hash_type = data.hash_type;
5641 uint hash_mode = data.hash_mode;
5642 uint salt_type = data.salt_type;
5643 uint opts_type = data.opts_type;
5644 uint opti_type = data.opti_type;
5645 uint dgst_size = data.dgst_size;
5646
5647 char *hashfile = data.hashfile;
5648
5649 uint len = 4096;
5650
5651 uint digest_buf[64];
5652
5653 uint64_t *digest_buf64 = (uint64_t *) digest_buf;
5654
5655 char *digests_buf_ptr = (char *) data.digests_buf;
5656
5657 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5658
5659 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5660 {
5661 uint tt;
5662
5663 switch (hash_type)
5664 {
5665 case HASH_TYPE_DESCRYPT:
5666 FP (digest_buf[1], digest_buf[0], tt);
5667 break;
5668
5669 case HASH_TYPE_DESRACF:
5670 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 29);
5671 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 29);
5672
5673 FP (digest_buf[1], digest_buf[0], tt);
5674 break;
5675
5676 case HASH_TYPE_LM:
5677 FP (digest_buf[1], digest_buf[0], tt);
5678 break;
5679
5680 case HASH_TYPE_NETNTLM:
5681 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 29);
5682 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 29);
5683 digest_buf[2] = ROTATE_LEFT (digest_buf[2], 29);
5684 digest_buf[3] = ROTATE_LEFT (digest_buf[3], 29);
5685
5686 FP (digest_buf[1], digest_buf[0], tt);
5687 FP (digest_buf[3], digest_buf[2], tt);
5688 break;
5689
5690 case HASH_TYPE_BSDICRYPT:
5691 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 31);
5692 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 31);
5693
5694 FP (digest_buf[1], digest_buf[0], tt);
5695 break;
5696 }
5697 }
5698
5699 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5700 {
5701 switch (hash_type)
5702 {
5703 case HASH_TYPE_MD4:
5704 digest_buf[0] += MD4M_A;
5705 digest_buf[1] += MD4M_B;
5706 digest_buf[2] += MD4M_C;
5707 digest_buf[3] += MD4M_D;
5708 break;
5709
5710 case HASH_TYPE_MD5:
5711 digest_buf[0] += MD5M_A;
5712 digest_buf[1] += MD5M_B;
5713 digest_buf[2] += MD5M_C;
5714 digest_buf[3] += MD5M_D;
5715 break;
5716
5717 case HASH_TYPE_SHA1:
5718 digest_buf[0] += SHA1M_A;
5719 digest_buf[1] += SHA1M_B;
5720 digest_buf[2] += SHA1M_C;
5721 digest_buf[3] += SHA1M_D;
5722 digest_buf[4] += SHA1M_E;
5723 break;
5724
5725 case HASH_TYPE_SHA256:
5726 digest_buf[0] += SHA256M_A;
5727 digest_buf[1] += SHA256M_B;
5728 digest_buf[2] += SHA256M_C;
5729 digest_buf[3] += SHA256M_D;
5730 digest_buf[4] += SHA256M_E;
5731 digest_buf[5] += SHA256M_F;
5732 digest_buf[6] += SHA256M_G;
5733 digest_buf[7] += SHA256M_H;
5734 break;
5735
5736 case HASH_TYPE_SHA384:
5737 digest_buf64[0] += SHA384M_A;
5738 digest_buf64[1] += SHA384M_B;
5739 digest_buf64[2] += SHA384M_C;
5740 digest_buf64[3] += SHA384M_D;
5741 digest_buf64[4] += SHA384M_E;
5742 digest_buf64[5] += SHA384M_F;
5743 digest_buf64[6] += 0;
5744 digest_buf64[7] += 0;
5745 break;
5746
5747 case HASH_TYPE_SHA512:
5748 digest_buf64[0] += SHA512M_A;
5749 digest_buf64[1] += SHA512M_B;
5750 digest_buf64[2] += SHA512M_C;
5751 digest_buf64[3] += SHA512M_D;
5752 digest_buf64[4] += SHA512M_E;
5753 digest_buf64[5] += SHA512M_F;
5754 digest_buf64[6] += SHA512M_G;
5755 digest_buf64[7] += SHA512M_H;
5756 break;
5757 }
5758 }
5759
5760 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
5761 {
5762 if (dgst_size == DGST_SIZE_4_2)
5763 {
5764 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5765 }
5766 else if (dgst_size == DGST_SIZE_4_4)
5767 {
5768 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5769 }
5770 else if (dgst_size == DGST_SIZE_4_5)
5771 {
5772 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5773 }
5774 else if (dgst_size == DGST_SIZE_4_6)
5775 {
5776 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5777 }
5778 else if (dgst_size == DGST_SIZE_4_8)
5779 {
5780 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5781 }
5782 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
5783 {
5784 if (hash_type == HASH_TYPE_WHIRLPOOL)
5785 {
5786 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5787 }
5788 else if (hash_type == HASH_TYPE_SHA384)
5789 {
5790 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5791 }
5792 else if (hash_type == HASH_TYPE_SHA512)
5793 {
5794 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5795 }
5796 else if (hash_type == HASH_TYPE_GOST)
5797 {
5798 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5799 }
5800 }
5801 else if (dgst_size == DGST_SIZE_4_64)
5802 {
5803 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5804 }
5805 else if (dgst_size == DGST_SIZE_8_25)
5806 {
5807 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5808 }
5809 }
5810
5811 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
5812 | (data.salt_type == SALT_TYPE_EXTERN)
5813 | (data.salt_type == SALT_TYPE_EMBEDDED));
5814
5815 salt_t salt;
5816
5817 if (isSalted)
5818 {
5819 memset (&salt, 0, sizeof (salt_t));
5820
5821 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
5822
5823 char *ptr = (char *) salt.salt_buf;
5824
5825 uint len = salt.salt_len;
5826
5827 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5828 {
5829 uint tt;
5830
5831 switch (hash_type)
5832 {
5833 case HASH_TYPE_NETNTLM:
5834
5835 salt.salt_buf[0] = ROTATE_RIGHT (salt.salt_buf[0], 3);
5836 salt.salt_buf[1] = ROTATE_RIGHT (salt.salt_buf[1], 3);
5837
5838 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
5839
5840 break;
5841 }
5842 }
5843
5844 if (opts_type & OPTS_TYPE_ST_UNICODE)
5845 {
5846 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5847 {
5848 ptr[i] = ptr[j];
5849 }
5850
5851 len = len / 2;
5852 }
5853
5854 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
5855 {
5856 uint max = salt.salt_len / 4;
5857
5858 if (len % 4) max++;
5859
5860 for (uint i = 0; i < max; i++)
5861 {
5862 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
5863 }
5864 }
5865
5866 if (opts_type & OPTS_TYPE_ST_HEX)
5867 {
5868 char tmp[64];
5869
5870 memset (tmp, 0, sizeof (tmp));
5871
5872 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5873 {
5874 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
5875 }
5876
5877 len = len * 2;
5878
5879 memcpy (ptr, tmp, len);
5880 }
5881
5882 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
5883
5884 memset (ptr + len, 0, memset_size);
5885
5886 salt.salt_len = len;
5887 }
5888
5889 //
5890 // some modes require special encoding
5891 //
5892
5893 uint out_buf_plain[256];
5894 uint out_buf_salt[256];
5895
5896 char tmp_buf[1024];
5897
5898 memset (out_buf_plain, 0, sizeof (out_buf_plain));
5899 memset (out_buf_salt, 0, sizeof (out_buf_salt));
5900
5901 memset (tmp_buf, 0, sizeof (tmp_buf));
5902
5903 char *ptr_plain = (char *) out_buf_plain;
5904 char *ptr_salt = (char *) out_buf_salt;
5905
5906 if (hash_mode == 22)
5907 {
5908 char username[30];
5909
5910 memset (username, 0, sizeof (username));
5911
5912 memcpy (username, salt.salt_buf, salt.salt_len - 22);
5913
5914 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
5915
5916 uint16_t *ptr = (uint16_t *) digest_buf;
5917
5918 tmp_buf[ 0] = sig[0];
5919 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
5920 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
5921 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
5922 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
5923 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
5924 tmp_buf[ 6] = sig[1];
5925 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
5926 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
5927 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
5928 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
5929 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
5930 tmp_buf[12] = sig[2];
5931 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
5932 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
5933 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
5934 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
5935 tmp_buf[17] = sig[3];
5936 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
5937 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
5938 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
5939 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
5940 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
5941 tmp_buf[23] = sig[4];
5942 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
5943 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
5944 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
5945 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
5946 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
5947 tmp_buf[29] = sig[5];
5948
5949 snprintf (out_buf, len-1, "%s:%s",
5950 tmp_buf,
5951 username);
5952 }
5953 else if (hash_mode == 23)
5954 {
5955 // do not show the \nskyper\n part in output
5956
5957 char *salt_buf_ptr = (char *) salt.salt_buf;
5958
5959 salt_buf_ptr[salt.salt_len - 8] = 0;
5960
5961 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
5962 digest_buf[0],
5963 digest_buf[1],
5964 digest_buf[2],
5965 digest_buf[3],
5966 salt_buf_ptr);
5967 }
5968 else if (hash_mode == 101)
5969 {
5970 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
5971
5972 digest_buf[0] = byte_swap_32 (digest_buf[0]);
5973 digest_buf[1] = byte_swap_32 (digest_buf[1]);
5974 digest_buf[2] = byte_swap_32 (digest_buf[2]);
5975 digest_buf[3] = byte_swap_32 (digest_buf[3]);
5976 digest_buf[4] = byte_swap_32 (digest_buf[4]);
5977
5978 memcpy (tmp_buf, digest_buf, 20);
5979
5980 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
5981
5982 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
5983 }
5984 else if (hash_mode == 111)
5985 {
5986 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
5987
5988 digest_buf[0] = byte_swap_32 (digest_buf[0]);
5989 digest_buf[1] = byte_swap_32 (digest_buf[1]);
5990 digest_buf[2] = byte_swap_32 (digest_buf[2]);
5991 digest_buf[3] = byte_swap_32 (digest_buf[3]);
5992 digest_buf[4] = byte_swap_32 (digest_buf[4]);
5993
5994 memcpy (tmp_buf, digest_buf, 20);
5995 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
5996
5997 base64_encode (int_to_base64, tmp_buf, 20 + salt.salt_len, ptr_plain);
5998
5999 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6000 }
6001 else if (hash_mode == 122)
6002 {
6003 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6004 (unsigned char *) salt.salt_buf,
6005 digest_buf[0],
6006 digest_buf[1],
6007 digest_buf[2],
6008 digest_buf[3],
6009 digest_buf[4]);
6010 }
6011 else if (hash_mode == 124)
6012 {
6013 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6014 (unsigned char *) salt.salt_buf,
6015 digest_buf[0],
6016 digest_buf[1],
6017 digest_buf[2],
6018 digest_buf[3],
6019 digest_buf[4]);
6020 }
6021 else if (hash_mode == 131)
6022 {
6023 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6024 (unsigned char *) salt.salt_buf,
6025 0, 0, 0, 0, 0,
6026 digest_buf[0],
6027 digest_buf[1],
6028 digest_buf[2],
6029 digest_buf[3],
6030 digest_buf[4]);
6031 }
6032 else if (hash_mode == 132)
6033 {
6034 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6035 (unsigned char *) salt.salt_buf,
6036 digest_buf[0],
6037 digest_buf[1],
6038 digest_buf[2],
6039 digest_buf[3],
6040 digest_buf[4]);
6041 }
6042 else if (hash_mode == 133)
6043 {
6044 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6045
6046 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6047 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6048 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6049 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6050 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6051
6052 memcpy (tmp_buf, digest_buf, 20);
6053
6054 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
6055
6056 snprintf (out_buf, len-1, "%s", ptr_plain);
6057 }
6058 else if (hash_mode == 141)
6059 {
6060 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6061
6062 base64_encode (int_to_base64, tmp_buf, salt.salt_len, ptr_salt);
6063
6064 memset (tmp_buf, 0, sizeof (tmp_buf));
6065
6066 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6067
6068 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6069 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6070 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6071 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6072 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6073
6074 memcpy (tmp_buf, digest_buf, 20);
6075
6076 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
6077
6078 ptr_plain[27] = 0;
6079
6080 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6081 }
6082 else if (hash_mode == 400)
6083 {
6084 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6085
6086 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6087 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6088 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6089 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6090
6091 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6092
6093 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6094 }
6095 else if (hash_mode == 500)
6096 {
6097 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6098
6099 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6100 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6101 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6102 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6103
6104 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6105
6106 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6107 {
6108 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6109 }
6110 else
6111 {
6112 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6113 }
6114 }
6115 else if (hash_mode == 501)
6116 {
6117 uint digest_idx = salt.digests_offset + digest_pos;
6118
6119 hashinfo_t **hashinfo_ptr = data.hash_info;
6120 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6121
6122 snprintf (out_buf, len-1, "%s", hash_buf);
6123 }
6124 else if (hash_mode == 1421)
6125 {
6126 uint8_t *salt_ptr = (uint8_t *) salt.salt_buf;
6127
6128 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6129 salt_ptr[0],
6130 salt_ptr[1],
6131 salt_ptr[2],
6132 salt_ptr[3],
6133 salt_ptr[4],
6134 salt_ptr[5],
6135 digest_buf[0],
6136 digest_buf[1],
6137 digest_buf[2],
6138 digest_buf[3],
6139 digest_buf[4],
6140 digest_buf[5],
6141 digest_buf[6],
6142 digest_buf[7]);
6143 }
6144 else if (hash_mode == 1441)
6145 {
6146 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6147
6148 base64_encode (int_to_base64, tmp_buf, salt.salt_len, ptr_salt);
6149
6150 memset (tmp_buf, 0, sizeof (tmp_buf));
6151
6152 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6153
6154 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6155 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6156 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6157 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6158 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6159 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6160 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6161 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6162
6163 memcpy (tmp_buf, digest_buf, 32);
6164
6165 base64_encode (int_to_base64, tmp_buf, 32, ptr_plain);
6166
6167 ptr_plain[43] = 0;
6168
6169 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6170 }
6171 else if (hash_mode == 1500)
6172 {
6173 out_buf[0] = salt.salt_sign[0] & 0xff;
6174 out_buf[1] = salt.salt_sign[1] & 0xff;
6175 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6176 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6177 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6178
6179 memset (tmp_buf, 0, sizeof (tmp_buf));
6180
6181 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6182
6183 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6184 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6185
6186 memcpy (tmp_buf, digest_buf, 8);
6187
6188 base64_encode (int_to_itoa64, tmp_buf, 8, ptr_plain);
6189
6190 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6191
6192 out_buf[13] = 0;
6193 }
6194 else if (hash_mode == 1600)
6195 {
6196 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6197
6198 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6199 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6200 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6201 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6202
6203 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6204
6205 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6206 {
6207 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6208 }
6209 else
6210 {
6211 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6212 }
6213 }
6214 else if (hash_mode == 1711)
6215 {
6216 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6217
6218 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6219 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6220 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6221 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6222 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6223 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6224 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6225 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6226
6227 memcpy (tmp_buf, digest_buf, 64);
6228 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6229
6230 base64_encode (int_to_base64, tmp_buf, 64 + salt.salt_len, ptr_plain);
6231
6232 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6233 }
6234 else if (hash_mode == 1722)
6235 {
6236 uint *ptr = digest_buf;
6237
6238 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6239 (unsigned char *) salt.salt_buf,
6240 ptr[ 1], ptr[ 0],
6241 ptr[ 3], ptr[ 2],
6242 ptr[ 5], ptr[ 4],
6243 ptr[ 7], ptr[ 6],
6244 ptr[ 9], ptr[ 8],
6245 ptr[11], ptr[10],
6246 ptr[13], ptr[12],
6247 ptr[15], ptr[14]);
6248 }
6249 else if (hash_mode == 1731)
6250 {
6251 uint *ptr = digest_buf;
6252
6253 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6254 (unsigned char *) salt.salt_buf,
6255 ptr[ 1], ptr[ 0],
6256 ptr[ 3], ptr[ 2],
6257 ptr[ 5], ptr[ 4],
6258 ptr[ 7], ptr[ 6],
6259 ptr[ 9], ptr[ 8],
6260 ptr[11], ptr[10],
6261 ptr[13], ptr[12],
6262 ptr[15], ptr[14]);
6263 }
6264 else if (hash_mode == 1800)
6265 {
6266 // temp workaround
6267
6268 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6269 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6270 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6271 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6272 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6273 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6274 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6275 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6276
6277 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6278
6279 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6280 {
6281 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6282 }
6283 else
6284 {
6285 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6286 }
6287 }
6288 else if (hash_mode == 2100)
6289 {
6290 uint pos = 0;
6291
6292 snprintf (out_buf + pos, len-1, "%s%i#",
6293 SIGNATURE_DCC2,
6294 salt.salt_iter + 1);
6295
6296 uint signature_len = strlen (out_buf);
6297
6298 pos += signature_len;
6299 len -= signature_len;
6300
6301 char *salt_ptr = (char *) salt.salt_buf;
6302
6303 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6304
6305 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6306 byte_swap_32 (digest_buf[0]),
6307 byte_swap_32 (digest_buf[1]),
6308 byte_swap_32 (digest_buf[2]),
6309 byte_swap_32 (digest_buf[3]));
6310 }
6311 else if ((hash_mode == 2400) || (hash_mode == 2410))
6312 {
6313 memcpy (tmp_buf, digest_buf, 16);
6314
6315 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6316
6317 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6318 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6319 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6320 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6321
6322 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6323 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6324 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6325 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6326
6327 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6328 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6329 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6330 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6331
6332 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6333 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6334 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6335 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6336
6337 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6338 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6339 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6340 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6341
6342 out_buf[16] = 0;
6343 }
6344 else if (hash_mode == 2500)
6345 {
6346 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6347
6348 wpa_t *wpa = &wpas[salt_pos];
6349
6350 uint pke[25];
6351
6352 char *pke_ptr = (char *) pke;
6353
6354 for (uint i = 0; i < 25; i++)
6355 {
6356 pke[i] = byte_swap_32 (wpa->pke[i]);
6357 }
6358
6359 unsigned char mac1[6];
6360 unsigned char mac2[6];
6361
6362 memcpy (mac1, pke_ptr + 23, 6);
6363 memcpy (mac2, pke_ptr + 29, 6);
6364
6365 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6366 (char *) salt.salt_buf,
6367 mac1[0],
6368 mac1[1],
6369 mac1[2],
6370 mac1[3],
6371 mac1[4],
6372 mac1[5],
6373 mac2[0],
6374 mac2[1],
6375 mac2[2],
6376 mac2[3],
6377 mac2[4],
6378 mac2[5]);
6379 }
6380 else if (hash_mode == 4400)
6381 {
6382 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6383 byte_swap_32 (digest_buf[0]),
6384 byte_swap_32 (digest_buf[1]),
6385 byte_swap_32 (digest_buf[2]),
6386 byte_swap_32 (digest_buf[3]));
6387 }
6388 else if (hash_mode == 4700)
6389 {
6390 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6391 byte_swap_32 (digest_buf[0]),
6392 byte_swap_32 (digest_buf[1]),
6393 byte_swap_32 (digest_buf[2]),
6394 byte_swap_32 (digest_buf[3]),
6395 byte_swap_32 (digest_buf[4]));
6396 }
6397 else if (hash_mode == 4800)
6398 {
6399 uint8_t chap_id_byte = (uint8_t) salt.salt_buf[4];
6400
6401 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6402 digest_buf[0],
6403 digest_buf[1],
6404 digest_buf[2],
6405 digest_buf[3],
6406 byte_swap_32 (salt.salt_buf[0]),
6407 byte_swap_32 (salt.salt_buf[1]),
6408 byte_swap_32 (salt.salt_buf[2]),
6409 byte_swap_32 (salt.salt_buf[3]),
6410 chap_id_byte);
6411 }
6412 else if (hash_mode == 4900)
6413 {
6414 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6415 byte_swap_32 (digest_buf[0]),
6416 byte_swap_32 (digest_buf[1]),
6417 byte_swap_32 (digest_buf[2]),
6418 byte_swap_32 (digest_buf[3]),
6419 byte_swap_32 (digest_buf[4]));
6420 }
6421 else if (hash_mode == 5100)
6422 {
6423 snprintf (out_buf, len-1, "%08x%08x",
6424 digest_buf[0],
6425 digest_buf[1]);
6426 }
6427 else if (hash_mode == 5200)
6428 {
6429 snprintf (out_buf, len-1, "%s", hashfile);
6430 }
6431 else if (hash_mode == 5300)
6432 {
6433 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6434
6435 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6436
6437 int buf_len = len -1;
6438
6439 // msg_buf
6440
6441 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6442
6443 for (uint i = 0; i < ikepsk_msg_len; i++)
6444 {
6445 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6446 {
6447 snprintf (out_buf, buf_len, ":");
6448
6449 buf_len--;
6450 out_buf++;
6451 }
6452
6453 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6454
6455 buf_len -= 8;
6456 out_buf += 8;
6457 }
6458
6459 // nr_buf
6460
6461 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6462
6463 for (uint i = 0; i < ikepsk_nr_len; i++)
6464 {
6465 if ((i == 0) || (i == 5))
6466 {
6467 snprintf (out_buf, buf_len, ":");
6468
6469 buf_len--;
6470 out_buf++;
6471 }
6472
6473 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6474
6475 buf_len -= 8;
6476 out_buf += 8;
6477 }
6478
6479 // digest_buf
6480
6481 for (uint i = 0; i < 4; i++)
6482 {
6483 if (i == 0)
6484 {
6485 snprintf (out_buf, buf_len, ":");
6486
6487 buf_len--;
6488 out_buf++;
6489 }
6490
6491 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6492
6493 buf_len -= 8;
6494 out_buf += 8;
6495 }
6496 }
6497 else if (hash_mode == 5400)
6498 {
6499 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6500
6501 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6502
6503 int buf_len = len -1;
6504
6505 // msg_buf
6506
6507 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6508
6509 for (uint i = 0; i < ikepsk_msg_len; i++)
6510 {
6511 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6512 {
6513 snprintf (out_buf, buf_len, ":");
6514
6515 buf_len--;
6516 out_buf++;
6517 }
6518
6519 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6520
6521 buf_len -= 8;
6522 out_buf += 8;
6523 }
6524
6525 // nr_buf
6526
6527 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6528
6529 for (uint i = 0; i < ikepsk_nr_len; i++)
6530 {
6531 if ((i == 0) || (i == 5))
6532 {
6533 snprintf (out_buf, buf_len, ":");
6534
6535 buf_len--;
6536 out_buf++;
6537 }
6538
6539 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6540
6541 buf_len -= 8;
6542 out_buf += 8;
6543 }
6544
6545 // digest_buf
6546
6547 for (uint i = 0; i < 5; i++)
6548 {
6549 if (i == 0)
6550 {
6551 snprintf (out_buf, buf_len, ":");
6552
6553 buf_len--;
6554 out_buf++;
6555 }
6556
6557 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6558
6559 buf_len -= 8;
6560 out_buf += 8;
6561 }
6562 }
6563 else if (hash_mode == 5500)
6564 {
6565 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6566
6567 netntlm_t *netntlm = &netntlms[salt_pos];
6568
6569 char user_buf[64];
6570 char domain_buf[64];
6571 char srvchall_buf[1024];
6572 char clichall_buf[1024];
6573
6574 memset (user_buf, 0, sizeof (user_buf));
6575 memset (domain_buf, 0, sizeof (domain_buf));
6576 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6577 memset (clichall_buf, 0, sizeof (clichall_buf));
6578
6579 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6580 {
6581 char *ptr = (char *) netntlm->userdomain_buf;
6582
6583 user_buf[i] = ptr[j];
6584 }
6585
6586 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6587 {
6588 char *ptr = (char *) netntlm->userdomain_buf;
6589
6590 domain_buf[i] = ptr[netntlm->user_len + j];
6591 }
6592
6593 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6594 {
6595 char *ptr = (char *) netntlm->chall_buf;
6596
6597 sprintf (srvchall_buf + j, "%02x", (uint8_t) ptr[i]);
6598 }
6599
6600 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6601 {
6602 char *ptr = (char *) netntlm->chall_buf;
6603
6604 sprintf (clichall_buf + j, "%02x", (uint8_t) ptr[netntlm->srvchall_len + i]);
6605 }
6606
6607 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6608 user_buf,
6609 domain_buf,
6610 srvchall_buf,
6611 digest_buf[0],
6612 digest_buf[1],
6613 digest_buf[2],
6614 digest_buf[3],
6615 byte_swap_32 (salt.salt_buf_pc[0]),
6616 byte_swap_32 (salt.salt_buf_pc[1]),
6617 clichall_buf);
6618 }
6619 else if (hash_mode == 5600)
6620 {
6621 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6622
6623 netntlm_t *netntlm = &netntlms[salt_pos];
6624
6625 char user_buf[64];
6626 char domain_buf[64];
6627 char srvchall_buf[1024];
6628 char clichall_buf[1024];
6629
6630 memset (user_buf, 0, sizeof (user_buf));
6631 memset (domain_buf, 0, sizeof (domain_buf));
6632 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6633 memset (clichall_buf, 0, sizeof (clichall_buf));
6634
6635 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6636 {
6637 char *ptr = (char *) netntlm->userdomain_buf;
6638
6639 user_buf[i] = ptr[j];
6640 }
6641
6642 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6643 {
6644 char *ptr = (char *) netntlm->userdomain_buf;
6645
6646 domain_buf[i] = ptr[netntlm->user_len + j];
6647 }
6648
6649 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6650 {
6651 char *ptr = (char *) netntlm->chall_buf;
6652
6653 sprintf (srvchall_buf + j, "%02x", (uint8_t) ptr[i]);
6654 }
6655
6656 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6657 {
6658 char *ptr = (char *) netntlm->chall_buf;
6659
6660 sprintf (clichall_buf + j, "%02x", (uint8_t) ptr[netntlm->srvchall_len + i]);
6661 }
6662
6663 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6664 user_buf,
6665 domain_buf,
6666 srvchall_buf,
6667 digest_buf[0],
6668 digest_buf[1],
6669 digest_buf[2],
6670 digest_buf[3],
6671 clichall_buf);
6672 }
6673 else if (hash_mode == 5700)
6674 {
6675 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6676
6677 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6678 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6679 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6680 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6681 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6682 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6683 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6684 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6685
6686 memcpy (tmp_buf, digest_buf, 32);
6687
6688 base64_encode (int_to_itoa64, tmp_buf, 32, ptr_plain);
6689
6690 ptr_plain[43] = 0;
6691
6692 snprintf (out_buf, len-1, "%s", ptr_plain);
6693 }
6694 else if (hash_mode == 5800)
6695 {
6696 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6697 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6698 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6699 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6700 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6701
6702 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6703 digest_buf[0],
6704 digest_buf[1],
6705 digest_buf[2],
6706 digest_buf[3],
6707 digest_buf[4]);
6708 }
6709 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6710 {
6711 snprintf (out_buf, len-1, "%s", hashfile);
6712 }
6713 else if (hash_mode == 6300)
6714 {
6715 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6716
6717 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6718 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6719 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6720 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6721
6722 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6723
6724 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6725 }
6726 else if (hash_mode == 6400)
6727 {
6728 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6729
6730 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6731 }
6732 else if (hash_mode == 6500)
6733 {
6734 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6735
6736 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6737 }
6738 else if (hash_mode == 6600)
6739 {
6740 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6741
6742 agilekey_t *agilekey = &agilekeys[salt_pos];
6743
6744 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6745 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6746
6747 uint buf_len = len - 1;
6748
6749 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6750 buf_len -= 22;
6751
6752 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6753 {
6754 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6755
6756 buf_len -= 2;
6757 }
6758 }
6759 else if (hash_mode == 6700)
6760 {
6761 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6762
6763 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6764 }
6765 else if (hash_mode == 6800)
6766 {
6767 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6768 }
6769 else if (hash_mode == 7100)
6770 {
6771 uint *ptr = digest_buf;
6772
6773 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6774
6775 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6776
6777 uint esalt[16];
6778
6779 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6780 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6781 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6782 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6783 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6784 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6785 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6786 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6787
6788 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",
6789 SIGNATURE_SHA512OSX,
6790 salt.salt_iter + 1,
6791 esalt[ 0], esalt[ 1],
6792 esalt[ 2], esalt[ 3],
6793 esalt[ 4], esalt[ 5],
6794 esalt[ 6], esalt[ 7],
6795 ptr [ 1], ptr [ 0],
6796 ptr [ 3], ptr [ 2],
6797 ptr [ 5], ptr [ 4],
6798 ptr [ 7], ptr [ 6],
6799 ptr [ 9], ptr [ 8],
6800 ptr [11], ptr [10],
6801 ptr [13], ptr [12],
6802 ptr [15], ptr [14]);
6803 }
6804 else if (hash_mode == 7200)
6805 {
6806 uint *ptr = digest_buf;
6807
6808 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6809
6810 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6811
6812 uint len_used = 0;
6813
6814 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
6815
6816 len_used = strlen (out_buf);
6817
6818 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
6819
6820 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
6821 {
6822 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
6823 }
6824
6825 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",
6826 ptr [ 1], ptr [ 0],
6827 ptr [ 3], ptr [ 2],
6828 ptr [ 5], ptr [ 4],
6829 ptr [ 7], ptr [ 6],
6830 ptr [ 9], ptr [ 8],
6831 ptr [11], ptr [10],
6832 ptr [13], ptr [12],
6833 ptr [15], ptr [14]);
6834 }
6835 else if (hash_mode == 7300)
6836 {
6837 rakp_t *rakps = (rakp_t *) data.esalts_buf;
6838
6839 rakp_t *rakp = &rakps[salt_pos];
6840
6841 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
6842 {
6843 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
6844 }
6845
6846 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
6847 digest_buf[0],
6848 digest_buf[1],
6849 digest_buf[2],
6850 digest_buf[3],
6851 digest_buf[4]);
6852 }
6853 else if (hash_mode == 7400)
6854 {
6855 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6856
6857 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6858 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6859 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6860 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6861 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6862 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6863 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6864 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6865
6866 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6867
6868 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
6869 {
6870 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6871 }
6872 else
6873 {
6874 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6875 }
6876 }
6877 else if (hash_mode == 7500)
6878 {
6879 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
6880
6881 krb5pa_t *krb5pa = &krb5pas[salt_pos];
6882
6883 uint8_t *ptr_timestamp = (uint8_t *) krb5pa->timestamp;
6884 uint8_t *ptr_checksum = (uint8_t *) krb5pa->checksum;
6885
6886 char data[128];
6887
6888 char *ptr_data = data;
6889
6890 for (uint i = 0; i < 36; i++, ptr_data += 2)
6891 {
6892 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
6893 }
6894
6895 for (uint i = 0; i < 16; i++, ptr_data += 2)
6896 {
6897 sprintf (ptr_data, "%02x", ptr_checksum[i]);
6898 }
6899
6900 *ptr_data = 0;
6901
6902 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
6903 SIGNATURE_KRB5PA,
6904 (char *) krb5pa->user,
6905 (char *) krb5pa->realm,
6906 (char *) krb5pa->salt,
6907 data);
6908 }
6909 else if (hash_mode == 7700)
6910 {
6911 snprintf (out_buf, len-1, "%s$%08X%08X",
6912 (char *) salt.salt_buf,
6913 digest_buf[0],
6914 digest_buf[1]);
6915 }
6916 else if (hash_mode == 7800)
6917 {
6918 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
6919 (char *) salt.salt_buf,
6920 digest_buf[0],
6921 digest_buf[1],
6922 digest_buf[2],
6923 digest_buf[3],
6924 digest_buf[4]);
6925 }
6926 else if (hash_mode == 7900)
6927 {
6928 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6929
6930 // ugly hack start
6931
6932 char *tmp = (char *) salt.salt_buf_pc;
6933
6934 ptr_plain[42] = tmp[0];
6935
6936 // ugly hack end
6937
6938 ptr_plain[43] = 0;
6939
6940 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6941 }
6942 else if (hash_mode == 8000)
6943 {
6944 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
6945 (unsigned char *) salt.salt_buf,
6946 digest_buf[0],
6947 digest_buf[1],
6948 digest_buf[2],
6949 digest_buf[3],
6950 digest_buf[4],
6951 digest_buf[5],
6952 digest_buf[6],
6953 digest_buf[7]);
6954 }
6955 else if (hash_mode == 8100)
6956 {
6957 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6958 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6959
6960 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
6961 (unsigned char *) salt.salt_buf,
6962 digest_buf[0],
6963 digest_buf[1],
6964 digest_buf[2],
6965 digest_buf[3],
6966 digest_buf[4]);
6967 }
6968 else if (hash_mode == 8200)
6969 {
6970 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
6971
6972 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
6973
6974 char data_buf[4096];
6975
6976 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
6977 {
6978 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
6979 }
6980
6981 data_buf[cloudkey->data_len * 2] = 0;
6982
6983 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6984 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6985 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6986 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6987 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6988 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6989 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6990 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6991
6992 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6993 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6994 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
6995 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
6996
6997 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
6998 digest_buf[0],
6999 digest_buf[1],
7000 digest_buf[2],
7001 digest_buf[3],
7002 digest_buf[4],
7003 digest_buf[5],
7004 digest_buf[6],
7005 digest_buf[7],
7006 salt.salt_buf[0],
7007 salt.salt_buf[1],
7008 salt.salt_buf[2],
7009 salt.salt_buf[3],
7010 salt.salt_iter + 1,
7011 data_buf);
7012 }
7013 else if (hash_mode == 8300)
7014 {
7015 // todo
7016
7017 char digest_buf_c[33];
7018
7019 base32_encode (int_to_itoa32, (char *) digest_buf, 32, digest_buf_c);
7020
7021 digest_buf_c[32] = 0;
7022
7023 // domain
7024
7025 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7026
7027 char domain_buf_c[33];
7028
7029 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7030
7031 for (uint i = 0; i < salt_pc_len; i++)
7032 {
7033 const char next = domain_buf_c[i];
7034
7035 domain_buf_c[i] = '.';
7036
7037 i += next;
7038 }
7039
7040 domain_buf_c[salt_pc_len] = 0;
7041
7042 // final
7043
7044 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7045 }
7046 else if (hash_mode == 8500)
7047 {
7048 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7049 }
7050 else if (hash_mode == 2612)
7051 {
7052 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7053 SIGNATURE_PHPS,
7054 (char *) salt.salt_buf,
7055 digest_buf[0],
7056 digest_buf[1],
7057 digest_buf[2],
7058 digest_buf[3]);
7059 }
7060 else if (hash_mode == 3711)
7061 {
7062 char *salt_ptr = (char *) salt.salt_buf;
7063
7064 salt_ptr[salt.salt_len - 1] = 0;
7065
7066 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7067 SIGNATURE_MEDIAWIKI_B,
7068 salt_ptr,
7069 digest_buf[0],
7070 digest_buf[1],
7071 digest_buf[2],
7072 digest_buf[3]);
7073 }
7074 else if (hash_mode == 8800)
7075 {
7076 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7077
7078 androidfde_t *androidfde = &androidfdes[salt_pos];
7079
7080 char tmp[3073];
7081
7082 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7083 {
7084 sprintf (tmp + j, "%08x", androidfde->data[i]);
7085 }
7086
7087 tmp[3072] = 0;
7088
7089 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7090 SIGNATURE_ANDROIDFDE,
7091 byte_swap_32 (salt.salt_buf[0]),
7092 byte_swap_32 (salt.salt_buf[1]),
7093 byte_swap_32 (salt.salt_buf[2]),
7094 byte_swap_32 (salt.salt_buf[3]),
7095 byte_swap_32 (digest_buf[0]),
7096 byte_swap_32 (digest_buf[1]),
7097 byte_swap_32 (digest_buf[2]),
7098 byte_swap_32 (digest_buf[3]),
7099 tmp);
7100 }
7101 else if (hash_mode == 8900)
7102 {
7103 uint N = salt.scrypt_N;
7104 uint r = salt.scrypt_r;
7105 uint p = salt.scrypt_p;
7106
7107 char base64_salt[32];
7108
7109 memset (base64_salt, 0, 32);
7110
7111 base64_encode (int_to_base64, (char *) salt.salt_buf, salt.salt_len, base64_salt + 0);
7112
7113 memset (tmp_buf, 0, 46);
7114
7115 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7116 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7117 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7118 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7119 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7120 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7121 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7122 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7123 digest_buf[8] = 0; // needed for base64_encode ()
7124
7125 base64_encode (int_to_base64, (char *) digest_buf, 32, tmp_buf + 0);
7126
7127 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7128 SIGNATURE_SCRYPT,
7129 N,
7130 r,
7131 p,
7132 base64_salt,
7133 tmp_buf);
7134 }
7135 else if (hash_mode == 9000)
7136 {
7137 snprintf (out_buf, len-1, "%s", hashfile);
7138 }
7139 else if (hash_mode == 9200)
7140 {
7141 // salt
7142
7143 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7144
7145 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7146
7147 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7148
7149 // hash
7150
7151 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7152 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7153 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7154 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7155 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7156 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7157 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7158 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7159 digest_buf[8] = 0; // needed for base64_encode ()
7160
7161 char tmp_buf[64];
7162 memset (tmp_buf, 0, sizeof (tmp_buf));
7163
7164 base64_encode (int_to_itoa64, (char *) digest_buf, 32, tmp_buf);
7165 tmp_buf[43] = 0; // cut it here
7166
7167 // output
7168
7169 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7170 }
7171 else if (hash_mode == 9300)
7172 {
7173 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7174 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7175 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7176 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7177 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7178 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7179 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7180 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7181 digest_buf[8] = 0; // needed for base64_encode ()
7182
7183 char tmp_buf[64];
7184 memset (tmp_buf, 0, sizeof (tmp_buf));
7185
7186 base64_encode (int_to_itoa64, (char *) digest_buf, 32, tmp_buf);
7187 tmp_buf[43] = 0; // cut it here
7188
7189 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7190
7191 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7192 }
7193 else if (hash_mode == 9400)
7194 {
7195 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7196
7197 office2007_t *office2007 = &office2007s[salt_pos];
7198
7199 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7200 SIGNATURE_OFFICE2007,
7201 2007,
7202 20,
7203 office2007->keySize,
7204 16,
7205 salt.salt_buf[0],
7206 salt.salt_buf[1],
7207 salt.salt_buf[2],
7208 salt.salt_buf[3],
7209 office2007->encryptedVerifier[0],
7210 office2007->encryptedVerifier[1],
7211 office2007->encryptedVerifier[2],
7212 office2007->encryptedVerifier[3],
7213 office2007->encryptedVerifierHash[0],
7214 office2007->encryptedVerifierHash[1],
7215 office2007->encryptedVerifierHash[2],
7216 office2007->encryptedVerifierHash[3],
7217 office2007->encryptedVerifierHash[4]);
7218 }
7219 else if (hash_mode == 9500)
7220 {
7221 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7222
7223 office2010_t *office2010 = &office2010s[salt_pos];
7224
7225 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,
7226
7227 salt.salt_buf[0],
7228 salt.salt_buf[1],
7229 salt.salt_buf[2],
7230 salt.salt_buf[3],
7231 office2010->encryptedVerifier[0],
7232 office2010->encryptedVerifier[1],
7233 office2010->encryptedVerifier[2],
7234 office2010->encryptedVerifier[3],
7235 office2010->encryptedVerifierHash[0],
7236 office2010->encryptedVerifierHash[1],
7237 office2010->encryptedVerifierHash[2],
7238 office2010->encryptedVerifierHash[3],
7239 office2010->encryptedVerifierHash[4],
7240 office2010->encryptedVerifierHash[5],
7241 office2010->encryptedVerifierHash[6],
7242 office2010->encryptedVerifierHash[7]);
7243 }
7244 else if (hash_mode == 9600)
7245 {
7246 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7247
7248 office2013_t *office2013 = &office2013s[salt_pos];
7249
7250 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,
7251
7252 salt.salt_buf[0],
7253 salt.salt_buf[1],
7254 salt.salt_buf[2],
7255 salt.salt_buf[3],
7256 office2013->encryptedVerifier[0],
7257 office2013->encryptedVerifier[1],
7258 office2013->encryptedVerifier[2],
7259 office2013->encryptedVerifier[3],
7260 office2013->encryptedVerifierHash[0],
7261 office2013->encryptedVerifierHash[1],
7262 office2013->encryptedVerifierHash[2],
7263 office2013->encryptedVerifierHash[3],
7264 office2013->encryptedVerifierHash[4],
7265 office2013->encryptedVerifierHash[5],
7266 office2013->encryptedVerifierHash[6],
7267 office2013->encryptedVerifierHash[7]);
7268 }
7269 else if (hash_mode == 9700)
7270 {
7271 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7272
7273 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7274
7275 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7276 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7277 byte_swap_32 (salt.salt_buf[0]),
7278 byte_swap_32 (salt.salt_buf[1]),
7279 byte_swap_32 (salt.salt_buf[2]),
7280 byte_swap_32 (salt.salt_buf[3]),
7281 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7282 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7283 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7284 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7285 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7286 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7287 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7288 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7289 }
7290 else if (hash_mode == 9710)
7291 {
7292 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7293
7294 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7295
7296 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7297 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7298 byte_swap_32 (salt.salt_buf[0]),
7299 byte_swap_32 (salt.salt_buf[1]),
7300 byte_swap_32 (salt.salt_buf[2]),
7301 byte_swap_32 (salt.salt_buf[3]),
7302 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7303 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7304 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7305 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7306 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7307 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7308 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7309 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7310 }
7311 else if (hash_mode == 9720)
7312 {
7313 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7314
7315 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7316
7317 uint8_t *rc4key = (uint8_t *) oldoffice01->rc4key;
7318
7319 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7320 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7321 byte_swap_32 (salt.salt_buf[0]),
7322 byte_swap_32 (salt.salt_buf[1]),
7323 byte_swap_32 (salt.salt_buf[2]),
7324 byte_swap_32 (salt.salt_buf[3]),
7325 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7326 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7327 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7328 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7329 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7330 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7331 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7332 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7333 rc4key[0],
7334 rc4key[1],
7335 rc4key[2],
7336 rc4key[3],
7337 rc4key[4]);
7338 }
7339 else if (hash_mode == 9800)
7340 {
7341 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7342
7343 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7344
7345 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7346 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7347 salt.salt_buf[0],
7348 salt.salt_buf[1],
7349 salt.salt_buf[2],
7350 salt.salt_buf[3],
7351 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7352 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7353 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7354 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7355 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7356 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7357 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7358 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7359 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7360 }
7361 else if (hash_mode == 9810)
7362 {
7363 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7364
7365 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7366
7367 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7368 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7369 salt.salt_buf[0],
7370 salt.salt_buf[1],
7371 salt.salt_buf[2],
7372 salt.salt_buf[3],
7373 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7374 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7375 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7376 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7377 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7378 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7379 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7380 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7381 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7382 }
7383 else if (hash_mode == 9820)
7384 {
7385 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7386
7387 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7388
7389 uint8_t *rc4key = (uint8_t *) oldoffice34->rc4key;
7390
7391 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7392 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7393 salt.salt_buf[0],
7394 salt.salt_buf[1],
7395 salt.salt_buf[2],
7396 salt.salt_buf[3],
7397 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7398 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7399 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7400 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7401 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7402 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7403 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7404 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7405 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7406 rc4key[0],
7407 rc4key[1],
7408 rc4key[2],
7409 rc4key[3],
7410 rc4key[4]);
7411 }
7412 else if (hash_mode == 10000)
7413 {
7414 // salt
7415
7416 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7417
7418 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7419
7420 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7421
7422 // hash
7423
7424 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7425 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7426 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7427 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7428 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7429 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7430 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7431 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7432 digest_buf[8] = 0; // needed for base64_encode ()
7433
7434 char tmp_buf[64];
7435 memset (tmp_buf, 0, sizeof (tmp_buf));
7436
7437 base64_encode (int_to_base64, (char *) digest_buf, 32, tmp_buf);
7438
7439 // output
7440
7441 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7442 }
7443 else if (hash_mode == 10100)
7444 {
7445 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7446 digest_buf[0],
7447 digest_buf[1],
7448 2,
7449 4,
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 }
7455 else if (hash_mode == 10200)
7456 {
7457 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7458
7459 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7460
7461 // challenge
7462
7463 char challenge[100];
7464
7465 memset (challenge, 0, sizeof (challenge));
7466
7467 base64_encode (int_to_base64, (char *) salt.salt_buf, salt.salt_len, challenge);
7468
7469 // response
7470
7471 char tmp_buf[100];
7472
7473 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7474 (char *) cram_md5->user,
7475 digest_buf[0],
7476 digest_buf[1],
7477 digest_buf[2],
7478 digest_buf[3]);
7479
7480 char response[100];
7481
7482 memset (response, 0, sizeof (response));
7483
7484 base64_encode (int_to_base64, (char *) tmp_buf, tmp_len, response);
7485
7486 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7487 }
7488 else if (hash_mode == 10300)
7489 {
7490 char tmp_buf[100];
7491
7492 memset (tmp_buf, 0, sizeof (tmp_buf));
7493
7494 memcpy (tmp_buf + 0, digest_buf, 20);
7495 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7496
7497 uint tmp_len = 20 + salt.salt_len;
7498
7499 // base64 encode it
7500
7501 char base64_encoded[100];
7502
7503 memset (base64_encoded, 0, sizeof (base64_encoded));
7504
7505 base64_encode (int_to_base64, (char *) tmp_buf, tmp_len, base64_encoded);
7506
7507 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7508 }
7509 else if (hash_mode == 10400)
7510 {
7511 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7512
7513 pdf_t *pdf = &pdfs[salt_pos];
7514
7515 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",
7516
7517 pdf->V,
7518 pdf->R,
7519 40,
7520 pdf->P,
7521 pdf->enc_md,
7522 pdf->id_len,
7523 byte_swap_32 (pdf->id_buf[0]),
7524 byte_swap_32 (pdf->id_buf[1]),
7525 byte_swap_32 (pdf->id_buf[2]),
7526 byte_swap_32 (pdf->id_buf[3]),
7527 pdf->u_len,
7528 byte_swap_32 (pdf->u_buf[0]),
7529 byte_swap_32 (pdf->u_buf[1]),
7530 byte_swap_32 (pdf->u_buf[2]),
7531 byte_swap_32 (pdf->u_buf[3]),
7532 byte_swap_32 (pdf->u_buf[4]),
7533 byte_swap_32 (pdf->u_buf[5]),
7534 byte_swap_32 (pdf->u_buf[6]),
7535 byte_swap_32 (pdf->u_buf[7]),
7536 pdf->o_len,
7537 byte_swap_32 (pdf->o_buf[0]),
7538 byte_swap_32 (pdf->o_buf[1]),
7539 byte_swap_32 (pdf->o_buf[2]),
7540 byte_swap_32 (pdf->o_buf[3]),
7541 byte_swap_32 (pdf->o_buf[4]),
7542 byte_swap_32 (pdf->o_buf[5]),
7543 byte_swap_32 (pdf->o_buf[6]),
7544 byte_swap_32 (pdf->o_buf[7])
7545 );
7546 }
7547 else if (hash_mode == 10410)
7548 {
7549 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7550
7551 pdf_t *pdf = &pdfs[salt_pos];
7552
7553 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",
7554
7555 pdf->V,
7556 pdf->R,
7557 40,
7558 pdf->P,
7559 pdf->enc_md,
7560 pdf->id_len,
7561 byte_swap_32 (pdf->id_buf[0]),
7562 byte_swap_32 (pdf->id_buf[1]),
7563 byte_swap_32 (pdf->id_buf[2]),
7564 byte_swap_32 (pdf->id_buf[3]),
7565 pdf->u_len,
7566 byte_swap_32 (pdf->u_buf[0]),
7567 byte_swap_32 (pdf->u_buf[1]),
7568 byte_swap_32 (pdf->u_buf[2]),
7569 byte_swap_32 (pdf->u_buf[3]),
7570 byte_swap_32 (pdf->u_buf[4]),
7571 byte_swap_32 (pdf->u_buf[5]),
7572 byte_swap_32 (pdf->u_buf[6]),
7573 byte_swap_32 (pdf->u_buf[7]),
7574 pdf->o_len,
7575 byte_swap_32 (pdf->o_buf[0]),
7576 byte_swap_32 (pdf->o_buf[1]),
7577 byte_swap_32 (pdf->o_buf[2]),
7578 byte_swap_32 (pdf->o_buf[3]),
7579 byte_swap_32 (pdf->o_buf[4]),
7580 byte_swap_32 (pdf->o_buf[5]),
7581 byte_swap_32 (pdf->o_buf[6]),
7582 byte_swap_32 (pdf->o_buf[7])
7583 );
7584 }
7585 else if (hash_mode == 10420)
7586 {
7587 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7588
7589 pdf_t *pdf = &pdfs[salt_pos];
7590
7591 uint8_t *rc4key = (uint8_t *) pdf->rc4key;
7592
7593 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",
7594
7595 pdf->V,
7596 pdf->R,
7597 40,
7598 pdf->P,
7599 pdf->enc_md,
7600 pdf->id_len,
7601 byte_swap_32 (pdf->id_buf[0]),
7602 byte_swap_32 (pdf->id_buf[1]),
7603 byte_swap_32 (pdf->id_buf[2]),
7604 byte_swap_32 (pdf->id_buf[3]),
7605 pdf->u_len,
7606 byte_swap_32 (pdf->u_buf[0]),
7607 byte_swap_32 (pdf->u_buf[1]),
7608 byte_swap_32 (pdf->u_buf[2]),
7609 byte_swap_32 (pdf->u_buf[3]),
7610 byte_swap_32 (pdf->u_buf[4]),
7611 byte_swap_32 (pdf->u_buf[5]),
7612 byte_swap_32 (pdf->u_buf[6]),
7613 byte_swap_32 (pdf->u_buf[7]),
7614 pdf->o_len,
7615 byte_swap_32 (pdf->o_buf[0]),
7616 byte_swap_32 (pdf->o_buf[1]),
7617 byte_swap_32 (pdf->o_buf[2]),
7618 byte_swap_32 (pdf->o_buf[3]),
7619 byte_swap_32 (pdf->o_buf[4]),
7620 byte_swap_32 (pdf->o_buf[5]),
7621 byte_swap_32 (pdf->o_buf[6]),
7622 byte_swap_32 (pdf->o_buf[7]),
7623 rc4key[0],
7624 rc4key[1],
7625 rc4key[2],
7626 rc4key[3],
7627 rc4key[4]
7628 );
7629 }
7630 else if (hash_mode == 10500)
7631 {
7632 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7633
7634 pdf_t *pdf = &pdfs[salt_pos];
7635
7636 if (pdf->id_len == 32)
7637 {
7638 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",
7639
7640 pdf->V,
7641 pdf->R,
7642 128,
7643 pdf->P,
7644 pdf->enc_md,
7645 pdf->id_len,
7646 byte_swap_32 (pdf->id_buf[0]),
7647 byte_swap_32 (pdf->id_buf[1]),
7648 byte_swap_32 (pdf->id_buf[2]),
7649 byte_swap_32 (pdf->id_buf[3]),
7650 byte_swap_32 (pdf->id_buf[4]),
7651 byte_swap_32 (pdf->id_buf[5]),
7652 byte_swap_32 (pdf->id_buf[6]),
7653 byte_swap_32 (pdf->id_buf[7]),
7654 pdf->u_len,
7655 byte_swap_32 (pdf->u_buf[0]),
7656 byte_swap_32 (pdf->u_buf[1]),
7657 byte_swap_32 (pdf->u_buf[2]),
7658 byte_swap_32 (pdf->u_buf[3]),
7659 byte_swap_32 (pdf->u_buf[4]),
7660 byte_swap_32 (pdf->u_buf[5]),
7661 byte_swap_32 (pdf->u_buf[6]),
7662 byte_swap_32 (pdf->u_buf[7]),
7663 pdf->o_len,
7664 byte_swap_32 (pdf->o_buf[0]),
7665 byte_swap_32 (pdf->o_buf[1]),
7666 byte_swap_32 (pdf->o_buf[2]),
7667 byte_swap_32 (pdf->o_buf[3]),
7668 byte_swap_32 (pdf->o_buf[4]),
7669 byte_swap_32 (pdf->o_buf[5]),
7670 byte_swap_32 (pdf->o_buf[6]),
7671 byte_swap_32 (pdf->o_buf[7])
7672 );
7673 }
7674 else
7675 {
7676 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",
7677
7678 pdf->V,
7679 pdf->R,
7680 128,
7681 pdf->P,
7682 pdf->enc_md,
7683 pdf->id_len,
7684 byte_swap_32 (pdf->id_buf[0]),
7685 byte_swap_32 (pdf->id_buf[1]),
7686 byte_swap_32 (pdf->id_buf[2]),
7687 byte_swap_32 (pdf->id_buf[3]),
7688 pdf->u_len,
7689 byte_swap_32 (pdf->u_buf[0]),
7690 byte_swap_32 (pdf->u_buf[1]),
7691 byte_swap_32 (pdf->u_buf[2]),
7692 byte_swap_32 (pdf->u_buf[3]),
7693 byte_swap_32 (pdf->u_buf[4]),
7694 byte_swap_32 (pdf->u_buf[5]),
7695 byte_swap_32 (pdf->u_buf[6]),
7696 byte_swap_32 (pdf->u_buf[7]),
7697 pdf->o_len,
7698 byte_swap_32 (pdf->o_buf[0]),
7699 byte_swap_32 (pdf->o_buf[1]),
7700 byte_swap_32 (pdf->o_buf[2]),
7701 byte_swap_32 (pdf->o_buf[3]),
7702 byte_swap_32 (pdf->o_buf[4]),
7703 byte_swap_32 (pdf->o_buf[5]),
7704 byte_swap_32 (pdf->o_buf[6]),
7705 byte_swap_32 (pdf->o_buf[7])
7706 );
7707 }
7708 }
7709 else if (hash_mode == 10600)
7710 {
7711 uint digest_idx = salt.digests_offset + digest_pos;
7712
7713 hashinfo_t **hashinfo_ptr = data.hash_info;
7714 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7715
7716 snprintf (out_buf, len-1, "%s", hash_buf);
7717 }
7718 else if (hash_mode == 10700)
7719 {
7720 uint digest_idx = salt.digests_offset + digest_pos;
7721
7722 hashinfo_t **hashinfo_ptr = data.hash_info;
7723 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7724
7725 snprintf (out_buf, len-1, "%s", hash_buf);
7726 }
7727 else if (hash_mode == 10900)
7728 {
7729 uint digest_idx = salt.digests_offset + digest_pos;
7730
7731 hashinfo_t **hashinfo_ptr = data.hash_info;
7732 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7733
7734 snprintf (out_buf, len-1, "%s", hash_buf);
7735 }
7736 else if (hash_mode == 11100)
7737 {
7738 uint32_t salt_challenge = salt.salt_buf[0];
7739
7740 salt_challenge = byte_swap_32 (salt_challenge);
7741
7742 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7743
7744 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7745 SIGNATURE_POSTGRESQL_AUTH,
7746 user_name,
7747 salt_challenge,
7748 digest_buf[0],
7749 digest_buf[1],
7750 digest_buf[2],
7751 digest_buf[3]);
7752 }
7753 else if (hash_mode == 11200)
7754 {
7755 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7756 SIGNATURE_MYSQL_AUTH,
7757 (unsigned char *) salt.salt_buf,
7758 digest_buf[0],
7759 digest_buf[1],
7760 digest_buf[2],
7761 digest_buf[3],
7762 digest_buf[4]);
7763 }
7764 else if (hash_mode == 11300)
7765 {
7766 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7767
7768 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7769
7770 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7771 const uint ckey_len = bitcoin_wallet->ckey_len;
7772 const uint public_key_len = bitcoin_wallet->public_key_len;
7773
7774 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7775 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7776 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7777
7778 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7779 {
7780 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->cry_master_buf;
7781
7782 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7783 }
7784
7785 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7786 {
7787 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->ckey_buf;
7788
7789 sprintf (ckey_buf + j, "%02x", ptr[i]);
7790 }
7791
7792 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7793 {
7794 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->public_key_buf;
7795
7796 sprintf (public_key_buf + j, "%02x", ptr[i]);
7797 }
7798
7799 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
7800 SIGNATURE_BITCOIN_WALLET,
7801 cry_master_len * 2,
7802 cry_master_buf,
7803 salt.salt_len,
7804 (unsigned char *) salt.salt_buf,
7805 salt.salt_iter + 1,
7806 ckey_len * 2,
7807 ckey_buf,
7808 public_key_len * 2,
7809 public_key_buf
7810 );
7811
7812 free (cry_master_buf);
7813 free (ckey_buf);
7814 free (public_key_buf);
7815 }
7816 else if (hash_mode == 11400)
7817 {
7818 uint digest_idx = salt.digests_offset + digest_pos;
7819
7820 hashinfo_t **hashinfo_ptr = data.hash_info;
7821 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7822
7823 snprintf (out_buf, len-1, "%s", hash_buf);
7824 }
7825 else if (hash_mode == 11600)
7826 {
7827 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
7828
7829 seven_zip_t *seven_zip = &seven_zips[salt_pos];
7830
7831 const uint data_len = seven_zip->data_len;
7832
7833 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
7834
7835 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
7836 {
7837 const uint8_t *ptr = (const uint8_t *) seven_zip->data_buf;
7838
7839 sprintf (data_buf + j, "%02x", ptr[i]);
7840 }
7841
7842 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
7843 SIGNATURE_SEVEN_ZIP,
7844 0,
7845 salt.salt_sign[0],
7846 0,
7847 (char *) seven_zip->salt_buf,
7848 seven_zip->iv_len,
7849 seven_zip->iv_buf[0],
7850 seven_zip->iv_buf[1],
7851 seven_zip->iv_buf[2],
7852 seven_zip->iv_buf[3],
7853 seven_zip->crc,
7854 seven_zip->data_len,
7855 seven_zip->unpack_size,
7856 data_buf);
7857
7858 free (data_buf);
7859 }
7860 else if (hash_mode == 11700)
7861 {
7862 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7863 digest_buf[0],
7864 digest_buf[1],
7865 digest_buf[2],
7866 digest_buf[3],
7867 digest_buf[4],
7868 digest_buf[5],
7869 digest_buf[6],
7870 digest_buf[7]);
7871 }
7872 else if (hash_mode == 11800)
7873 {
7874 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
7875 digest_buf[ 0],
7876 digest_buf[ 1],
7877 digest_buf[ 2],
7878 digest_buf[ 3],
7879 digest_buf[ 4],
7880 digest_buf[ 5],
7881 digest_buf[ 6],
7882 digest_buf[ 7],
7883 digest_buf[ 8],
7884 digest_buf[ 9],
7885 digest_buf[10],
7886 digest_buf[11],
7887 digest_buf[12],
7888 digest_buf[13],
7889 digest_buf[14],
7890 digest_buf[15]);
7891 }
7892 else if (hash_mode == 11900)
7893 {
7894 uint digest_idx = salt.digests_offset + digest_pos;
7895
7896 hashinfo_t **hashinfo_ptr = data.hash_info;
7897 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7898
7899 snprintf (out_buf, len-1, "%s", hash_buf);
7900 }
7901 else if (hash_mode == 12000)
7902 {
7903 uint digest_idx = salt.digests_offset + digest_pos;
7904
7905 hashinfo_t **hashinfo_ptr = data.hash_info;
7906 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7907
7908 snprintf (out_buf, len-1, "%s", hash_buf);
7909 }
7910 else if (hash_mode == 12100)
7911 {
7912 uint digest_idx = salt.digests_offset + digest_pos;
7913
7914 hashinfo_t **hashinfo_ptr = data.hash_info;
7915 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7916
7917 snprintf (out_buf, len-1, "%s", hash_buf);
7918 }
7919 else if (hash_mode == 12200)
7920 {
7921 uint *ptr_digest = digest_buf;
7922 uint *ptr_salt = salt.salt_buf;
7923
7924 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
7925 SIGNATURE_ECRYPTFS,
7926 ptr_salt[0],
7927 ptr_salt[1],
7928 ptr_digest[0],
7929 ptr_digest[1]);
7930 }
7931 else if (hash_mode == 12300)
7932 {
7933 uint *ptr_digest = digest_buf;
7934 uint *ptr_salt = salt.salt_buf;
7935
7936 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",
7937 ptr_digest[ 0], ptr_digest[ 1],
7938 ptr_digest[ 2], ptr_digest[ 3],
7939 ptr_digest[ 4], ptr_digest[ 5],
7940 ptr_digest[ 6], ptr_digest[ 7],
7941 ptr_digest[ 8], ptr_digest[ 9],
7942 ptr_digest[10], ptr_digest[11],
7943 ptr_digest[12], ptr_digest[13],
7944 ptr_digest[14], ptr_digest[15],
7945 ptr_salt[0],
7946 ptr_salt[1],
7947 ptr_salt[2],
7948 ptr_salt[3]);
7949 }
7950 else if (hash_mode == 12400)
7951 {
7952 // encode iteration count
7953
7954 char salt_iter[5];
7955
7956 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
7957 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
7958 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
7959 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
7960 salt_iter[4] = 0;
7961
7962 // encode salt
7963
7964 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
7965 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
7966 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
7967 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
7968 ptr_salt[4] = 0;
7969
7970 // encode digest
7971
7972 memset (tmp_buf, 0, sizeof (tmp_buf));
7973
7974 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7975 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7976
7977 memcpy (tmp_buf, digest_buf, 8);
7978
7979 base64_encode (int_to_itoa64, tmp_buf, 8, ptr_plain);
7980
7981 ptr_plain[11] = 0;
7982
7983 // fill the resulting buffer
7984
7985 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
7986 }
7987 else if (hash_mode == 12500)
7988 {
7989 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
7990 SIGNATURE_RAR3,
7991 byte_swap_32 (salt.salt_buf[0]),
7992 byte_swap_32 (salt.salt_buf[1]),
7993 salt.salt_buf[2],
7994 salt.salt_buf[3],
7995 salt.salt_buf[4],
7996 salt.salt_buf[5]);
7997 }
7998 else if (hash_mode == 12600)
7999 {
8000 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8001 digest_buf[0] + salt.salt_buf_pc[0],
8002 digest_buf[1] + salt.salt_buf_pc[1],
8003 digest_buf[2] + salt.salt_buf_pc[2],
8004 digest_buf[3] + salt.salt_buf_pc[3],
8005 digest_buf[4] + salt.salt_buf_pc[4],
8006 digest_buf[5] + salt.salt_buf_pc[5],
8007 digest_buf[6] + salt.salt_buf_pc[6],
8008 digest_buf[7] + salt.salt_buf_pc[7]);
8009 }
8010 else if (hash_mode == 12700)
8011 {
8012 uint digest_idx = salt.digests_offset + digest_pos;
8013
8014 hashinfo_t **hashinfo_ptr = data.hash_info;
8015 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8016
8017 snprintf (out_buf, len-1, "%s", hash_buf);
8018 }
8019 else if (hash_mode == 12800)
8020 {
8021 const uint8_t *ptr = (const uint8_t *) salt.salt_buf;
8022
8023 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",
8024 SIGNATURE_MS_DRSR,
8025 ptr[0],
8026 ptr[1],
8027 ptr[2],
8028 ptr[3],
8029 ptr[4],
8030 ptr[5],
8031 ptr[6],
8032 ptr[7],
8033 ptr[8],
8034 ptr[9],
8035 salt.salt_iter + 1,
8036 byte_swap_32 (digest_buf[0]),
8037 byte_swap_32 (digest_buf[1]),
8038 byte_swap_32 (digest_buf[2]),
8039 byte_swap_32 (digest_buf[3]),
8040 byte_swap_32 (digest_buf[4]),
8041 byte_swap_32 (digest_buf[5]),
8042 byte_swap_32 (digest_buf[6]),
8043 byte_swap_32 (digest_buf[7])
8044 );
8045 }
8046 else if (hash_mode == 12900)
8047 {
8048 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",
8049 salt.salt_buf[ 4],
8050 salt.salt_buf[ 5],
8051 salt.salt_buf[ 6],
8052 salt.salt_buf[ 7],
8053 salt.salt_buf[ 8],
8054 salt.salt_buf[ 9],
8055 salt.salt_buf[10],
8056 salt.salt_buf[11],
8057 byte_swap_32 (digest_buf[0]),
8058 byte_swap_32 (digest_buf[1]),
8059 byte_swap_32 (digest_buf[2]),
8060 byte_swap_32 (digest_buf[3]),
8061 byte_swap_32 (digest_buf[4]),
8062 byte_swap_32 (digest_buf[5]),
8063 byte_swap_32 (digest_buf[6]),
8064 byte_swap_32 (digest_buf[7]),
8065 salt.salt_buf[ 0],
8066 salt.salt_buf[ 1],
8067 salt.salt_buf[ 2],
8068 salt.salt_buf[ 3]
8069 );
8070 }
8071 else
8072 {
8073 if (hash_type == HASH_TYPE_MD4)
8074 {
8075 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8076 digest_buf[0],
8077 digest_buf[1],
8078 digest_buf[2],
8079 digest_buf[3]);
8080 }
8081 else if (hash_type == HASH_TYPE_MD5)
8082 {
8083 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8084 digest_buf[0],
8085 digest_buf[1],
8086 digest_buf[2],
8087 digest_buf[3]);
8088 }
8089 else if (hash_type == HASH_TYPE_SHA1)
8090 {
8091 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8092 digest_buf[0],
8093 digest_buf[1],
8094 digest_buf[2],
8095 digest_buf[3],
8096 digest_buf[4]);
8097 }
8098 else if (hash_type == HASH_TYPE_SHA256)
8099 {
8100 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8101 digest_buf[0],
8102 digest_buf[1],
8103 digest_buf[2],
8104 digest_buf[3],
8105 digest_buf[4],
8106 digest_buf[5],
8107 digest_buf[6],
8108 digest_buf[7]);
8109 }
8110 else if (hash_type == HASH_TYPE_SHA384)
8111 {
8112 uint *ptr = digest_buf;
8113
8114 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8115 ptr[ 1], ptr[ 0],
8116 ptr[ 3], ptr[ 2],
8117 ptr[ 5], ptr[ 4],
8118 ptr[ 7], ptr[ 6],
8119 ptr[ 9], ptr[ 8],
8120 ptr[11], ptr[10]);
8121 }
8122 else if (hash_type == HASH_TYPE_SHA512)
8123 {
8124 uint *ptr = digest_buf;
8125
8126 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8127 ptr[ 1], ptr[ 0],
8128 ptr[ 3], ptr[ 2],
8129 ptr[ 5], ptr[ 4],
8130 ptr[ 7], ptr[ 6],
8131 ptr[ 9], ptr[ 8],
8132 ptr[11], ptr[10],
8133 ptr[13], ptr[12],
8134 ptr[15], ptr[14]);
8135 }
8136 else if (hash_type == HASH_TYPE_LM)
8137 {
8138 snprintf (out_buf, len-1, "%08x%08x",
8139 digest_buf[0],
8140 digest_buf[1]);
8141 }
8142 else if (hash_type == HASH_TYPE_ORACLEH)
8143 {
8144 snprintf (out_buf, len-1, "%08X%08X",
8145 digest_buf[0],
8146 digest_buf[1]);
8147 }
8148 else if (hash_type == HASH_TYPE_BCRYPT)
8149 {
8150 base64_encode (int_to_bf64, (char *) salt.salt_buf, 16, tmp_buf + 0);
8151 base64_encode (int_to_bf64, (char *) digest_buf, 23, tmp_buf + 22);
8152
8153 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8154
8155 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8156 }
8157 else if (hash_type == HASH_TYPE_KECCAK)
8158 {
8159 uint *ptr = digest_buf;
8160
8161 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",
8162 ptr[ 1], ptr[ 0],
8163 ptr[ 3], ptr[ 2],
8164 ptr[ 5], ptr[ 4],
8165 ptr[ 7], ptr[ 6],
8166 ptr[ 9], ptr[ 8],
8167 ptr[11], ptr[10],
8168 ptr[13], ptr[12],
8169 ptr[15], ptr[14],
8170 ptr[17], ptr[16],
8171 ptr[19], ptr[18],
8172 ptr[21], ptr[20],
8173 ptr[23], ptr[22],
8174 ptr[25], ptr[24],
8175 ptr[27], ptr[26],
8176 ptr[29], ptr[28],
8177 ptr[31], ptr[30],
8178 ptr[33], ptr[32],
8179 ptr[35], ptr[34],
8180 ptr[37], ptr[36],
8181 ptr[39], ptr[38],
8182 ptr[41], ptr[30],
8183 ptr[43], ptr[42],
8184 ptr[45], ptr[44],
8185 ptr[47], ptr[46],
8186 ptr[49], ptr[48]
8187 );
8188
8189 out_buf[salt.keccak_mdlen * 2] = 0;
8190 }
8191 else if (hash_type == HASH_TYPE_RIPEMD160)
8192 {
8193 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8194 digest_buf[0],
8195 digest_buf[1],
8196 digest_buf[2],
8197 digest_buf[3],
8198 digest_buf[4]);
8199 }
8200 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8201 {
8202 digest_buf[ 0] = digest_buf[ 0];
8203 digest_buf[ 1] = digest_buf[ 1];
8204 digest_buf[ 2] = digest_buf[ 2];
8205 digest_buf[ 3] = digest_buf[ 3];
8206 digest_buf[ 4] = digest_buf[ 4];
8207 digest_buf[ 5] = digest_buf[ 5];
8208 digest_buf[ 6] = digest_buf[ 6];
8209 digest_buf[ 7] = digest_buf[ 7];
8210 digest_buf[ 8] = digest_buf[ 8];
8211 digest_buf[ 9] = digest_buf[ 9];
8212 digest_buf[10] = digest_buf[10];
8213 digest_buf[11] = digest_buf[11];
8214 digest_buf[12] = digest_buf[12];
8215 digest_buf[13] = digest_buf[13];
8216 digest_buf[14] = digest_buf[14];
8217 digest_buf[15] = digest_buf[15];
8218
8219 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8220 digest_buf[ 0],
8221 digest_buf[ 1],
8222 digest_buf[ 2],
8223 digest_buf[ 3],
8224 digest_buf[ 4],
8225 digest_buf[ 5],
8226 digest_buf[ 6],
8227 digest_buf[ 7],
8228 digest_buf[ 8],
8229 digest_buf[ 9],
8230 digest_buf[10],
8231 digest_buf[11],
8232 digest_buf[12],
8233 digest_buf[13],
8234 digest_buf[14],
8235 digest_buf[15]);
8236 }
8237 else if (hash_type == HASH_TYPE_GOST)
8238 {
8239 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8240 digest_buf[0],
8241 digest_buf[1],
8242 digest_buf[2],
8243 digest_buf[3],
8244 digest_buf[4],
8245 digest_buf[5],
8246 digest_buf[6],
8247 digest_buf[7]);
8248 }
8249 else if (hash_type == HASH_TYPE_MYSQL)
8250 {
8251 snprintf (out_buf, len-1, "%08x%08x",
8252 digest_buf[0],
8253 digest_buf[1]);
8254 }
8255 else if (hash_type == HASH_TYPE_LOTUS5)
8256 {
8257 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8258 digest_buf[0],
8259 digest_buf[1],
8260 digest_buf[2],
8261 digest_buf[3]);
8262 }
8263 else if (hash_type == HASH_TYPE_LOTUS6)
8264 {
8265 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8266 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8267 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8268 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8269
8270 char buf[16];
8271
8272 memcpy (buf + 0, salt.salt_buf, 5);
8273 memcpy (buf + 5, digest_buf, 9);
8274
8275 buf[3] -= -4;
8276
8277 base64_encode (int_to_lotus64, buf, 14, tmp_buf);
8278
8279 tmp_buf[18] = salt.salt_buf_pc[7];
8280 tmp_buf[19] = 0;
8281
8282 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8283 }
8284 else if (hash_type == HASH_TYPE_LOTUS8)
8285 {
8286 char buf[52];
8287
8288 memset (buf, 0, sizeof (buf));
8289
8290 // salt
8291
8292 memcpy (buf + 0, salt.salt_buf, 16);
8293
8294 buf[3] -= -4;
8295
8296 // iteration
8297
8298 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8299
8300 // chars
8301
8302 buf[26] = salt.salt_buf_pc[0];
8303 buf[27] = salt.salt_buf_pc[1];
8304
8305 // digest
8306
8307 memcpy (buf + 28, digest_buf, 8);
8308
8309 base64_encode (int_to_lotus64, buf, 36, tmp_buf);
8310
8311 tmp_buf[49] = 0;
8312
8313 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8314 }
8315 else if (hash_type == HASH_TYPE_CRC32)
8316 {
8317 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8318 }
8319 }
8320
8321 if (salt_type == SALT_TYPE_INTERN)
8322 {
8323 size_t pos = strlen (out_buf);
8324
8325 out_buf[pos] = data.separator;
8326
8327 char *ptr = (char *) salt.salt_buf;
8328
8329 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8330
8331 out_buf[pos + 1 + salt.salt_len] = 0;
8332 }
8333 }
8334
8335 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8336 {
8337 memset (hccap, 0, sizeof (hccap_t));
8338
8339 salt_t *salt = &data.salts_buf[salt_pos];
8340
8341 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8342
8343 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8344 wpa_t *wpa = &wpas[salt_pos];
8345
8346 hccap->keyver = wpa->keyver;
8347
8348 hccap->eapol_size = wpa->eapol_size;
8349
8350 if (wpa->keyver != 1)
8351 {
8352 uint eapol_tmp[64];
8353
8354 for (uint i = 0; i < 64; i++)
8355 {
8356 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8357 }
8358
8359 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8360 }
8361 else
8362 {
8363 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8364 }
8365
8366 uint pke_tmp[25];
8367
8368 for (int i = 5; i < 25; i++)
8369 {
8370 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8371 }
8372
8373 char *pke_ptr = (char *) pke_tmp;
8374
8375 memcpy (hccap->mac1, pke_ptr + 23, 6);
8376 memcpy (hccap->mac2, pke_ptr + 29, 6);
8377 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8378 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8379
8380 char *digests_buf_ptr = (char *) data.digests_buf;
8381
8382 uint dgst_size = data.dgst_size;
8383
8384 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8385
8386 if (wpa->keyver != 1)
8387 {
8388 uint digest_tmp[4];
8389
8390 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8391 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8392 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8393 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8394
8395 memcpy (hccap->keymic, digest_tmp, 16);
8396 }
8397 else
8398 {
8399 memcpy (hccap->keymic, digest_ptr, 16);
8400 }
8401 }
8402
8403 void SuspendThreads ()
8404 {
8405 if (data.devices_status == STATUS_RUNNING)
8406 {
8407 hc_timer_set (&data.timer_paused);
8408
8409 data.devices_status = STATUS_PAUSED;
8410
8411 log_info ("Paused");
8412 }
8413 }
8414
8415 void ResumeThreads ()
8416 {
8417 if (data.devices_status == STATUS_PAUSED)
8418 {
8419 float ms_paused;
8420
8421 hc_timer_get (data.timer_paused, ms_paused);
8422
8423 data.ms_paused += ms_paused;
8424
8425 data.devices_status = STATUS_RUNNING;
8426
8427 log_info ("Resumed");
8428 }
8429 }
8430
8431 void bypass ()
8432 {
8433 if (data.devices_status != STATUS_RUNNING) return;
8434
8435 data.devices_status = STATUS_BYPASS;
8436
8437 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8438 }
8439
8440 void stop_at_checkpoint ()
8441 {
8442 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8443 {
8444 if (data.devices_status != STATUS_RUNNING) return;
8445 }
8446
8447 // this feature only makes sense if --restore-disable was not specified
8448
8449 if (data.restore_disable == 1)
8450 {
8451 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8452
8453 return;
8454 }
8455
8456 // check if monitoring of Restore Point updates should be enabled or disabled
8457
8458 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8459 {
8460 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8461
8462 // save the current restore point value
8463
8464 data.checkpoint_cur_words = get_lowest_words_done ();
8465
8466 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8467 }
8468 else
8469 {
8470 data.devices_status = STATUS_RUNNING;
8471
8472 // reset the global value for checkpoint checks
8473
8474 data.checkpoint_cur_words = 0;
8475
8476 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8477 }
8478 }
8479
8480 void myabort ()
8481 {
8482 if (data.devices_status == STATUS_INIT) return;
8483 if (data.devices_status == STATUS_STARTING) return;
8484
8485 data.devices_status = STATUS_ABORTED;
8486 }
8487
8488 void myquit ()
8489 {
8490 if (data.devices_status == STATUS_INIT) return;
8491 if (data.devices_status == STATUS_STARTING) return;
8492
8493 data.devices_status = STATUS_QUIT;
8494 }
8495
8496 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const unsigned char **kernel_sources)
8497 {
8498 FILE *fp;
8499
8500 if ((fp = fopen (kernel_file, "rb")) != NULL)
8501 {
8502 struct stat st;
8503
8504 memset (&st, 0, sizeof (st));
8505
8506 stat (kernel_file, &st);
8507
8508 unsigned char *buf = (unsigned char *) mymalloc (st.st_size + 1);
8509
8510 size_t num_read = fread (buf, sizeof (unsigned char), st.st_size, fp);
8511
8512 if (num_read != (size_t) st.st_size)
8513 {
8514 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8515
8516 exit (-1);
8517 }
8518
8519 fclose (fp);
8520
8521 buf[st.st_size] = 0;
8522
8523 for (int i = 0; i < num_devices; i++)
8524 {
8525 kernel_lengths[i] = (size_t) st.st_size;
8526
8527 kernel_sources[i] = buf;
8528 }
8529 }
8530 else
8531 {
8532 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8533
8534 exit (-1);
8535 }
8536
8537 return;
8538 }
8539
8540 void writeProgramBin (char *dst, unsigned char *binary, size_t binary_size)
8541 {
8542 FILE *fp = fopen (dst, "wb");
8543
8544 fwrite (binary, sizeof (unsigned char), binary_size, fp);
8545
8546 fflush (fp);
8547 fclose (fp);
8548 }
8549
8550 /**
8551 * restore
8552 */
8553
8554 restore_data_t *init_restore (int argc, char **argv)
8555 {
8556 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8557
8558 if (data.restore_disable == 0)
8559 {
8560 FILE *fp = fopen (data.eff_restore_file, "rb");
8561
8562 if (fp)
8563 {
8564 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8565
8566 if (nread != 1)
8567 {
8568 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8569
8570 exit (-1);
8571 }
8572
8573 fclose (fp);
8574
8575 if (rd->pid)
8576 {
8577 char pidbin[BUFSIZ];
8578
8579 int pidbin_len;
8580
8581 #ifdef _POSIX
8582 memset (pidbin, 0, sizeof (pidbin));
8583
8584 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8585
8586 FILE *fd = fopen (pidbin, "rb");
8587
8588 if (fd)
8589 {
8590 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8591
8592 pidbin[pidbin_len] = 0;
8593
8594 fclose (fd);
8595
8596 char *argv0_r = strrchr (argv[0], '/');
8597
8598 char *pidbin_r = strrchr (pidbin, '/');
8599
8600 if (argv0_r == NULL) argv0_r = argv[0];
8601
8602 if (pidbin_r == NULL) pidbin_r = pidbin;
8603
8604 if (strcmp (argv0_r, pidbin_r) == 0)
8605 {
8606 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8607
8608 exit (-1);
8609 }
8610 }
8611
8612 #elif _WIN
8613 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8614
8615 char pidbin2[BUFSIZ];
8616
8617 int pidbin2_len;
8618
8619 memset (pidbin2, 0, sizeof (pidbin2));
8620
8621 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8622 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8623
8624 pidbin[pidbin_len] = 0;
8625 pidbin2[pidbin2_len] = 0;
8626
8627 if (pidbin2_len)
8628 {
8629 if (strcmp (pidbin, pidbin2) == 0)
8630 {
8631 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8632
8633 exit (-1);
8634 }
8635 }
8636 #endif
8637 }
8638
8639 if (rd->version_bin < RESTORE_MIN)
8640 {
8641 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8642
8643 exit (-1);
8644 }
8645 }
8646 }
8647
8648 memset (rd, 0, sizeof (restore_data_t));
8649
8650 rd->version_bin = VERSION_BIN;
8651
8652 #ifdef _POSIX
8653 rd->pid = getpid ();
8654 #elif _WIN
8655 rd->pid = GetCurrentProcessId ();
8656 #endif
8657
8658 if (getcwd (rd->cwd, 255) == NULL)
8659 {
8660 myfree (rd);
8661
8662 return (NULL);
8663 }
8664
8665 rd->argc = argc;
8666 rd->argv = argv;
8667
8668 return (rd);
8669 }
8670
8671 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8672 {
8673 FILE *fp = fopen (eff_restore_file, "rb");
8674
8675 if (fp == NULL)
8676 {
8677 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8678
8679 exit (-1);
8680 }
8681
8682 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8683 {
8684 log_error ("ERROR: cannot read %s", eff_restore_file);
8685
8686 exit (-1);
8687 }
8688
8689 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8690
8691 for (uint i = 0; i < rd->argc; i++)
8692 {
8693 char buf[BUFSIZ];
8694
8695 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8696 {
8697 log_error ("ERROR: cannot read %s", eff_restore_file);
8698
8699 exit (-1);
8700 }
8701
8702 size_t len = strlen (buf);
8703
8704 if (len) buf[len - 1] = 0;
8705
8706 rd->argv[i] = mystrdup (buf);
8707 }
8708
8709 fclose (fp);
8710
8711 char new_cwd[256];
8712
8713 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8714
8715 if (nwd == NULL)
8716 {
8717 log_error ("Restore file is corrupted");
8718 }
8719
8720 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8721 {
8722 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8723 {
8724 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8725
8726 exit (-1);
8727 }
8728
8729 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8730 }
8731
8732
8733 if (chdir (rd->cwd))
8734 {
8735 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8736
8737 exit (-1);
8738 }
8739 }
8740
8741 uint64_t get_lowest_words_done ()
8742 {
8743 uint64_t words_cur = -1;
8744
8745 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8746 {
8747 hc_device_param_t *device_param = &data.devices_param[device_id];
8748
8749 const uint64_t words_done = device_param->words_done;
8750
8751 if (words_done < words_cur) words_cur = words_done;
8752 }
8753
8754 // It's possible that a device's workload isn't finished right after a restore-case.
8755 // In that case, this function would return 0 and overwrite the real restore point
8756 // There's also data.words_cur which is set to rd->words_cur but it changes while
8757 // the attack is running therefore we should stick to rd->words_cur.
8758 // Note that -s influences rd->words_cur we should keep a close look on that.
8759
8760 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
8761
8762 return words_cur;
8763 }
8764
8765 void write_restore (const char *new_restore_file, restore_data_t *rd)
8766 {
8767 uint64_t words_cur = get_lowest_words_done ();
8768
8769 rd->words_cur = words_cur;
8770
8771 FILE *fp = fopen (new_restore_file, "wb");
8772
8773 if (fp == NULL)
8774 {
8775 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
8776
8777 exit (-1);
8778 }
8779
8780 if (setvbuf (fp, NULL, _IONBF, 0))
8781 {
8782 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
8783
8784 exit (-1);
8785 }
8786
8787 fwrite (rd, sizeof (restore_data_t), 1, fp);
8788
8789 for (uint i = 0; i < rd->argc; i++)
8790 {
8791 fprintf (fp, "%s", rd->argv[i]);
8792 fputc ('\n', fp);
8793 }
8794
8795 fflush (fp);
8796
8797 fsync (fileno (fp));
8798
8799 fclose (fp);
8800 }
8801
8802 void cycle_restore ()
8803 {
8804 const char *eff_restore_file = data.eff_restore_file;
8805 const char *new_restore_file = data.new_restore_file;
8806
8807 restore_data_t *rd = data.rd;
8808
8809 write_restore (new_restore_file, rd);
8810
8811 struct stat st;
8812
8813 memset (&st, 0, sizeof(st));
8814
8815 if (stat (eff_restore_file, &st) == 0)
8816 {
8817 if (unlink (eff_restore_file))
8818 {
8819 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
8820 }
8821 }
8822
8823 if (rename (new_restore_file, eff_restore_file))
8824 {
8825 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
8826 }
8827 }
8828
8829 void check_checkpoint ()
8830 {
8831 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
8832
8833 uint64_t words_cur = get_lowest_words_done ();
8834
8835 if (words_cur != data.checkpoint_cur_words)
8836 {
8837 myabort ();
8838 }
8839 }
8840
8841 /**
8842 * adjustments
8843 */
8844
8845 uint set_kernel_accel (uint hash_mode)
8846 {
8847 switch (hash_mode)
8848 {
8849 case 0: return GET_ACCEL (0);
8850 case 10: return GET_ACCEL (10);
8851 case 11: return GET_ACCEL (11);
8852 case 12: return GET_ACCEL (12);
8853 case 20: return GET_ACCEL (20);
8854 case 21: return GET_ACCEL (21);
8855 case 22: return GET_ACCEL (22);
8856 case 23: return GET_ACCEL (23);
8857 case 30: return GET_ACCEL (30);
8858 case 40: return GET_ACCEL (40);
8859 case 50: return GET_ACCEL (50);
8860 case 60: return GET_ACCEL (60);
8861 case 100: return GET_ACCEL (100);
8862 case 101: return GET_ACCEL (101);
8863 case 110: return GET_ACCEL (110);
8864 case 111: return GET_ACCEL (111);
8865 case 112: return GET_ACCEL (112);
8866 case 120: return GET_ACCEL (120);
8867 case 121: return GET_ACCEL (121);
8868 case 122: return GET_ACCEL (122);
8869 case 124: return GET_ACCEL (124);
8870 case 130: return GET_ACCEL (130);
8871 case 131: return GET_ACCEL (131);
8872 case 132: return GET_ACCEL (132);
8873 case 133: return GET_ACCEL (133);
8874 case 140: return GET_ACCEL (140);
8875 case 141: return GET_ACCEL (141);
8876 case 150: return GET_ACCEL (150);
8877 case 160: return GET_ACCEL (160);
8878 case 190: return GET_ACCEL (190);
8879 case 200: return GET_ACCEL (200);
8880 case 300: return GET_ACCEL (300);
8881 case 400: return GET_ACCEL (400);
8882 case 500: return GET_ACCEL (500);
8883 case 501: return GET_ACCEL (501);
8884 case 900: return GET_ACCEL (900);
8885 case 910: return GET_ACCEL (910);
8886 case 1000: return GET_ACCEL (1000);
8887 case 1100: return GET_ACCEL (1100);
8888 case 1400: return GET_ACCEL (1400);
8889 case 1410: return GET_ACCEL (1410);
8890 case 1420: return GET_ACCEL (1420);
8891 case 1421: return GET_ACCEL (1421);
8892 case 1430: return GET_ACCEL (1430);
8893 case 1440: return GET_ACCEL (1440);
8894 case 1441: return GET_ACCEL (1441);
8895 case 1450: return GET_ACCEL (1450);
8896 case 1460: return GET_ACCEL (1460);
8897 case 1500: return GET_ACCEL (1500);
8898 case 1600: return GET_ACCEL (1600);
8899 case 1700: return GET_ACCEL (1700);
8900 case 1710: return GET_ACCEL (1710);
8901 case 1711: return GET_ACCEL (1711);
8902 case 1720: return GET_ACCEL (1720);
8903 case 1722: return GET_ACCEL (1722);
8904 case 1730: return GET_ACCEL (1730);
8905 case 1731: return GET_ACCEL (1731);
8906 case 1740: return GET_ACCEL (1740);
8907 case 1750: return GET_ACCEL (1750);
8908 case 1760: return GET_ACCEL (1760);
8909 case 1800: return GET_ACCEL (1800);
8910 case 2100: return GET_ACCEL (2100);
8911 case 2400: return GET_ACCEL (2400);
8912 case 2410: return GET_ACCEL (2410);
8913 case 2500: return GET_ACCEL (2500);
8914 case 2600: return GET_ACCEL (2600);
8915 case 2611: return GET_ACCEL (2611);
8916 case 2612: return GET_ACCEL (2612);
8917 case 2711: return GET_ACCEL (2711);
8918 case 2811: return GET_ACCEL (2811);
8919 case 3000: return GET_ACCEL (3000);
8920 case 3100: return GET_ACCEL (3100);
8921 case 3200: return GET_ACCEL (3200);
8922 case 3710: return GET_ACCEL (3710);
8923 case 3711: return GET_ACCEL (3711);
8924 case 3800: return GET_ACCEL (3800);
8925 case 4300: return GET_ACCEL (4300);
8926 case 4400: return GET_ACCEL (4400);
8927 case 4500: return GET_ACCEL (4500);
8928 case 4700: return GET_ACCEL (4700);
8929 case 4800: return GET_ACCEL (4800);
8930 case 4900: return GET_ACCEL (4900);
8931 case 5000: return GET_ACCEL (5000);
8932 case 5100: return GET_ACCEL (5100);
8933 case 5200: return GET_ACCEL (5200);
8934 case 5300: return GET_ACCEL (5300);
8935 case 5400: return GET_ACCEL (5400);
8936 case 5500: return GET_ACCEL (5500);
8937 case 5600: return GET_ACCEL (5600);
8938 case 5700: return GET_ACCEL (5700);
8939 case 5800: return GET_ACCEL (5800);
8940 case 6000: return GET_ACCEL (6000);
8941 case 6100: return GET_ACCEL (6100);
8942 case 6211: return GET_ACCEL (6211);
8943 case 6212: return GET_ACCEL (6212);
8944 case 6213: return GET_ACCEL (6213);
8945 case 6221: return GET_ACCEL (6221);
8946 case 6222: return GET_ACCEL (6222);
8947 case 6223: return GET_ACCEL (6223);
8948 case 6231: return GET_ACCEL (6231);
8949 case 6232: return GET_ACCEL (6232);
8950 case 6233: return GET_ACCEL (6233);
8951 case 6241: return GET_ACCEL (6241);
8952 case 6242: return GET_ACCEL (6242);
8953 case 6243: return GET_ACCEL (6243);
8954 case 6300: return GET_ACCEL (6300);
8955 case 6400: return GET_ACCEL (6400);
8956 case 6500: return GET_ACCEL (6500);
8957 case 6600: return GET_ACCEL (6600);
8958 case 6700: return GET_ACCEL (6700);
8959 case 6800: return GET_ACCEL (6800);
8960 case 6900: return GET_ACCEL (6900);
8961 case 7100: return GET_ACCEL (7100);
8962 case 7200: return GET_ACCEL (7200);
8963 case 7300: return GET_ACCEL (7300);
8964 case 7400: return GET_ACCEL (7400);
8965 case 7500: return GET_ACCEL (7500);
8966 case 7600: return GET_ACCEL (7600);
8967 case 7700: return GET_ACCEL (7700);
8968 case 7800: return GET_ACCEL (7800);
8969 case 7900: return GET_ACCEL (7900);
8970 case 8000: return GET_ACCEL (8000);
8971 case 8100: return GET_ACCEL (8100);
8972 case 8200: return GET_ACCEL (8200);
8973 case 8300: return GET_ACCEL (8300);
8974 case 8400: return GET_ACCEL (8400);
8975 case 8500: return GET_ACCEL (8500);
8976 case 8600: return GET_ACCEL (8600);
8977 case 8700: return GET_ACCEL (8700);
8978 case 8800: return GET_ACCEL (8800);
8979 case 8900: return GET_ACCEL (8900);
8980 case 9000: return GET_ACCEL (9000);
8981 case 9100: return GET_ACCEL (9100);
8982 case 9200: return GET_ACCEL (9200);
8983 case 9300: return GET_ACCEL (9300);
8984 case 9400: return GET_ACCEL (9400);
8985 case 9500: return GET_ACCEL (9500);
8986 case 9600: return GET_ACCEL (9600);
8987 case 9700: return GET_ACCEL (9700);
8988 case 9710: return GET_ACCEL (9710);
8989 case 9720: return GET_ACCEL (9720);
8990 case 9800: return GET_ACCEL (9800);
8991 case 9810: return GET_ACCEL (9810);
8992 case 9820: return GET_ACCEL (9820);
8993 case 9900: return GET_ACCEL (9900);
8994 case 10000: return GET_ACCEL (10000);
8995 case 10100: return GET_ACCEL (10100);
8996 case 10200: return GET_ACCEL (10200);
8997 case 10300: return GET_ACCEL (10300);
8998 case 10400: return GET_ACCEL (10400);
8999 case 10410: return GET_ACCEL (10410);
9000 case 10420: return GET_ACCEL (10420);
9001 case 10500: return GET_ACCEL (10500);
9002 case 10600: return GET_ACCEL (10600);
9003 case 10700: return GET_ACCEL (10700);
9004 case 10800: return GET_ACCEL (10800);
9005 case 10900: return GET_ACCEL (10900);
9006 case 11000: return GET_ACCEL (11000);
9007 case 11100: return GET_ACCEL (11100);
9008 case 11200: return GET_ACCEL (11200);
9009 case 11300: return GET_ACCEL (11300);
9010 case 11400: return GET_ACCEL (11400);
9011 case 11500: return GET_ACCEL (11500);
9012 case 11600: return GET_ACCEL (11600);
9013 case 11700: return GET_ACCEL (11700);
9014 case 11800: return GET_ACCEL (11800);
9015 case 11900: return GET_ACCEL (11900);
9016 case 12000: return GET_ACCEL (12000);
9017 case 12100: return GET_ACCEL (12100);
9018 case 12200: return GET_ACCEL (12200);
9019 case 12300: return GET_ACCEL (12300);
9020 case 12400: return GET_ACCEL (12400);
9021 case 12500: return GET_ACCEL (12500);
9022 case 12600: return GET_ACCEL (12600);
9023 case 12700: return GET_ACCEL (12700);
9024 case 12800: return GET_ACCEL (12800);
9025 case 12900: return GET_ACCEL (12900);
9026 }
9027
9028 return 0;
9029 }
9030
9031 uint set_kernel_loops (uint hash_mode)
9032 {
9033 switch (hash_mode)
9034 {
9035 case 0: return GET_LOOPS (0);
9036 case 10: return GET_LOOPS (10);
9037 case 11: return GET_LOOPS (11);
9038 case 12: return GET_LOOPS (12);
9039 case 20: return GET_LOOPS (20);
9040 case 21: return GET_LOOPS (21);
9041 case 22: return GET_LOOPS (22);
9042 case 23: return GET_LOOPS (23);
9043 case 30: return GET_LOOPS (30);
9044 case 40: return GET_LOOPS (40);
9045 case 50: return GET_LOOPS (50);
9046 case 60: return GET_LOOPS (60);
9047 case 100: return GET_LOOPS (100);
9048 case 101: return GET_LOOPS (101);
9049 case 110: return GET_LOOPS (110);
9050 case 111: return GET_LOOPS (111);
9051 case 112: return GET_LOOPS (112);
9052 case 120: return GET_LOOPS (120);
9053 case 121: return GET_LOOPS (121);
9054 case 122: return GET_LOOPS (122);
9055 case 124: return GET_LOOPS (124);
9056 case 130: return GET_LOOPS (130);
9057 case 131: return GET_LOOPS (131);
9058 case 132: return GET_LOOPS (132);
9059 case 133: return GET_LOOPS (133);
9060 case 140: return GET_LOOPS (140);
9061 case 141: return GET_LOOPS (141);
9062 case 150: return GET_LOOPS (150);
9063 case 160: return GET_LOOPS (160);
9064 case 190: return GET_LOOPS (190);
9065 case 200: return GET_LOOPS (200);
9066 case 300: return GET_LOOPS (300);
9067 case 400: return GET_LOOPS (400);
9068 case 500: return GET_LOOPS (500);
9069 case 501: return GET_LOOPS (501);
9070 case 900: return GET_LOOPS (900);
9071 case 910: return GET_LOOPS (910);
9072 case 1000: return GET_LOOPS (1000);
9073 case 1100: return GET_LOOPS (1100);
9074 case 1400: return GET_LOOPS (1400);
9075 case 1410: return GET_LOOPS (1410);
9076 case 1420: return GET_LOOPS (1420);
9077 case 1421: return GET_LOOPS (1421);
9078 case 1430: return GET_LOOPS (1430);
9079 case 1440: return GET_LOOPS (1440);
9080 case 1441: return GET_LOOPS (1441);
9081 case 1450: return GET_LOOPS (1450);
9082 case 1460: return GET_LOOPS (1460);
9083 case 1500: return GET_LOOPS (1500);
9084 case 1600: return GET_LOOPS (1600);
9085 case 1700: return GET_LOOPS (1700);
9086 case 1710: return GET_LOOPS (1710);
9087 case 1711: return GET_LOOPS (1711);
9088 case 1720: return GET_LOOPS (1720);
9089 case 1722: return GET_LOOPS (1722);
9090 case 1730: return GET_LOOPS (1730);
9091 case 1731: return GET_LOOPS (1731);
9092 case 1740: return GET_LOOPS (1740);
9093 case 1750: return GET_LOOPS (1750);
9094 case 1760: return GET_LOOPS (1760);
9095 case 1800: return GET_LOOPS (1800);
9096 case 2100: return GET_LOOPS (2100);
9097 case 2400: return GET_LOOPS (2400);
9098 case 2410: return GET_LOOPS (2410);
9099 case 2500: return GET_LOOPS (2500);
9100 case 2600: return GET_LOOPS (2600);
9101 case 2611: return GET_LOOPS (2611);
9102 case 2612: return GET_LOOPS (2612);
9103 case 2711: return GET_LOOPS (2711);
9104 case 2811: return GET_LOOPS (2811);
9105 case 3000: return GET_LOOPS (3000);
9106 case 3100: return GET_LOOPS (3100);
9107 case 3200: return GET_LOOPS (3200);
9108 case 3710: return GET_LOOPS (3710);
9109 case 3711: return GET_LOOPS (3711);
9110 case 3800: return GET_LOOPS (3800);
9111 case 4300: return GET_LOOPS (4300);
9112 case 4400: return GET_LOOPS (4400);
9113 case 4500: return GET_LOOPS (4500);
9114 case 4700: return GET_LOOPS (4700);
9115 case 4800: return GET_LOOPS (4800);
9116 case 4900: return GET_LOOPS (4900);
9117 case 5000: return GET_LOOPS (5000);
9118 case 5100: return GET_LOOPS (5100);
9119 case 5200: return GET_LOOPS (5200);
9120 case 5300: return GET_LOOPS (5300);
9121 case 5400: return GET_LOOPS (5400);
9122 case 5500: return GET_LOOPS (5500);
9123 case 5600: return GET_LOOPS (5600);
9124 case 5700: return GET_LOOPS (5700);
9125 case 5800: return GET_LOOPS (5800);
9126 case 6000: return GET_LOOPS (6000);
9127 case 6100: return GET_LOOPS (6100);
9128 case 6211: return GET_LOOPS (6211);
9129 case 6212: return GET_LOOPS (6212);
9130 case 6213: return GET_LOOPS (6213);
9131 case 6221: return GET_LOOPS (6221);
9132 case 6222: return GET_LOOPS (6222);
9133 case 6223: return GET_LOOPS (6223);
9134 case 6231: return GET_LOOPS (6231);
9135 case 6232: return GET_LOOPS (6232);
9136 case 6233: return GET_LOOPS (6233);
9137 case 6241: return GET_LOOPS (6241);
9138 case 6242: return GET_LOOPS (6242);
9139 case 6243: return GET_LOOPS (6243);
9140 case 6300: return GET_LOOPS (6300);
9141 case 6400: return GET_LOOPS (6400);
9142 case 6500: return GET_LOOPS (6500);
9143 case 6600: return GET_LOOPS (6600);
9144 case 6700: return GET_LOOPS (6700);
9145 case 6800: return GET_LOOPS (6800);
9146 case 6900: return GET_LOOPS (6900);
9147 case 7100: return GET_LOOPS (7100);
9148 case 7200: return GET_LOOPS (7200);
9149 case 7300: return GET_LOOPS (7300);
9150 case 7400: return GET_LOOPS (7400);
9151 case 7500: return GET_LOOPS (7500);
9152 case 7600: return GET_LOOPS (7600);
9153 case 7700: return GET_LOOPS (7700);
9154 case 7800: return GET_LOOPS (7800);
9155 case 7900: return GET_LOOPS (7900);
9156 case 8000: return GET_LOOPS (8000);
9157 case 8100: return GET_LOOPS (8100);
9158 case 8200: return GET_LOOPS (8200);
9159 case 8300: return GET_LOOPS (8300);
9160 case 8400: return GET_LOOPS (8400);
9161 case 8500: return GET_LOOPS (8500);
9162 case 8600: return GET_LOOPS (8600);
9163 case 8700: return GET_LOOPS (8700);
9164 case 8800: return GET_LOOPS (8800);
9165 case 8900: return GET_LOOPS (8900);
9166 case 9000: return GET_LOOPS (9000);
9167 case 9100: return GET_LOOPS (9100);
9168 case 9200: return GET_LOOPS (9200);
9169 case 9300: return GET_LOOPS (9300);
9170 case 9400: return GET_LOOPS (9400);
9171 case 9500: return GET_LOOPS (9500);
9172 case 9600: return GET_LOOPS (9600);
9173 case 9700: return GET_LOOPS (9700);
9174 case 9710: return GET_LOOPS (9710);
9175 case 9720: return GET_LOOPS (9720);
9176 case 9800: return GET_LOOPS (9800);
9177 case 9810: return GET_LOOPS (9810);
9178 case 9820: return GET_LOOPS (9820);
9179 case 9900: return GET_LOOPS (9900);
9180 case 10000: return GET_LOOPS (10000);
9181 case 10100: return GET_LOOPS (10100);
9182 case 10200: return GET_LOOPS (10200);
9183 case 10300: return GET_LOOPS (10300);
9184 case 10400: return GET_LOOPS (10400);
9185 case 10410: return GET_LOOPS (10410);
9186 case 10420: return GET_LOOPS (10420);
9187 case 10500: return GET_LOOPS (10500);
9188 case 10600: return GET_LOOPS (10600);
9189 case 10700: return GET_LOOPS (10700);
9190 case 10800: return GET_LOOPS (10800);
9191 case 10900: return GET_LOOPS (10900);
9192 case 11000: return GET_LOOPS (11000);
9193 case 11100: return GET_LOOPS (11100);
9194 case 11200: return GET_LOOPS (11200);
9195 case 11300: return GET_LOOPS (11300);
9196 case 11400: return GET_LOOPS (11400);
9197 case 11500: return GET_LOOPS (11500);
9198 case 11600: return GET_LOOPS (11600);
9199 case 11700: return GET_LOOPS (11700);
9200 case 11800: return GET_LOOPS (11800);
9201 case 11900: return GET_LOOPS (11900);
9202 case 12000: return GET_LOOPS (12000);
9203 case 12100: return GET_LOOPS (12100);
9204 case 12200: return GET_LOOPS (12200);
9205 case 12300: return GET_LOOPS (12300);
9206 case 12400: return GET_LOOPS (12400);
9207 case 12500: return GET_LOOPS (12500);
9208 case 12600: return GET_LOOPS (12600);
9209 case 12700: return GET_LOOPS (12700);
9210 case 12800: return GET_LOOPS (12800);
9211 case 12900: return GET_LOOPS (12900);
9212 }
9213
9214 return 0;
9215 }
9216
9217 /**
9218 * parser
9219 */
9220
9221 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9222 {
9223 char tmp[256];
9224
9225 if (salt_len > sizeof(tmp))
9226 {
9227 return UINT_MAX;
9228 }
9229
9230 memset (tmp, 0, sizeof (tmp));
9231 memcpy (tmp, in, salt_len);
9232
9233 if (data.opts_type & OPTS_TYPE_ST_HEX)
9234 {
9235 if ((salt_len % 2) == 0)
9236 {
9237 uint new_salt_len = salt_len / 2;
9238
9239 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9240 {
9241 char p0 = tmp[j + 0];
9242 char p1 = tmp[j + 1];
9243
9244 tmp[i] = hex_convert (p1) << 0;
9245 tmp[i] |= hex_convert (p0) << 4;
9246 }
9247
9248 salt_len = new_salt_len;
9249 }
9250 else
9251 {
9252 return UINT_MAX;
9253 }
9254 }
9255 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9256 {
9257 salt_len = base64_decode (base64_to_int, in, salt_len, tmp);
9258 }
9259
9260 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9261
9262 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9263 {
9264 if (salt_len < 20)
9265 {
9266 uint *tmp_uint = (uint *) tmp;
9267
9268 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9269 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9270 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9271 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9272 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9273 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9274 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9275 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9276 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9277 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9278
9279 salt_len = salt_len * 2;
9280 }
9281 else
9282 {
9283 return UINT_MAX;
9284 }
9285 }
9286
9287 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9288 {
9289 lowercase (tmp, salt_len);
9290 }
9291
9292 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9293 {
9294 uppercase (tmp, salt_len);
9295 }
9296
9297 uint len = salt_len;
9298
9299 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9300 {
9301 tmp[len++] = 0x80;
9302 }
9303
9304 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9305 {
9306 tmp[len++] = 0x01;
9307 }
9308
9309 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9310 {
9311 uint *tmp_uint = (uint *) tmp;
9312
9313 uint max = len / 4;
9314
9315 if (len % 4) max++;
9316
9317 for (uint i = 0; i < max; i++)
9318 {
9319 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9320 }
9321
9322 // Important: we may need to increase the length of memcpy since
9323 // we don't want to "loose" some swapped bytes (could happen if
9324 // they do not perfectly fit in the 4-byte blocks)
9325 // Memcpy does always copy the bytes in the BE order, but since
9326 // we swapped them, some important bytes could be in positions
9327 // we normally skip with the original len
9328
9329 if (len % 4) len += 4 - (len % 4);
9330 }
9331
9332 memcpy (out, tmp, len);
9333
9334 return (salt_len);
9335 }
9336
9337 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9338 {
9339 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9340
9341 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9342
9343 uint32_t *digest = (uint32_t *) hash_buf->digest;
9344
9345 salt_t *salt = hash_buf->salt;
9346
9347 memcpy ((char *) salt->salt_sign, input_buf, 6);
9348
9349 char *iter_pos = input_buf + 4;
9350
9351 salt->salt_iter = 1 << atoi (iter_pos);
9352
9353 char *salt_pos = strchr (iter_pos, '$');
9354
9355 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9356
9357 salt_pos++;
9358
9359 uint salt_len = 16;
9360
9361 salt->salt_len = salt_len;
9362
9363 char tmp_buf[100];
9364
9365 memset (tmp_buf, 0, sizeof (tmp_buf));
9366
9367 base64_decode (bf64_to_int, salt_pos, 22, tmp_buf);
9368
9369 char *salt_buf_ptr = (char *) salt->salt_buf;
9370
9371 memcpy (salt_buf_ptr, tmp_buf, 16);
9372
9373 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9374 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9375 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9376 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9377
9378 char *hash_pos = salt_pos + 22;
9379
9380 memset (tmp_buf, 0, sizeof (tmp_buf));
9381
9382 base64_decode (bf64_to_int, hash_pos, 31, tmp_buf);
9383
9384 memcpy (digest, tmp_buf, 24);
9385
9386 digest[0] = byte_swap_32 (digest[0]);
9387 digest[1] = byte_swap_32 (digest[1]);
9388 digest[2] = byte_swap_32 (digest[2]);
9389 digest[3] = byte_swap_32 (digest[3]);
9390 digest[4] = byte_swap_32 (digest[4]);
9391 digest[5] = byte_swap_32 (digest[5]);
9392
9393 digest[5] &= ~0xff; // its just 23 not 24 !
9394
9395 return (PARSER_OK);
9396 }
9397
9398 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9399 {
9400 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9401
9402 uint32_t *digest = (uint32_t *) hash_buf->digest;
9403
9404 char tmp_buf[100];
9405
9406 memset (tmp_buf, 0, sizeof (tmp_buf));
9407
9408 base64_decode (itoa64_to_int, input_buf, 43, tmp_buf);
9409
9410 memcpy (digest, tmp_buf, 32);
9411
9412 digest[0] = byte_swap_32 (digest[0]);
9413 digest[1] = byte_swap_32 (digest[1]);
9414 digest[2] = byte_swap_32 (digest[2]);
9415 digest[3] = byte_swap_32 (digest[3]);
9416 digest[4] = byte_swap_32 (digest[4]);
9417 digest[5] = byte_swap_32 (digest[5]);
9418 digest[6] = byte_swap_32 (digest[6]);
9419 digest[7] = byte_swap_32 (digest[7]);
9420
9421 digest[0] -= SHA256M_A;
9422 digest[1] -= SHA256M_B;
9423 digest[2] -= SHA256M_C;
9424 digest[3] -= SHA256M_D;
9425 digest[4] -= SHA256M_E;
9426 digest[5] -= SHA256M_F;
9427 digest[6] -= SHA256M_G;
9428 digest[7] -= SHA256M_H;
9429
9430 return (PARSER_OK);
9431 }
9432
9433 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9434 {
9435 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9436
9437 uint32_t *digest = (uint32_t *) hash_buf->digest;
9438
9439 digest[0] = hex_to_uint (&input_buf[ 0]);
9440 digest[1] = hex_to_uint (&input_buf[ 8]);
9441
9442 digest[0] = byte_swap_32 (digest[0]);
9443 digest[1] = byte_swap_32 (digest[1]);
9444
9445 uint tt;
9446
9447 IP (digest[0], digest[1], tt);
9448
9449 digest[0] = digest[0];
9450 digest[1] = digest[1];
9451 digest[2] = 0;
9452 digest[3] = 0;
9453
9454 return (PARSER_OK);
9455 }
9456
9457 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9458 {
9459 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9460
9461 uint32_t *digest = (uint32_t *) hash_buf->digest;
9462
9463 salt_t *salt = hash_buf->salt;
9464
9465 char *hash_pos = input_buf + 8;
9466
9467 digest[0] = hex_to_uint (&hash_pos[ 0]);
9468 digest[1] = hex_to_uint (&hash_pos[ 8]);
9469 digest[2] = hex_to_uint (&hash_pos[16]);
9470 digest[3] = hex_to_uint (&hash_pos[24]);
9471 digest[4] = hex_to_uint (&hash_pos[32]);
9472
9473 digest[0] -= SHA1M_A;
9474 digest[1] -= SHA1M_B;
9475 digest[2] -= SHA1M_C;
9476 digest[3] -= SHA1M_D;
9477 digest[4] -= SHA1M_E;
9478
9479 uint salt_len = 8;
9480
9481 char *salt_buf_ptr = (char *) salt->salt_buf;
9482
9483 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9484
9485 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9486
9487 salt->salt_len = salt_len;
9488
9489 return (PARSER_OK);
9490 }
9491
9492 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9493 {
9494 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9495
9496 uint64_t *digest = (uint64_t *) hash_buf->digest;
9497
9498 salt_t *salt = hash_buf->salt;
9499
9500 char *hash_pos = input_buf + 8;
9501
9502 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
9503 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
9504 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
9505 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
9506 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
9507 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
9508 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
9509 digest[7] = hex_to_uint64_t (&hash_pos[112]);
9510
9511 digest[0] -= SHA512M_A;
9512 digest[1] -= SHA512M_B;
9513 digest[2] -= SHA512M_C;
9514 digest[3] -= SHA512M_D;
9515 digest[4] -= SHA512M_E;
9516 digest[5] -= SHA512M_F;
9517 digest[6] -= SHA512M_G;
9518 digest[7] -= SHA512M_H;
9519
9520 uint salt_len = 8;
9521
9522 char *salt_buf_ptr = (char *) salt->salt_buf;
9523
9524 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9525
9526 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9527
9528 salt->salt_len = salt_len;
9529
9530 return (PARSER_OK);
9531 }
9532
9533 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9534 {
9535 if (data.opts_type & OPTS_TYPE_ST_HEX)
9536 {
9537 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9538 }
9539 else
9540 {
9541 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9542 }
9543
9544 uint32_t *digest = (uint32_t *) hash_buf->digest;
9545
9546 salt_t *salt = hash_buf->salt;
9547
9548 digest[0] = hex_to_uint (&input_buf[ 0]);
9549 digest[1] = hex_to_uint (&input_buf[ 8]);
9550 digest[2] = hex_to_uint (&input_buf[16]);
9551 digest[3] = hex_to_uint (&input_buf[24]);
9552
9553 digest[0] = byte_swap_32 (digest[0]);
9554 digest[1] = byte_swap_32 (digest[1]);
9555 digest[2] = byte_swap_32 (digest[2]);
9556 digest[3] = byte_swap_32 (digest[3]);
9557
9558 digest[0] -= MD5M_A;
9559 digest[1] -= MD5M_B;
9560 digest[2] -= MD5M_C;
9561 digest[3] -= MD5M_D;
9562
9563 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9564
9565 uint salt_len = input_len - 32 - 1;
9566
9567 char *salt_buf = input_buf + 32 + 1;
9568
9569 char *salt_buf_ptr = (char *) salt->salt_buf;
9570
9571 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9572
9573 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9574
9575 salt->salt_len = salt_len;
9576
9577 return (PARSER_OK);
9578 }
9579
9580 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9581 {
9582 if (data.opts_type & OPTS_TYPE_ST_HEX)
9583 {
9584 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9585 }
9586 else
9587 {
9588 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9589 }
9590
9591 // unscramble
9592
9593 char clean_input_buf[32];
9594
9595 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9596 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9597
9598 for (int i = 0, j = 0, k = 0; i < 30; i++)
9599 {
9600 if (i == pos[j])
9601 {
9602 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9603
9604 j++;
9605 }
9606 else
9607 {
9608 clean_input_buf[k] = input_buf[i];
9609
9610 k++;
9611 }
9612 }
9613
9614 // base64 decode
9615
9616 uint32_t *digest = (uint32_t *) hash_buf->digest;
9617
9618 salt_t *salt = hash_buf->salt;
9619
9620 char a, b, c, d, e, f;
9621
9622 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9623 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9624 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9625 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9626 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9627 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9628
9629 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9630 | (((d << 12) | (e << 6) | (f)) << 0);
9631
9632 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9633 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9634 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9635 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9636 e = base64_to_int (clean_input_buf[10] & 0x7f);
9637 f = base64_to_int (clean_input_buf[11] & 0x7f);
9638
9639 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9640 | (((d << 12) | (e << 6) | (f)) << 0);
9641
9642 a = base64_to_int (clean_input_buf[12] & 0x7f);
9643 b = base64_to_int (clean_input_buf[13] & 0x7f);
9644 c = base64_to_int (clean_input_buf[14] & 0x7f);
9645 d = base64_to_int (clean_input_buf[15] & 0x7f);
9646 e = base64_to_int (clean_input_buf[16] & 0x7f);
9647 f = base64_to_int (clean_input_buf[17] & 0x7f);
9648
9649 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9650 | (((d << 12) | (e << 6) | (f)) << 0);
9651
9652 a = base64_to_int (clean_input_buf[18] & 0x7f);
9653 b = base64_to_int (clean_input_buf[19] & 0x7f);
9654 c = base64_to_int (clean_input_buf[20] & 0x7f);
9655 d = base64_to_int (clean_input_buf[21] & 0x7f);
9656 e = base64_to_int (clean_input_buf[22] & 0x7f);
9657 f = base64_to_int (clean_input_buf[23] & 0x7f);
9658
9659 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
9660 | (((d << 12) | (e << 6) | (f)) << 0);
9661
9662 digest[0] = byte_swap_32 (digest[0]);
9663 digest[1] = byte_swap_32 (digest[1]);
9664 digest[2] = byte_swap_32 (digest[2]);
9665 digest[3] = byte_swap_32 (digest[3]);
9666
9667 digest[0] -= MD5M_A;
9668 digest[1] -= MD5M_B;
9669 digest[2] -= MD5M_C;
9670 digest[3] -= MD5M_D;
9671
9672 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
9673
9674 uint salt_len = input_len - 30 - 1;
9675
9676 char *salt_buf = input_buf + 30 + 1;
9677
9678 char *salt_buf_ptr = (char *) salt->salt_buf;
9679
9680 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9681
9682 // max. salt length: salt_buf[32] => 32 - 22 (":Administration Tools:") = 10
9683 if (salt_len > 10) return (PARSER_SALT_LENGTH);
9684
9685 salt->salt_len = salt_len;
9686
9687 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9688
9689 salt->salt_len += 22;
9690
9691 return (PARSER_OK);
9692 }
9693
9694 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9695 {
9696 if (data.opts_type & OPTS_TYPE_ST_HEX)
9697 {
9698 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9699 }
9700 else
9701 {
9702 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9703 }
9704
9705 uint32_t *digest = (uint32_t *) hash_buf->digest;
9706
9707 salt_t *salt = hash_buf->salt;
9708
9709 digest[0] = hex_to_uint (&input_buf[ 0]);
9710 digest[1] = hex_to_uint (&input_buf[ 8]);
9711 digest[2] = hex_to_uint (&input_buf[16]);
9712 digest[3] = hex_to_uint (&input_buf[24]);
9713 digest[4] = hex_to_uint (&input_buf[32]);
9714
9715 digest[0] -= SHA1M_A;
9716 digest[1] -= SHA1M_B;
9717 digest[2] -= SHA1M_C;
9718 digest[3] -= SHA1M_D;
9719 digest[4] -= SHA1M_E;
9720
9721 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9722
9723 uint salt_len = input_len - 40 - 1;
9724
9725 char *salt_buf = input_buf + 40 + 1;
9726
9727 char *salt_buf_ptr = (char *) salt->salt_buf;
9728
9729 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9730
9731 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9732
9733 salt->salt_len = salt_len;
9734
9735 return (PARSER_OK);
9736 }
9737
9738 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9739 {
9740 if (data.opts_type & OPTS_TYPE_ST_HEX)
9741 {
9742 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9743 }
9744 else
9745 {
9746 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9747 }
9748
9749 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9750
9751 char *iter_pos = input_buf + 6;
9752
9753 salt_t *salt = hash_buf->salt;
9754
9755 salt->salt_iter = atoi (iter_pos) - 1;
9756
9757 char *salt_pos = strchr (iter_pos, '#');
9758
9759 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9760
9761 salt_pos++;
9762
9763 char *digest_pos = strchr (salt_pos, '#');
9764
9765 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9766
9767 digest_pos++;
9768
9769 uint salt_len = digest_pos - salt_pos - 1;
9770
9771 uint32_t *digest = (uint32_t *) hash_buf->digest;
9772
9773 digest[0] = hex_to_uint (&digest_pos[ 0]);
9774 digest[1] = hex_to_uint (&digest_pos[ 8]);
9775 digest[2] = hex_to_uint (&digest_pos[16]);
9776 digest[3] = hex_to_uint (&digest_pos[24]);
9777
9778 char *salt_buf_ptr = (char *) salt->salt_buf;
9779
9780 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9781
9782 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9783
9784 salt->salt_len = salt_len;
9785
9786 return (PARSER_OK);
9787 }
9788
9789 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9790 {
9791 uint32_t *digest = (uint32_t *) hash_buf->digest;
9792
9793 salt_t *salt = hash_buf->salt;
9794
9795 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9796
9797 hccap_t in;
9798
9799 memcpy (&in, input_buf, input_len);
9800
9801 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9802
9803 memcpy (digest, in.keymic, 16);
9804
9805 /*
9806 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9807 The phrase "Pairwise key expansion"
9808 Access Point Address (Referred to as Authenticator Address AA)
9809 Supplicant Address (referred to as Supplicant Address SA)
9810 Access Point Nonce (referred to as Authenticator Anonce)
9811 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9812 */
9813
9814 uint salt_len = strlen (in.essid);
9815
9816 memcpy (salt->salt_buf, in.essid, salt_len);
9817
9818 salt->salt_len = salt_len;
9819
9820 salt->salt_iter = ROUNDS_WPA2 - 1;
9821
9822 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
9823
9824 memcpy (pke_ptr, "Pairwise key expansion", 23);
9825
9826 if (memcmp (in.mac1, in.mac2, 6) < 0)
9827 {
9828 memcpy (pke_ptr + 23, in.mac1, 6);
9829 memcpy (pke_ptr + 29, in.mac2, 6);
9830 }
9831 else
9832 {
9833 memcpy (pke_ptr + 23, in.mac2, 6);
9834 memcpy (pke_ptr + 29, in.mac1, 6);
9835 }
9836
9837 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
9838 {
9839 memcpy (pke_ptr + 35, in.nonce1, 32);
9840 memcpy (pke_ptr + 67, in.nonce2, 32);
9841 }
9842 else
9843 {
9844 memcpy (pke_ptr + 35, in.nonce2, 32);
9845 memcpy (pke_ptr + 67, in.nonce1, 32);
9846 }
9847
9848 for (int i = 0; i < 25; i++)
9849 {
9850 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
9851 }
9852
9853 wpa->keyver = in.keyver;
9854
9855 if (wpa->keyver > 255)
9856 {
9857 log_info ("ATTENTION!");
9858 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
9859 log_info (" This could be due to a recent aircrack-ng bug.");
9860 log_info (" The key version was automatically reset to a reasonable value.");
9861 log_info ("");
9862
9863 wpa->keyver &= 0xff;
9864 }
9865
9866 wpa->eapol_size = in.eapol_size;
9867
9868 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
9869
9870 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
9871
9872 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
9873
9874 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
9875
9876 if (wpa->keyver == 1)
9877 {
9878 // nothing to do
9879 }
9880 else
9881 {
9882 digest[0] = byte_swap_32 (digest[0]);
9883 digest[1] = byte_swap_32 (digest[1]);
9884 digest[2] = byte_swap_32 (digest[2]);
9885 digest[3] = byte_swap_32 (digest[3]);
9886
9887 for (int i = 0; i < 64; i++)
9888 {
9889 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
9890 }
9891 }
9892
9893 salt->salt_buf[10] = digest[1];
9894 salt->salt_buf[11] = digest[2];
9895
9896 return (PARSER_OK);
9897 }
9898
9899 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9900 {
9901 uint32_t *digest = (uint32_t *) hash_buf->digest;
9902
9903 salt_t *salt = hash_buf->salt;
9904
9905 if (input_len == 0)
9906 {
9907 log_error ("Password Safe v2 container not specified");
9908
9909 exit (-1);
9910 }
9911
9912 FILE *fp = fopen (input_buf, "rb");
9913
9914 if (fp == NULL)
9915 {
9916 log_error ("%s: %s", input_buf, strerror (errno));
9917
9918 exit (-1);
9919 }
9920
9921 typedef struct
9922 {
9923 uint32_t random[2];
9924 uint32_t hash[5];
9925 uint32_t salt[5]; // unused, but makes better valid check
9926 uint32_t iv[2]; // unused, but makes better valid check
9927
9928 } psafe2_hdr;
9929
9930 psafe2_hdr buf;
9931
9932 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
9933
9934 fclose (fp);
9935
9936 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
9937
9938 salt->salt_buf[0] = buf.random[0];
9939 salt->salt_buf[1] = buf.random[1];
9940
9941 salt->salt_len = 8;
9942 salt->salt_iter = 1000;
9943
9944 digest[0] = byte_swap_32 (buf.hash[0]);
9945 digest[1] = byte_swap_32 (buf.hash[1]);
9946 digest[2] = byte_swap_32 (buf.hash[2]);
9947 digest[3] = byte_swap_32 (buf.hash[3]);
9948 digest[4] = byte_swap_32 (buf.hash[4]);
9949
9950 return (PARSER_OK);
9951 }
9952
9953 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9954 {
9955 uint32_t *digest = (uint32_t *) hash_buf->digest;
9956
9957 salt_t *salt = hash_buf->salt;
9958
9959 if (input_len == 0)
9960 {
9961 log_error (".psafe3 not specified");
9962
9963 exit (-1);
9964 }
9965
9966 FILE *fp = fopen (input_buf, "rb");
9967
9968 if (fp == NULL)
9969 {
9970 log_error ("%s: %s", input_buf, strerror (errno));
9971
9972 exit (-1);
9973 }
9974
9975 psafe3_t in;
9976
9977 int n = fread (&in, sizeof (psafe3_t), 1, fp);
9978
9979 fclose (fp);
9980
9981 data.hashfile = input_buf; // we will need this in case it gets cracked
9982
9983 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
9984
9985 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
9986
9987 salt->salt_iter = in.iterations + 1;
9988
9989 salt->salt_buf[0] = in.salt_buf[0];
9990 salt->salt_buf[1] = in.salt_buf[1];
9991 salt->salt_buf[2] = in.salt_buf[2];
9992 salt->salt_buf[3] = in.salt_buf[3];
9993 salt->salt_buf[4] = in.salt_buf[4];
9994 salt->salt_buf[5] = in.salt_buf[5];
9995 salt->salt_buf[6] = in.salt_buf[6];
9996 salt->salt_buf[7] = in.salt_buf[7];
9997
9998 salt->salt_len = 32;
9999
10000 digest[0] = in.hash_buf[0];
10001 digest[1] = in.hash_buf[1];
10002 digest[2] = in.hash_buf[2];
10003 digest[3] = in.hash_buf[3];
10004 digest[4] = in.hash_buf[4];
10005 digest[5] = in.hash_buf[5];
10006 digest[6] = in.hash_buf[6];
10007 digest[7] = in.hash_buf[7];
10008
10009 digest[0] = byte_swap_32 (digest[0]);
10010 digest[1] = byte_swap_32 (digest[1]);
10011 digest[2] = byte_swap_32 (digest[2]);
10012 digest[3] = byte_swap_32 (digest[3]);
10013 digest[4] = byte_swap_32 (digest[4]);
10014 digest[5] = byte_swap_32 (digest[5]);
10015 digest[6] = byte_swap_32 (digest[6]);
10016 digest[7] = byte_swap_32 (digest[7]);
10017
10018 return (PARSER_OK);
10019 }
10020
10021 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10022 {
10023 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10024
10025 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10026
10027 uint32_t *digest = (uint32_t *) hash_buf->digest;
10028
10029 salt_t *salt = hash_buf->salt;
10030
10031 char *iter_pos = input_buf + 3;
10032
10033 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10034
10035 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10036
10037 memcpy ((char *) salt->salt_sign, input_buf, 4);
10038
10039 salt->salt_iter = salt_iter;
10040
10041 char *salt_pos = iter_pos + 1;
10042
10043 uint salt_len = 8;
10044
10045 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10046
10047 salt->salt_len = salt_len;
10048
10049 char *hash_pos = salt_pos + salt_len;
10050
10051 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10052
10053 return (PARSER_OK);
10054 }
10055
10056 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10057 {
10058 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10059
10060 uint32_t *digest = (uint32_t *) hash_buf->digest;
10061
10062 salt_t *salt = hash_buf->salt;
10063
10064 char *salt_pos = input_buf + 3;
10065
10066 uint iterations_len = 0;
10067
10068 if (memcmp (salt_pos, "rounds=", 7) == 0)
10069 {
10070 salt_pos += 7;
10071
10072 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10073
10074 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10075 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10076
10077 salt_pos[0] = 0x0;
10078
10079 salt->salt_iter = atoi (salt_pos - iterations_len);
10080
10081 salt_pos += 1;
10082
10083 iterations_len += 8;
10084 }
10085 else
10086 {
10087 salt->salt_iter = ROUNDS_MD5CRYPT;
10088 }
10089
10090 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10091
10092 char *hash_pos = strchr (salt_pos, '$');
10093
10094 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10095
10096 uint salt_len = hash_pos - salt_pos;
10097
10098 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10099
10100 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10101
10102 salt->salt_len = salt_len;
10103
10104 hash_pos++;
10105
10106 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10107
10108 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10109
10110 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10111
10112 return (PARSER_OK);
10113 }
10114
10115 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10116 {
10117 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10118
10119 uint32_t *digest = (uint32_t *) hash_buf->digest;
10120
10121 salt_t *salt = hash_buf->salt;
10122
10123 char *salt_pos = input_buf + 6;
10124
10125 uint iterations_len = 0;
10126
10127 if (memcmp (salt_pos, "rounds=", 7) == 0)
10128 {
10129 salt_pos += 7;
10130
10131 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10132
10133 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10134 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10135
10136 salt_pos[0] = 0x0;
10137
10138 salt->salt_iter = atoi (salt_pos - iterations_len);
10139
10140 salt_pos += 1;
10141
10142 iterations_len += 8;
10143 }
10144 else
10145 {
10146 salt->salt_iter = ROUNDS_MD5CRYPT;
10147 }
10148
10149 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10150
10151 char *hash_pos = strchr (salt_pos, '$');
10152
10153 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10154
10155 uint salt_len = hash_pos - salt_pos;
10156
10157 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10158
10159 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10160
10161 salt->salt_len = salt_len;
10162
10163 hash_pos++;
10164
10165 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10166
10167 return (PARSER_OK);
10168 }
10169
10170 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10171 {
10172 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10173
10174 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10175
10176 uint32_t *digest = (uint32_t *) hash_buf->digest;
10177
10178 salt_t *salt = hash_buf->salt;
10179
10180 char *salt_pos = input_buf + 14;
10181
10182 char *hash_pos = strchr (salt_pos, '*');
10183
10184 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10185
10186 hash_pos++;
10187
10188 uint salt_len = hash_pos - salt_pos - 1;
10189
10190 char *salt_buf_ptr = (char *) salt->salt_buf;
10191
10192 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10193
10194 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10195
10196 salt->salt_len = salt_len;
10197
10198 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
10199
10200 base64_decode (base64_to_int, hash_pos, 27, tmp_buf);
10201
10202 memcpy (digest, tmp_buf, 20);
10203
10204 digest[0] = byte_swap_32 (digest[0]);
10205 digest[1] = byte_swap_32 (digest[1]);
10206 digest[2] = byte_swap_32 (digest[2]);
10207 digest[3] = byte_swap_32 (digest[3]);
10208 digest[4] = byte_swap_32 (digest[4]);
10209
10210 digest[0] -= SHA1M_A;
10211 digest[1] -= SHA1M_B;
10212 digest[2] -= SHA1M_C;
10213 digest[3] -= SHA1M_D;
10214 digest[4] -= SHA1M_E;
10215
10216 return (PARSER_OK);
10217 }
10218
10219 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10220 {
10221 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10222
10223 unsigned char c12 = itoa64_to_int (input_buf[12]);
10224
10225 if (c12 & 3) return (PARSER_HASH_VALUE);
10226
10227 uint32_t *digest = (uint32_t *) hash_buf->digest;
10228
10229 salt_t *salt = hash_buf->salt;
10230
10231 // for ascii_digest
10232 salt->salt_sign[0] = input_buf[0];
10233 salt->salt_sign[1] = input_buf[1];
10234
10235 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10236 | itoa64_to_int (input_buf[1]) << 6;
10237
10238 salt->salt_len = 2;
10239
10240 char tmp_buf[100];
10241
10242 memset (tmp_buf, 0, sizeof (tmp_buf));
10243
10244 base64_decode (itoa64_to_int, input_buf + 2, 11, tmp_buf);
10245
10246 memcpy (digest, tmp_buf, 8);
10247
10248 uint tt;
10249
10250 IP (digest[0], digest[1], tt);
10251
10252 digest[2] = 0;
10253 digest[3] = 0;
10254
10255 return (PARSER_OK);
10256 }
10257
10258 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10259 {
10260 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10261
10262 uint32_t *digest = (uint32_t *) hash_buf->digest;
10263
10264 digest[0] = hex_to_uint (&input_buf[ 0]);
10265 digest[1] = hex_to_uint (&input_buf[ 8]);
10266 digest[2] = hex_to_uint (&input_buf[16]);
10267 digest[3] = hex_to_uint (&input_buf[24]);
10268
10269 digest[0] = byte_swap_32 (digest[0]);
10270 digest[1] = byte_swap_32 (digest[1]);
10271 digest[2] = byte_swap_32 (digest[2]);
10272 digest[3] = byte_swap_32 (digest[3]);
10273
10274 digest[0] -= MD4M_A;
10275 digest[1] -= MD4M_B;
10276 digest[2] -= MD4M_C;
10277 digest[3] -= MD4M_D;
10278
10279 return (PARSER_OK);
10280 }
10281
10282 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10283 {
10284 if (data.opts_type & OPTS_TYPE_ST_HEX)
10285 {
10286 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10287 }
10288 else
10289 {
10290 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10291 }
10292
10293 uint32_t *digest = (uint32_t *) hash_buf->digest;
10294
10295 salt_t *salt = hash_buf->salt;
10296
10297 digest[0] = hex_to_uint (&input_buf[ 0]);
10298 digest[1] = hex_to_uint (&input_buf[ 8]);
10299 digest[2] = hex_to_uint (&input_buf[16]);
10300 digest[3] = hex_to_uint (&input_buf[24]);
10301
10302 digest[0] = byte_swap_32 (digest[0]);
10303 digest[1] = byte_swap_32 (digest[1]);
10304 digest[2] = byte_swap_32 (digest[2]);
10305 digest[3] = byte_swap_32 (digest[3]);
10306
10307 digest[0] -= MD4M_A;
10308 digest[1] -= MD4M_B;
10309 digest[2] -= MD4M_C;
10310 digest[3] -= MD4M_D;
10311
10312 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10313
10314 uint salt_len = input_len - 32 - 1;
10315
10316 char *salt_buf = input_buf + 32 + 1;
10317
10318 char *salt_buf_ptr = (char *) salt->salt_buf;
10319
10320 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10321
10322 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10323
10324 salt->salt_len = salt_len;
10325
10326 return (PARSER_OK);
10327 }
10328
10329 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10330 {
10331 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10332
10333 uint32_t *digest = (uint32_t *) hash_buf->digest;
10334
10335 digest[0] = hex_to_uint (&input_buf[ 0]);
10336 digest[1] = hex_to_uint (&input_buf[ 8]);
10337 digest[2] = hex_to_uint (&input_buf[16]);
10338 digest[3] = hex_to_uint (&input_buf[24]);
10339
10340 digest[0] = byte_swap_32 (digest[0]);
10341 digest[1] = byte_swap_32 (digest[1]);
10342 digest[2] = byte_swap_32 (digest[2]);
10343 digest[3] = byte_swap_32 (digest[3]);
10344
10345 digest[0] -= MD5M_A;
10346 digest[1] -= MD5M_B;
10347 digest[2] -= MD5M_C;
10348 digest[3] -= MD5M_D;
10349
10350 return (PARSER_OK);
10351 }
10352
10353 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10354 {
10355 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10356
10357 uint32_t *digest = (uint32_t *) hash_buf->digest;
10358
10359 digest[0] = hex_to_uint (&input_buf[0]);
10360 digest[1] = hex_to_uint (&input_buf[8]);
10361 digest[2] = 0;
10362 digest[3] = 0;
10363
10364 digest[0] = byte_swap_32 (digest[0]);
10365 digest[1] = byte_swap_32 (digest[1]);
10366
10367 return (PARSER_OK);
10368 }
10369
10370 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10371 {
10372 if (data.opts_type & OPTS_TYPE_ST_HEX)
10373 {
10374 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10375 }
10376 else
10377 {
10378 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10379 }
10380
10381 uint32_t *digest = (uint32_t *) hash_buf->digest;
10382
10383 salt_t *salt = hash_buf->salt;
10384
10385 digest[0] = hex_to_uint (&input_buf[ 0]);
10386 digest[1] = hex_to_uint (&input_buf[ 8]);
10387 digest[2] = hex_to_uint (&input_buf[16]);
10388 digest[3] = hex_to_uint (&input_buf[24]);
10389
10390 digest[0] = byte_swap_32 (digest[0]);
10391 digest[1] = byte_swap_32 (digest[1]);
10392 digest[2] = byte_swap_32 (digest[2]);
10393 digest[3] = byte_swap_32 (digest[3]);
10394
10395 digest[0] -= MD5M_A;
10396 digest[1] -= MD5M_B;
10397 digest[2] -= MD5M_C;
10398 digest[3] -= MD5M_D;
10399
10400 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10401
10402 uint salt_len = input_len - 32 - 1;
10403
10404 char *salt_buf = input_buf + 32 + 1;
10405
10406 char *salt_buf_ptr = (char *) salt->salt_buf;
10407
10408 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10409
10410 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10411
10412 salt->salt_len = salt_len;
10413
10414 return (PARSER_OK);
10415 }
10416
10417 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10418 {
10419 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10420
10421 uint32_t *digest = (uint32_t *) hash_buf->digest;
10422
10423 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10424 | itoa64_to_int (input_buf[ 1]) << 6
10425 | itoa64_to_int (input_buf[ 2]) << 12
10426 | itoa64_to_int (input_buf[ 3]) << 18;
10427 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10428 | itoa64_to_int (input_buf[ 5]) << 6
10429 | itoa64_to_int (input_buf[ 6]) << 12
10430 | itoa64_to_int (input_buf[ 7]) << 18;
10431 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10432 | itoa64_to_int (input_buf[ 9]) << 6
10433 | itoa64_to_int (input_buf[10]) << 12
10434 | itoa64_to_int (input_buf[11]) << 18;
10435 digest[3] = itoa64_to_int (input_buf[12]) << 0
10436 | itoa64_to_int (input_buf[13]) << 6
10437 | itoa64_to_int (input_buf[14]) << 12
10438 | itoa64_to_int (input_buf[15]) << 18;
10439
10440 digest[0] -= MD5M_A;
10441 digest[1] -= MD5M_B;
10442 digest[2] -= MD5M_C;
10443 digest[3] -= MD5M_D;
10444
10445 digest[0] &= 0x00ffffff;
10446 digest[1] &= 0x00ffffff;
10447 digest[2] &= 0x00ffffff;
10448 digest[3] &= 0x00ffffff;
10449
10450 return (PARSER_OK);
10451 }
10452
10453 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10454 {
10455 if (data.opts_type & OPTS_TYPE_ST_HEX)
10456 {
10457 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10458 }
10459 else
10460 {
10461 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10462 }
10463
10464 uint32_t *digest = (uint32_t *) hash_buf->digest;
10465
10466 salt_t *salt = hash_buf->salt;
10467
10468 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10469 | itoa64_to_int (input_buf[ 1]) << 6
10470 | itoa64_to_int (input_buf[ 2]) << 12
10471 | itoa64_to_int (input_buf[ 3]) << 18;
10472 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10473 | itoa64_to_int (input_buf[ 5]) << 6
10474 | itoa64_to_int (input_buf[ 6]) << 12
10475 | itoa64_to_int (input_buf[ 7]) << 18;
10476 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10477 | itoa64_to_int (input_buf[ 9]) << 6
10478 | itoa64_to_int (input_buf[10]) << 12
10479 | itoa64_to_int (input_buf[11]) << 18;
10480 digest[3] = itoa64_to_int (input_buf[12]) << 0
10481 | itoa64_to_int (input_buf[13]) << 6
10482 | itoa64_to_int (input_buf[14]) << 12
10483 | itoa64_to_int (input_buf[15]) << 18;
10484
10485 digest[0] -= MD5M_A;
10486 digest[1] -= MD5M_B;
10487 digest[2] -= MD5M_C;
10488 digest[3] -= MD5M_D;
10489
10490 digest[0] &= 0x00ffffff;
10491 digest[1] &= 0x00ffffff;
10492 digest[2] &= 0x00ffffff;
10493 digest[3] &= 0x00ffffff;
10494
10495 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10496
10497 uint salt_len = input_len - 16 - 1;
10498
10499 char *salt_buf = input_buf + 16 + 1;
10500
10501 char *salt_buf_ptr = (char *) salt->salt_buf;
10502
10503 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10504
10505 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10506
10507 salt->salt_len = salt_len;
10508
10509 return (PARSER_OK);
10510 }
10511
10512 void transform_netntlmv1_key (const uint8_t *nthash, uint8_t *key)
10513 {
10514 key[0] = (nthash[0] >> 0);
10515 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10516 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10517 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10518 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10519 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10520 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10521 key[7] = (nthash[6] << 1);
10522
10523 key[0] |= 0x01;
10524 key[1] |= 0x01;
10525 key[2] |= 0x01;
10526 key[3] |= 0x01;
10527 key[4] |= 0x01;
10528 key[5] |= 0x01;
10529 key[6] |= 0x01;
10530 key[7] |= 0x01;
10531 }
10532
10533 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10534 {
10535 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10536
10537 uint32_t *digest = (uint32_t *) hash_buf->digest;
10538
10539 salt_t *salt = hash_buf->salt;
10540
10541 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10542
10543 /**
10544 * parse line
10545 */
10546
10547 char *user_pos = input_buf;
10548
10549 char *unused_pos = strchr (user_pos, ':');
10550
10551 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10552
10553 uint user_len = unused_pos - user_pos;
10554
10555 if (user_len > 60) return (PARSER_SALT_LENGTH);
10556
10557 unused_pos++;
10558
10559 char *domain_pos = strchr (unused_pos, ':');
10560
10561 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10562
10563 uint unused_len = domain_pos - unused_pos;
10564
10565 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10566
10567 domain_pos++;
10568
10569 char *srvchall_pos = strchr (domain_pos, ':');
10570
10571 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10572
10573 uint domain_len = srvchall_pos - domain_pos;
10574
10575 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10576
10577 srvchall_pos++;
10578
10579 char *hash_pos = strchr (srvchall_pos, ':');
10580
10581 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10582
10583 uint srvchall_len = hash_pos - srvchall_pos;
10584
10585 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10586
10587 hash_pos++;
10588
10589 char *clichall_pos = strchr (hash_pos, ':');
10590
10591 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10592
10593 uint hash_len = clichall_pos - hash_pos;
10594
10595 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10596
10597 clichall_pos++;
10598
10599 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10600
10601 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10602
10603 /**
10604 * store some data for later use
10605 */
10606
10607 netntlm->user_len = user_len * 2;
10608 netntlm->domain_len = domain_len * 2;
10609 netntlm->srvchall_len = srvchall_len / 2;
10610 netntlm->clichall_len = clichall_len / 2;
10611
10612 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10613 char *chall_ptr = (char *) netntlm->chall_buf;
10614
10615 /**
10616 * handle username and domainname
10617 */
10618
10619 for (uint i = 0; i < user_len; i++)
10620 {
10621 *userdomain_ptr++ = user_pos[i];
10622 *userdomain_ptr++ = 0;
10623 }
10624
10625 for (uint i = 0; i < domain_len; i++)
10626 {
10627 *userdomain_ptr++ = domain_pos[i];
10628 *userdomain_ptr++ = 0;
10629 }
10630
10631 /**
10632 * handle server challenge encoding
10633 */
10634
10635 for (uint i = 0; i < srvchall_len; i += 2)
10636 {
10637 const char p0 = srvchall_pos[i + 0];
10638 const char p1 = srvchall_pos[i + 1];
10639
10640 *chall_ptr++ = hex_convert (p1) << 0
10641 | hex_convert (p0) << 4;
10642 }
10643
10644 /**
10645 * handle client challenge encoding
10646 */
10647
10648 for (uint i = 0; i < clichall_len; i += 2)
10649 {
10650 const char p0 = clichall_pos[i + 0];
10651 const char p1 = clichall_pos[i + 1];
10652
10653 *chall_ptr++ = hex_convert (p1) << 0
10654 | hex_convert (p0) << 4;
10655 }
10656
10657 /**
10658 * store data
10659 */
10660
10661 char *salt_buf_ptr = (char *) salt->salt_buf;
10662
10663 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10664
10665 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10666
10667 salt->salt_len = salt_len;
10668
10669 digest[0] = hex_to_uint (&hash_pos[ 0]);
10670 digest[1] = hex_to_uint (&hash_pos[ 8]);
10671 digest[2] = hex_to_uint (&hash_pos[16]);
10672 digest[3] = hex_to_uint (&hash_pos[24]);
10673
10674 digest[0] = byte_swap_32 (digest[0]);
10675 digest[1] = byte_swap_32 (digest[1]);
10676 digest[2] = byte_swap_32 (digest[2]);
10677 digest[3] = byte_swap_32 (digest[3]);
10678
10679 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10680
10681 uint digest_tmp[2];
10682
10683 digest_tmp[0] = hex_to_uint (&hash_pos[32]);
10684 digest_tmp[1] = hex_to_uint (&hash_pos[40]);
10685
10686 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10687 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10688
10689 /* special case 2: ESS */
10690
10691 if (srvchall_len == 48)
10692 {
10693 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10694 {
10695 uint w[16];
10696
10697 w[ 0] = netntlm->chall_buf[6];
10698 w[ 1] = netntlm->chall_buf[7];
10699 w[ 2] = netntlm->chall_buf[0];
10700 w[ 3] = netntlm->chall_buf[1];
10701 w[ 4] = 0x80;
10702 w[ 5] = 0;
10703 w[ 6] = 0;
10704 w[ 7] = 0;
10705 w[ 8] = 0;
10706 w[ 9] = 0;
10707 w[10] = 0;
10708 w[11] = 0;
10709 w[12] = 0;
10710 w[13] = 0;
10711 w[14] = 16 * 8;
10712 w[15] = 0;
10713
10714 uint dgst[4];
10715
10716 dgst[0] = MAGIC_A;
10717 dgst[1] = MAGIC_B;
10718 dgst[2] = MAGIC_C;
10719 dgst[3] = MAGIC_D;
10720
10721 md5_64 (w, dgst);
10722
10723 salt->salt_buf[0] = dgst[0];
10724 salt->salt_buf[1] = dgst[1];
10725 }
10726 }
10727
10728 /* precompute netntlmv1 exploit start */
10729
10730 for (uint i = 0; i < 0x10000; i++)
10731 {
10732 uint key_md4[2] = { i, 0 };
10733 uint key_des[2] = { 0, 0 };
10734
10735 transform_netntlmv1_key ((uint8_t *) key_md4, (uint8_t *) key_des);
10736
10737 uint Kc[16];
10738 uint Kd[16];
10739
10740 _des_keysetup (key_des, Kc, Kd, c_skb);
10741
10742 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10743
10744 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10745
10746 if (data3[0] != digest_tmp[0]) continue;
10747 if (data3[1] != digest_tmp[1]) continue;
10748
10749 salt->salt_buf[2] = i;
10750
10751 salt->salt_len = 24;
10752
10753 break;
10754 }
10755
10756 salt->salt_buf_pc[0] = digest_tmp[0];
10757 salt->salt_buf_pc[1] = digest_tmp[1];
10758
10759 /* precompute netntlmv1 exploit stop */
10760
10761 uint32_t tt;
10762
10763 IP (digest[0], digest[1], tt);
10764 IP (digest[2], digest[3], tt);
10765
10766 digest[0] = ROTATE_RIGHT (digest[0], 29);
10767 digest[1] = ROTATE_RIGHT (digest[1], 29);
10768 digest[2] = ROTATE_RIGHT (digest[2], 29);
10769 digest[3] = ROTATE_RIGHT (digest[3], 29);
10770
10771 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10772
10773 salt->salt_buf[0] = ROTATE_LEFT (salt->salt_buf[0], 3);
10774 salt->salt_buf[1] = ROTATE_LEFT (salt->salt_buf[1], 3);
10775
10776 return (PARSER_OK);
10777 }
10778
10779 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10780 {
10781 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10782
10783 uint32_t *digest = (uint32_t *) hash_buf->digest;
10784
10785 salt_t *salt = hash_buf->salt;
10786
10787 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10788
10789 /**
10790 * parse line
10791 */
10792
10793 char *user_pos = input_buf;
10794
10795 char *unused_pos = strchr (user_pos, ':');
10796
10797 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10798
10799 uint user_len = unused_pos - user_pos;
10800
10801 if (user_len > 60) return (PARSER_SALT_LENGTH);
10802
10803 unused_pos++;
10804
10805 char *domain_pos = strchr (unused_pos, ':');
10806
10807 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10808
10809 uint unused_len = domain_pos - unused_pos;
10810
10811 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10812
10813 domain_pos++;
10814
10815 char *srvchall_pos = strchr (domain_pos, ':');
10816
10817 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10818
10819 uint domain_len = srvchall_pos - domain_pos;
10820
10821 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10822
10823 srvchall_pos++;
10824
10825 char *hash_pos = strchr (srvchall_pos, ':');
10826
10827 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10828
10829 uint srvchall_len = hash_pos - srvchall_pos;
10830
10831 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
10832
10833 hash_pos++;
10834
10835 char *clichall_pos = strchr (hash_pos, ':');
10836
10837 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10838
10839 uint hash_len = clichall_pos - hash_pos;
10840
10841 if (hash_len != 32) return (PARSER_HASH_LENGTH);
10842
10843 clichall_pos++;
10844
10845 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10846
10847 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
10848
10849 if (clichall_len % 2) return (PARSER_SALT_VALUE);
10850
10851 /**
10852 * store some data for later use
10853 */
10854
10855 netntlm->user_len = user_len * 2;
10856 netntlm->domain_len = domain_len * 2;
10857 netntlm->srvchall_len = srvchall_len / 2;
10858 netntlm->clichall_len = clichall_len / 2;
10859
10860 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10861 char *chall_ptr = (char *) netntlm->chall_buf;
10862
10863 /**
10864 * handle username and domainname
10865 */
10866
10867 for (uint i = 0; i < user_len; i++)
10868 {
10869 *userdomain_ptr++ = toupper (user_pos[i]);
10870 *userdomain_ptr++ = 0;
10871 }
10872
10873 for (uint i = 0; i < domain_len; i++)
10874 {
10875 *userdomain_ptr++ = domain_pos[i];
10876 *userdomain_ptr++ = 0;
10877 }
10878
10879 *userdomain_ptr++ = 0x80;
10880
10881 /**
10882 * handle server challenge encoding
10883 */
10884
10885 for (uint i = 0; i < srvchall_len; i += 2)
10886 {
10887 const char p0 = srvchall_pos[i + 0];
10888 const char p1 = srvchall_pos[i + 1];
10889
10890 *chall_ptr++ = hex_convert (p1) << 0
10891 | hex_convert (p0) << 4;
10892 }
10893
10894 /**
10895 * handle client challenge encoding
10896 */
10897
10898 for (uint i = 0; i < clichall_len; i += 2)
10899 {
10900 const char p0 = clichall_pos[i + 0];
10901 const char p1 = clichall_pos[i + 1];
10902
10903 *chall_ptr++ = hex_convert (p1) << 0
10904 | hex_convert (p0) << 4;
10905 }
10906
10907 *chall_ptr++ = 0x80;
10908
10909 /**
10910 * handle hash itself
10911 */
10912
10913 digest[0] = hex_to_uint (&hash_pos[ 0]);
10914 digest[1] = hex_to_uint (&hash_pos[ 8]);
10915 digest[2] = hex_to_uint (&hash_pos[16]);
10916 digest[3] = hex_to_uint (&hash_pos[24]);
10917
10918 digest[0] = byte_swap_32 (digest[0]);
10919 digest[1] = byte_swap_32 (digest[1]);
10920 digest[2] = byte_swap_32 (digest[2]);
10921 digest[3] = byte_swap_32 (digest[3]);
10922
10923 /**
10924 * reuse challange data as salt_buf, its the buffer that is most likely unique
10925 */
10926
10927 salt->salt_buf[0] = 0;
10928 salt->salt_buf[1] = 0;
10929 salt->salt_buf[2] = 0;
10930 salt->salt_buf[3] = 0;
10931 salt->salt_buf[4] = 0;
10932 salt->salt_buf[5] = 0;
10933 salt->salt_buf[6] = 0;
10934 salt->salt_buf[7] = 0;
10935
10936 uint *uptr;
10937
10938 uptr = (uint *) netntlm->userdomain_buf;
10939
10940 for (uint i = 0; i < 16; i += 16)
10941 {
10942 md5_64 (uptr, salt->salt_buf);
10943 }
10944
10945 uptr = (uint *) netntlm->chall_buf;
10946
10947 for (uint i = 0; i < 256; i += 16)
10948 {
10949 md5_64 (uptr, salt->salt_buf);
10950 }
10951
10952 salt->salt_len = 16;
10953
10954 return (PARSER_OK);
10955 }
10956
10957 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10958 {
10959 if (data.opts_type & OPTS_TYPE_ST_HEX)
10960 {
10961 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
10962 }
10963 else
10964 {
10965 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
10966 }
10967
10968 uint32_t *digest = (uint32_t *) hash_buf->digest;
10969
10970 salt_t *salt = hash_buf->salt;
10971
10972 digest[0] = hex_to_uint (&input_buf[ 0]);
10973 digest[1] = hex_to_uint (&input_buf[ 8]);
10974 digest[2] = hex_to_uint (&input_buf[16]);
10975 digest[3] = hex_to_uint (&input_buf[24]);
10976
10977 digest[0] = byte_swap_32 (digest[0]);
10978 digest[1] = byte_swap_32 (digest[1]);
10979 digest[2] = byte_swap_32 (digest[2]);
10980 digest[3] = byte_swap_32 (digest[3]);
10981
10982 digest[0] -= MD5M_A;
10983 digest[1] -= MD5M_B;
10984 digest[2] -= MD5M_C;
10985 digest[3] -= MD5M_D;
10986
10987 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10988
10989 uint salt_len = input_len - 32 - 1;
10990
10991 char *salt_buf = input_buf + 32 + 1;
10992
10993 char *salt_buf_ptr = (char *) salt->salt_buf;
10994
10995 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10996
10997 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10998
10999 salt->salt_len = salt_len;
11000
11001 return (PARSER_OK);
11002 }
11003
11004 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11005 {
11006 if (data.opts_type & OPTS_TYPE_ST_HEX)
11007 {
11008 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11009 }
11010 else
11011 {
11012 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11013 }
11014
11015 uint32_t *digest = (uint32_t *) hash_buf->digest;
11016
11017 salt_t *salt = hash_buf->salt;
11018
11019 digest[0] = hex_to_uint (&input_buf[ 0]);
11020 digest[1] = hex_to_uint (&input_buf[ 8]);
11021 digest[2] = hex_to_uint (&input_buf[16]);
11022 digest[3] = hex_to_uint (&input_buf[24]);
11023
11024 digest[0] = byte_swap_32 (digest[0]);
11025 digest[1] = byte_swap_32 (digest[1]);
11026 digest[2] = byte_swap_32 (digest[2]);
11027 digest[3] = byte_swap_32 (digest[3]);
11028
11029 digest[0] -= MD5M_A;
11030 digest[1] -= MD5M_B;
11031 digest[2] -= MD5M_C;
11032 digest[3] -= MD5M_D;
11033
11034 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11035
11036 uint salt_len = input_len - 32 - 1;
11037
11038 char *salt_buf = input_buf + 32 + 1;
11039
11040 char *salt_buf_ptr = (char *) salt->salt_buf;
11041
11042 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11043
11044 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11045
11046 salt->salt_len = salt_len;
11047
11048 return (PARSER_OK);
11049 }
11050
11051 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11052 {
11053 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11054
11055 uint32_t *digest = (uint32_t *) hash_buf->digest;
11056
11057 salt_t *salt = hash_buf->salt;
11058
11059 digest[0] = hex_to_uint (&input_buf[ 0]);
11060 digest[1] = hex_to_uint (&input_buf[ 8]);
11061 digest[2] = hex_to_uint (&input_buf[16]);
11062 digest[3] = hex_to_uint (&input_buf[24]);
11063
11064 digest[0] = byte_swap_32 (digest[0]);
11065 digest[1] = byte_swap_32 (digest[1]);
11066 digest[2] = byte_swap_32 (digest[2]);
11067 digest[3] = byte_swap_32 (digest[3]);
11068
11069 digest[0] -= MD5M_A;
11070 digest[1] -= MD5M_B;
11071 digest[2] -= MD5M_C;
11072 digest[3] -= MD5M_D;
11073
11074 /**
11075 * This is a virtual salt. While the algorithm is basically not salted
11076 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11077 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11078 */
11079
11080 char *salt_buf_ptr = (char *) salt->salt_buf;
11081
11082 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11083
11084 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11085
11086 salt->salt_len = salt_len;
11087
11088 return (PARSER_OK);
11089 }
11090
11091 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11092 {
11093 if (data.opts_type & OPTS_TYPE_ST_HEX)
11094 {
11095 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11096 }
11097 else
11098 {
11099 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11100 }
11101
11102 uint32_t *digest = (uint32_t *) hash_buf->digest;
11103
11104 salt_t *salt = hash_buf->salt;
11105
11106 digest[0] = hex_to_uint (&input_buf[ 0]);
11107 digest[1] = hex_to_uint (&input_buf[ 8]);
11108 digest[2] = hex_to_uint (&input_buf[16]);
11109 digest[3] = hex_to_uint (&input_buf[24]);
11110
11111 digest[0] = byte_swap_32 (digest[0]);
11112 digest[1] = byte_swap_32 (digest[1]);
11113 digest[2] = byte_swap_32 (digest[2]);
11114 digest[3] = byte_swap_32 (digest[3]);
11115
11116 digest[0] -= MD5M_A;
11117 digest[1] -= MD5M_B;
11118 digest[2] -= MD5M_C;
11119 digest[3] -= MD5M_D;
11120
11121 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11122
11123 uint salt_len = input_len - 32 - 1;
11124
11125 char *salt_buf = input_buf + 32 + 1;
11126
11127 char *salt_buf_ptr = (char *) salt->salt_buf;
11128
11129 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11130
11131 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11132
11133 salt->salt_len = salt_len;
11134
11135 return (PARSER_OK);
11136 }
11137
11138 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11139 {
11140 if (data.opts_type & OPTS_TYPE_ST_HEX)
11141 {
11142 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11143 }
11144 else
11145 {
11146 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11147 }
11148
11149 uint32_t *digest = (uint32_t *) hash_buf->digest;
11150
11151 salt_t *salt = hash_buf->salt;
11152
11153 digest[0] = hex_to_uint (&input_buf[ 0]);
11154 digest[1] = hex_to_uint (&input_buf[ 8]);
11155 digest[2] = hex_to_uint (&input_buf[16]);
11156 digest[3] = hex_to_uint (&input_buf[24]);
11157
11158 digest[0] = byte_swap_32 (digest[0]);
11159 digest[1] = byte_swap_32 (digest[1]);
11160 digest[2] = byte_swap_32 (digest[2]);
11161 digest[3] = byte_swap_32 (digest[3]);
11162
11163 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11164
11165 uint salt_len = input_len - 32 - 1;
11166
11167 char *salt_buf = input_buf + 32 + 1;
11168
11169 char *salt_buf_ptr = (char *) salt->salt_buf;
11170
11171 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11172
11173 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11174
11175 salt->salt_len = salt_len;
11176
11177 return (PARSER_OK);
11178 }
11179
11180 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11181 {
11182 if (data.opts_type & OPTS_TYPE_ST_HEX)
11183 {
11184 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11185 }
11186 else
11187 {
11188 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11189 }
11190
11191 uint32_t *digest = (uint32_t *) hash_buf->digest;
11192
11193 salt_t *salt = hash_buf->salt;
11194
11195 digest[0] = hex_to_uint (&input_buf[ 0]);
11196 digest[1] = hex_to_uint (&input_buf[ 8]);
11197 digest[2] = hex_to_uint (&input_buf[16]);
11198 digest[3] = hex_to_uint (&input_buf[24]);
11199
11200 digest[0] = byte_swap_32 (digest[0]);
11201 digest[1] = byte_swap_32 (digest[1]);
11202 digest[2] = byte_swap_32 (digest[2]);
11203 digest[3] = byte_swap_32 (digest[3]);
11204
11205 digest[0] -= MD4M_A;
11206 digest[1] -= MD4M_B;
11207 digest[2] -= MD4M_C;
11208 digest[3] -= MD4M_D;
11209
11210 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11211
11212 uint salt_len = input_len - 32 - 1;
11213
11214 char *salt_buf = input_buf + 32 + 1;
11215
11216 char *salt_buf_ptr = (char *) salt->salt_buf;
11217
11218 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11219
11220 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11221
11222 salt->salt_len = salt_len;
11223
11224 return (PARSER_OK);
11225 }
11226
11227 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11228 {
11229 if (data.opts_type & OPTS_TYPE_ST_HEX)
11230 {
11231 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11232 }
11233 else
11234 {
11235 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11236 }
11237
11238 uint32_t *digest = (uint32_t *) hash_buf->digest;
11239
11240 salt_t *salt = hash_buf->salt;
11241
11242 digest[0] = hex_to_uint (&input_buf[ 0]);
11243 digest[1] = hex_to_uint (&input_buf[ 8]);
11244 digest[2] = hex_to_uint (&input_buf[16]);
11245 digest[3] = hex_to_uint (&input_buf[24]);
11246
11247 digest[0] = byte_swap_32 (digest[0]);
11248 digest[1] = byte_swap_32 (digest[1]);
11249 digest[2] = byte_swap_32 (digest[2]);
11250 digest[3] = byte_swap_32 (digest[3]);
11251
11252 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11253
11254 uint salt_len = input_len - 32 - 1;
11255
11256 char *salt_buf = input_buf + 32 + 1;
11257
11258 uint salt_pc_block[16];
11259
11260 memset (salt_pc_block, 0, sizeof (salt_pc_block));
11261
11262 char *salt_pc_block_ptr = (char *) salt_pc_block;
11263
11264 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11265
11266 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11267
11268 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11269
11270 salt_pc_block[14] = salt_len * 8;
11271
11272 uint salt_pc_digest[4];
11273
11274 salt_pc_digest[0] = MAGIC_A;
11275 salt_pc_digest[1] = MAGIC_B;
11276 salt_pc_digest[2] = MAGIC_C;
11277 salt_pc_digest[3] = MAGIC_D;
11278
11279 md5_64 (salt_pc_block, salt_pc_digest);
11280
11281 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11282 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11283 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11284 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11285
11286 char *salt_buf_ptr = (char *) salt->salt_buf;
11287
11288 memcpy (salt_buf_ptr, salt_buf, salt_len);
11289
11290 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
11291
11292 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11293 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11294 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11295 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11296
11297 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11298
11299 return (PARSER_OK);
11300 }
11301
11302 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11303 {
11304 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11305
11306 uint32_t *digest = (uint32_t *) hash_buf->digest;
11307
11308 digest[0] = hex_to_uint (&input_buf[ 0]);
11309 digest[1] = hex_to_uint (&input_buf[ 8]);
11310 digest[2] = hex_to_uint (&input_buf[16]);
11311 digest[3] = hex_to_uint (&input_buf[24]);
11312 digest[4] = hex_to_uint (&input_buf[32]);
11313
11314 digest[0] -= SHA1M_A;
11315 digest[1] -= SHA1M_B;
11316 digest[2] -= SHA1M_C;
11317 digest[3] -= SHA1M_D;
11318 digest[4] -= SHA1M_E;
11319
11320 return (PARSER_OK);
11321 }
11322
11323 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11324 {
11325 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11326
11327 uint32_t *digest = (uint32_t *) hash_buf->digest;
11328
11329 digest[0] = hex_to_uint (&input_buf[ 0]);
11330 digest[1] = hex_to_uint (&input_buf[ 8]);
11331 digest[2] = hex_to_uint (&input_buf[16]);
11332 digest[3] = hex_to_uint (&input_buf[24]);
11333 digest[4] = hex_to_uint (&input_buf[32]);
11334
11335 return (PARSER_OK);
11336 }
11337
11338 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11339 {
11340 if (data.opts_type & OPTS_TYPE_ST_HEX)
11341 {
11342 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11343 }
11344 else
11345 {
11346 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11347 }
11348
11349 uint32_t *digest = (uint32_t *) hash_buf->digest;
11350
11351 salt_t *salt = hash_buf->salt;
11352
11353 digest[0] = hex_to_uint (&input_buf[ 0]);
11354 digest[1] = hex_to_uint (&input_buf[ 8]);
11355 digest[2] = hex_to_uint (&input_buf[16]);
11356 digest[3] = hex_to_uint (&input_buf[24]);
11357 digest[4] = hex_to_uint (&input_buf[32]);
11358
11359 digest[0] -= SHA1M_A;
11360 digest[1] -= SHA1M_B;
11361 digest[2] -= SHA1M_C;
11362 digest[3] -= SHA1M_D;
11363 digest[4] -= SHA1M_E;
11364
11365 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11366
11367 uint salt_len = input_len - 40 - 1;
11368
11369 char *salt_buf = input_buf + 40 + 1;
11370
11371 char *salt_buf_ptr = (char *) salt->salt_buf;
11372
11373 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11374
11375 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11376
11377 salt->salt_len = salt_len;
11378
11379 return (PARSER_OK);
11380 }
11381
11382 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11383 {
11384 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11385
11386 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11387
11388 uint32_t *digest = (uint32_t *) hash_buf->digest;
11389
11390 char tmp_buf[100];
11391
11392 memset (tmp_buf, 0, sizeof (tmp_buf));
11393
11394 base64_decode (base64_to_int, input_buf + 5, input_len - 5, tmp_buf);
11395
11396 memcpy (digest, tmp_buf, 20);
11397
11398 digest[0] = byte_swap_32 (digest[0]);
11399 digest[1] = byte_swap_32 (digest[1]);
11400 digest[2] = byte_swap_32 (digest[2]);
11401 digest[3] = byte_swap_32 (digest[3]);
11402 digest[4] = byte_swap_32 (digest[4]);
11403
11404 digest[0] -= SHA1M_A;
11405 digest[1] -= SHA1M_B;
11406 digest[2] -= SHA1M_C;
11407 digest[3] -= SHA1M_D;
11408 digest[4] -= SHA1M_E;
11409
11410 return (PARSER_OK);
11411 }
11412
11413 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11414 {
11415 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11416
11417 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11418
11419 uint32_t *digest = (uint32_t *) hash_buf->digest;
11420
11421 salt_t *salt = hash_buf->salt;
11422
11423 char tmp_buf[100];
11424
11425 memset (tmp_buf, 0, sizeof (tmp_buf));
11426
11427 int tmp_len = base64_decode (base64_to_int, input_buf + 6, input_len - 6, tmp_buf);
11428
11429 memcpy (digest, tmp_buf, 20);
11430
11431 salt->salt_len = tmp_len - 20;
11432
11433 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11434
11435 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11436 {
11437 char *ptr = (char *) salt->salt_buf;
11438
11439 ptr[salt->salt_len] = 0x80;
11440 }
11441
11442 digest[0] = byte_swap_32 (digest[0]);
11443 digest[1] = byte_swap_32 (digest[1]);
11444 digest[2] = byte_swap_32 (digest[2]);
11445 digest[3] = byte_swap_32 (digest[3]);
11446 digest[4] = byte_swap_32 (digest[4]);
11447
11448 digest[0] -= SHA1M_A;
11449 digest[1] -= SHA1M_B;
11450 digest[2] -= SHA1M_C;
11451 digest[3] -= SHA1M_D;
11452 digest[4] -= SHA1M_E;
11453
11454 return (PARSER_OK);
11455 }
11456
11457 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11458 {
11459 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11460
11461 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11462
11463 uint32_t *digest = (uint32_t *) hash_buf->digest;
11464
11465 salt_t *salt = hash_buf->salt;
11466
11467 char *salt_buf = input_buf + 6;
11468
11469 uint salt_len = 8;
11470
11471 char *salt_buf_ptr = (char *) salt->salt_buf;
11472
11473 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11474
11475 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11476
11477 salt->salt_len = salt_len;
11478
11479 char *hash_pos = input_buf + 6 + 8 + 40;
11480
11481 digest[0] = hex_to_uint (&hash_pos[ 0]);
11482 digest[1] = hex_to_uint (&hash_pos[ 8]);
11483 digest[2] = hex_to_uint (&hash_pos[16]);
11484 digest[3] = hex_to_uint (&hash_pos[24]);
11485 digest[4] = hex_to_uint (&hash_pos[32]);
11486
11487 digest[0] -= SHA1M_A;
11488 digest[1] -= SHA1M_B;
11489 digest[2] -= SHA1M_C;
11490 digest[3] -= SHA1M_D;
11491 digest[4] -= SHA1M_E;
11492
11493 return (PARSER_OK);
11494 }
11495
11496 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11497 {
11498 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11499
11500 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11501
11502 uint32_t *digest = (uint32_t *) hash_buf->digest;
11503
11504 salt_t *salt = hash_buf->salt;
11505
11506 char *salt_buf = input_buf + 6;
11507
11508 uint salt_len = 8;
11509
11510 char *salt_buf_ptr = (char *) salt->salt_buf;
11511
11512 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11513
11514 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11515
11516 salt->salt_len = salt_len;
11517
11518 char *hash_pos = input_buf + 6 + 8;
11519
11520 digest[0] = hex_to_uint (&hash_pos[ 0]);
11521 digest[1] = hex_to_uint (&hash_pos[ 8]);
11522 digest[2] = hex_to_uint (&hash_pos[16]);
11523 digest[3] = hex_to_uint (&hash_pos[24]);
11524 digest[4] = hex_to_uint (&hash_pos[32]);
11525
11526 digest[0] -= SHA1M_A;
11527 digest[1] -= SHA1M_B;
11528 digest[2] -= SHA1M_C;
11529 digest[3] -= SHA1M_D;
11530 digest[4] -= SHA1M_E;
11531
11532 return (PARSER_OK);
11533 }
11534
11535 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11536 {
11537 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11538
11539 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11540
11541 uint64_t *digest = (uint64_t *) hash_buf->digest;
11542
11543 salt_t *salt = hash_buf->salt;
11544
11545 char *salt_buf = input_buf + 6;
11546
11547 uint salt_len = 8;
11548
11549 char *salt_buf_ptr = (char *) salt->salt_buf;
11550
11551 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11552
11553 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11554
11555 salt->salt_len = salt_len;
11556
11557 char *hash_pos = input_buf + 6 + 8;
11558
11559 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
11560 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
11561 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
11562 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
11563 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
11564 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
11565 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
11566 digest[7] = hex_to_uint64_t (&hash_pos[112]);
11567
11568 digest[0] -= SHA512M_A;
11569 digest[1] -= SHA512M_B;
11570 digest[2] -= SHA512M_C;
11571 digest[3] -= SHA512M_D;
11572 digest[4] -= SHA512M_E;
11573 digest[5] -= SHA512M_F;
11574 digest[6] -= SHA512M_G;
11575 digest[7] -= SHA512M_H;
11576
11577 return (PARSER_OK);
11578 }
11579
11580 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11581 {
11582 if (data.opts_type & OPTS_TYPE_ST_HEX)
11583 {
11584 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11585 }
11586 else
11587 {
11588 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11589 }
11590
11591 uint32_t *digest = (uint32_t *) hash_buf->digest;
11592
11593 salt_t *salt = hash_buf->salt;
11594
11595 digest[0] = hex_to_uint (&input_buf[ 0]);
11596 digest[1] = hex_to_uint (&input_buf[ 8]);
11597 digest[2] = 0;
11598 digest[3] = 0;
11599
11600 digest[0] = byte_swap_32 (digest[0]);
11601 digest[1] = byte_swap_32 (digest[1]);
11602
11603 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11604
11605 uint salt_len = input_len - 16 - 1;
11606
11607 char *salt_buf = input_buf + 16 + 1;
11608
11609 char *salt_buf_ptr = (char *) salt->salt_buf;
11610
11611 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11612
11613 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11614
11615 salt->salt_len = salt_len;
11616
11617 return (PARSER_OK);
11618 }
11619
11620 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11621 {
11622 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11623
11624 uint32_t *digest = (uint32_t *) hash_buf->digest;
11625
11626 salt_t *salt = hash_buf->salt;
11627
11628 digest[0] = hex_to_uint (&input_buf[ 0]);
11629 digest[1] = hex_to_uint (&input_buf[ 8]);
11630 digest[2] = hex_to_uint (&input_buf[16]);
11631 digest[3] = hex_to_uint (&input_buf[24]);
11632 digest[4] = hex_to_uint (&input_buf[32]);
11633
11634 digest[0] -= SHA1M_A;
11635 digest[1] -= SHA1M_B;
11636 digest[2] -= SHA1M_C;
11637 digest[3] -= SHA1M_D;
11638 digest[4] -= SHA1M_E;
11639
11640 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11641
11642 uint salt_len = input_len - 40 - 1;
11643
11644 char *salt_buf = input_buf + 40 + 1;
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 return (PARSER_OK);
11655 }
11656
11657 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11658 {
11659 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11660
11661 uint32_t *digest = (uint32_t *) hash_buf->digest;
11662
11663 salt_t *salt = hash_buf->salt;
11664
11665 char *hash_pos = input_buf;
11666
11667 digest[ 0] = hex_to_uint (&hash_pos[ 0]);
11668 digest[ 1] = hex_to_uint (&hash_pos[ 8]);
11669 digest[ 2] = hex_to_uint (&hash_pos[ 16]);
11670 digest[ 3] = hex_to_uint (&hash_pos[ 24]);
11671 digest[ 4] = hex_to_uint (&hash_pos[ 32]);
11672 digest[ 5] = hex_to_uint (&hash_pos[ 40]);
11673 digest[ 6] = hex_to_uint (&hash_pos[ 48]);
11674 digest[ 7] = hex_to_uint (&hash_pos[ 56]);
11675 digest[ 8] = hex_to_uint (&hash_pos[ 64]);
11676 digest[ 9] = hex_to_uint (&hash_pos[ 72]);
11677 digest[10] = hex_to_uint (&hash_pos[ 80]);
11678 digest[11] = hex_to_uint (&hash_pos[ 88]);
11679 digest[12] = hex_to_uint (&hash_pos[ 96]);
11680 digest[13] = hex_to_uint (&hash_pos[104]);
11681 digest[14] = hex_to_uint (&hash_pos[112]);
11682 digest[15] = hex_to_uint (&hash_pos[120]);
11683
11684 char *salt_pos = input_buf + 128;
11685
11686 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
11687 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
11688 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]);
11689 salt->salt_buf[3] = hex_to_uint (&salt_pos[24]);
11690
11691 salt->salt_iter = ROUNDS_ORACLET - 1;
11692 salt->salt_len = 16;
11693
11694 return (PARSER_OK);
11695 }
11696
11697 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11698 {
11699 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11700
11701 uint32_t *digest = (uint32_t *) hash_buf->digest;
11702
11703 digest[0] = hex_to_uint (&input_buf[ 0]);
11704 digest[1] = hex_to_uint (&input_buf[ 8]);
11705 digest[2] = hex_to_uint (&input_buf[16]);
11706 digest[3] = hex_to_uint (&input_buf[24]);
11707 digest[4] = hex_to_uint (&input_buf[32]);
11708 digest[5] = hex_to_uint (&input_buf[40]);
11709 digest[6] = hex_to_uint (&input_buf[48]);
11710 digest[7] = hex_to_uint (&input_buf[56]);
11711
11712 digest[0] -= SHA256M_A;
11713 digest[1] -= SHA256M_B;
11714 digest[2] -= SHA256M_C;
11715 digest[3] -= SHA256M_D;
11716 digest[4] -= SHA256M_E;
11717 digest[5] -= SHA256M_F;
11718 digest[6] -= SHA256M_G;
11719 digest[7] -= SHA256M_H;
11720
11721 return (PARSER_OK);
11722 }
11723
11724 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11725 {
11726 if (data.opts_type & OPTS_TYPE_ST_HEX)
11727 {
11728 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11729 }
11730 else
11731 {
11732 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11733 }
11734
11735 uint32_t *digest = (uint32_t *) hash_buf->digest;
11736
11737 salt_t *salt = hash_buf->salt;
11738
11739 digest[0] = hex_to_uint (&input_buf[ 0]);
11740 digest[1] = hex_to_uint (&input_buf[ 8]);
11741 digest[2] = hex_to_uint (&input_buf[16]);
11742 digest[3] = hex_to_uint (&input_buf[24]);
11743 digest[4] = hex_to_uint (&input_buf[32]);
11744 digest[5] = hex_to_uint (&input_buf[40]);
11745 digest[6] = hex_to_uint (&input_buf[48]);
11746 digest[7] = hex_to_uint (&input_buf[56]);
11747
11748 digest[0] -= SHA256M_A;
11749 digest[1] -= SHA256M_B;
11750 digest[2] -= SHA256M_C;
11751 digest[3] -= SHA256M_D;
11752 digest[4] -= SHA256M_E;
11753 digest[5] -= SHA256M_F;
11754 digest[6] -= SHA256M_G;
11755 digest[7] -= SHA256M_H;
11756
11757 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11758
11759 uint salt_len = input_len - 64 - 1;
11760
11761 char *salt_buf = input_buf + 64 + 1;
11762
11763 char *salt_buf_ptr = (char *) salt->salt_buf;
11764
11765 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11766
11767 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11768
11769 salt->salt_len = salt_len;
11770
11771 return (PARSER_OK);
11772 }
11773
11774 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11775 {
11776 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11777
11778 uint64_t *digest = (uint64_t *) hash_buf->digest;
11779
11780 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11781 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11782 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11783 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11784 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11785 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11786 digest[6] = 0;
11787 digest[7] = 0;
11788
11789 digest[0] -= SHA384M_A;
11790 digest[1] -= SHA384M_B;
11791 digest[2] -= SHA384M_C;
11792 digest[3] -= SHA384M_D;
11793 digest[4] -= SHA384M_E;
11794 digest[5] -= SHA384M_F;
11795 digest[6] -= 0;
11796 digest[7] -= 0;
11797
11798 return (PARSER_OK);
11799 }
11800
11801 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11802 {
11803 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
11804
11805 uint64_t *digest = (uint64_t *) hash_buf->digest;
11806
11807 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11808 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11809 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11810 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11811 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11812 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11813 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
11814 digest[7] = hex_to_uint64_t (&input_buf[112]);
11815
11816 digest[0] -= SHA512M_A;
11817 digest[1] -= SHA512M_B;
11818 digest[2] -= SHA512M_C;
11819 digest[3] -= SHA512M_D;
11820 digest[4] -= SHA512M_E;
11821 digest[5] -= SHA512M_F;
11822 digest[6] -= SHA512M_G;
11823 digest[7] -= SHA512M_H;
11824
11825 return (PARSER_OK);
11826 }
11827
11828 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11829 {
11830 if (data.opts_type & OPTS_TYPE_ST_HEX)
11831 {
11832 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
11833 }
11834 else
11835 {
11836 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
11837 }
11838
11839 uint64_t *digest = (uint64_t *) hash_buf->digest;
11840
11841 salt_t *salt = hash_buf->salt;
11842
11843 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11844 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11845 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11846 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11847 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11848 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11849 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
11850 digest[7] = hex_to_uint64_t (&input_buf[112]);
11851
11852 digest[0] -= SHA512M_A;
11853 digest[1] -= SHA512M_B;
11854 digest[2] -= SHA512M_C;
11855 digest[3] -= SHA512M_D;
11856 digest[4] -= SHA512M_E;
11857 digest[5] -= SHA512M_F;
11858 digest[6] -= SHA512M_G;
11859 digest[7] -= SHA512M_H;
11860
11861 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11862
11863 uint salt_len = input_len - 128 - 1;
11864
11865 char *salt_buf = input_buf + 128 + 1;
11866
11867 char *salt_buf_ptr = (char *) salt->salt_buf;
11868
11869 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11870
11871 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11872
11873 salt->salt_len = salt_len;
11874
11875 return (PARSER_OK);
11876 }
11877
11878 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11879 {
11880 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
11881
11882 uint64_t *digest = (uint64_t *) hash_buf->digest;
11883
11884 salt_t *salt = hash_buf->salt;
11885
11886 char *salt_pos = input_buf + 3;
11887
11888 uint iterations_len = 0;
11889
11890 if (memcmp (salt_pos, "rounds=", 7) == 0)
11891 {
11892 salt_pos += 7;
11893
11894 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
11895
11896 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
11897 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
11898
11899 salt_pos[0] = 0x0;
11900
11901 salt->salt_iter = atoi (salt_pos - iterations_len);
11902
11903 salt_pos += 1;
11904
11905 iterations_len += 8;
11906 }
11907 else
11908 {
11909 salt->salt_iter = ROUNDS_SHA512CRYPT;
11910 }
11911
11912 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
11913
11914 char *hash_pos = strchr (salt_pos, '$');
11915
11916 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11917
11918 uint salt_len = hash_pos - salt_pos;
11919
11920 if (salt_len > 16) return (PARSER_SALT_LENGTH);
11921
11922 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
11923
11924 salt->salt_len = salt_len;
11925
11926 hash_pos++;
11927
11928 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
11929
11930 return (PARSER_OK);
11931 }
11932
11933 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11934 {
11935 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
11936
11937 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
11938
11939 uint64_t *digest = (uint64_t *) hash_buf->digest;
11940
11941 salt_t *salt = hash_buf->salt;
11942
11943 uint keccak_mdlen = input_len / 2;
11944
11945 for (uint i = 0; i < keccak_mdlen / 8; i++)
11946 {
11947 digest[i] = hex_to_uint64_t (&input_buf[i * 16]);
11948
11949 digest[i] = byte_swap_64 (digest[i]);
11950 }
11951
11952 salt->keccak_mdlen = keccak_mdlen;
11953
11954 return (PARSER_OK);
11955 }
11956
11957 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11958 {
11959 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
11960
11961 uint32_t *digest = (uint32_t *) hash_buf->digest;
11962
11963 salt_t *salt = hash_buf->salt;
11964
11965 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
11966
11967 /**
11968 * Parse that strange long line
11969 */
11970
11971 char *in_off[9];
11972
11973 size_t in_len[9];
11974
11975 in_off[0] = strtok (input_buf, ":");
11976
11977 in_len[0] = strlen (in_off[0]);
11978
11979 size_t i;
11980
11981 for (i = 1; i < 9; i++)
11982 {
11983 in_off[i] = strtok (NULL, ":");
11984
11985 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11986
11987 in_len[i] = strlen (in_off[i]);
11988 }
11989
11990 char *ptr;
11991
11992 ptr = (char *) ikepsk->msg_buf;
11993
11994 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_char (in_off[0] + i);
11995 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_char (in_off[1] + i);
11996 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_char (in_off[2] + i);
11997 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_char (in_off[3] + i);
11998 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_char (in_off[4] + i);
11999 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_char (in_off[5] + i);
12000
12001 *ptr = 0x80;
12002
12003 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12004
12005 ptr = (char *) ikepsk->nr_buf;
12006
12007 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_char (in_off[6] + i);
12008 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_char (in_off[7] + i);
12009
12010 *ptr = 0x80;
12011
12012 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12013
12014 /**
12015 * Store to database
12016 */
12017
12018 ptr = in_off[8];
12019
12020 digest[0] = hex_to_uint (&ptr[ 0]);
12021 digest[1] = hex_to_uint (&ptr[ 8]);
12022 digest[2] = hex_to_uint (&ptr[16]);
12023 digest[3] = hex_to_uint (&ptr[24]);
12024
12025 digest[0] = byte_swap_32 (digest[0]);
12026 digest[1] = byte_swap_32 (digest[1]);
12027 digest[2] = byte_swap_32 (digest[2]);
12028 digest[3] = byte_swap_32 (digest[3]);
12029
12030 salt->salt_len = 32;
12031
12032 salt->salt_buf[0] = ikepsk->nr_buf[0];
12033 salt->salt_buf[1] = ikepsk->nr_buf[1];
12034 salt->salt_buf[2] = ikepsk->nr_buf[2];
12035 salt->salt_buf[3] = ikepsk->nr_buf[3];
12036 salt->salt_buf[4] = ikepsk->nr_buf[4];
12037 salt->salt_buf[5] = ikepsk->nr_buf[5];
12038 salt->salt_buf[6] = ikepsk->nr_buf[6];
12039 salt->salt_buf[7] = ikepsk->nr_buf[7];
12040
12041 return (PARSER_OK);
12042 }
12043
12044 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12045 {
12046 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12047
12048 uint32_t *digest = (uint32_t *) hash_buf->digest;
12049
12050 salt_t *salt = hash_buf->salt;
12051
12052 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12053
12054 /**
12055 * Parse that strange long line
12056 */
12057
12058 char *in_off[9];
12059
12060 size_t in_len[9];
12061
12062 in_off[0] = strtok (input_buf, ":");
12063
12064 in_len[0] = strlen (in_off[0]);
12065
12066 size_t i;
12067
12068 for (i = 1; i < 9; i++)
12069 {
12070 in_off[i] = strtok (NULL, ":");
12071
12072 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12073
12074 in_len[i] = strlen (in_off[i]);
12075 }
12076
12077 char *ptr;
12078
12079 ptr = (char *) ikepsk->msg_buf;
12080
12081 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_char (in_off[0] + i);
12082 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_char (in_off[1] + i);
12083 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_char (in_off[2] + i);
12084 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_char (in_off[3] + i);
12085 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_char (in_off[4] + i);
12086 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_char (in_off[5] + i);
12087
12088 *ptr = 0x80;
12089
12090 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12091
12092 ptr = (char *) ikepsk->nr_buf;
12093
12094 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_char (in_off[6] + i);
12095 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_char (in_off[7] + i);
12096
12097 *ptr = 0x80;
12098
12099 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12100
12101 /**
12102 * Store to database
12103 */
12104
12105 ptr = in_off[8];
12106
12107 digest[0] = hex_to_uint (&ptr[ 0]);
12108 digest[1] = hex_to_uint (&ptr[ 8]);
12109 digest[2] = hex_to_uint (&ptr[16]);
12110 digest[3] = hex_to_uint (&ptr[24]);
12111 digest[4] = hex_to_uint (&ptr[32]);
12112
12113 salt->salt_len = 32;
12114
12115 salt->salt_buf[0] = ikepsk->nr_buf[0];
12116 salt->salt_buf[1] = ikepsk->nr_buf[1];
12117 salt->salt_buf[2] = ikepsk->nr_buf[2];
12118 salt->salt_buf[3] = ikepsk->nr_buf[3];
12119 salt->salt_buf[4] = ikepsk->nr_buf[4];
12120 salt->salt_buf[5] = ikepsk->nr_buf[5];
12121 salt->salt_buf[6] = ikepsk->nr_buf[6];
12122 salt->salt_buf[7] = ikepsk->nr_buf[7];
12123
12124 return (PARSER_OK);
12125 }
12126
12127 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12128 {
12129 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12130
12131 uint32_t *digest = (uint32_t *) hash_buf->digest;
12132
12133 digest[0] = hex_to_uint (&input_buf[ 0]);
12134 digest[1] = hex_to_uint (&input_buf[ 8]);
12135 digest[2] = hex_to_uint (&input_buf[16]);
12136 digest[3] = hex_to_uint (&input_buf[24]);
12137 digest[4] = hex_to_uint (&input_buf[32]);
12138
12139 digest[0] = byte_swap_32 (digest[0]);
12140 digest[1] = byte_swap_32 (digest[1]);
12141 digest[2] = byte_swap_32 (digest[2]);
12142 digest[3] = byte_swap_32 (digest[3]);
12143 digest[4] = byte_swap_32 (digest[4]);
12144
12145 return (PARSER_OK);
12146 }
12147
12148 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12149 {
12150 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12151
12152 uint32_t *digest = (uint32_t *) hash_buf->digest;
12153
12154 digest[ 0] = hex_to_uint (&input_buf[ 0]);
12155 digest[ 1] = hex_to_uint (&input_buf[ 8]);
12156 digest[ 2] = hex_to_uint (&input_buf[ 16]);
12157 digest[ 3] = hex_to_uint (&input_buf[ 24]);
12158 digest[ 4] = hex_to_uint (&input_buf[ 32]);
12159 digest[ 5] = hex_to_uint (&input_buf[ 40]);
12160 digest[ 6] = hex_to_uint (&input_buf[ 48]);
12161 digest[ 7] = hex_to_uint (&input_buf[ 56]);
12162 digest[ 8] = hex_to_uint (&input_buf[ 64]);
12163 digest[ 9] = hex_to_uint (&input_buf[ 72]);
12164 digest[10] = hex_to_uint (&input_buf[ 80]);
12165 digest[11] = hex_to_uint (&input_buf[ 88]);
12166 digest[12] = hex_to_uint (&input_buf[ 96]);
12167 digest[13] = hex_to_uint (&input_buf[104]);
12168 digest[14] = hex_to_uint (&input_buf[112]);
12169 digest[15] = hex_to_uint (&input_buf[120]);
12170
12171 return (PARSER_OK);
12172 }
12173
12174 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12175 {
12176 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12177
12178 uint32_t *digest = (uint32_t *) hash_buf->digest;
12179
12180 salt_t *salt = hash_buf->salt;
12181
12182 digest[0] = hex_to_uint (&input_buf[ 0]);
12183 digest[1] = hex_to_uint (&input_buf[ 8]);
12184 digest[2] = hex_to_uint (&input_buf[16]);
12185 digest[3] = hex_to_uint (&input_buf[24]);
12186 digest[4] = hex_to_uint (&input_buf[32]);
12187
12188 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12189
12190 uint salt_len = input_len - 40 - 1;
12191
12192 char *salt_buf = input_buf + 40 + 1;
12193
12194 char *salt_buf_ptr = (char *) salt->salt_buf;
12195
12196 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12197
12198 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12199
12200 salt->salt_len = salt_len;
12201
12202 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12203
12204 return (PARSER_OK);
12205 }
12206
12207 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12208 {
12209 uint32_t *digest = (uint32_t *) hash_buf->digest;
12210
12211 salt_t *salt = hash_buf->salt;
12212
12213 tc_t *tc = (tc_t *) hash_buf->esalt;
12214
12215 if (input_len == 0)
12216 {
12217 log_error ("TrueCrypt container not specified");
12218
12219 exit (-1);
12220 }
12221
12222 FILE *fp = fopen (input_buf, "rb");
12223
12224 if (fp == NULL)
12225 {
12226 log_error ("%s: %s", input_buf, strerror (errno));
12227
12228 exit (-1);
12229 }
12230
12231 char buf[512];
12232
12233 int n = fread (buf, 1, sizeof (buf), fp);
12234
12235 fclose (fp);
12236
12237 if (n != 512) return (PARSER_TC_FILE_SIZE);
12238
12239 memcpy (tc->salt_buf, buf, 64);
12240
12241 memcpy (tc->data_buf, buf + 64, 512 - 64);
12242
12243 salt->salt_buf[0] = tc->salt_buf[0];
12244
12245 salt->salt_len = 4;
12246
12247 salt->salt_iter = 1000 - 1;
12248
12249 digest[0] = tc->data_buf[0];
12250
12251 return (PARSER_OK);
12252 }
12253
12254 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12255 {
12256 uint32_t *digest = (uint32_t *) hash_buf->digest;
12257
12258 salt_t *salt = hash_buf->salt;
12259
12260 tc_t *tc = (tc_t *) hash_buf->esalt;
12261
12262 if (input_len == 0)
12263 {
12264 log_error ("TrueCrypt container not specified");
12265
12266 exit (-1);
12267 }
12268
12269 FILE *fp = fopen (input_buf, "rb");
12270
12271 if (fp == NULL)
12272 {
12273 log_error ("%s: %s", input_buf, strerror (errno));
12274
12275 exit (-1);
12276 }
12277
12278 char buf[512];
12279
12280 int n = fread (buf, 1, sizeof (buf), fp);
12281
12282 fclose (fp);
12283
12284 if (n != 512) return (PARSER_TC_FILE_SIZE);
12285
12286 memcpy (tc->salt_buf, buf, 64);
12287
12288 memcpy (tc->data_buf, buf + 64, 512 - 64);
12289
12290 salt->salt_buf[0] = tc->salt_buf[0];
12291
12292 salt->salt_len = 4;
12293
12294 salt->salt_iter = 2000 - 1;
12295
12296 digest[0] = tc->data_buf[0];
12297
12298 return (PARSER_OK);
12299 }
12300
12301 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12302 {
12303 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12304
12305 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12306
12307 uint32_t *digest = (uint32_t *) hash_buf->digest;
12308
12309 salt_t *salt = hash_buf->salt;
12310
12311 char *salt_pos = input_buf + 6;
12312
12313 char *hash_pos = strchr (salt_pos, '$');
12314
12315 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12316
12317 uint salt_len = hash_pos - salt_pos;
12318
12319 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12320
12321 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12322
12323 salt->salt_len = salt_len;
12324
12325 salt->salt_iter = 1000;
12326
12327 hash_pos++;
12328
12329 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12330
12331 return (PARSER_OK);
12332 }
12333
12334 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12335 {
12336 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12337
12338 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12339
12340 uint32_t *digest = (uint32_t *) hash_buf->digest;
12341
12342 salt_t *salt = hash_buf->salt;
12343
12344 char *iter_pos = input_buf + 7;
12345
12346 char *salt_pos = strchr (iter_pos, '$');
12347
12348 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12349
12350 salt_pos++;
12351
12352 char *hash_pos = strchr (salt_pos, '$');
12353
12354 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12355
12356 uint salt_len = hash_pos - salt_pos;
12357
12358 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12359
12360 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12361
12362 salt->salt_len = salt_len;
12363
12364 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12365
12366 salt->salt_sign[0] = atoi (salt_iter);
12367
12368 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12369
12370 hash_pos++;
12371
12372 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12373
12374 digest[0] = byte_swap_32 (digest[0]);
12375 digest[1] = byte_swap_32 (digest[1]);
12376 digest[2] = byte_swap_32 (digest[2]);
12377 digest[3] = byte_swap_32 (digest[3]);
12378 digest[4] = byte_swap_32 (digest[4]);
12379
12380 return (PARSER_OK);
12381 }
12382
12383 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12384 {
12385 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12386
12387 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12388
12389 uint32_t *digest = (uint32_t *) hash_buf->digest;
12390
12391 salt_t *salt = hash_buf->salt;
12392
12393 char *iter_pos = input_buf + 9;
12394
12395 char *salt_pos = strchr (iter_pos, '$');
12396
12397 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12398
12399 salt_pos++;
12400
12401 char *hash_pos = strchr (salt_pos, '$');
12402
12403 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12404
12405 uint salt_len = hash_pos - salt_pos;
12406
12407 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12408
12409 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12410
12411 salt->salt_len = salt_len;
12412
12413 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12414
12415 salt->salt_sign[0] = atoi (salt_iter);
12416
12417 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12418
12419 hash_pos++;
12420
12421 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12422
12423 digest[0] = byte_swap_32 (digest[0]);
12424 digest[1] = byte_swap_32 (digest[1]);
12425 digest[2] = byte_swap_32 (digest[2]);
12426 digest[3] = byte_swap_32 (digest[3]);
12427 digest[4] = byte_swap_32 (digest[4]);
12428 digest[5] = byte_swap_32 (digest[5]);
12429 digest[6] = byte_swap_32 (digest[6]);
12430 digest[7] = byte_swap_32 (digest[7]);
12431
12432 return (PARSER_OK);
12433 }
12434
12435 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12436 {
12437 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12438
12439 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12440
12441 uint64_t *digest = (uint64_t *) hash_buf->digest;
12442
12443 salt_t *salt = hash_buf->salt;
12444
12445 char *iter_pos = input_buf + 9;
12446
12447 char *salt_pos = strchr (iter_pos, '$');
12448
12449 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12450
12451 salt_pos++;
12452
12453 char *hash_pos = strchr (salt_pos, '$');
12454
12455 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12456
12457 uint salt_len = hash_pos - salt_pos;
12458
12459 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12460
12461 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12462
12463 salt->salt_len = salt_len;
12464
12465 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12466
12467 salt->salt_sign[0] = atoi (salt_iter);
12468
12469 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12470
12471 hash_pos++;
12472
12473 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12474
12475 digest[0] = byte_swap_64 (digest[0]);
12476 digest[1] = byte_swap_64 (digest[1]);
12477 digest[2] = byte_swap_64 (digest[2]);
12478 digest[3] = byte_swap_64 (digest[3]);
12479 digest[4] = byte_swap_64 (digest[4]);
12480 digest[5] = byte_swap_64 (digest[5]);
12481 digest[6] = byte_swap_64 (digest[6]);
12482 digest[7] = byte_swap_64 (digest[7]);
12483
12484 return (PARSER_OK);
12485 }
12486
12487 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12488 {
12489 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12490
12491 uint32_t *digest = (uint32_t *) hash_buf->digest;
12492
12493 salt_t *salt = hash_buf->salt;
12494
12495 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12496
12497 /**
12498 * parse line
12499 */
12500
12501 char *iterations_pos = input_buf;
12502
12503 char *saltbuf_pos = strchr (iterations_pos, ':');
12504
12505 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12506
12507 uint iterations_len = saltbuf_pos - iterations_pos;
12508
12509 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12510
12511 saltbuf_pos++;
12512
12513 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12514
12515 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12516
12517 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12518
12519 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12520
12521 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12522
12523 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12524
12525 cipherbuf_pos++;
12526
12527 /**
12528 * pbkdf2 iterations
12529 */
12530
12531 salt->salt_iter = atoi (iterations_pos) - 1;
12532
12533 /**
12534 * handle salt encoding
12535 */
12536
12537 char *saltbuf_ptr = (char *) salt->salt_buf;
12538
12539 for (uint i = 0; i < saltbuf_len; i += 2)
12540 {
12541 const char p0 = saltbuf_pos[i + 0];
12542 const char p1 = saltbuf_pos[i + 1];
12543
12544 *saltbuf_ptr++ = hex_convert (p1) << 0
12545 | hex_convert (p0) << 4;
12546 }
12547
12548 salt->salt_len = saltbuf_len / 2;
12549
12550 /**
12551 * handle cipher encoding
12552 */
12553
12554 uint *tmp = (uint *) mymalloc (32);
12555
12556 char *cipherbuf_ptr = (char *) tmp;
12557
12558 for (uint i = 2016; i < cipherbuf_len; i += 2)
12559 {
12560 const char p0 = cipherbuf_pos[i + 0];
12561 const char p1 = cipherbuf_pos[i + 1];
12562
12563 *cipherbuf_ptr++ = hex_convert (p1) << 0
12564 | hex_convert (p0) << 4;
12565 }
12566
12567 // iv is stored at salt_buf 4 (length 16)
12568 // data is stored at salt_buf 8 (length 16)
12569
12570 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12571 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12572 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12573 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12574
12575 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12576 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12577 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12578 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12579
12580 free (tmp);
12581
12582 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12583 {
12584 const char p0 = cipherbuf_pos[j + 0];
12585 const char p1 = cipherbuf_pos[j + 1];
12586
12587 agilekey->cipher[i] = hex_convert (p1) << 0
12588 | hex_convert (p0) << 4;
12589 }
12590
12591 /**
12592 * digest buf
12593 */
12594
12595 digest[0] = 0x10101010;
12596 digest[1] = 0x10101010;
12597 digest[2] = 0x10101010;
12598 digest[3] = 0x10101010;
12599
12600 return (PARSER_OK);
12601 }
12602
12603 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12604 {
12605 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12606
12607 uint32_t *digest = (uint32_t *) hash_buf->digest;
12608
12609 salt_t *salt = hash_buf->salt;
12610
12611 char *hashbuf_pos = input_buf;
12612
12613 char *iterations_pos = strchr (hashbuf_pos, ':');
12614
12615 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12616
12617 uint hash_len = iterations_pos - hashbuf_pos;
12618
12619 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12620
12621 iterations_pos++;
12622
12623 char *saltbuf_pos = strchr (iterations_pos, ':');
12624
12625 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12626
12627 uint iterations_len = saltbuf_pos - iterations_pos;
12628
12629 saltbuf_pos++;
12630
12631 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12632
12633 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12634
12635 char *salt_buf_ptr = (char *) salt->salt_buf;
12636
12637 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12638
12639 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12640
12641 salt->salt_len = salt_len;
12642
12643 salt->salt_iter = atoi (iterations_pos) - 1;
12644
12645 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
12646 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
12647 digest[2] = hex_to_uint (&hashbuf_pos[16]);
12648 digest[3] = hex_to_uint (&hashbuf_pos[24]);
12649
12650 return (PARSER_OK);
12651 }
12652
12653 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12654 {
12655 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12656
12657 uint32_t *digest = (uint32_t *) hash_buf->digest;
12658
12659 digest[0] = hex_to_uint (&input_buf[ 0]);
12660 digest[1] = hex_to_uint (&input_buf[ 8]);
12661 digest[2] = hex_to_uint (&input_buf[16]);
12662 digest[3] = hex_to_uint (&input_buf[24]);
12663 digest[4] = hex_to_uint (&input_buf[32]);
12664 digest[5] = hex_to_uint (&input_buf[40]);
12665 digest[6] = hex_to_uint (&input_buf[48]);
12666 digest[7] = hex_to_uint (&input_buf[56]);
12667
12668 digest[0] = byte_swap_32 (digest[0]);
12669 digest[1] = byte_swap_32 (digest[1]);
12670 digest[2] = byte_swap_32 (digest[2]);
12671 digest[3] = byte_swap_32 (digest[3]);
12672 digest[4] = byte_swap_32 (digest[4]);
12673 digest[5] = byte_swap_32 (digest[5]);
12674 digest[6] = byte_swap_32 (digest[6]);
12675 digest[7] = byte_swap_32 (digest[7]);
12676
12677 return (PARSER_OK);
12678 }
12679
12680 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12681 {
12682 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12683
12684 uint32_t *digest = (uint32_t *) hash_buf->digest;
12685
12686 salt_t *salt = hash_buf->salt;
12687
12688 char *salt_pos = input_buf + 3;
12689
12690 uint iterations_len = 0;
12691
12692 if (memcmp (salt_pos, "rounds=", 7) == 0)
12693 {
12694 salt_pos += 7;
12695
12696 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12697
12698 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12699 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12700
12701 salt_pos[0] = 0x0;
12702
12703 salt->salt_iter = atoi (salt_pos - iterations_len);
12704
12705 salt_pos += 1;
12706
12707 iterations_len += 8;
12708 }
12709 else
12710 {
12711 salt->salt_iter = ROUNDS_SHA256CRYPT;
12712 }
12713
12714 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12715
12716 char *hash_pos = strchr (salt_pos, '$');
12717
12718 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12719
12720 uint salt_len = hash_pos - salt_pos;
12721
12722 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12723
12724 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12725
12726 salt->salt_len = salt_len;
12727
12728 hash_pos++;
12729
12730 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12731
12732 return (PARSER_OK);
12733 }
12734
12735 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12736 {
12737 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12738
12739 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12740
12741 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12742
12743 uint64_t *digest = (uint64_t *) hash_buf->digest;
12744
12745 salt_t *salt = hash_buf->salt;
12746
12747 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12748
12749 char *iter_pos = input_buf + 4;
12750
12751 char *salt_pos = strchr (iter_pos, '$');
12752
12753 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12754
12755 salt_pos++;
12756
12757 char *hash_pos = strchr (salt_pos, '$');
12758
12759 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12760
12761 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12762
12763 hash_pos++;
12764
12765 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
12766 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
12767 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
12768 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
12769 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
12770 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
12771 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
12772 digest[7] = hex_to_uint64_t (&hash_pos[112]);
12773
12774 uint salt_len = hash_pos - salt_pos - 1;
12775
12776 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12777
12778 salt->salt_len = salt_len / 2;
12779
12780 pbkdf2_sha512->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
12781 pbkdf2_sha512->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
12782 pbkdf2_sha512->salt_buf[2] = hex_to_uint (&salt_pos[16]);
12783 pbkdf2_sha512->salt_buf[3] = hex_to_uint (&salt_pos[24]);
12784 pbkdf2_sha512->salt_buf[4] = hex_to_uint (&salt_pos[32]);
12785 pbkdf2_sha512->salt_buf[5] = hex_to_uint (&salt_pos[40]);
12786 pbkdf2_sha512->salt_buf[6] = hex_to_uint (&salt_pos[48]);
12787 pbkdf2_sha512->salt_buf[7] = hex_to_uint (&salt_pos[56]);
12788
12789 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12790 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12791 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12792 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12793 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12794 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12795 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12796 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12797 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12798 pbkdf2_sha512->salt_buf[9] = 0x80;
12799
12800 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12801
12802 salt->salt_iter = atoi (iter_pos) - 1;
12803
12804 return (PARSER_OK);
12805 }
12806
12807 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12808 {
12809 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12810
12811 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12812
12813 uint32_t *digest = (uint32_t *) hash_buf->digest;
12814
12815 salt_t *salt = hash_buf->salt;
12816
12817 char *salt_pos = input_buf + 14;
12818
12819 char *hash_pos = strchr (salt_pos, '*');
12820
12821 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12822
12823 hash_pos++;
12824
12825 uint salt_len = hash_pos - salt_pos - 1;
12826
12827 char *salt_buf_ptr = (char *) salt->salt_buf;
12828
12829 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
12830
12831 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12832
12833 salt->salt_len = salt_len;
12834
12835 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
12836
12837 base64_decode (base64_to_int, hash_pos, 43, tmp_buf);
12838
12839 memcpy (digest, tmp_buf, 32);
12840
12841 digest[0] = byte_swap_32 (digest[0]);
12842 digest[1] = byte_swap_32 (digest[1]);
12843 digest[2] = byte_swap_32 (digest[2]);
12844 digest[3] = byte_swap_32 (digest[3]);
12845 digest[4] = byte_swap_32 (digest[4]);
12846 digest[5] = byte_swap_32 (digest[5]);
12847 digest[6] = byte_swap_32 (digest[6]);
12848 digest[7] = byte_swap_32 (digest[7]);
12849
12850 digest[0] -= SHA256M_A;
12851 digest[1] -= SHA256M_B;
12852 digest[2] -= SHA256M_C;
12853 digest[3] -= SHA256M_D;
12854 digest[4] -= SHA256M_E;
12855 digest[5] -= SHA256M_F;
12856 digest[6] -= SHA256M_G;
12857 digest[7] -= SHA256M_H;
12858
12859 return (PARSER_OK);
12860 }
12861
12862 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12863 {
12864 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
12865
12866 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12867
12868 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
12869
12870 uint64_t *digest = (uint64_t *) hash_buf->digest;
12871
12872 salt_t *salt = hash_buf->salt;
12873
12874 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12875
12876 char *iter_pos = input_buf + 19;
12877
12878 char *salt_pos = strchr (iter_pos, '.');
12879
12880 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12881
12882 salt_pos++;
12883
12884 char *hash_pos = strchr (salt_pos, '.');
12885
12886 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12887
12888 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12889
12890 hash_pos++;
12891
12892 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
12893 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
12894 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
12895 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
12896 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
12897 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
12898 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
12899 digest[7] = hex_to_uint64_t (&hash_pos[112]);
12900
12901 uint salt_len = hash_pos - salt_pos - 1;
12902
12903 salt_len /= 2;
12904
12905 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
12906
12907 uint i;
12908
12909 for (i = 0; i < salt_len; i++)
12910 {
12911 salt_buf_ptr[i] = hex_to_char (&salt_pos[i * 2]);
12912 }
12913
12914 salt_buf_ptr[salt_len + 3] = 0x01;
12915 salt_buf_ptr[salt_len + 4] = 0x80;
12916
12917 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12918
12919 salt->salt_len = salt_len;
12920
12921 salt->salt_iter = atoi (iter_pos) - 1;
12922
12923 return (PARSER_OK);
12924 }
12925
12926 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12927 {
12928 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
12929
12930 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12931
12932 uint64_t *digest = (uint64_t *) hash_buf->digest;
12933
12934 salt_t *salt = hash_buf->salt;
12935
12936 char tmp_buf[120];
12937
12938 memset (tmp_buf, 0, sizeof (tmp_buf));
12939
12940 int tmp_len = base64_decode (base64_to_int, input_buf + 9, input_len - 9, tmp_buf);
12941
12942 memcpy (digest, tmp_buf, 64);
12943
12944 digest[0] = byte_swap_64 (digest[0]);
12945 digest[1] = byte_swap_64 (digest[1]);
12946 digest[2] = byte_swap_64 (digest[2]);
12947 digest[3] = byte_swap_64 (digest[3]);
12948 digest[4] = byte_swap_64 (digest[4]);
12949 digest[5] = byte_swap_64 (digest[5]);
12950 digest[6] = byte_swap_64 (digest[6]);
12951 digest[7] = byte_swap_64 (digest[7]);
12952
12953 digest[0] -= SHA512M_A;
12954 digest[1] -= SHA512M_B;
12955 digest[2] -= SHA512M_C;
12956 digest[3] -= SHA512M_D;
12957 digest[4] -= SHA512M_E;
12958 digest[5] -= SHA512M_F;
12959 digest[6] -= SHA512M_G;
12960 digest[7] -= SHA512M_H;
12961
12962 salt->salt_len = tmp_len - 64;
12963
12964 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
12965
12966 if (data.opts_type & OPTS_TYPE_ST_ADD80)
12967 {
12968 char *ptr = (char *) salt->salt_buf;
12969
12970 ptr[salt->salt_len] = 0x80;
12971 }
12972
12973 return (PARSER_OK);
12974 }
12975
12976 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12977 {
12978 if (data.opts_type & OPTS_TYPE_ST_HEX)
12979 {
12980 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
12981 }
12982 else
12983 {
12984 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
12985 }
12986
12987 uint32_t *digest = (uint32_t *) hash_buf->digest;
12988
12989 salt_t *salt = hash_buf->salt;
12990
12991 digest[0] = hex_to_uint (&input_buf[ 0]);
12992 digest[1] = hex_to_uint (&input_buf[ 8]);
12993 digest[2] = hex_to_uint (&input_buf[16]);
12994 digest[3] = hex_to_uint (&input_buf[24]);
12995
12996 digest[0] = byte_swap_32 (digest[0]);
12997 digest[1] = byte_swap_32 (digest[1]);
12998 digest[2] = byte_swap_32 (digest[2]);
12999 digest[3] = byte_swap_32 (digest[3]);
13000
13001 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13002
13003 uint salt_len = input_len - 32 - 1;
13004
13005 char *salt_buf = input_buf + 32 + 1;
13006
13007 char *salt_buf_ptr = (char *) salt->salt_buf;
13008
13009 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13010
13011 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13012
13013 salt->salt_len = salt_len;
13014
13015 return (PARSER_OK);
13016 }
13017
13018 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13019 {
13020 if (data.opts_type & OPTS_TYPE_ST_HEX)
13021 {
13022 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13023 }
13024 else
13025 {
13026 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13027 }
13028
13029 uint32_t *digest = (uint32_t *) hash_buf->digest;
13030
13031 salt_t *salt = hash_buf->salt;
13032
13033 digest[0] = hex_to_uint (&input_buf[ 0]);
13034 digest[1] = hex_to_uint (&input_buf[ 8]);
13035 digest[2] = hex_to_uint (&input_buf[16]);
13036 digest[3] = hex_to_uint (&input_buf[24]);
13037 digest[4] = hex_to_uint (&input_buf[32]);
13038
13039 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13040
13041 uint salt_len = input_len - 40 - 1;
13042
13043 char *salt_buf = input_buf + 40 + 1;
13044
13045 char *salt_buf_ptr = (char *) salt->salt_buf;
13046
13047 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13048
13049 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13050
13051 salt->salt_len = salt_len;
13052
13053 return (PARSER_OK);
13054 }
13055
13056 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13057 {
13058 if (data.opts_type & OPTS_TYPE_ST_HEX)
13059 {
13060 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13061 }
13062 else
13063 {
13064 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13065 }
13066
13067 uint32_t *digest = (uint32_t *) hash_buf->digest;
13068
13069 salt_t *salt = hash_buf->salt;
13070
13071 digest[0] = hex_to_uint (&input_buf[ 0]);
13072 digest[1] = hex_to_uint (&input_buf[ 8]);
13073 digest[2] = hex_to_uint (&input_buf[16]);
13074 digest[3] = hex_to_uint (&input_buf[24]);
13075 digest[4] = hex_to_uint (&input_buf[32]);
13076 digest[5] = hex_to_uint (&input_buf[40]);
13077 digest[6] = hex_to_uint (&input_buf[48]);
13078 digest[7] = hex_to_uint (&input_buf[56]);
13079
13080 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13081
13082 uint salt_len = input_len - 64 - 1;
13083
13084 char *salt_buf = input_buf + 64 + 1;
13085
13086 char *salt_buf_ptr = (char *) salt->salt_buf;
13087
13088 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13089
13090 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13091
13092 salt->salt_len = salt_len;
13093
13094 return (PARSER_OK);
13095 }
13096
13097 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13098 {
13099 if (data.opts_type & OPTS_TYPE_ST_HEX)
13100 {
13101 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13102 }
13103 else
13104 {
13105 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13106 }
13107
13108 uint64_t *digest = (uint64_t *) hash_buf->digest;
13109
13110 salt_t *salt = hash_buf->salt;
13111
13112 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
13113 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
13114 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
13115 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
13116 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
13117 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
13118 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
13119 digest[7] = hex_to_uint64_t (&input_buf[112]);
13120
13121 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13122
13123 uint salt_len = input_len - 128 - 1;
13124
13125 char *salt_buf = input_buf + 128 + 1;
13126
13127 char *salt_buf_ptr = (char *) salt->salt_buf;
13128
13129 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13130
13131 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13132
13133 salt->salt_len = salt_len;
13134
13135 return (PARSER_OK);
13136 }
13137
13138 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13139 {
13140 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13141
13142 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13143
13144 uint32_t *digest = (uint32_t *) hash_buf->digest;
13145
13146 salt_t *salt = hash_buf->salt;
13147
13148 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13149
13150 /**
13151 * parse line
13152 */
13153
13154 char *user_pos = input_buf + 10 + 1;
13155
13156 char *realm_pos = strchr (user_pos, '$');
13157
13158 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13159
13160 uint user_len = realm_pos - user_pos;
13161
13162 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13163
13164 realm_pos++;
13165
13166 char *salt_pos = strchr (realm_pos, '$');
13167
13168 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13169
13170 uint realm_len = salt_pos - realm_pos;
13171
13172 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13173
13174 salt_pos++;
13175
13176 char *data_pos = strchr (salt_pos, '$');
13177
13178 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13179
13180 uint salt_len = data_pos - salt_pos;
13181
13182 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13183
13184 data_pos++;
13185
13186 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13187
13188 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13189
13190 /**
13191 * copy data
13192 */
13193
13194 memcpy (krb5pa->user, user_pos, user_len);
13195 memcpy (krb5pa->realm, realm_pos, realm_len);
13196 memcpy (krb5pa->salt, salt_pos, salt_len);
13197
13198 char *timestamp_ptr = (char *) krb5pa->timestamp;
13199
13200 for (uint i = 0; i < (36 * 2); i += 2)
13201 {
13202 const char p0 = data_pos[i + 0];
13203 const char p1 = data_pos[i + 1];
13204
13205 *timestamp_ptr++ = hex_convert (p1) << 0
13206 | hex_convert (p0) << 4;
13207 }
13208
13209 char *checksum_ptr = (char *) krb5pa->checksum;
13210
13211 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13212 {
13213 const char p0 = data_pos[i + 0];
13214 const char p1 = data_pos[i + 1];
13215
13216 *checksum_ptr++ = hex_convert (p1) << 0
13217 | hex_convert (p0) << 4;
13218 }
13219
13220 /**
13221 * copy some data to generic buffers to make sorting happy
13222 */
13223
13224 salt->salt_buf[0] = krb5pa->timestamp[0];
13225 salt->salt_buf[1] = krb5pa->timestamp[1];
13226 salt->salt_buf[2] = krb5pa->timestamp[2];
13227 salt->salt_buf[3] = krb5pa->timestamp[3];
13228 salt->salt_buf[4] = krb5pa->timestamp[4];
13229 salt->salt_buf[5] = krb5pa->timestamp[5];
13230 salt->salt_buf[6] = krb5pa->timestamp[6];
13231 salt->salt_buf[7] = krb5pa->timestamp[7];
13232 salt->salt_buf[8] = krb5pa->timestamp[8];
13233
13234 salt->salt_len = 36;
13235
13236 digest[0] = krb5pa->checksum[0];
13237 digest[1] = krb5pa->checksum[1];
13238 digest[2] = krb5pa->checksum[2];
13239 digest[3] = krb5pa->checksum[3];
13240
13241 return (PARSER_OK);
13242 }
13243
13244 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13245 {
13246 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13247
13248 uint32_t *digest = (uint32_t *) hash_buf->digest;
13249
13250 salt_t *salt = hash_buf->salt;
13251
13252 /**
13253 * parse line
13254 */
13255
13256 char *salt_pos = input_buf;
13257
13258 char *hash_pos = strchr (salt_pos, '$');
13259
13260 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13261
13262 uint salt_len = hash_pos - salt_pos;
13263
13264 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13265
13266 hash_pos++;
13267
13268 uint hash_len = input_len - 1 - salt_len;
13269
13270 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13271
13272 /**
13273 * valid some data
13274 */
13275
13276 uint user_len = 0;
13277
13278 for (uint i = 0; i < salt_len; i++)
13279 {
13280 if (salt_pos[i] == ' ') continue;
13281
13282 user_len++;
13283 }
13284
13285 // SAP user names cannot be longer than 12 characters
13286 if (user_len > 12) return (PARSER_SALT_LENGTH);
13287
13288 // SAP user name cannot start with ! or ?
13289 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13290
13291 /**
13292 * copy data
13293 */
13294
13295 char *salt_buf_ptr = (char *) salt->salt_buf;
13296
13297 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13298
13299 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13300
13301 salt->salt_len = salt_len;
13302
13303 digest[0] = hex_to_uint (&hash_pos[0]);
13304 digest[1] = hex_to_uint (&hash_pos[8]);
13305 digest[2] = 0;
13306 digest[3] = 0;
13307
13308 digest[0] = byte_swap_32 (digest[0]);
13309 digest[1] = byte_swap_32 (digest[1]);
13310
13311 return (PARSER_OK);
13312 }
13313
13314 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13315 {
13316 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13317
13318 uint32_t *digest = (uint32_t *) hash_buf->digest;
13319
13320 salt_t *salt = hash_buf->salt;
13321
13322 /**
13323 * parse line
13324 */
13325
13326 char *salt_pos = input_buf;
13327
13328 char *hash_pos = strchr (salt_pos, '$');
13329
13330 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13331
13332 uint salt_len = hash_pos - salt_pos;
13333
13334 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13335
13336 hash_pos++;
13337
13338 uint hash_len = input_len - 1 - salt_len;
13339
13340 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13341
13342 /**
13343 * valid some data
13344 */
13345
13346 uint user_len = 0;
13347
13348 for (uint i = 0; i < salt_len; i++)
13349 {
13350 if (salt_pos[i] == ' ') continue;
13351
13352 user_len++;
13353 }
13354
13355 // SAP user names cannot be longer than 12 characters
13356 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
13357 // so far nobody complained so we stay with this because it helps in optimization
13358 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
13359
13360 if (user_len > 12) return (PARSER_SALT_LENGTH);
13361
13362 // SAP user name cannot start with ! or ?
13363 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13364
13365 /**
13366 * copy data
13367 */
13368
13369 char *salt_buf_ptr = (char *) salt->salt_buf;
13370
13371 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13372
13373 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13374
13375 salt->salt_len = salt_len;
13376
13377 digest[0] = hex_to_uint (&hash_pos[ 0]);
13378 digest[1] = hex_to_uint (&hash_pos[ 8]);
13379 digest[2] = hex_to_uint (&hash_pos[16]);
13380 digest[3] = hex_to_uint (&hash_pos[24]);
13381 digest[4] = hex_to_uint (&hash_pos[32]);
13382
13383 return (PARSER_OK);
13384 }
13385
13386 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13387 {
13388 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13389
13390 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13391
13392 uint64_t *digest = (uint64_t *) hash_buf->digest;
13393
13394 salt_t *salt = hash_buf->salt;
13395
13396 char *iter_pos = input_buf + 3;
13397
13398 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13399
13400 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13401
13402 memcpy ((char *) salt->salt_sign, input_buf, 4);
13403
13404 salt->salt_iter = salt_iter;
13405
13406 char *salt_pos = iter_pos + 1;
13407
13408 uint salt_len = 8;
13409
13410 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13411
13412 salt->salt_len = salt_len;
13413
13414 char *hash_pos = salt_pos + salt_len;
13415
13416 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13417
13418 // ugly hack start
13419
13420 char *tmp = (char *) salt->salt_buf_pc;
13421
13422 tmp[0] = hash_pos[42];
13423
13424 // ugly hack end
13425
13426 digest[ 0] = byte_swap_64 (digest[ 0]);
13427 digest[ 1] = byte_swap_64 (digest[ 1]);
13428 digest[ 2] = byte_swap_64 (digest[ 2]);
13429 digest[ 3] = byte_swap_64 (digest[ 3]);
13430 digest[ 4] = 0;
13431 digest[ 5] = 0;
13432 digest[ 6] = 0;
13433 digest[ 7] = 0;
13434
13435 return (PARSER_OK);
13436 }
13437
13438 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13439 {
13440 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13441
13442 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13443
13444 uint32_t *digest = (uint32_t *) hash_buf->digest;
13445
13446 salt_t *salt = hash_buf->salt;
13447
13448 char *salt_buf = input_buf + 6;
13449
13450 uint salt_len = 16;
13451
13452 char *salt_buf_ptr = (char *) salt->salt_buf;
13453
13454 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13455
13456 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13457
13458 salt->salt_len = salt_len;
13459
13460 char *hash_pos = input_buf + 6 + 16;
13461
13462 digest[0] = hex_to_uint (&hash_pos[ 0]);
13463 digest[1] = hex_to_uint (&hash_pos[ 8]);
13464 digest[2] = hex_to_uint (&hash_pos[16]);
13465 digest[3] = hex_to_uint (&hash_pos[24]);
13466 digest[4] = hex_to_uint (&hash_pos[32]);
13467 digest[5] = hex_to_uint (&hash_pos[40]);
13468 digest[6] = hex_to_uint (&hash_pos[48]);
13469 digest[7] = hex_to_uint (&hash_pos[56]);
13470
13471 return (PARSER_OK);
13472 }
13473
13474 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13475 {
13476 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13477
13478 uint32_t *digest = (uint32_t *) hash_buf->digest;
13479
13480 digest[0] = hex_to_uint (&input_buf[ 0]);
13481 digest[1] = hex_to_uint (&input_buf[ 8]);
13482 digest[2] = 0;
13483 digest[3] = 0;
13484
13485 return (PARSER_OK);
13486 }
13487
13488 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13489 {
13490 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13491
13492 uint32_t *digest = (uint32_t *) hash_buf->digest;
13493
13494 salt_t *salt = hash_buf->salt;
13495
13496 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13497
13498 char *saltbuf_pos = input_buf;
13499
13500 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13501
13502 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13503
13504 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13505
13506 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13507 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13508
13509 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13510
13511 hashbuf_pos++;
13512
13513 uint hashbuf_len = input_len - saltbuf_len - 1;
13514
13515 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13516
13517 char *salt_ptr = (char *) saltbuf_pos;
13518 char *rakp_ptr = (char *) rakp->salt_buf;
13519
13520 uint i;
13521 uint j;
13522
13523 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13524 {
13525 rakp_ptr[j] = hex_to_char (&salt_ptr[i]);
13526 }
13527
13528 rakp_ptr[j] = 0x80;
13529
13530 rakp->salt_len = j;
13531
13532 for (i = 0; i < 64; i++)
13533 {
13534 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13535 }
13536
13537 salt->salt_buf[0] = rakp->salt_buf[0];
13538 salt->salt_buf[1] = rakp->salt_buf[1];
13539 salt->salt_buf[2] = rakp->salt_buf[2];
13540 salt->salt_buf[3] = rakp->salt_buf[3];
13541 salt->salt_buf[4] = rakp->salt_buf[4];
13542 salt->salt_buf[5] = rakp->salt_buf[5];
13543 salt->salt_buf[6] = rakp->salt_buf[6];
13544 salt->salt_buf[7] = rakp->salt_buf[7];
13545
13546 salt->salt_len = 32; // muss min. 32 haben
13547
13548 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
13549 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
13550 digest[2] = hex_to_uint (&hashbuf_pos[16]);
13551 digest[3] = hex_to_uint (&hashbuf_pos[24]);
13552 digest[4] = hex_to_uint (&hashbuf_pos[32]);
13553
13554 return (PARSER_OK);
13555 }
13556
13557 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13558 {
13559 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13560
13561 uint32_t *digest = (uint32_t *) hash_buf->digest;
13562
13563 salt_t *salt = hash_buf->salt;
13564
13565 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13566
13567 char *salt_pos = input_buf + 1;
13568
13569 memcpy (salt->salt_buf, salt_pos, 8);
13570
13571 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13572 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13573
13574 salt->salt_len = 8;
13575
13576 char *hash_pos = salt_pos + 8;
13577
13578 digest[0] = hex_to_uint (&hash_pos[ 0]);
13579 digest[1] = hex_to_uint (&hash_pos[ 8]);
13580 digest[2] = hex_to_uint (&hash_pos[16]);
13581 digest[3] = hex_to_uint (&hash_pos[24]);
13582 digest[4] = hex_to_uint (&hash_pos[32]);
13583
13584 digest[0] -= SHA1M_A;
13585 digest[1] -= SHA1M_B;
13586 digest[2] -= SHA1M_C;
13587 digest[3] -= SHA1M_D;
13588 digest[4] -= SHA1M_E;
13589
13590 return (PARSER_OK);
13591 }
13592
13593 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13594 {
13595 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13596
13597 uint32_t *digest = (uint32_t *) hash_buf->digest;
13598
13599 salt_t *salt = hash_buf->salt;
13600
13601 digest[0] = hex_to_uint (&input_buf[ 0]);
13602 digest[1] = hex_to_uint (&input_buf[ 8]);
13603 digest[2] = hex_to_uint (&input_buf[16]);
13604 digest[3] = hex_to_uint (&input_buf[24]);
13605
13606 digest[0] = byte_swap_32 (digest[0]);
13607 digest[1] = byte_swap_32 (digest[1]);
13608 digest[2] = byte_swap_32 (digest[2]);
13609 digest[3] = byte_swap_32 (digest[3]);
13610
13611 digest[0] -= MD5M_A;
13612 digest[1] -= MD5M_B;
13613 digest[2] -= MD5M_C;
13614 digest[3] -= MD5M_D;
13615
13616 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13617
13618 char *salt_buf_ptr = input_buf + 32 + 1;
13619
13620 uint32_t *salt_buf = salt->salt_buf;
13621
13622 salt_buf[0] = hex_to_uint (&salt_buf_ptr[ 0]);
13623 salt_buf[1] = hex_to_uint (&salt_buf_ptr[ 8]);
13624 salt_buf[2] = hex_to_uint (&salt_buf_ptr[16]);
13625 salt_buf[3] = hex_to_uint (&salt_buf_ptr[24]);
13626
13627 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13628 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13629 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13630 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13631
13632 salt->salt_len = 16 + 1;
13633
13634 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13635
13636 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13637
13638 salt_buf[4] = hex_to_char (&idbyte_buf_ptr[0]) & 0xff;
13639
13640 return (PARSER_OK);
13641 }
13642
13643 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13644 {
13645 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13646
13647 uint32_t *digest = (uint32_t *) hash_buf->digest;
13648
13649 salt_t *salt = hash_buf->salt;
13650
13651 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13652
13653 /**
13654 * parse line
13655 */
13656
13657 char *hashbuf_pos = input_buf;
13658
13659 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13660
13661 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13662
13663 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13664
13665 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13666
13667 saltbuf_pos++;
13668
13669 char *iteration_pos = strchr (saltbuf_pos, ':');
13670
13671 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13672
13673 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13674
13675 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13676
13677 iteration_pos++;
13678
13679 char *databuf_pos = strchr (iteration_pos, ':');
13680
13681 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13682
13683 const uint iteration_len = databuf_pos - iteration_pos;
13684
13685 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13686 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13687
13688 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13689
13690 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13691 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13692
13693 databuf_pos++;
13694
13695 // digest
13696
13697 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
13698 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
13699 digest[2] = hex_to_uint (&hashbuf_pos[16]);
13700 digest[3] = hex_to_uint (&hashbuf_pos[24]);
13701 digest[4] = hex_to_uint (&hashbuf_pos[32]);
13702 digest[5] = hex_to_uint (&hashbuf_pos[40]);
13703 digest[6] = hex_to_uint (&hashbuf_pos[48]);
13704 digest[7] = hex_to_uint (&hashbuf_pos[56]);
13705
13706 // salt
13707
13708 char *saltbuf_ptr = (char *) salt->salt_buf;
13709
13710 for (uint i = 0; i < saltbuf_len; i += 2)
13711 {
13712 const char p0 = saltbuf_pos[i + 0];
13713 const char p1 = saltbuf_pos[i + 1];
13714
13715 *saltbuf_ptr++ = hex_convert (p1) << 0
13716 | hex_convert (p0) << 4;
13717 }
13718
13719 salt->salt_buf[4] = 0x01000000;
13720 salt->salt_buf[5] = 0x80;
13721
13722 salt->salt_len = saltbuf_len / 2;
13723
13724 // iteration
13725
13726 salt->salt_iter = atoi (iteration_pos) - 1;
13727
13728 // data
13729
13730 char *databuf_ptr = (char *) cloudkey->data_buf;
13731
13732 for (uint i = 0; i < databuf_len; i += 2)
13733 {
13734 const char p0 = databuf_pos[i + 0];
13735 const char p1 = databuf_pos[i + 1];
13736
13737 *databuf_ptr++ = hex_convert (p1) << 0
13738 | hex_convert (p0) << 4;
13739 }
13740
13741 *databuf_ptr++ = 0x80;
13742
13743 for (uint i = 0; i < 512; i++)
13744 {
13745 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13746 }
13747
13748 cloudkey->data_len = databuf_len / 2;
13749
13750 return (PARSER_OK);
13751 }
13752
13753 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13754 {
13755 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13756
13757 uint32_t *digest = (uint32_t *) hash_buf->digest;
13758
13759 salt_t *salt = hash_buf->salt;
13760
13761 /**
13762 * parse line
13763 */
13764
13765 char *hashbuf_pos = input_buf;
13766
13767 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13768
13769 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13770
13771 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13772
13773 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13774
13775 domainbuf_pos++;
13776
13777 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13778
13779 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13780
13781 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13782
13783 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13784
13785 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13786
13787 saltbuf_pos++;
13788
13789 char *iteration_pos = strchr (saltbuf_pos, ':');
13790
13791 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13792
13793 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13794
13795 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13796
13797 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13798
13799 iteration_pos++;
13800
13801 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13802
13803 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13804 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13805
13806 // ok, the plan for this algorithm is the following:
13807 // we have 2 salts here, the domain-name and a random salt
13808 // while both are used in the initial transformation,
13809 // only the random salt is used in the following iterations
13810 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13811 // and one that includes only the real salt (stored into salt_buf[]).
13812 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13813
13814 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
13815
13816 base32_decode (itoa32_to_int, hashbuf_pos, 32, tmp_buf);
13817
13818 memcpy (digest, tmp_buf, 20);
13819
13820 digest[0] = byte_swap_32 (digest[0]);
13821 digest[1] = byte_swap_32 (digest[1]);
13822 digest[2] = byte_swap_32 (digest[2]);
13823 digest[3] = byte_swap_32 (digest[3]);
13824 digest[4] = byte_swap_32 (digest[4]);
13825
13826 // domain
13827
13828 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13829
13830 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
13831
13832 char *len_ptr = NULL;
13833
13834 for (uint i = 0; i < domainbuf_len; i++)
13835 {
13836 if (salt_buf_pc_ptr[i] == '.')
13837 {
13838 len_ptr = &salt_buf_pc_ptr[i];
13839
13840 *len_ptr = 0;
13841 }
13842 else
13843 {
13844 *len_ptr += 1;
13845 }
13846 }
13847
13848 salt->salt_buf_pc[7] = domainbuf_len;
13849
13850 // "real" salt
13851
13852 char *salt_buf_ptr = (char *) salt->salt_buf;
13853
13854 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
13855
13856 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13857
13858 salt->salt_len = salt_len;
13859
13860 // iteration
13861
13862 salt->salt_iter = atoi (iteration_pos);
13863
13864 return (PARSER_OK);
13865 }
13866
13867 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13868 {
13869 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
13870
13871 uint32_t *digest = (uint32_t *) hash_buf->digest;
13872
13873 salt_t *salt = hash_buf->salt;
13874
13875 digest[0] = hex_to_uint (&input_buf[ 0]);
13876 digest[1] = hex_to_uint (&input_buf[ 8]);
13877 digest[2] = hex_to_uint (&input_buf[16]);
13878 digest[3] = hex_to_uint (&input_buf[24]);
13879 digest[4] = hex_to_uint (&input_buf[32]);
13880
13881 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13882
13883 uint salt_len = input_len - 40 - 1;
13884
13885 char *salt_buf = input_buf + 40 + 1;
13886
13887 char *salt_buf_ptr = (char *) salt->salt_buf;
13888
13889 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13890
13891 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13892
13893 salt->salt_len = salt_len;
13894
13895 return (PARSER_OK);
13896 }
13897
13898 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13899 {
13900 const uint8_t ascii_to_ebcdic[] =
13901 {
13902 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
13903 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
13904 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
13905 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
13906 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
13907 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
13908 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
13909 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
13910 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
13911 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
13912 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
13913 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
13914 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
13915 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
13916 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
13917 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
13918 };
13919
13920 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
13921
13922 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13923
13924 uint32_t *digest = (uint32_t *) hash_buf->digest;
13925
13926 salt_t *salt = hash_buf->salt;
13927
13928 char *salt_pos = input_buf + 6 + 1;
13929
13930 char *digest_pos = strchr (salt_pos, '*');
13931
13932 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13933
13934 uint salt_len = digest_pos - salt_pos;
13935
13936 if (salt_len > 8) return (PARSER_SALT_LENGTH);
13937
13938 uint hash_len = input_len - 1 - salt_len - 1 - 6;
13939
13940 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13941
13942 digest_pos++;
13943
13944 char *salt_buf_ptr = (char *) salt->salt_buf;
13945 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13946
13947 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13948
13949 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13950
13951 salt->salt_len = salt_len;
13952
13953 for (uint i = 0; i < salt_len; i++)
13954 {
13955 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
13956 }
13957 for (uint i = salt_len; i < 8; i++)
13958 {
13959 salt_buf_pc_ptr[i] = 0x40;
13960 }
13961
13962 uint tt;
13963
13964 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
13965
13966 salt->salt_buf_pc[0] = ROTATE_LEFT (salt->salt_buf_pc[0], 3u);
13967 salt->salt_buf_pc[1] = ROTATE_LEFT (salt->salt_buf_pc[1], 3u);
13968
13969 digest[0] = hex_to_uint (&digest_pos[ 0]);
13970 digest[1] = hex_to_uint (&digest_pos[ 8]);
13971
13972 digest[0] = byte_swap_32 (digest[0]);
13973 digest[1] = byte_swap_32 (digest[1]);
13974
13975 IP (digest[0], digest[1], tt);
13976
13977 digest[0] = ROTATE_RIGHT (digest[0], 29);
13978 digest[1] = ROTATE_RIGHT (digest[1], 29);
13979 digest[2] = 0;
13980 digest[3] = 0;
13981
13982 return (PARSER_OK);
13983 }
13984
13985 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13986 {
13987 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
13988
13989 uint32_t *digest = (uint32_t *) hash_buf->digest;
13990
13991 digest[0] = hex_to_uint (&input_buf[ 0]);
13992 digest[1] = hex_to_uint (&input_buf[ 8]);
13993 digest[2] = hex_to_uint (&input_buf[16]);
13994 digest[3] = hex_to_uint (&input_buf[24]);
13995
13996 digest[0] = byte_swap_32 (digest[0]);
13997 digest[1] = byte_swap_32 (digest[1]);
13998 digest[2] = byte_swap_32 (digest[2]);
13999 digest[3] = byte_swap_32 (digest[3]);
14000
14001 return (PARSER_OK);
14002 }
14003
14004 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14005 {
14006 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14007
14008 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14009
14010 uint32_t *digest = (uint32_t *) hash_buf->digest;
14011
14012 salt_t *salt = hash_buf->salt;
14013
14014 char tmp_buf[120];
14015
14016 memset (tmp_buf, 0, sizeof (tmp_buf));
14017
14018 base64_decode (lotus64_to_int, input_buf + 2, input_len - 3, tmp_buf);
14019
14020 tmp_buf[3] += -4; // dont ask!
14021
14022 memcpy (salt->salt_buf, tmp_buf, 5);
14023
14024 salt->salt_len = 5;
14025
14026 memcpy (digest, tmp_buf + 5, 9);
14027
14028 // yes, only 9 byte are needed to crack, but 10 to display
14029
14030 salt->salt_buf_pc[7] = input_buf[20];
14031
14032 return (PARSER_OK);
14033 }
14034
14035 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14036 {
14037 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14038
14039 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14040
14041 uint32_t *digest = (uint32_t *) hash_buf->digest;
14042
14043 salt_t *salt = hash_buf->salt;
14044
14045 char tmp_buf[120];
14046
14047 memset (tmp_buf, 0, sizeof (tmp_buf));
14048
14049 base64_decode (lotus64_to_int, input_buf + 2, input_len - 3, tmp_buf);
14050
14051 tmp_buf[3] += -4; // dont ask!
14052
14053 // salt
14054
14055 memcpy (salt->salt_buf, tmp_buf, 16);
14056
14057 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)
14058
14059 // iteration
14060
14061 char tmp_iter_buf[11];
14062
14063 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14064
14065 tmp_iter_buf[10] = 0;
14066
14067 salt->salt_iter = atoi (tmp_iter_buf);
14068
14069 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14070 {
14071 return (PARSER_SALT_ITERATION);
14072 }
14073
14074 salt->salt_iter--; // first round in init
14075
14076 // 2 additional bytes for display only
14077
14078 salt->salt_buf_pc[0] = tmp_buf[26];
14079 salt->salt_buf_pc[1] = tmp_buf[27];
14080
14081 // digest
14082
14083 memcpy (digest, tmp_buf + 28, 8);
14084
14085 digest[0] = byte_swap_32 (digest[0]);
14086 digest[1] = byte_swap_32 (digest[1]);
14087 digest[2] = 0;
14088 digest[3] = 0;
14089
14090 return (PARSER_OK);
14091 }
14092
14093 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14094 {
14095 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14096
14097 uint32_t *digest = (uint32_t *) hash_buf->digest;
14098
14099 salt_t *salt = hash_buf->salt;
14100
14101 char *salt_buf_pos = input_buf;
14102
14103 char *hash_buf_pos = salt_buf_pos + 6;
14104
14105 digest[0] = hex_to_uint (&hash_buf_pos[ 0]);
14106 digest[1] = hex_to_uint (&hash_buf_pos[ 8]);
14107 digest[2] = hex_to_uint (&hash_buf_pos[16]);
14108 digest[3] = hex_to_uint (&hash_buf_pos[24]);
14109 digest[4] = hex_to_uint (&hash_buf_pos[32]);
14110 digest[5] = hex_to_uint (&hash_buf_pos[40]);
14111 digest[6] = hex_to_uint (&hash_buf_pos[48]);
14112 digest[7] = hex_to_uint (&hash_buf_pos[56]);
14113
14114 digest[0] -= SHA256M_A;
14115 digest[1] -= SHA256M_B;
14116 digest[2] -= SHA256M_C;
14117 digest[3] -= SHA256M_D;
14118 digest[4] -= SHA256M_E;
14119 digest[5] -= SHA256M_F;
14120 digest[6] -= SHA256M_G;
14121 digest[7] -= SHA256M_H;
14122
14123 char *salt_buf_ptr = (char *) salt->salt_buf;
14124
14125 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14126
14127 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14128
14129 salt->salt_len = salt_len;
14130
14131 return (PARSER_OK);
14132 }
14133
14134 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14135 {
14136 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14137
14138 uint32_t *digest = (uint32_t *) hash_buf->digest;
14139
14140 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14141
14142 salt_t *salt = hash_buf->salt;
14143
14144 char *salt_buf = input_buf + 6;
14145
14146 char *digest_buf = strchr (salt_buf, '$');
14147
14148 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14149
14150 uint salt_len = digest_buf - salt_buf;
14151
14152 digest_buf++; // skip the '$' symbol
14153
14154 char *salt_buf_ptr = (char *) salt->salt_buf;
14155
14156 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14157
14158 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14159
14160 salt->salt_len = salt_len;
14161
14162 digest[0] = hex_to_uint (&digest_buf[ 0]);
14163 digest[1] = hex_to_uint (&digest_buf[ 8]);
14164 digest[2] = hex_to_uint (&digest_buf[16]);
14165 digest[3] = hex_to_uint (&digest_buf[24]);
14166
14167 digest[0] = byte_swap_32 (digest[0]);
14168 digest[1] = byte_swap_32 (digest[1]);
14169 digest[2] = byte_swap_32 (digest[2]);
14170 digest[3] = byte_swap_32 (digest[3]);
14171
14172 digest[0] -= MD5M_A;
14173 digest[1] -= MD5M_B;
14174 digest[2] -= MD5M_C;
14175 digest[3] -= MD5M_D;
14176
14177 return (PARSER_OK);
14178 }
14179
14180 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14181 {
14182 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14183
14184 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14185
14186 uint32_t *digest = (uint32_t *) hash_buf->digest;
14187
14188 salt_t *salt = hash_buf->salt;
14189
14190 char *salt_buf = input_buf + 3;
14191
14192 char *digest_buf = strchr (salt_buf, '$');
14193
14194 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14195
14196 uint salt_len = digest_buf - salt_buf;
14197
14198 digest_buf++; // skip the '$' symbol
14199
14200 char *salt_buf_ptr = (char *) salt->salt_buf;
14201
14202 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14203
14204 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14205
14206 salt_buf_ptr[salt_len] = 0x2d;
14207
14208 salt->salt_len = salt_len + 1;
14209
14210 digest[0] = hex_to_uint (&digest_buf[ 0]);
14211 digest[1] = hex_to_uint (&digest_buf[ 8]);
14212 digest[2] = hex_to_uint (&digest_buf[16]);
14213 digest[3] = hex_to_uint (&digest_buf[24]);
14214
14215 digest[0] = byte_swap_32 (digest[0]);
14216 digest[1] = byte_swap_32 (digest[1]);
14217 digest[2] = byte_swap_32 (digest[2]);
14218 digest[3] = byte_swap_32 (digest[3]);
14219
14220 digest[0] -= MD5M_A;
14221 digest[1] -= MD5M_B;
14222 digest[2] -= MD5M_C;
14223 digest[3] -= MD5M_D;
14224
14225 return (PARSER_OK);
14226 }
14227
14228 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14229 {
14230 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14231
14232 uint32_t *digest = (uint32_t *) hash_buf->digest;
14233
14234 char tmp_buf[100];
14235
14236 memset (tmp_buf, 0, sizeof (tmp_buf));
14237
14238 base64_decode (base64_to_int, input_buf, input_len, tmp_buf);
14239
14240 memcpy (digest, tmp_buf, 20);
14241
14242 digest[0] = byte_swap_32 (digest[0]);
14243 digest[1] = byte_swap_32 (digest[1]);
14244 digest[2] = byte_swap_32 (digest[2]);
14245 digest[3] = byte_swap_32 (digest[3]);
14246 digest[4] = byte_swap_32 (digest[4]);
14247
14248 digest[0] -= SHA1M_A;
14249 digest[1] -= SHA1M_B;
14250 digest[2] -= SHA1M_C;
14251 digest[3] -= SHA1M_D;
14252 digest[4] -= SHA1M_E;
14253
14254 return (PARSER_OK);
14255 }
14256
14257 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14258 {
14259 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14260
14261 uint32_t *digest = (uint32_t *) hash_buf->digest;
14262
14263 salt_t *salt = hash_buf->salt;
14264
14265 digest[0] = hex_to_uint (&input_buf[ 0]);
14266 digest[1] = hex_to_uint (&input_buf[ 8]);
14267 digest[2] = hex_to_uint (&input_buf[16]);
14268 digest[3] = hex_to_uint (&input_buf[24]);
14269
14270 digest[0] = byte_swap_32 (digest[0]);
14271 digest[1] = byte_swap_32 (digest[1]);
14272 digest[2] = byte_swap_32 (digest[2]);
14273 digest[3] = byte_swap_32 (digest[3]);
14274
14275 digest[0] -= MD5M_A;
14276 digest[1] -= MD5M_B;
14277 digest[2] -= MD5M_C;
14278 digest[3] -= MD5M_D;
14279
14280 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14281
14282 uint salt_len = input_len - 32 - 1;
14283
14284 char *salt_buf = input_buf + 32 + 1;
14285
14286 char *salt_buf_ptr = (char *) salt->salt_buf;
14287
14288 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14289
14290 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14291
14292 /*
14293 * add static "salt" part
14294 */
14295
14296 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14297
14298 salt_len += 8;
14299
14300 salt->salt_len = salt_len;
14301
14302 return (PARSER_OK);
14303 }
14304
14305 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14306 {
14307 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14308
14309 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14310
14311 uint32_t *digest = (uint32_t *) hash_buf->digest;
14312
14313 salt_t *salt = hash_buf->salt;
14314
14315 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14316
14317 /**
14318 * parse line
14319 */
14320
14321 char *saltlen_pos = input_buf + 1 + 3 + 1;
14322
14323 char *saltbuf_pos = strchr (saltlen_pos, '$');
14324
14325 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14326
14327 uint saltlen_len = saltbuf_pos - saltlen_pos;
14328
14329 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14330
14331 saltbuf_pos++;
14332
14333 char *keylen_pos = strchr (saltbuf_pos, '$');
14334
14335 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14336
14337 uint saltbuf_len = keylen_pos - saltbuf_pos;
14338
14339 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14340
14341 keylen_pos++;
14342
14343 char *keybuf_pos = strchr (keylen_pos, '$');
14344
14345 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14346
14347 uint keylen_len = keybuf_pos - keylen_pos;
14348
14349 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14350
14351 keybuf_pos++;
14352
14353 char *databuf_pos = strchr (keybuf_pos, '$');
14354
14355 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14356
14357 uint keybuf_len = databuf_pos - keybuf_pos;
14358
14359 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14360
14361 databuf_pos++;
14362
14363 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14364
14365 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14366
14367 /**
14368 * copy data
14369 */
14370
14371 digest[0] = hex_to_uint (&keybuf_pos[ 0]);
14372 digest[1] = hex_to_uint (&keybuf_pos[ 8]);
14373 digest[2] = hex_to_uint (&keybuf_pos[16]);
14374 digest[3] = hex_to_uint (&keybuf_pos[24]);
14375
14376 salt->salt_buf[0] = hex_to_uint (&saltbuf_pos[ 0]);
14377 salt->salt_buf[1] = hex_to_uint (&saltbuf_pos[ 8]);
14378 salt->salt_buf[2] = hex_to_uint (&saltbuf_pos[16]);
14379 salt->salt_buf[3] = hex_to_uint (&saltbuf_pos[24]);
14380
14381 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14382 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14383 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14384 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14385
14386 salt->salt_len = 16;
14387 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14388
14389 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14390 {
14391 androidfde->data[j] = hex_to_uint (&databuf_pos[i]);
14392 }
14393
14394 return (PARSER_OK);
14395 }
14396
14397 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14398 {
14399 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14400
14401 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14402
14403 uint32_t *digest = (uint32_t *) hash_buf->digest;
14404
14405 salt_t *salt = hash_buf->salt;
14406
14407 /**
14408 * parse line
14409 */
14410
14411 // first is the N salt parameter
14412
14413 char *N_pos = input_buf + 6;
14414
14415 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14416
14417 N_pos++;
14418
14419 salt->scrypt_N = atoi (N_pos);
14420
14421 // r
14422
14423 char *r_pos = strchr (N_pos, ':');
14424
14425 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14426
14427 r_pos++;
14428
14429 salt->scrypt_r = atoi (r_pos);
14430
14431 // p
14432
14433 char *p_pos = strchr (r_pos, ':');
14434
14435 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14436
14437 p_pos++;
14438
14439 salt->scrypt_p = atoi (p_pos);
14440
14441 // salt
14442
14443 char *saltbuf_pos = strchr (p_pos, ':');
14444
14445 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14446
14447 saltbuf_pos++;
14448
14449 char *hash_pos = strchr (saltbuf_pos, ':');
14450
14451 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14452
14453 hash_pos++;
14454
14455 // base64 decode
14456
14457 char tmp_buf[32];
14458
14459 memset (tmp_buf, 0, sizeof (tmp_buf));
14460
14461 int tmp_len = base64_decode (base64_to_int, saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14462
14463 char *salt_buf_ptr = (char *) salt->salt_buf;
14464
14465 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14466
14467 salt->salt_len = tmp_len;
14468 salt->salt_iter = 1;
14469
14470 // digest - base64 decode
14471
14472 memset (tmp_buf, 0, sizeof (tmp_buf));
14473
14474 tmp_len = input_len - (hash_pos - input_buf);
14475
14476 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14477
14478 base64_decode (base64_to_int, hash_pos, tmp_len, tmp_buf);
14479
14480 memcpy (digest, tmp_buf, 32);
14481
14482 return (PARSER_OK);
14483 }
14484
14485 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14486 {
14487 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14488
14489 uint32_t *digest = (uint32_t *) hash_buf->digest;
14490
14491 salt_t *salt = hash_buf->salt;
14492
14493 /**
14494 * parse line
14495 */
14496
14497 char decrypted[76]; // iv + hash
14498
14499 juniper_decrypt_hash (input_buf, decrypted);
14500
14501 char *md5crypt_hash = decrypted + 12;
14502
14503 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14504
14505 salt->salt_iter = ROUNDS_MD5CRYPT;
14506
14507 char *salt_pos = md5crypt_hash + 3;
14508
14509 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14510
14511 salt->salt_len = hash_pos - salt_pos; // should be 8
14512
14513 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14514
14515 hash_pos++;
14516
14517 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14518
14519 return (PARSER_OK);
14520 }
14521
14522 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14523 {
14524 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14525
14526 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14527
14528 uint32_t *digest = (uint32_t *) hash_buf->digest;
14529
14530 salt_t *salt = hash_buf->salt;
14531
14532 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14533
14534 /**
14535 * parse line
14536 */
14537
14538 // first is *raw* salt
14539
14540 char *salt_pos = input_buf + 3;
14541
14542 char *hash_pos = strchr (salt_pos, '$');
14543
14544 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14545
14546 uint salt_len = hash_pos - salt_pos;
14547
14548 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14549
14550 hash_pos++;
14551
14552 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14553
14554 memcpy (salt_buf_ptr, salt_pos, 14);
14555
14556 salt_buf_ptr[17] = 0x01;
14557 salt_buf_ptr[18] = 0x80;
14558
14559 // add some stuff to normal salt to make sorted happy
14560
14561 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14562 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14563 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14564 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14565
14566 salt->salt_len = salt_len;
14567 salt->salt_iter = ROUNDS_CISCO8 - 1;
14568
14569 // base64 decode hash
14570
14571 char tmp_buf[100];
14572
14573 memset (tmp_buf, 0, sizeof (tmp_buf));
14574
14575 uint hash_len = input_len - 3 - salt_len - 1;
14576
14577 int tmp_len = base64_decode (itoa64_to_int, hash_pos, hash_len, tmp_buf);
14578
14579 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14580
14581 memcpy (digest, tmp_buf, 32);
14582
14583 digest[0] = byte_swap_32 (digest[0]);
14584 digest[1] = byte_swap_32 (digest[1]);
14585 digest[2] = byte_swap_32 (digest[2]);
14586 digest[3] = byte_swap_32 (digest[3]);
14587 digest[4] = byte_swap_32 (digest[4]);
14588 digest[5] = byte_swap_32 (digest[5]);
14589 digest[6] = byte_swap_32 (digest[6]);
14590 digest[7] = byte_swap_32 (digest[7]);
14591
14592 return (PARSER_OK);
14593 }
14594
14595 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14596 {
14597 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14598
14599 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14600
14601 uint32_t *digest = (uint32_t *) hash_buf->digest;
14602
14603 salt_t *salt = hash_buf->salt;
14604
14605 /**
14606 * parse line
14607 */
14608
14609 // first is *raw* salt
14610
14611 char *salt_pos = input_buf + 3;
14612
14613 char *hash_pos = strchr (salt_pos, '$');
14614
14615 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14616
14617 uint salt_len = hash_pos - salt_pos;
14618
14619 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14620
14621 salt->salt_len = salt_len;
14622 hash_pos++;
14623
14624 char *salt_buf_ptr = (char *) salt->salt_buf;
14625
14626 memcpy (salt_buf_ptr, salt_pos, salt_len);
14627 salt_buf_ptr[salt_len] = 0;
14628
14629 // base64 decode hash
14630
14631 char tmp_buf[100];
14632
14633 memset (tmp_buf, 0, sizeof (tmp_buf));
14634
14635 uint hash_len = input_len - 3 - salt_len - 1;
14636
14637 int tmp_len = base64_decode (itoa64_to_int, hash_pos, hash_len, tmp_buf);
14638
14639 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14640
14641 memcpy (digest, tmp_buf, 32);
14642
14643 // fixed:
14644 salt->scrypt_N = 16384;
14645 salt->scrypt_r = 1;
14646 salt->scrypt_p = 1;
14647 salt->salt_iter = 1;
14648
14649 return (PARSER_OK);
14650 }
14651
14652 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14653 {
14654 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14655
14656 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14657
14658 uint32_t *digest = (uint32_t *) hash_buf->digest;
14659
14660 salt_t *salt = hash_buf->salt;
14661
14662 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14663
14664 /**
14665 * parse line
14666 */
14667
14668 char *version_pos = input_buf + 8 + 1;
14669
14670 char *verifierHashSize_pos = strchr (version_pos, '*');
14671
14672 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14673
14674 uint32_t version_len = verifierHashSize_pos - version_pos;
14675
14676 if (version_len != 4) return (PARSER_SALT_LENGTH);
14677
14678 verifierHashSize_pos++;
14679
14680 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14681
14682 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14683
14684 uint32_t verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14685
14686 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14687
14688 keySize_pos++;
14689
14690 char *saltSize_pos = strchr (keySize_pos, '*');
14691
14692 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14693
14694 uint32_t keySize_len = saltSize_pos - keySize_pos;
14695
14696 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14697
14698 saltSize_pos++;
14699
14700 char *osalt_pos = strchr (saltSize_pos, '*');
14701
14702 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14703
14704 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14705
14706 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14707
14708 osalt_pos++;
14709
14710 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14711
14712 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14713
14714 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14715
14716 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14717
14718 encryptedVerifier_pos++;
14719
14720 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14721
14722 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14723
14724 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14725
14726 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14727
14728 encryptedVerifierHash_pos++;
14729
14730 uint32_t encryptedVerifierHash_len = input_len - 8 - 1 - version_len - 1 - verifierHashSize_len - 1 - keySize_len - 1 - saltSize_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
14731
14732 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14733
14734 const uint version = atoi (version_pos);
14735
14736 if (version != 2007) return (PARSER_SALT_VALUE);
14737
14738 const uint verifierHashSize = atoi (verifierHashSize_pos);
14739
14740 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14741
14742 const uint keySize = atoi (keySize_pos);
14743
14744 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14745
14746 office2007->keySize = keySize;
14747
14748 const uint saltSize = atoi (saltSize_pos);
14749
14750 if (saltSize != 16) return (PARSER_SALT_VALUE);
14751
14752 /**
14753 * salt
14754 */
14755
14756 salt->salt_len = 16;
14757 salt->salt_iter = ROUNDS_OFFICE2007;
14758
14759 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14760 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14761 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14762 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14763
14764 /**
14765 * esalt
14766 */
14767
14768 office2007->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14769 office2007->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14770 office2007->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14771 office2007->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14772
14773 office2007->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14774 office2007->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14775 office2007->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14776 office2007->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14777 office2007->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14778
14779 /**
14780 * digest
14781 */
14782
14783 digest[0] = office2007->encryptedVerifierHash[0];
14784 digest[1] = office2007->encryptedVerifierHash[1];
14785 digest[2] = office2007->encryptedVerifierHash[2];
14786 digest[3] = office2007->encryptedVerifierHash[3];
14787
14788 return (PARSER_OK);
14789 }
14790
14791 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14792 {
14793 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14794
14795 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14796
14797 uint32_t *digest = (uint32_t *) hash_buf->digest;
14798
14799 salt_t *salt = hash_buf->salt;
14800
14801 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14802
14803 /**
14804 * parse line
14805 */
14806
14807 char *version_pos = input_buf + 8 + 1;
14808
14809 char *spinCount_pos = strchr (version_pos, '*');
14810
14811 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14812
14813 uint32_t version_len = spinCount_pos - version_pos;
14814
14815 if (version_len != 4) return (PARSER_SALT_LENGTH);
14816
14817 spinCount_pos++;
14818
14819 char *keySize_pos = strchr (spinCount_pos, '*');
14820
14821 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14822
14823 uint32_t spinCount_len = keySize_pos - spinCount_pos;
14824
14825 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14826
14827 keySize_pos++;
14828
14829 char *saltSize_pos = strchr (keySize_pos, '*');
14830
14831 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14832
14833 uint32_t keySize_len = saltSize_pos - keySize_pos;
14834
14835 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14836
14837 saltSize_pos++;
14838
14839 char *osalt_pos = strchr (saltSize_pos, '*');
14840
14841 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14842
14843 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14844
14845 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14846
14847 osalt_pos++;
14848
14849 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14850
14851 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14852
14853 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14854
14855 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14856
14857 encryptedVerifier_pos++;
14858
14859 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14860
14861 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14862
14863 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14864
14865 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14866
14867 encryptedVerifierHash_pos++;
14868
14869 uint32_t encryptedVerifierHash_len = input_len - 8 - 1 - version_len - 1 - spinCount_len - 1 - keySize_len - 1 - saltSize_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
14870
14871 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14872
14873 const uint version = atoi (version_pos);
14874
14875 if (version != 2010) return (PARSER_SALT_VALUE);
14876
14877 const uint spinCount = atoi (spinCount_pos);
14878
14879 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14880
14881 const uint keySize = atoi (keySize_pos);
14882
14883 if (keySize != 128) return (PARSER_SALT_VALUE);
14884
14885 const uint saltSize = atoi (saltSize_pos);
14886
14887 if (saltSize != 16) return (PARSER_SALT_VALUE);
14888
14889 /**
14890 * salt
14891 */
14892
14893 salt->salt_len = 16;
14894 salt->salt_iter = spinCount;
14895
14896 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14897 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14898 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14899 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14900
14901 /**
14902 * esalt
14903 */
14904
14905 office2010->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14906 office2010->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14907 office2010->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14908 office2010->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14909
14910 office2010->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14911 office2010->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14912 office2010->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14913 office2010->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14914 office2010->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14915 office2010->encryptedVerifierHash[5] = hex_to_uint (&encryptedVerifierHash_pos[40]);
14916 office2010->encryptedVerifierHash[6] = hex_to_uint (&encryptedVerifierHash_pos[48]);
14917 office2010->encryptedVerifierHash[7] = hex_to_uint (&encryptedVerifierHash_pos[56]);
14918
14919 /**
14920 * digest
14921 */
14922
14923 digest[0] = office2010->encryptedVerifierHash[0];
14924 digest[1] = office2010->encryptedVerifierHash[1];
14925 digest[2] = office2010->encryptedVerifierHash[2];
14926 digest[3] = office2010->encryptedVerifierHash[3];
14927
14928 return (PARSER_OK);
14929 }
14930
14931 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14932 {
14933 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
14934
14935 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14936
14937 uint32_t *digest = (uint32_t *) hash_buf->digest;
14938
14939 salt_t *salt = hash_buf->salt;
14940
14941 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
14942
14943 /**
14944 * parse line
14945 */
14946
14947 char *version_pos = input_buf + 8 + 1;
14948
14949 char *spinCount_pos = strchr (version_pos, '*');
14950
14951 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14952
14953 uint32_t version_len = spinCount_pos - version_pos;
14954
14955 if (version_len != 4) return (PARSER_SALT_LENGTH);
14956
14957 spinCount_pos++;
14958
14959 char *keySize_pos = strchr (spinCount_pos, '*');
14960
14961 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14962
14963 uint32_t spinCount_len = keySize_pos - spinCount_pos;
14964
14965 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14966
14967 keySize_pos++;
14968
14969 char *saltSize_pos = strchr (keySize_pos, '*');
14970
14971 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14972
14973 uint32_t keySize_len = saltSize_pos - keySize_pos;
14974
14975 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14976
14977 saltSize_pos++;
14978
14979 char *osalt_pos = strchr (saltSize_pos, '*');
14980
14981 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14982
14983 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14984
14985 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14986
14987 osalt_pos++;
14988
14989 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14990
14991 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14992
14993 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14994
14995 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14996
14997 encryptedVerifier_pos++;
14998
14999 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15000
15001 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15002
15003 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15004
15005 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15006
15007 encryptedVerifierHash_pos++;
15008
15009 uint32_t encryptedVerifierHash_len = input_len - 8 - 1 - version_len - 1 - spinCount_len - 1 - keySize_len - 1 - saltSize_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15010
15011 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15012
15013 const uint version = atoi (version_pos);
15014
15015 if (version != 2013) return (PARSER_SALT_VALUE);
15016
15017 const uint spinCount = atoi (spinCount_pos);
15018
15019 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15020
15021 const uint keySize = atoi (keySize_pos);
15022
15023 if (keySize != 256) return (PARSER_SALT_VALUE);
15024
15025 const uint saltSize = atoi (saltSize_pos);
15026
15027 if (saltSize != 16) return (PARSER_SALT_VALUE);
15028
15029 /**
15030 * salt
15031 */
15032
15033 salt->salt_len = 16;
15034 salt->salt_iter = spinCount;
15035
15036 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15037 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15038 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15039 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15040
15041 /**
15042 * esalt
15043 */
15044
15045 office2013->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15046 office2013->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15047 office2013->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15048 office2013->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15049
15050 office2013->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15051 office2013->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15052 office2013->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15053 office2013->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15054 office2013->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15055 office2013->encryptedVerifierHash[5] = hex_to_uint (&encryptedVerifierHash_pos[40]);
15056 office2013->encryptedVerifierHash[6] = hex_to_uint (&encryptedVerifierHash_pos[48]);
15057 office2013->encryptedVerifierHash[7] = hex_to_uint (&encryptedVerifierHash_pos[56]);
15058
15059 /**
15060 * digest
15061 */
15062
15063 digest[0] = office2013->encryptedVerifierHash[0];
15064 digest[1] = office2013->encryptedVerifierHash[1];
15065 digest[2] = office2013->encryptedVerifierHash[2];
15066 digest[3] = office2013->encryptedVerifierHash[3];
15067
15068 return (PARSER_OK);
15069 }
15070
15071 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15072 {
15073 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15074
15075 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15076
15077 uint32_t *digest = (uint32_t *) hash_buf->digest;
15078
15079 salt_t *salt = hash_buf->salt;
15080
15081 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15082
15083 /**
15084 * parse line
15085 */
15086
15087 char *version_pos = input_buf + 11;
15088
15089 char *osalt_pos = strchr (version_pos, '*');
15090
15091 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15092
15093 uint32_t version_len = osalt_pos - version_pos;
15094
15095 if (version_len != 1) return (PARSER_SALT_LENGTH);
15096
15097 osalt_pos++;
15098
15099 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15100
15101 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15102
15103 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15104
15105 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15106
15107 encryptedVerifier_pos++;
15108
15109 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15110
15111 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15112
15113 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15114
15115 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15116
15117 encryptedVerifierHash_pos++;
15118
15119 uint32_t encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15120
15121 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15122
15123 const uint version = *version_pos - 0x30;
15124
15125 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15126
15127 /**
15128 * esalt
15129 */
15130
15131 oldoffice01->version = version;
15132
15133 oldoffice01->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15134 oldoffice01->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15135 oldoffice01->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15136 oldoffice01->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15137
15138 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15139 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15140 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15141 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15142
15143 oldoffice01->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15144 oldoffice01->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15145 oldoffice01->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15146 oldoffice01->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15147
15148 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15149 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15150 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15151 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15152
15153 /**
15154 * salt
15155 */
15156
15157 salt->salt_len = 16;
15158
15159 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15160 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15161 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15162 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15163
15164 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15165 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15166 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15167 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15168
15169 // this is a workaround as office produces multiple documents with the same salt
15170
15171 salt->salt_len += 32;
15172
15173 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15174 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15175 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15176 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15177 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15178 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15179 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15180 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15181
15182 /**
15183 * digest
15184 */
15185
15186 digest[0] = oldoffice01->encryptedVerifierHash[0];
15187 digest[1] = oldoffice01->encryptedVerifierHash[1];
15188 digest[2] = oldoffice01->encryptedVerifierHash[2];
15189 digest[3] = oldoffice01->encryptedVerifierHash[3];
15190
15191 return (PARSER_OK);
15192 }
15193
15194 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15195 {
15196 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15197 }
15198
15199 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15200 {
15201 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15202
15203 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15204
15205 uint32_t *digest = (uint32_t *) hash_buf->digest;
15206
15207 salt_t *salt = hash_buf->salt;
15208
15209 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15210
15211 /**
15212 * parse line
15213 */
15214
15215 char *version_pos = input_buf + 11;
15216
15217 char *osalt_pos = strchr (version_pos, '*');
15218
15219 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15220
15221 uint32_t version_len = osalt_pos - version_pos;
15222
15223 if (version_len != 1) return (PARSER_SALT_LENGTH);
15224
15225 osalt_pos++;
15226
15227 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15228
15229 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15230
15231 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15232
15233 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15234
15235 encryptedVerifier_pos++;
15236
15237 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15238
15239 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15240
15241 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15242
15243 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15244
15245 encryptedVerifierHash_pos++;
15246
15247 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15248
15249 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15250
15251 uint32_t encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15252
15253 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15254
15255 rc4key_pos++;
15256
15257 uint32_t rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15258
15259 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15260
15261 const uint version = *version_pos - 0x30;
15262
15263 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15264
15265 /**
15266 * esalt
15267 */
15268
15269 oldoffice01->version = version;
15270
15271 oldoffice01->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15272 oldoffice01->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15273 oldoffice01->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15274 oldoffice01->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15275
15276 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15277 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15278 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15279 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15280
15281 oldoffice01->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15282 oldoffice01->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15283 oldoffice01->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15284 oldoffice01->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15285
15286 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15287 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15288 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15289 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15290
15291 oldoffice01->rc4key[1] = 0;
15292 oldoffice01->rc4key[0] = 0;
15293
15294 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15295 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15296 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15297 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15298 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15299 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15300 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15301 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15302 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15303 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15304
15305 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15306 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15307
15308 /**
15309 * salt
15310 */
15311
15312 salt->salt_len = 16;
15313
15314 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15315 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15316 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15317 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15318
15319 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15320 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15321 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15322 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15323
15324 // this is a workaround as office produces multiple documents with the same salt
15325
15326 salt->salt_len += 32;
15327
15328 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15329 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15330 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15331 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15332 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15333 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15334 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15335 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15336
15337 /**
15338 * digest
15339 */
15340
15341 digest[0] = oldoffice01->rc4key[0];
15342 digest[1] = oldoffice01->rc4key[1];
15343 digest[2] = 0;
15344 digest[3] = 0;
15345
15346 return (PARSER_OK);
15347 }
15348
15349 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15350 {
15351 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15352
15353 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15354
15355 uint32_t *digest = (uint32_t *) hash_buf->digest;
15356
15357 salt_t *salt = hash_buf->salt;
15358
15359 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15360
15361 /**
15362 * parse line
15363 */
15364
15365 char *version_pos = input_buf + 11;
15366
15367 char *osalt_pos = strchr (version_pos, '*');
15368
15369 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15370
15371 uint32_t version_len = osalt_pos - version_pos;
15372
15373 if (version_len != 1) return (PARSER_SALT_LENGTH);
15374
15375 osalt_pos++;
15376
15377 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15378
15379 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15380
15381 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15382
15383 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15384
15385 encryptedVerifier_pos++;
15386
15387 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15388
15389 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15390
15391 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15392
15393 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15394
15395 encryptedVerifierHash_pos++;
15396
15397 uint32_t encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15398
15399 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15400
15401 const uint version = *version_pos - 0x30;
15402
15403 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15404
15405 /**
15406 * esalt
15407 */
15408
15409 oldoffice34->version = version;
15410
15411 oldoffice34->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15412 oldoffice34->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15413 oldoffice34->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15414 oldoffice34->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15415
15416 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15417 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15418 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15419 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15420
15421 oldoffice34->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15422 oldoffice34->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15423 oldoffice34->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15424 oldoffice34->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15425 oldoffice34->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15426
15427 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15428 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15429 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15430 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15431 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15432
15433 /**
15434 * salt
15435 */
15436
15437 salt->salt_len = 16;
15438
15439 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15440 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15441 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15442 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15443
15444 // this is a workaround as office produces multiple documents with the same salt
15445
15446 salt->salt_len += 32;
15447
15448 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15449 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15450 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15451 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15452 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15453 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15454 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15455 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15456
15457 /**
15458 * digest
15459 */
15460
15461 digest[0] = oldoffice34->encryptedVerifierHash[0];
15462 digest[1] = oldoffice34->encryptedVerifierHash[1];
15463 digest[2] = oldoffice34->encryptedVerifierHash[2];
15464 digest[3] = oldoffice34->encryptedVerifierHash[3];
15465
15466 return (PARSER_OK);
15467 }
15468
15469 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15470 {
15471 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15472
15473 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15474 }
15475
15476 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15477 {
15478 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15479
15480 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15481
15482 uint32_t *digest = (uint32_t *) hash_buf->digest;
15483
15484 salt_t *salt = hash_buf->salt;
15485
15486 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15487
15488 /**
15489 * parse line
15490 */
15491
15492 char *version_pos = input_buf + 11;
15493
15494 char *osalt_pos = strchr (version_pos, '*');
15495
15496 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15497
15498 uint32_t version_len = osalt_pos - version_pos;
15499
15500 if (version_len != 1) return (PARSER_SALT_LENGTH);
15501
15502 osalt_pos++;
15503
15504 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15505
15506 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15507
15508 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15509
15510 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15511
15512 encryptedVerifier_pos++;
15513
15514 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15515
15516 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15517
15518 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15519
15520 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15521
15522 encryptedVerifierHash_pos++;
15523
15524 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15525
15526 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15527
15528 uint32_t encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15529
15530 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15531
15532 rc4key_pos++;
15533
15534 uint32_t rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15535
15536 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15537
15538 const uint version = *version_pos - 0x30;
15539
15540 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15541
15542 /**
15543 * esalt
15544 */
15545
15546 oldoffice34->version = version;
15547
15548 oldoffice34->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15549 oldoffice34->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15550 oldoffice34->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15551 oldoffice34->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15552
15553 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15554 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15555 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15556 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15557
15558 oldoffice34->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15559 oldoffice34->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15560 oldoffice34->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15561 oldoffice34->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15562 oldoffice34->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15563
15564 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15565 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15566 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15567 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15568 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15569
15570 oldoffice34->rc4key[1] = 0;
15571 oldoffice34->rc4key[0] = 0;
15572
15573 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15574 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15575 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15576 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15577 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15578 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15579 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15580 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15581 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15582 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15583
15584 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15585 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15586
15587 /**
15588 * salt
15589 */
15590
15591 salt->salt_len = 16;
15592
15593 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15594 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15595 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15596 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15597
15598 // this is a workaround as office produces multiple documents with the same salt
15599
15600 salt->salt_len += 32;
15601
15602 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15603 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15604 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15605 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15606 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15607 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15608 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15609 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15610
15611 /**
15612 * digest
15613 */
15614
15615 digest[0] = oldoffice34->rc4key[0];
15616 digest[1] = oldoffice34->rc4key[1];
15617 digest[2] = 0;
15618 digest[3] = 0;
15619
15620 return (PARSER_OK);
15621 }
15622
15623 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15624 {
15625 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15626
15627 uint32_t *digest = (uint32_t *) hash_buf->digest;
15628
15629 digest[0] = hex_to_uint (&input_buf[ 0]);
15630 digest[1] = hex_to_uint (&input_buf[ 8]);
15631 digest[2] = hex_to_uint (&input_buf[16]);
15632 digest[3] = hex_to_uint (&input_buf[24]);
15633
15634 digest[0] = byte_swap_32 (digest[0]);
15635 digest[1] = byte_swap_32 (digest[1]);
15636 digest[2] = byte_swap_32 (digest[2]);
15637 digest[3] = byte_swap_32 (digest[3]);
15638
15639 return (PARSER_OK);
15640 }
15641
15642 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15643 {
15644 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15645
15646 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15647
15648 uint32_t *digest = (uint32_t *) hash_buf->digest;
15649
15650 salt_t *salt = hash_buf->salt;
15651
15652 char *signature_pos = input_buf;
15653
15654 char *salt_pos = strchr (signature_pos, '$');
15655
15656 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15657
15658 uint32_t signature_len = salt_pos - signature_pos;
15659
15660 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15661
15662 salt_pos++;
15663
15664 char *hash_pos = strchr (salt_pos, '$');
15665
15666 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15667
15668 uint32_t salt_len = hash_pos - salt_pos;
15669
15670 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15671
15672 hash_pos++;
15673
15674 uint32_t hash_len = input_len - signature_len - 1 - salt_len - 1;
15675
15676 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15677
15678 digest[0] = hex_to_uint (&hash_pos[ 0]);
15679 digest[1] = hex_to_uint (&hash_pos[ 8]);
15680 digest[2] = hex_to_uint (&hash_pos[16]);
15681 digest[3] = hex_to_uint (&hash_pos[24]);
15682 digest[4] = hex_to_uint (&hash_pos[32]);
15683
15684 digest[0] -= SHA1M_A;
15685 digest[1] -= SHA1M_B;
15686 digest[2] -= SHA1M_C;
15687 digest[3] -= SHA1M_D;
15688 digest[4] -= SHA1M_E;
15689
15690 char *salt_buf_ptr = (char *) salt->salt_buf;
15691
15692 memcpy (salt_buf_ptr, salt_pos, salt_len);
15693
15694 salt->salt_len = salt_len;
15695
15696 return (PARSER_OK);
15697 }
15698
15699 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15700 {
15701 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15702
15703 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15704
15705 uint32_t *digest = (uint32_t *) hash_buf->digest;
15706
15707 salt_t *salt = hash_buf->salt;
15708
15709 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15710
15711 /**
15712 * parse line
15713 */
15714
15715 char *iter_pos = input_buf + 14;
15716
15717 const int iter = atoi (iter_pos);
15718
15719 if (iter < 1) return (PARSER_SALT_ITERATION);
15720
15721 salt->salt_iter = iter - 1;
15722
15723 char *salt_pos = strchr (iter_pos, '$');
15724
15725 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15726
15727 salt_pos++;
15728
15729 char *hash_pos = strchr (salt_pos, '$');
15730
15731 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15732
15733 const uint salt_len = hash_pos - salt_pos;
15734
15735 hash_pos++;
15736
15737 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15738
15739 memcpy (salt_buf_ptr, salt_pos, salt_len);
15740
15741 salt->salt_len = salt_len;
15742
15743 salt_buf_ptr[salt_len + 3] = 0x01;
15744 salt_buf_ptr[salt_len + 4] = 0x80;
15745
15746 // add some stuff to normal salt to make sorted happy
15747
15748 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15749 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15750 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15751 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15752 salt->salt_buf[4] = salt->salt_iter;
15753
15754 // base64 decode hash
15755
15756 char tmp_buf[100];
15757
15758 memset (tmp_buf, 0, sizeof (tmp_buf));
15759
15760 uint hash_len = input_len - (hash_pos - input_buf);
15761
15762 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15763
15764 base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf);
15765
15766 memcpy (digest, tmp_buf, 32);
15767
15768 digest[0] = byte_swap_32 (digest[0]);
15769 digest[1] = byte_swap_32 (digest[1]);
15770 digest[2] = byte_swap_32 (digest[2]);
15771 digest[3] = byte_swap_32 (digest[3]);
15772 digest[4] = byte_swap_32 (digest[4]);
15773 digest[5] = byte_swap_32 (digest[5]);
15774 digest[6] = byte_swap_32 (digest[6]);
15775 digest[7] = byte_swap_32 (digest[7]);
15776
15777 return (PARSER_OK);
15778 }
15779
15780 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15781 {
15782 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15783
15784 uint32_t *digest = (uint32_t *) hash_buf->digest;
15785
15786 salt_t *salt = hash_buf->salt;
15787
15788 digest[0] = hex_to_uint (&input_buf[ 0]);
15789 digest[1] = hex_to_uint (&input_buf[ 8]);
15790 digest[2] = 0;
15791 digest[3] = 0;
15792
15793 digest[0] = byte_swap_32 (digest[0]);
15794 digest[1] = byte_swap_32 (digest[1]);
15795
15796 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15797 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15798 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15799
15800 char iter_c = input_buf[17];
15801 char iter_d = input_buf[19];
15802
15803 // atm only defaults, let's see if there's more request
15804 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15805 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15806
15807 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15808
15809 salt->salt_buf[0] = hex_to_uint (&salt_buf[ 0]);
15810 salt->salt_buf[1] = hex_to_uint (&salt_buf[ 8]);
15811 salt->salt_buf[2] = hex_to_uint (&salt_buf[16]);
15812 salt->salt_buf[3] = hex_to_uint (&salt_buf[24]);
15813
15814 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15815 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15816 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15817 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15818
15819 salt->salt_len = 16;
15820
15821 return (PARSER_OK);
15822 }
15823
15824 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15825 {
15826 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
15827
15828 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15829
15830 uint32_t *digest = (uint32_t *) hash_buf->digest;
15831
15832 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
15833
15834 salt_t *salt = hash_buf->salt;
15835
15836 char *salt_pos = input_buf + 10;
15837
15838 char *hash_pos = strchr (salt_pos, '$');
15839
15840 uint salt_len = hash_pos - salt_pos;
15841
15842 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15843
15844 hash_pos++;
15845
15846 uint hash_len = input_len - 10 - salt_len - 1;
15847
15848 // base64 decode salt
15849
15850 char tmp_buf[100];
15851
15852 memset (tmp_buf, 0, sizeof (tmp_buf));
15853
15854 salt_len = base64_decode (base64_to_int, salt_pos, salt_len, tmp_buf);
15855
15856 if (salt_len > 55) return (PARSER_SALT_LENGTH);
15857
15858 tmp_buf[salt_len] = 0x80;
15859
15860 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
15861
15862 salt->salt_len = salt_len;
15863
15864 // base64 decode salt
15865
15866 memset (tmp_buf, 0, sizeof (tmp_buf));
15867
15868 hash_len = base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf);
15869
15870 uint user_len = hash_len - 32;
15871
15872 char *tmp_hash = tmp_buf + user_len;
15873
15874 user_len--; // skip the trailing space
15875
15876 digest[0] = hex_to_uint (&tmp_hash[ 0]);
15877 digest[1] = hex_to_uint (&tmp_hash[ 8]);
15878 digest[2] = hex_to_uint (&tmp_hash[16]);
15879 digest[3] = hex_to_uint (&tmp_hash[24]);
15880
15881 digest[0] = byte_swap_32 (digest[0]);
15882 digest[1] = byte_swap_32 (digest[1]);
15883 digest[2] = byte_swap_32 (digest[2]);
15884 digest[3] = byte_swap_32 (digest[3]);
15885
15886 // store username for host only (output hash if cracked)
15887
15888 memset (cram_md5->user, 0, sizeof (cram_md5->user));
15889 memcpy (cram_md5->user, tmp_buf, user_len);
15890
15891 return (PARSER_OK);
15892 }
15893
15894 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15895 {
15896 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
15897
15898 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15899
15900 uint32_t *digest = (uint32_t *) hash_buf->digest;
15901
15902 salt_t *salt = hash_buf->salt;
15903
15904 char *iter_pos = input_buf + 10;
15905
15906 uint32_t iter = atoi (iter_pos);
15907
15908 if (iter < 1)
15909 {
15910 return (PARSER_SALT_ITERATION);
15911 }
15912
15913 iter--; // first iteration is special
15914
15915 salt->salt_iter = iter;
15916
15917 char *base64_pos = strchr (iter_pos, '}');
15918
15919 if (base64_pos == NULL)
15920 {
15921 return (PARSER_SIGNATURE_UNMATCHED);
15922 }
15923
15924 base64_pos++;
15925
15926 // base64 decode salt
15927
15928 uint32_t base64_len = input_len - (base64_pos - input_buf);
15929
15930 char tmp_buf[100];
15931
15932 memset (tmp_buf, 0, sizeof (tmp_buf));
15933
15934 uint32_t decoded_len = base64_decode (base64_to_int, base64_pos, base64_len, tmp_buf);
15935
15936 if (decoded_len < 24)
15937 {
15938 return (PARSER_SALT_LENGTH);
15939 }
15940
15941 // copy the salt
15942
15943 uint salt_len = decoded_len - 20;
15944
15945 if (salt_len < 4) return (PARSER_SALT_LENGTH);
15946 if (salt_len > 16) return (PARSER_SALT_LENGTH);
15947
15948 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
15949
15950 salt->salt_len = salt_len;
15951
15952 // set digest
15953
15954 uint32_t *digest_ptr = (uint32_t*) tmp_buf;
15955
15956 digest[0] = byte_swap_32 (digest_ptr[0]);
15957 digest[1] = byte_swap_32 (digest_ptr[1]);
15958 digest[2] = byte_swap_32 (digest_ptr[2]);
15959 digest[3] = byte_swap_32 (digest_ptr[3]);
15960 digest[4] = byte_swap_32 (digest_ptr[4]);
15961
15962 return (PARSER_OK);
15963 }
15964
15965 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15966 {
15967 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
15968
15969 uint32_t *digest = (uint32_t *) hash_buf->digest;
15970
15971 salt_t *salt = hash_buf->salt;
15972
15973 digest[0] = hex_to_uint (&input_buf[ 0]);
15974 digest[1] = hex_to_uint (&input_buf[ 8]);
15975 digest[2] = hex_to_uint (&input_buf[16]);
15976 digest[3] = hex_to_uint (&input_buf[24]);
15977 digest[4] = hex_to_uint (&input_buf[32]);
15978
15979 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15980
15981 uint salt_len = input_len - 40 - 1;
15982
15983 char *salt_buf = input_buf + 40 + 1;
15984
15985 char *salt_buf_ptr = (char *) salt->salt_buf;
15986
15987 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15988
15989 if (salt_len != 32) return (PARSER_SALT_LENGTH);
15990
15991 salt->salt_len = salt_len;
15992
15993 return (PARSER_OK);
15994 }
15995
15996 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15997 {
15998 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
15999
16000 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16001
16002 uint32_t *digest = (uint32_t *) hash_buf->digest;
16003
16004 salt_t *salt = hash_buf->salt;
16005
16006 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16007
16008 /**
16009 * parse line
16010 */
16011
16012 char *V_pos = input_buf + 5;
16013
16014 char *R_pos = strchr (V_pos, '*');
16015
16016 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16017
16018 uint32_t V_len = R_pos - V_pos;
16019
16020 R_pos++;
16021
16022 char *bits_pos = strchr (R_pos, '*');
16023
16024 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16025
16026 uint32_t R_len = bits_pos - R_pos;
16027
16028 bits_pos++;
16029
16030 char *P_pos = strchr (bits_pos, '*');
16031
16032 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16033
16034 uint32_t bits_len = P_pos - bits_pos;
16035
16036 P_pos++;
16037
16038 char *enc_md_pos = strchr (P_pos, '*');
16039
16040 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16041
16042 uint32_t P_len = enc_md_pos - P_pos;
16043
16044 enc_md_pos++;
16045
16046 char *id_len_pos = strchr (enc_md_pos, '*');
16047
16048 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16049
16050 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16051
16052 id_len_pos++;
16053
16054 char *id_buf_pos = strchr (id_len_pos, '*');
16055
16056 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16057
16058 uint32_t id_len_len = id_buf_pos - id_len_pos;
16059
16060 id_buf_pos++;
16061
16062 char *u_len_pos = strchr (id_buf_pos, '*');
16063
16064 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16065
16066 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16067
16068 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16069
16070 u_len_pos++;
16071
16072 char *u_buf_pos = strchr (u_len_pos, '*');
16073
16074 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16075
16076 uint32_t u_len_len = u_buf_pos - u_len_pos;
16077
16078 u_buf_pos++;
16079
16080 char *o_len_pos = strchr (u_buf_pos, '*');
16081
16082 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16083
16084 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16085
16086 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16087
16088 o_len_pos++;
16089
16090 char *o_buf_pos = strchr (o_len_pos, '*');
16091
16092 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16093
16094 uint32_t o_len_len = o_buf_pos - o_len_pos;
16095
16096 o_buf_pos++;
16097
16098 uint32_t 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;
16099
16100 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16101
16102 // validate data
16103
16104 const int V = atoi (V_pos);
16105 const int R = atoi (R_pos);
16106 const int P = atoi (P_pos);
16107
16108 if (V != 1) return (PARSER_SALT_VALUE);
16109 if (R != 2) return (PARSER_SALT_VALUE);
16110
16111 const int enc_md = atoi (enc_md_pos);
16112
16113 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16114
16115 const int id_len = atoi (id_len_pos);
16116 const int u_len = atoi (u_len_pos);
16117 const int o_len = atoi (o_len_pos);
16118
16119 if (id_len != 16) return (PARSER_SALT_VALUE);
16120 if (u_len != 32) return (PARSER_SALT_VALUE);
16121 if (o_len != 32) return (PARSER_SALT_VALUE);
16122
16123 const int bits = atoi (bits_pos);
16124
16125 if (bits != 40) return (PARSER_SALT_VALUE);
16126
16127 // copy data to esalt
16128
16129 pdf->V = V;
16130 pdf->R = R;
16131 pdf->P = P;
16132
16133 pdf->enc_md = enc_md;
16134
16135 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16136 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16137 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16138 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16139 pdf->id_len = id_len;
16140
16141 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16142 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16143 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16144 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16145 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16146 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16147 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16148 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16149 pdf->u_len = u_len;
16150
16151 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16152 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16153 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16154 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16155 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16156 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16157 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16158 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16159 pdf->o_len = o_len;
16160
16161 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16162 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16163 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16164 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16165
16166 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16167 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16168 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16169 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16170 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16171 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16172 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16173 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16174
16175 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16176 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16177 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16178 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16179 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16180 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16181 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16182 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16183
16184 // we use ID for salt, maybe needs to change, we will see...
16185
16186 salt->salt_buf[0] = pdf->id_buf[0];
16187 salt->salt_buf[1] = pdf->id_buf[1];
16188 salt->salt_buf[2] = pdf->id_buf[2];
16189 salt->salt_buf[3] = pdf->id_buf[3];
16190 salt->salt_len = pdf->id_len;
16191
16192 digest[0] = pdf->u_buf[0];
16193 digest[1] = pdf->u_buf[1];
16194 digest[2] = pdf->u_buf[2];
16195 digest[3] = pdf->u_buf[3];
16196
16197 return (PARSER_OK);
16198 }
16199
16200 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16201 {
16202 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16203 }
16204
16205 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16206 {
16207 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16208
16209 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16210
16211 uint32_t *digest = (uint32_t *) hash_buf->digest;
16212
16213 salt_t *salt = hash_buf->salt;
16214
16215 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16216
16217 /**
16218 * parse line
16219 */
16220
16221 char *V_pos = input_buf + 5;
16222
16223 char *R_pos = strchr (V_pos, '*');
16224
16225 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16226
16227 uint32_t V_len = R_pos - V_pos;
16228
16229 R_pos++;
16230
16231 char *bits_pos = strchr (R_pos, '*');
16232
16233 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16234
16235 uint32_t R_len = bits_pos - R_pos;
16236
16237 bits_pos++;
16238
16239 char *P_pos = strchr (bits_pos, '*');
16240
16241 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16242
16243 uint32_t bits_len = P_pos - bits_pos;
16244
16245 P_pos++;
16246
16247 char *enc_md_pos = strchr (P_pos, '*');
16248
16249 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16250
16251 uint32_t P_len = enc_md_pos - P_pos;
16252
16253 enc_md_pos++;
16254
16255 char *id_len_pos = strchr (enc_md_pos, '*');
16256
16257 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16258
16259 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16260
16261 id_len_pos++;
16262
16263 char *id_buf_pos = strchr (id_len_pos, '*');
16264
16265 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16266
16267 uint32_t id_len_len = id_buf_pos - id_len_pos;
16268
16269 id_buf_pos++;
16270
16271 char *u_len_pos = strchr (id_buf_pos, '*');
16272
16273 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16274
16275 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16276
16277 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16278
16279 u_len_pos++;
16280
16281 char *u_buf_pos = strchr (u_len_pos, '*');
16282
16283 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16284
16285 uint32_t u_len_len = u_buf_pos - u_len_pos;
16286
16287 u_buf_pos++;
16288
16289 char *o_len_pos = strchr (u_buf_pos, '*');
16290
16291 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16292
16293 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16294
16295 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16296
16297 o_len_pos++;
16298
16299 char *o_buf_pos = strchr (o_len_pos, '*');
16300
16301 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16302
16303 uint32_t o_len_len = o_buf_pos - o_len_pos;
16304
16305 o_buf_pos++;
16306
16307 char *rc4key_pos = strchr (o_buf_pos, ':');
16308
16309 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16310
16311 uint32_t o_buf_len = rc4key_pos - o_buf_pos;
16312
16313 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16314
16315 rc4key_pos++;
16316
16317 uint32_t 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;
16318
16319 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16320
16321 // validate data
16322
16323 const int V = atoi (V_pos);
16324 const int R = atoi (R_pos);
16325 const int P = atoi (P_pos);
16326
16327 if (V != 1) return (PARSER_SALT_VALUE);
16328 if (R != 2) return (PARSER_SALT_VALUE);
16329
16330 const int enc_md = atoi (enc_md_pos);
16331
16332 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16333
16334 const int id_len = atoi (id_len_pos);
16335 const int u_len = atoi (u_len_pos);
16336 const int o_len = atoi (o_len_pos);
16337
16338 if (id_len != 16) return (PARSER_SALT_VALUE);
16339 if (u_len != 32) return (PARSER_SALT_VALUE);
16340 if (o_len != 32) return (PARSER_SALT_VALUE);
16341
16342 const int bits = atoi (bits_pos);
16343
16344 if (bits != 40) return (PARSER_SALT_VALUE);
16345
16346 // copy data to esalt
16347
16348 pdf->V = V;
16349 pdf->R = R;
16350 pdf->P = P;
16351
16352 pdf->enc_md = enc_md;
16353
16354 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16355 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16356 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16357 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16358 pdf->id_len = id_len;
16359
16360 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16361 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16362 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16363 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16364 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16365 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16366 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16367 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16368 pdf->u_len = u_len;
16369
16370 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16371 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16372 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16373 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16374 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16375 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16376 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16377 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16378 pdf->o_len = o_len;
16379
16380 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16381 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16382 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16383 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16384
16385 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16386 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16387 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16388 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16389 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16390 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16391 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16392 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16393
16394 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16395 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16396 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16397 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16398 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16399 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16400 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16401 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16402
16403 pdf->rc4key[1] = 0;
16404 pdf->rc4key[0] = 0;
16405
16406 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16407 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16408 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16409 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16410 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16411 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16412 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16413 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16414 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16415 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16416
16417 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16418 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16419
16420 // we use ID for salt, maybe needs to change, we will see...
16421
16422 salt->salt_buf[0] = pdf->id_buf[0];
16423 salt->salt_buf[1] = pdf->id_buf[1];
16424 salt->salt_buf[2] = pdf->id_buf[2];
16425 salt->salt_buf[3] = pdf->id_buf[3];
16426 salt->salt_buf[4] = pdf->u_buf[0];
16427 salt->salt_buf[5] = pdf->u_buf[1];
16428 salt->salt_buf[6] = pdf->o_buf[0];
16429 salt->salt_buf[7] = pdf->o_buf[1];
16430 salt->salt_len = pdf->id_len + 16;
16431
16432 digest[0] = pdf->rc4key[0];
16433 digest[1] = pdf->rc4key[1];
16434 digest[2] = 0;
16435 digest[3] = 0;
16436
16437 return (PARSER_OK);
16438 }
16439
16440 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16441 {
16442 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16443
16444 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16445
16446 uint32_t *digest = (uint32_t *) hash_buf->digest;
16447
16448 salt_t *salt = hash_buf->salt;
16449
16450 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16451
16452 /**
16453 * parse line
16454 */
16455
16456 char *V_pos = input_buf + 5;
16457
16458 char *R_pos = strchr (V_pos, '*');
16459
16460 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16461
16462 uint32_t V_len = R_pos - V_pos;
16463
16464 R_pos++;
16465
16466 char *bits_pos = strchr (R_pos, '*');
16467
16468 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16469
16470 uint32_t R_len = bits_pos - R_pos;
16471
16472 bits_pos++;
16473
16474 char *P_pos = strchr (bits_pos, '*');
16475
16476 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16477
16478 uint32_t bits_len = P_pos - bits_pos;
16479
16480 P_pos++;
16481
16482 char *enc_md_pos = strchr (P_pos, '*');
16483
16484 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16485
16486 uint32_t P_len = enc_md_pos - P_pos;
16487
16488 enc_md_pos++;
16489
16490 char *id_len_pos = strchr (enc_md_pos, '*');
16491
16492 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16493
16494 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16495
16496 id_len_pos++;
16497
16498 char *id_buf_pos = strchr (id_len_pos, '*');
16499
16500 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16501
16502 uint32_t id_len_len = id_buf_pos - id_len_pos;
16503
16504 id_buf_pos++;
16505
16506 char *u_len_pos = strchr (id_buf_pos, '*');
16507
16508 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16509
16510 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16511
16512 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16513
16514 u_len_pos++;
16515
16516 char *u_buf_pos = strchr (u_len_pos, '*');
16517
16518 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16519
16520 uint32_t u_len_len = u_buf_pos - u_len_pos;
16521
16522 u_buf_pos++;
16523
16524 char *o_len_pos = strchr (u_buf_pos, '*');
16525
16526 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16527
16528 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16529
16530 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16531
16532 o_len_pos++;
16533
16534 char *o_buf_pos = strchr (o_len_pos, '*');
16535
16536 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16537
16538 uint32_t o_len_len = o_buf_pos - o_len_pos;
16539
16540 o_buf_pos++;
16541
16542 uint32_t 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;
16543
16544 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16545
16546 // validate data
16547
16548 const int V = atoi (V_pos);
16549 const int R = atoi (R_pos);
16550 const int P = atoi (P_pos);
16551
16552 int vr_ok = 0;
16553
16554 if ((V == 2) && (R == 3)) vr_ok = 1;
16555 if ((V == 4) && (R == 4)) vr_ok = 1;
16556
16557 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16558
16559 const int id_len = atoi (id_len_pos);
16560 const int u_len = atoi (u_len_pos);
16561 const int o_len = atoi (o_len_pos);
16562
16563 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16564
16565 if (u_len != 32) return (PARSER_SALT_VALUE);
16566 if (o_len != 32) return (PARSER_SALT_VALUE);
16567
16568 const int bits = atoi (bits_pos);
16569
16570 if (bits != 128) return (PARSER_SALT_VALUE);
16571
16572 int enc_md = 1;
16573
16574 if (R >= 4)
16575 {
16576 enc_md = atoi (enc_md_pos);
16577 }
16578
16579 // copy data to esalt
16580
16581 pdf->V = V;
16582 pdf->R = R;
16583 pdf->P = P;
16584
16585 pdf->enc_md = enc_md;
16586
16587 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16588 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16589 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16590 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16591
16592 if (id_len == 32)
16593 {
16594 pdf->id_buf[4] = hex_to_uint (&id_buf_pos[32]);
16595 pdf->id_buf[5] = hex_to_uint (&id_buf_pos[40]);
16596 pdf->id_buf[6] = hex_to_uint (&id_buf_pos[48]);
16597 pdf->id_buf[7] = hex_to_uint (&id_buf_pos[56]);
16598 }
16599
16600 pdf->id_len = id_len;
16601
16602 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16603 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16604 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16605 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16606 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16607 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16608 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16609 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16610 pdf->u_len = u_len;
16611
16612 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16613 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16614 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16615 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16616 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16617 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16618 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16619 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16620 pdf->o_len = o_len;
16621
16622 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16623 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16624 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16625 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16626
16627 if (id_len == 32)
16628 {
16629 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16630 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16631 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16632 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16633 }
16634
16635 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16636 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16637 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16638 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16639 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16640 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16641 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16642 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16643
16644 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16645 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16646 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16647 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16648 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16649 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16650 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16651 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16652
16653 // precompute rc4 data for later use
16654
16655 uint padding[8] =
16656 {
16657 0x5e4ebf28,
16658 0x418a754e,
16659 0x564e0064,
16660 0x0801faff,
16661 0xb6002e2e,
16662 0x803e68d0,
16663 0xfea90c2f,
16664 0x7a695364
16665 };
16666
16667 // md5
16668
16669 uint salt_pc_block[32];
16670
16671 char *salt_pc_ptr = (char *) salt_pc_block;
16672
16673 memcpy (salt_pc_ptr, padding, 32);
16674 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16675
16676 uint salt_pc_digest[4];
16677
16678 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16679
16680 pdf->rc4data[0] = salt_pc_digest[0];
16681 pdf->rc4data[1] = salt_pc_digest[1];
16682
16683 // we use ID for salt, maybe needs to change, we will see...
16684
16685 salt->salt_buf[0] = pdf->id_buf[0];
16686 salt->salt_buf[1] = pdf->id_buf[1];
16687 salt->salt_buf[2] = pdf->id_buf[2];
16688 salt->salt_buf[3] = pdf->id_buf[3];
16689 salt->salt_buf[4] = pdf->u_buf[0];
16690 salt->salt_buf[5] = pdf->u_buf[1];
16691 salt->salt_buf[6] = pdf->o_buf[0];
16692 salt->salt_buf[7] = pdf->o_buf[1];
16693 salt->salt_len = pdf->id_len + 16;
16694
16695 salt->salt_iter = ROUNDS_PDF14;
16696
16697 digest[0] = pdf->u_buf[0];
16698 digest[1] = pdf->u_buf[1];
16699 digest[2] = 0;
16700 digest[3] = 0;
16701
16702 return (PARSER_OK);
16703 }
16704
16705 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16706 {
16707 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16708
16709 if (ret != PARSER_OK)
16710 {
16711 return ret;
16712 }
16713
16714 uint32_t *digest = (uint32_t *) hash_buf->digest;
16715
16716 salt_t *salt = hash_buf->salt;
16717
16718 digest[0] -= SHA256M_A;
16719 digest[1] -= SHA256M_B;
16720 digest[2] -= SHA256M_C;
16721 digest[3] -= SHA256M_D;
16722 digest[4] -= SHA256M_E;
16723 digest[5] -= SHA256M_F;
16724 digest[6] -= SHA256M_G;
16725 digest[7] -= SHA256M_H;
16726
16727 salt->salt_buf[2] = 0x80;
16728
16729 return (PARSER_OK);
16730 }
16731
16732 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16733 {
16734 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16735
16736 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16737
16738 uint32_t *digest = (uint32_t *) hash_buf->digest;
16739
16740 salt_t *salt = hash_buf->salt;
16741
16742 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16743
16744 /**
16745 * parse line
16746 */
16747
16748 char *V_pos = input_buf + 5;
16749
16750 char *R_pos = strchr (V_pos, '*');
16751
16752 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16753
16754 uint32_t V_len = R_pos - V_pos;
16755
16756 R_pos++;
16757
16758 char *bits_pos = strchr (R_pos, '*');
16759
16760 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16761
16762 uint32_t R_len = bits_pos - R_pos;
16763
16764 bits_pos++;
16765
16766 char *P_pos = strchr (bits_pos, '*');
16767
16768 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16769
16770 uint32_t bits_len = P_pos - bits_pos;
16771
16772 P_pos++;
16773
16774 char *enc_md_pos = strchr (P_pos, '*');
16775
16776 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16777
16778 uint32_t P_len = enc_md_pos - P_pos;
16779
16780 enc_md_pos++;
16781
16782 char *id_len_pos = strchr (enc_md_pos, '*');
16783
16784 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16785
16786 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16787
16788 id_len_pos++;
16789
16790 char *id_buf_pos = strchr (id_len_pos, '*');
16791
16792 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16793
16794 uint32_t id_len_len = id_buf_pos - id_len_pos;
16795
16796 id_buf_pos++;
16797
16798 char *u_len_pos = strchr (id_buf_pos, '*');
16799
16800 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16801
16802 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16803
16804 u_len_pos++;
16805
16806 char *u_buf_pos = strchr (u_len_pos, '*');
16807
16808 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16809
16810 uint32_t u_len_len = u_buf_pos - u_len_pos;
16811
16812 u_buf_pos++;
16813
16814 char *o_len_pos = strchr (u_buf_pos, '*');
16815
16816 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16817
16818 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16819
16820 o_len_pos++;
16821
16822 char *o_buf_pos = strchr (o_len_pos, '*');
16823
16824 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16825
16826 uint32_t o_len_len = o_buf_pos - o_len_pos;
16827
16828 o_buf_pos++;
16829
16830 char *last = strchr (o_buf_pos, '*');
16831
16832 if (last == NULL) last = input_buf + input_len;
16833
16834 uint32_t o_buf_len = last - o_buf_pos;
16835
16836 // validate data
16837
16838 const int V = atoi (V_pos);
16839 const int R = atoi (R_pos);
16840
16841 int vr_ok = 0;
16842
16843 if ((V == 5) && (R == 5)) vr_ok = 1;
16844 if ((V == 5) && (R == 6)) vr_ok = 1;
16845
16846 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16847
16848 const int bits = atoi (bits_pos);
16849
16850 if (bits != 256) return (PARSER_SALT_VALUE);
16851
16852 int enc_md = atoi (enc_md_pos);
16853
16854 if (enc_md != 1) return (PARSER_SALT_VALUE);
16855
16856 const uint id_len = atoi (id_len_pos);
16857 const uint u_len = atoi (u_len_pos);
16858 const uint o_len = atoi (o_len_pos);
16859
16860 if (V_len > 6) return (PARSER_SALT_LENGTH);
16861 if (R_len > 6) return (PARSER_SALT_LENGTH);
16862 if (P_len > 6) return (PARSER_SALT_LENGTH);
16863 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
16864 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
16865 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
16866 if (bits_len > 6) return (PARSER_SALT_LENGTH);
16867 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
16868
16869 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
16870 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
16871 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
16872
16873 // copy data to esalt
16874
16875 if (u_len < 40) return (PARSER_SALT_VALUE);
16876
16877 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
16878 {
16879 pdf->u_buf[i] = hex_to_uint (&u_buf_pos[j]);
16880 }
16881
16882 salt->salt_buf[0] = pdf->u_buf[8];
16883 salt->salt_buf[1] = pdf->u_buf[9];
16884
16885 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16886 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16887
16888 salt->salt_len = 8;
16889 salt->salt_iter = ROUNDS_PDF17L8;
16890
16891 digest[0] = pdf->u_buf[0];
16892 digest[1] = pdf->u_buf[1];
16893 digest[2] = pdf->u_buf[2];
16894 digest[3] = pdf->u_buf[3];
16895 digest[4] = pdf->u_buf[4];
16896 digest[5] = pdf->u_buf[5];
16897 digest[6] = pdf->u_buf[6];
16898 digest[7] = pdf->u_buf[7];
16899
16900 return (PARSER_OK);
16901 }
16902
16903 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16904 {
16905 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
16906
16907 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
16908
16909 uint32_t *digest = (uint32_t *) hash_buf->digest;
16910
16911 salt_t *salt = hash_buf->salt;
16912
16913 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16914
16915 /**
16916 * parse line
16917 */
16918
16919 // iterations
16920
16921 char *iter_pos = input_buf + 7;
16922
16923 uint32_t iter = atoi (iter_pos);
16924
16925 if (iter < 1) return (PARSER_SALT_ITERATION);
16926 if (iter > 999999) return (PARSER_SALT_ITERATION);
16927
16928 // first is *raw* salt
16929
16930 char *salt_pos = strchr (iter_pos, ':');
16931
16932 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16933
16934 salt_pos++;
16935
16936 char *hash_pos = strchr (salt_pos, ':');
16937
16938 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16939
16940 uint32_t salt_len = hash_pos - salt_pos;
16941
16942 if (salt_len > 64) return (PARSER_SALT_LENGTH);
16943
16944 hash_pos++;
16945
16946 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
16947
16948 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
16949
16950 // decode salt
16951
16952 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16953
16954 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
16955
16956 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
16957
16958 salt_buf_ptr[salt_len + 3] = 0x01;
16959 salt_buf_ptr[salt_len + 4] = 0x80;
16960
16961 salt->salt_len = salt_len;
16962 salt->salt_iter = iter - 1;
16963
16964 // decode hash
16965
16966 char tmp_buf[100];
16967
16968 memset (tmp_buf, 0, sizeof (tmp_buf));
16969
16970 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
16971
16972 if (hash_len < 16) return (PARSER_HASH_LENGTH);
16973
16974 memcpy (digest, tmp_buf, 16);
16975
16976 digest[0] = byte_swap_32 (digest[0]);
16977 digest[1] = byte_swap_32 (digest[1]);
16978 digest[2] = byte_swap_32 (digest[2]);
16979 digest[3] = byte_swap_32 (digest[3]);
16980
16981 // add some stuff to normal salt to make sorted happy
16982
16983 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16984 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16985 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16986 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16987 salt->salt_buf[4] = salt->salt_iter;
16988
16989 return (PARSER_OK);
16990 }
16991
16992 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16993 {
16994 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
16995
16996 uint32_t *digest = (uint32_t *) hash_buf->digest;
16997
16998 salt_t *salt = hash_buf->salt;
16999
17000 digest[0] = hex_to_uint (&input_buf[ 0]);
17001 digest[1] = hex_to_uint (&input_buf[ 8]);
17002 digest[2] = hex_to_uint (&input_buf[16]);
17003 digest[3] = hex_to_uint (&input_buf[24]);
17004
17005 digest[0] = byte_swap_32 (digest[0]);
17006 digest[1] = byte_swap_32 (digest[1]);
17007 digest[2] = byte_swap_32 (digest[2]);
17008 digest[3] = byte_swap_32 (digest[3]);
17009
17010 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17011
17012 uint salt_len = input_len - 32 - 1;
17013
17014 char *salt_buf = input_buf + 32 + 1;
17015
17016 char *salt_buf_ptr = (char *) salt->salt_buf;
17017
17018 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17019
17020 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17021
17022 salt->salt_len = salt_len;
17023
17024 return (PARSER_OK);
17025 }
17026
17027 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17028 {
17029 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17030
17031 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17032
17033 uint32_t *digest = (uint32_t *) hash_buf->digest;
17034
17035 salt_t *salt = hash_buf->salt;
17036
17037 char *user_pos = input_buf + 10;
17038
17039 char *salt_pos = strchr (user_pos, '*');
17040
17041 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17042
17043 salt_pos++;
17044
17045 char *hash_pos = strchr (salt_pos, '*');
17046
17047 hash_pos++;
17048
17049 uint hash_len = input_len - (hash_pos - input_buf);
17050
17051 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17052
17053 uint user_len = salt_pos - user_pos - 1;
17054
17055 uint salt_len = hash_pos - salt_pos - 1;
17056
17057 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17058
17059 /*
17060 * store digest
17061 */
17062
17063 digest[0] = hex_to_uint (&hash_pos[ 0]);
17064 digest[1] = hex_to_uint (&hash_pos[ 8]);
17065 digest[2] = hex_to_uint (&hash_pos[16]);
17066 digest[3] = hex_to_uint (&hash_pos[24]);
17067
17068 digest[0] = byte_swap_32 (digest[0]);
17069 digest[1] = byte_swap_32 (digest[1]);
17070 digest[2] = byte_swap_32 (digest[2]);
17071 digest[3] = byte_swap_32 (digest[3]);
17072
17073 digest[0] -= MD5M_A;
17074 digest[1] -= MD5M_B;
17075 digest[2] -= MD5M_C;
17076 digest[3] -= MD5M_D;
17077
17078 /*
17079 * store salt
17080 */
17081
17082 char *salt_buf_ptr = (char *) salt->salt_buf;
17083
17084 // first 4 bytes are the "challenge"
17085
17086 salt_buf_ptr[0] = hex_to_char (&salt_pos[0]);
17087 salt_buf_ptr[1] = hex_to_char (&salt_pos[2]);
17088 salt_buf_ptr[2] = hex_to_char (&salt_pos[4]);
17089 salt_buf_ptr[3] = hex_to_char (&salt_pos[6]);
17090
17091 // append the user name
17092
17093 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17094
17095 salt->salt_len = 4 + user_len;
17096
17097 return (PARSER_OK);
17098 }
17099
17100 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17101 {
17102 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17103
17104 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17105
17106 uint32_t *digest = (uint32_t *) hash_buf->digest;
17107
17108 salt_t *salt = hash_buf->salt;
17109
17110 char *salt_pos = input_buf + 9;
17111
17112 char *hash_pos = strchr (salt_pos, '*');
17113
17114 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17115
17116 hash_pos++;
17117
17118 uint hash_len = input_len - (hash_pos - input_buf);
17119
17120 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17121
17122 uint salt_len = hash_pos - salt_pos - 1;
17123
17124 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17125
17126 /*
17127 * store digest
17128 */
17129
17130 digest[0] = hex_to_uint (&hash_pos[ 0]);
17131 digest[1] = hex_to_uint (&hash_pos[ 8]);
17132 digest[2] = hex_to_uint (&hash_pos[16]);
17133 digest[3] = hex_to_uint (&hash_pos[24]);
17134 digest[4] = hex_to_uint (&hash_pos[32]);
17135
17136 /*
17137 * store salt
17138 */
17139
17140 char *salt_buf_ptr = (char *) salt->salt_buf;
17141
17142 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17143
17144 salt->salt_len = salt_len;
17145
17146 return (PARSER_OK);
17147 }
17148
17149 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17150 {
17151 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17152
17153 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17154
17155 uint32_t *digest = (uint32_t *) hash_buf->digest;
17156
17157 salt_t *salt = hash_buf->salt;
17158
17159 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17160
17161 /**
17162 * parse line
17163 */
17164
17165 char *cry_master_len_pos = input_buf + 9;
17166
17167 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17168
17169 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17170
17171 uint32_t cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17172
17173 cry_master_buf_pos++;
17174
17175 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17176
17177 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17178
17179 uint32_t cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17180
17181 cry_salt_len_pos++;
17182
17183 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17184
17185 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17186
17187 uint32_t cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17188
17189 cry_salt_buf_pos++;
17190
17191 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17192
17193 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17194
17195 uint32_t cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17196
17197 cry_rounds_pos++;
17198
17199 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17200
17201 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17202
17203 uint32_t cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17204
17205 ckey_len_pos++;
17206
17207 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17208
17209 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17210
17211 uint32_t ckey_len_len = ckey_buf_pos - ckey_len_pos;
17212
17213 ckey_buf_pos++;
17214
17215 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17216
17217 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17218
17219 uint32_t ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17220
17221 public_key_len_pos++;
17222
17223 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17224
17225 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17226
17227 uint32_t public_key_len_len = public_key_buf_pos - public_key_len_pos;
17228
17229 public_key_buf_pos++;
17230
17231 uint32_t 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;
17232
17233 const uint cry_master_len = atoi (cry_master_len_pos);
17234 const uint cry_salt_len = atoi (cry_salt_len_pos);
17235 const uint ckey_len = atoi (ckey_len_pos);
17236 const uint public_key_len = atoi (public_key_len_pos);
17237
17238 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17239 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17240 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17241 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17242
17243 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 8)
17244 {
17245 bitcoin_wallet->cry_master_buf[i] = hex_to_uint (&cry_master_buf_pos[j]);
17246
17247 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17248 }
17249
17250 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 8)
17251 {
17252 bitcoin_wallet->ckey_buf[i] = hex_to_uint (&ckey_buf_pos[j]);
17253
17254 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17255 }
17256
17257 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 8)
17258 {
17259 bitcoin_wallet->public_key_buf[i] = hex_to_uint (&public_key_buf_pos[j]);
17260
17261 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17262 }
17263
17264 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17265 bitcoin_wallet->ckey_len = ckey_len / 2;
17266 bitcoin_wallet->public_key_len = public_key_len / 2;
17267
17268 /*
17269 * store digest (should be unique enought, hopefully)
17270 */
17271
17272 digest[0] = bitcoin_wallet->cry_master_buf[0];
17273 digest[1] = bitcoin_wallet->cry_master_buf[1];
17274 digest[2] = bitcoin_wallet->cry_master_buf[2];
17275 digest[3] = bitcoin_wallet->cry_master_buf[3];
17276
17277 /*
17278 * store salt
17279 */
17280
17281 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17282
17283 const uint cry_rounds = atoi (cry_rounds_pos);
17284
17285 salt->salt_iter = cry_rounds - 1;
17286
17287 char *salt_buf_ptr = (char *) salt->salt_buf;
17288
17289 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17290
17291 salt->salt_len = salt_len;
17292
17293 return (PARSER_OK);
17294 }
17295
17296 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17297 {
17298 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17299
17300 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17301
17302 uint32_t *digest = (uint32_t *) hash_buf->digest;
17303
17304 salt_t *salt = hash_buf->salt;
17305
17306 sip_t *sip = (sip_t *) hash_buf->esalt;
17307
17308 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17309
17310 char temp_input_buf[input_len + 1];
17311
17312 memset (temp_input_buf, 0, sizeof (temp_input_buf));
17313 memcpy (temp_input_buf, input_buf, input_len);
17314
17315 // URI_server:
17316
17317 char *URI_server_pos = temp_input_buf + 6;
17318
17319 char *URI_client_pos = strchr (URI_server_pos, '*');
17320
17321 if (URI_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17322
17323 URI_client_pos[0] = 0;
17324 URI_client_pos++;
17325
17326 uint URI_server_len = strlen (URI_server_pos);
17327
17328 if (URI_server_len > 512) return (PARSER_SALT_LENGTH);
17329
17330 // URI_client:
17331
17332 char *user_pos = strchr (URI_client_pos, '*');
17333
17334 if (user_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17335
17336 user_pos[0] = 0;
17337 user_pos++;
17338
17339 uint URI_client_len = strlen (URI_client_pos);
17340
17341 if (URI_client_len > 512) return (PARSER_SALT_LENGTH);
17342
17343 // user:
17344
17345 char *realm_pos = strchr (user_pos, '*');
17346
17347 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17348
17349 realm_pos[0] = 0;
17350 realm_pos++;
17351
17352 uint user_len = strlen (user_pos);
17353
17354 if (user_len > 116) return (PARSER_SALT_LENGTH);
17355
17356 // realm:
17357
17358 char *method_pos = strchr (realm_pos, '*');
17359
17360 if (method_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17361
17362 method_pos[0] = 0;
17363 method_pos++;
17364
17365 uint realm_len = strlen (realm_pos);
17366
17367 if (realm_len > 116) return (PARSER_SALT_LENGTH);
17368
17369 // method:
17370
17371 char *URI_prefix_pos = strchr (method_pos, '*');
17372
17373 if (URI_prefix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17374
17375 URI_prefix_pos[0] = 0;
17376 URI_prefix_pos++;
17377
17378 uint method_len = strlen (method_pos);
17379
17380 if (method_len > 246) return (PARSER_SALT_LENGTH);
17381
17382 // URI_prefix:
17383
17384 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17385
17386 if (URI_resource_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17387
17388 URI_resource_pos[0] = 0;
17389 URI_resource_pos++;
17390
17391 uint URI_prefix_len = strlen (URI_prefix_pos);
17392
17393 if (URI_prefix_len > 245) return (PARSER_SALT_LENGTH);
17394
17395 // URI_resource:
17396
17397 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17398
17399 if (URI_suffix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17400
17401 URI_suffix_pos[0] = 0;
17402 URI_suffix_pos++;
17403
17404 uint URI_resource_len = strlen (URI_resource_pos);
17405
17406 if (URI_resource_len < 1) return (PARSER_SALT_LENGTH);
17407 if (URI_resource_len > 246) return (PARSER_SALT_LENGTH);
17408
17409 // URI_suffix:
17410
17411 char *nonce_pos = strchr (URI_suffix_pos, '*');
17412
17413 if (nonce_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17414
17415 nonce_pos[0] = 0;
17416 nonce_pos++;
17417
17418 uint URI_suffix_len = strlen (URI_suffix_pos);
17419
17420 if (URI_suffix_len > 245) return (PARSER_SALT_LENGTH);
17421
17422 // nonce:
17423
17424 char *nonce_client_pos = strchr (nonce_pos, '*');
17425
17426 if (nonce_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17427
17428 nonce_client_pos[0] = 0;
17429 nonce_client_pos++;
17430
17431 uint nonce_len = strlen (nonce_pos);
17432
17433 if (nonce_len < 1) return (PARSER_SALT_LENGTH);
17434 if (nonce_len > 50) return (PARSER_SALT_LENGTH);
17435
17436 // nonce_client:
17437
17438 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17439
17440 if (nonce_count_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17441
17442 nonce_count_pos[0] = 0;
17443 nonce_count_pos++;
17444
17445 uint nonce_client_len = strlen (nonce_client_pos);
17446
17447 if (nonce_client_len > 50) return (PARSER_SALT_LENGTH);
17448
17449 // nonce_count:
17450
17451 char *qop_pos = strchr (nonce_count_pos, '*');
17452
17453 if (qop_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17454
17455 qop_pos[0] = 0;
17456 qop_pos++;
17457
17458 uint nonce_count_len = strlen (nonce_count_pos);
17459
17460 if (nonce_count_len > 50) return (PARSER_SALT_LENGTH);
17461
17462 // qop:
17463
17464 char *directive_pos = strchr (qop_pos, '*');
17465
17466 if (directive_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17467
17468 directive_pos[0] = 0;
17469 directive_pos++;
17470
17471 uint qop_len = strlen (qop_pos);
17472
17473 if (qop_len > 50) return (PARSER_SALT_LENGTH);
17474
17475 // directive
17476
17477 char *digest_pos = strchr (directive_pos, '*');
17478
17479 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17480
17481 digest_pos[0] = 0;
17482 digest_pos++;
17483
17484 uint directive_len = strlen (directive_pos);
17485
17486 if (directive_len != 3) return (PARSER_SALT_LENGTH);
17487
17488 if (memcmp (directive_pos, "MD5", 3))
17489 {
17490 log_info ("ERROR: only the MD5 directive is currently supported\n");
17491
17492 return (PARSER_SIP_AUTH_DIRECTIVE);
17493 }
17494
17495 /*
17496 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17497 */
17498
17499 uint md5_len = 0;
17500
17501 uint md5_max_len = 4 * 64;
17502
17503 uint md5_remaining_len = md5_max_len;
17504
17505 uint tmp_md5_buf[md5_max_len / 4];
17506
17507 memset (tmp_md5_buf, 0, sizeof (tmp_md5_buf));
17508
17509 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17510
17511 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17512
17513 md5_len += method_len + 1;
17514 tmp_md5_ptr += method_len + 1;
17515
17516 if (URI_prefix_len > 0)
17517 {
17518 md5_remaining_len = md5_max_len - md5_len;
17519
17520 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17521
17522 md5_len += URI_prefix_len + 1;
17523 tmp_md5_ptr += URI_prefix_len + 1;
17524 }
17525
17526 md5_remaining_len = md5_max_len - md5_len;
17527
17528 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17529
17530 md5_len += URI_resource_len;
17531 tmp_md5_ptr += URI_resource_len;
17532
17533 if (URI_suffix_len > 0)
17534 {
17535 md5_remaining_len = md5_max_len - md5_len;
17536
17537 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17538
17539 md5_len += 1 + URI_suffix_len;
17540 }
17541
17542 uint tmp_digest[4];
17543
17544 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17545
17546 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17547 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17548 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17549 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17550
17551 /*
17552 * esalt
17553 */
17554
17555 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17556
17557 uint esalt_len = 0;
17558
17559 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17560
17561 // there are 2 possibilities for the esalt:
17562
17563 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17564 {
17565 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17566
17567 if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH);
17568
17569 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17570 nonce_pos,
17571 nonce_count_pos,
17572 nonce_client_pos,
17573 qop_pos,
17574 tmp_digest[0],
17575 tmp_digest[1],
17576 tmp_digest[2],
17577 tmp_digest[3]);
17578 }
17579 else
17580 {
17581 esalt_len = 1 + nonce_len + 1 + 32;
17582
17583 if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH);
17584
17585 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17586 nonce_pos,
17587 tmp_digest[0],
17588 tmp_digest[1],
17589 tmp_digest[2],
17590 tmp_digest[3]);
17591 }
17592
17593 // add 0x80 to esalt
17594
17595 esalt_buf_ptr[esalt_len] = 0x80;
17596
17597 sip->esalt_len = esalt_len;
17598
17599 /*
17600 * actual salt
17601 */
17602
17603 char *sip_salt_ptr = (char *) sip->salt_buf;
17604
17605 uint salt_len = user_len + 1 + realm_len + 1;
17606
17607 uint max_salt_len = 119;
17608
17609 if (salt_len > max_salt_len) return (PARSER_SALT_LENGTH);
17610
17611 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17612
17613 sip->salt_len = salt_len;
17614
17615 /*
17616 * fake salt (for sorting)
17617 */
17618
17619 char *salt_buf_ptr = (char *) salt->salt_buf;
17620
17621 max_salt_len = 55;
17622
17623 uint fake_salt_len = salt_len;
17624
17625 if (fake_salt_len > max_salt_len)
17626 {
17627 fake_salt_len = max_salt_len;
17628 }
17629
17630 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17631
17632 salt->salt_len = fake_salt_len;
17633
17634 /*
17635 * digest
17636 */
17637
17638 digest[0] = hex_to_uint (&digest_pos[ 0]);
17639 digest[1] = hex_to_uint (&digest_pos[ 8]);
17640 digest[2] = hex_to_uint (&digest_pos[16]);
17641 digest[3] = hex_to_uint (&digest_pos[24]);
17642
17643 digest[0] = byte_swap_32 (digest[0]);
17644 digest[1] = byte_swap_32 (digest[1]);
17645 digest[2] = byte_swap_32 (digest[2]);
17646 digest[3] = byte_swap_32 (digest[3]);
17647
17648 return (PARSER_OK);
17649 }
17650
17651 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17652 {
17653 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17654
17655 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17656
17657 uint32_t *digest = (uint32_t *) hash_buf->digest;
17658
17659 salt_t *salt = hash_buf->salt;
17660
17661 // digest
17662
17663 char *digest_pos = input_buf;
17664
17665 digest[0] = hex_to_uint (&digest_pos[0]);
17666 digest[1] = 0;
17667 digest[2] = 0;
17668 digest[3] = 0;
17669
17670 // salt
17671
17672 char *salt_buf = input_buf + 8 + 1;
17673
17674 uint salt_len = 8;
17675
17676 char *salt_buf_ptr = (char *) salt->salt_buf;
17677
17678 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17679
17680 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17681
17682 salt->salt_len = salt_len;
17683
17684 return (PARSER_OK);
17685 }
17686
17687 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17688 {
17689 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
17690
17691 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17692
17693 uint32_t *digest = (uint32_t *) hash_buf->digest;
17694
17695 salt_t *salt = hash_buf->salt;
17696
17697 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
17698
17699 /**
17700 * parse line
17701 */
17702
17703 char *p_buf_pos = input_buf + 4;
17704
17705 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
17706
17707 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17708
17709 uint32_t p_buf_len = NumCyclesPower_pos - p_buf_pos;
17710
17711 NumCyclesPower_pos++;
17712
17713 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
17714
17715 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17716
17717 uint32_t NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
17718
17719 salt_len_pos++;
17720
17721 char *salt_buf_pos = strchr (salt_len_pos, '$');
17722
17723 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17724
17725 uint32_t salt_len_len = salt_buf_pos - salt_len_pos;
17726
17727 salt_buf_pos++;
17728
17729 char *iv_len_pos = strchr (salt_buf_pos, '$');
17730
17731 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17732
17733 uint32_t salt_buf_len = iv_len_pos - salt_buf_pos;
17734
17735 iv_len_pos++;
17736
17737 char *iv_buf_pos = strchr (iv_len_pos, '$');
17738
17739 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17740
17741 uint32_t iv_len_len = iv_buf_pos - iv_len_pos;
17742
17743 iv_buf_pos++;
17744
17745 char *crc_buf_pos = strchr (iv_buf_pos, '$');
17746
17747 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17748
17749 uint32_t iv_buf_len = crc_buf_pos - iv_buf_pos;
17750
17751 crc_buf_pos++;
17752
17753 char *data_len_pos = strchr (crc_buf_pos, '$');
17754
17755 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17756
17757 uint32_t crc_buf_len = data_len_pos - crc_buf_pos;
17758
17759 data_len_pos++;
17760
17761 char *unpack_size_pos = strchr (data_len_pos, '$');
17762
17763 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17764
17765 uint32_t data_len_len = unpack_size_pos - data_len_pos;
17766
17767 unpack_size_pos++;
17768
17769 char *data_buf_pos = strchr (unpack_size_pos, '$');
17770
17771 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17772
17773 uint32_t unpack_size_len = data_buf_pos - unpack_size_pos;
17774
17775 data_buf_pos++;
17776
17777 uint32_t 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;
17778
17779 const uint iter = atoi (NumCyclesPower_pos);
17780 const uint crc = atoi (crc_buf_pos);
17781 const uint p_buf = atoi (p_buf_pos);
17782 const uint salt_len = atoi (salt_len_pos);
17783 const uint iv_len = atoi (iv_len_pos);
17784 const uint unpack_size = atoi (unpack_size_pos);
17785 const uint data_len = atoi (data_len_pos);
17786
17787 /**
17788 * verify some data
17789 */
17790
17791 if (p_buf != 0) return (PARSER_SALT_VALUE);
17792 if (salt_len != 0) return (PARSER_SALT_VALUE);
17793
17794 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
17795
17796 if (data_len > 384) return (PARSER_SALT_VALUE);
17797
17798 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
17799
17800 /**
17801 * store data
17802 */
17803
17804 seven_zip->iv_buf[0] = hex_to_uint (&iv_buf_pos[ 0]);
17805 seven_zip->iv_buf[1] = hex_to_uint (&iv_buf_pos[ 8]);
17806 seven_zip->iv_buf[2] = hex_to_uint (&iv_buf_pos[16]);
17807 seven_zip->iv_buf[3] = hex_to_uint (&iv_buf_pos[24]);
17808
17809 seven_zip->iv_len = iv_len;
17810
17811 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
17812
17813 seven_zip->salt_len = 0;
17814
17815 seven_zip->crc = crc;
17816
17817 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
17818 {
17819 seven_zip->data_buf[i] = hex_to_uint (&data_buf_pos[j]);
17820
17821 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
17822 }
17823
17824 seven_zip->data_len = data_len;
17825
17826 seven_zip->unpack_size = unpack_size;
17827
17828 // real salt
17829
17830 salt->salt_buf[0] = seven_zip->data_buf[0];
17831 salt->salt_buf[1] = seven_zip->data_buf[1];
17832 salt->salt_buf[2] = seven_zip->data_buf[2];
17833 salt->salt_buf[3] = seven_zip->data_buf[3];
17834
17835 salt->salt_len = 16;
17836
17837 salt->salt_sign[0] = iter;
17838
17839 salt->salt_iter = 1 << iter;
17840
17841 /**
17842 * digest
17843 */
17844
17845 digest[0] = crc;
17846 digest[1] = 0;
17847 digest[2] = 0;
17848 digest[3] = 0;
17849
17850 return (PARSER_OK);
17851 }
17852
17853 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17854 {
17855 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
17856
17857 uint32_t *digest = (uint32_t *) hash_buf->digest;
17858
17859 digest[0] = hex_to_uint (&input_buf[ 0]);
17860 digest[1] = hex_to_uint (&input_buf[ 8]);
17861 digest[2] = hex_to_uint (&input_buf[16]);
17862 digest[3] = hex_to_uint (&input_buf[24]);
17863 digest[4] = hex_to_uint (&input_buf[32]);
17864 digest[5] = hex_to_uint (&input_buf[40]);
17865 digest[6] = hex_to_uint (&input_buf[48]);
17866 digest[7] = hex_to_uint (&input_buf[56]);
17867
17868 digest[0] = byte_swap_32 (digest[0]);
17869 digest[1] = byte_swap_32 (digest[1]);
17870 digest[2] = byte_swap_32 (digest[2]);
17871 digest[3] = byte_swap_32 (digest[3]);
17872 digest[4] = byte_swap_32 (digest[4]);
17873 digest[5] = byte_swap_32 (digest[5]);
17874 digest[6] = byte_swap_32 (digest[6]);
17875 digest[7] = byte_swap_32 (digest[7]);
17876
17877 return (PARSER_OK);
17878 }
17879
17880 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17881 {
17882 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
17883
17884 uint32_t *digest = (uint32_t *) hash_buf->digest;
17885
17886 digest[ 0] = hex_to_uint (&input_buf[ 0]);
17887 digest[ 1] = hex_to_uint (&input_buf[ 8]);
17888 digest[ 2] = hex_to_uint (&input_buf[ 16]);
17889 digest[ 3] = hex_to_uint (&input_buf[ 24]);
17890 digest[ 4] = hex_to_uint (&input_buf[ 32]);
17891 digest[ 5] = hex_to_uint (&input_buf[ 40]);
17892 digest[ 6] = hex_to_uint (&input_buf[ 48]);
17893 digest[ 7] = hex_to_uint (&input_buf[ 56]);
17894 digest[ 8] = hex_to_uint (&input_buf[ 64]);
17895 digest[ 9] = hex_to_uint (&input_buf[ 72]);
17896 digest[10] = hex_to_uint (&input_buf[ 80]);
17897 digest[11] = hex_to_uint (&input_buf[ 88]);
17898 digest[12] = hex_to_uint (&input_buf[ 96]);
17899 digest[13] = hex_to_uint (&input_buf[104]);
17900 digest[14] = hex_to_uint (&input_buf[112]);
17901 digest[15] = hex_to_uint (&input_buf[120]);
17902
17903 digest[ 0] = byte_swap_32 (digest[ 0]);
17904 digest[ 1] = byte_swap_32 (digest[ 1]);
17905 digest[ 2] = byte_swap_32 (digest[ 2]);
17906 digest[ 3] = byte_swap_32 (digest[ 3]);
17907 digest[ 4] = byte_swap_32 (digest[ 4]);
17908 digest[ 5] = byte_swap_32 (digest[ 5]);
17909 digest[ 6] = byte_swap_32 (digest[ 6]);
17910 digest[ 7] = byte_swap_32 (digest[ 7]);
17911 digest[ 8] = byte_swap_32 (digest[ 8]);
17912 digest[ 9] = byte_swap_32 (digest[ 9]);
17913 digest[10] = byte_swap_32 (digest[10]);
17914 digest[11] = byte_swap_32 (digest[11]);
17915 digest[12] = byte_swap_32 (digest[12]);
17916 digest[13] = byte_swap_32 (digest[13]);
17917 digest[14] = byte_swap_32 (digest[14]);
17918 digest[15] = byte_swap_32 (digest[15]);
17919
17920 return (PARSER_OK);
17921 }
17922
17923 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17924 {
17925 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
17926
17927 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17928
17929 uint32_t *digest = (uint32_t *) hash_buf->digest;
17930
17931 salt_t *salt = hash_buf->salt;
17932
17933 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
17934
17935 /**
17936 * parse line
17937 */
17938
17939 // iterations
17940
17941 char *iter_pos = input_buf + 4;
17942
17943 uint32_t iter = atoi (iter_pos);
17944
17945 if (iter < 1) return (PARSER_SALT_ITERATION);
17946 if (iter > 999999) return (PARSER_SALT_ITERATION);
17947
17948 // first is *raw* salt
17949
17950 char *salt_pos = strchr (iter_pos, ':');
17951
17952 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17953
17954 salt_pos++;
17955
17956 char *hash_pos = strchr (salt_pos, ':');
17957
17958 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17959
17960 uint32_t salt_len = hash_pos - salt_pos;
17961
17962 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17963
17964 hash_pos++;
17965
17966 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
17967
17968 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17969
17970 // decode salt
17971
17972 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
17973
17974 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17975
17976 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17977
17978 salt_buf_ptr[salt_len + 3] = 0x01;
17979 salt_buf_ptr[salt_len + 4] = 0x80;
17980
17981 salt->salt_len = salt_len;
17982 salt->salt_iter = iter - 1;
17983
17984 // decode hash
17985
17986 char tmp_buf[100];
17987
17988 memset (tmp_buf, 0, sizeof (tmp_buf));
17989
17990 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
17991
17992 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17993
17994 memcpy (digest, tmp_buf, 16);
17995
17996 // add some stuff to normal salt to make sorted happy
17997
17998 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
17999 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
18000 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
18001 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
18002 salt->salt_buf[4] = salt->salt_iter;
18003
18004 return (PARSER_OK);
18005 }
18006
18007 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18008 {
18009 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
18010
18011 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
18012
18013 uint32_t *digest = (uint32_t *) hash_buf->digest;
18014
18015 salt_t *salt = hash_buf->salt;
18016
18017 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
18018
18019 /**
18020 * parse line
18021 */
18022
18023 // iterations
18024
18025 char *iter_pos = input_buf + 5;
18026
18027 uint32_t iter = atoi (iter_pos);
18028
18029 if (iter < 1) return (PARSER_SALT_ITERATION);
18030 if (iter > 999999) return (PARSER_SALT_ITERATION);
18031
18032 // first is *raw* salt
18033
18034 char *salt_pos = strchr (iter_pos, ':');
18035
18036 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18037
18038 salt_pos++;
18039
18040 char *hash_pos = strchr (salt_pos, ':');
18041
18042 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18043
18044 uint32_t salt_len = hash_pos - salt_pos;
18045
18046 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18047
18048 hash_pos++;
18049
18050 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
18051
18052 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18053
18054 // decode salt
18055
18056 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18057
18058 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18059
18060 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18061
18062 salt_buf_ptr[salt_len + 3] = 0x01;
18063 salt_buf_ptr[salt_len + 4] = 0x80;
18064
18065 salt->salt_len = salt_len;
18066 salt->salt_iter = iter - 1;
18067
18068 // decode hash
18069
18070 char tmp_buf[100];
18071
18072 memset (tmp_buf, 0, sizeof (tmp_buf));
18073
18074 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
18075
18076 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18077
18078 memcpy (digest, tmp_buf, 16);
18079
18080 digest[0] = byte_swap_32 (digest[0]);
18081 digest[1] = byte_swap_32 (digest[1]);
18082 digest[2] = byte_swap_32 (digest[2]);
18083 digest[3] = byte_swap_32 (digest[3]);
18084
18085 // add some stuff to normal salt to make sorted happy
18086
18087 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18088 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18089 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18090 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18091 salt->salt_buf[4] = salt->salt_iter;
18092
18093 return (PARSER_OK);
18094 }
18095
18096 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18097 {
18098 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18099
18100 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18101
18102 uint64_t *digest = (uint64_t *) hash_buf->digest;
18103
18104 salt_t *salt = hash_buf->salt;
18105
18106 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18107
18108 /**
18109 * parse line
18110 */
18111
18112 // iterations
18113
18114 char *iter_pos = input_buf + 7;
18115
18116 uint32_t iter = atoi (iter_pos);
18117
18118 if (iter < 1) return (PARSER_SALT_ITERATION);
18119 if (iter > 999999) return (PARSER_SALT_ITERATION);
18120
18121 // first is *raw* salt
18122
18123 char *salt_pos = strchr (iter_pos, ':');
18124
18125 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18126
18127 salt_pos++;
18128
18129 char *hash_pos = strchr (salt_pos, ':');
18130
18131 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18132
18133 uint32_t salt_len = hash_pos - salt_pos;
18134
18135 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18136
18137 hash_pos++;
18138
18139 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
18140
18141 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18142
18143 // decode salt
18144
18145 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18146
18147 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18148
18149 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18150
18151 salt_buf_ptr[salt_len + 3] = 0x01;
18152 salt_buf_ptr[salt_len + 4] = 0x80;
18153
18154 salt->salt_len = salt_len;
18155 salt->salt_iter = iter - 1;
18156
18157 // decode hash
18158
18159 char tmp_buf[100];
18160
18161 memset (tmp_buf, 0, sizeof (tmp_buf));
18162
18163 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
18164
18165 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18166
18167 memcpy (digest, tmp_buf, 64);
18168
18169 digest[0] = byte_swap_64 (digest[0]);
18170 digest[1] = byte_swap_64 (digest[1]);
18171 digest[2] = byte_swap_64 (digest[2]);
18172 digest[3] = byte_swap_64 (digest[3]);
18173 digest[4] = byte_swap_64 (digest[4]);
18174 digest[5] = byte_swap_64 (digest[5]);
18175 digest[6] = byte_swap_64 (digest[6]);
18176 digest[7] = byte_swap_64 (digest[7]);
18177
18178 // add some stuff to normal salt to make sorted happy
18179
18180 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18181 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18182 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18183 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18184 salt->salt_buf[4] = salt->salt_iter;
18185
18186 return (PARSER_OK);
18187 }
18188
18189 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18190 {
18191 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18192
18193 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18194
18195 uint *digest = (uint *) hash_buf->digest;
18196
18197 salt_t *salt = hash_buf->salt;
18198
18199 /**
18200 * parse line
18201 */
18202
18203 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18204
18205 char *hash_pos = strchr (salt_pos, '$');
18206
18207 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18208
18209 uint32_t salt_len = hash_pos - salt_pos;
18210
18211 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18212
18213 hash_pos++;
18214
18215 uint32_t hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18216
18217 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18218
18219 // decode hash
18220
18221 digest[ 0] = hex_to_uint (&hash_pos[0]);
18222 digest[ 1] = hex_to_uint (&hash_pos[8]);
18223 digest[ 2] = 0;
18224 digest[ 3] = 0;
18225 digest[ 4] = 0;
18226 digest[ 5] = 0;
18227 digest[ 6] = 0;
18228 digest[ 7] = 0;
18229 digest[ 8] = 0;
18230 digest[ 9] = 0;
18231 digest[10] = 0;
18232 digest[11] = 0;
18233 digest[12] = 0;
18234 digest[13] = 0;
18235 digest[14] = 0;
18236 digest[15] = 0;
18237
18238 // decode salt
18239
18240 salt->salt_buf[0] = hex_to_uint (&salt_pos[0]);
18241 salt->salt_buf[1] = hex_to_uint (&salt_pos[8]);
18242
18243 salt->salt_iter = ROUNDS_ECRYPTFS;
18244 salt->salt_len = 8;
18245
18246 return (PARSER_OK);
18247 }
18248
18249 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18250 {
18251 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18252
18253 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18254
18255 unsigned char c19 = itoa64_to_int (input_buf[19]);
18256
18257 if (c19 & 3) return (PARSER_HASH_VALUE);
18258
18259 salt_t *salt = hash_buf->salt;
18260
18261 uint32_t *digest = (uint32_t *) hash_buf->digest;
18262
18263 // iteration count
18264
18265 salt->salt_iter = itoa64_to_int (input_buf[1])
18266 | itoa64_to_int (input_buf[2]) << 6
18267 | itoa64_to_int (input_buf[3]) << 12
18268 | itoa64_to_int (input_buf[4]) << 18;
18269
18270 // set salt
18271
18272 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18273 | itoa64_to_int (input_buf[6]) << 6
18274 | itoa64_to_int (input_buf[7]) << 12
18275 | itoa64_to_int (input_buf[8]) << 18;
18276
18277 salt->salt_len = 4;
18278
18279 char tmp_buf[100];
18280
18281 memset (tmp_buf, 0, sizeof (tmp_buf));
18282
18283 base64_decode (itoa64_to_int, input_buf + 9, 11, tmp_buf);
18284
18285 memcpy (digest, tmp_buf, 8);
18286
18287 uint tt;
18288
18289 IP (digest[0], digest[1], tt);
18290
18291 digest[0] = ROTATE_RIGHT (digest[0], 31);
18292 digest[1] = ROTATE_RIGHT (digest[1], 31);
18293 digest[2] = 0;
18294 digest[3] = 0;
18295
18296 return (PARSER_OK);
18297 }
18298
18299 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18300 {
18301 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18302
18303 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18304
18305 uint32_t *digest = (uint32_t *) hash_buf->digest;
18306
18307 salt_t *salt = hash_buf->salt;
18308
18309 /**
18310 * parse line
18311 */
18312
18313 char *type_pos = input_buf + 6 + 1;
18314
18315 char *salt_pos = strchr (type_pos, '*');
18316
18317 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18318
18319 uint32_t type_len = salt_pos - type_pos;
18320
18321 if (type_len != 1) return (PARSER_SALT_LENGTH);
18322
18323 salt_pos++;
18324
18325 char *crypted_pos = strchr (salt_pos, '*');
18326
18327 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18328
18329 uint32_t salt_len = crypted_pos - salt_pos;
18330
18331 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18332
18333 crypted_pos++;
18334
18335 uint32_t crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18336
18337 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18338
18339 /**
18340 * copy data
18341 */
18342
18343 salt->salt_buf[0] = hex_to_uint (&salt_pos[0]);
18344 salt->salt_buf[1] = hex_to_uint (&salt_pos[8]);
18345
18346 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18347 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18348
18349 salt->salt_buf[2] = hex_to_uint (&crypted_pos[ 0]);
18350 salt->salt_buf[3] = hex_to_uint (&crypted_pos[ 8]);
18351 salt->salt_buf[4] = hex_to_uint (&crypted_pos[16]);
18352 salt->salt_buf[5] = hex_to_uint (&crypted_pos[24]);
18353
18354 salt->salt_len = 24;
18355 salt->salt_iter = ROUNDS_RAR3;
18356
18357 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18358 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18359
18360 digest[0] = 0xc43d7b00;
18361 digest[1] = 0x40070000;
18362 digest[2] = 0;
18363 digest[3] = 0;
18364
18365 return (PARSER_OK);
18366 }
18367
18368 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18369 {
18370 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18371
18372 uint32_t *digest = (uint32_t *) hash_buf->digest;
18373
18374 salt_t *salt = hash_buf->salt;
18375
18376 digest[0] = hex_to_uint (&input_buf[ 0]);
18377 digest[1] = hex_to_uint (&input_buf[ 8]);
18378 digest[2] = hex_to_uint (&input_buf[16]);
18379 digest[3] = hex_to_uint (&input_buf[24]);
18380 digest[4] = hex_to_uint (&input_buf[32]);
18381 digest[5] = hex_to_uint (&input_buf[40]);
18382 digest[6] = hex_to_uint (&input_buf[48]);
18383 digest[7] = hex_to_uint (&input_buf[56]);
18384
18385 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18386
18387 uint salt_len = input_len - 64 - 1;
18388
18389 char *salt_buf = input_buf + 64 + 1;
18390
18391 char *salt_buf_ptr = (char *) salt->salt_buf;
18392
18393 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18394
18395 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18396
18397 salt->salt_len = salt_len;
18398
18399 /**
18400 * we can precompute the first sha256 transform
18401 */
18402
18403 uint w[16];
18404
18405 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18406 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18407 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18408 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18409 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18410 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18411 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18412 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18413 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18414 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18415 w[10] = byte_swap_32 (salt->salt_buf[10]);
18416 w[11] = byte_swap_32 (salt->salt_buf[11]);
18417 w[12] = byte_swap_32 (salt->salt_buf[12]);
18418 w[13] = byte_swap_32 (salt->salt_buf[13]);
18419 w[14] = byte_swap_32 (salt->salt_buf[14]);
18420 w[15] = byte_swap_32 (salt->salt_buf[15]);
18421
18422 uint pc256[8];
18423
18424 pc256[0] = SHA256M_A;
18425 pc256[1] = SHA256M_B;
18426 pc256[2] = SHA256M_C;
18427 pc256[3] = SHA256M_D;
18428 pc256[4] = SHA256M_E;
18429 pc256[5] = SHA256M_F;
18430 pc256[6] = SHA256M_G;
18431 pc256[7] = SHA256M_H;
18432
18433 sha256_64 (w, pc256);
18434
18435 salt->salt_buf_pc[0] = pc256[0];
18436 salt->salt_buf_pc[1] = pc256[1];
18437 salt->salt_buf_pc[2] = pc256[2];
18438 salt->salt_buf_pc[3] = pc256[3];
18439 salt->salt_buf_pc[4] = pc256[4];
18440 salt->salt_buf_pc[5] = pc256[5];
18441 salt->salt_buf_pc[6] = pc256[6];
18442 salt->salt_buf_pc[7] = pc256[7];
18443
18444 digest[0] -= pc256[0];
18445 digest[1] -= pc256[1];
18446 digest[2] -= pc256[2];
18447 digest[3] -= pc256[3];
18448 digest[4] -= pc256[4];
18449 digest[5] -= pc256[5];
18450 digest[6] -= pc256[6];
18451 digest[7] -= pc256[7];
18452
18453 return (PARSER_OK);
18454 }
18455
18456 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18457 {
18458 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18459
18460 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18461
18462 uint32_t *digest = (uint32_t *) hash_buf->digest;
18463
18464 salt_t *salt = hash_buf->salt;
18465
18466 /**
18467 * parse line
18468 */
18469
18470 char *data_len_pos = input_buf + 1 + 10 + 1;
18471
18472 char *data_buf_pos = strchr (data_len_pos, '$');
18473
18474 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18475
18476 uint32_t data_len_len = data_buf_pos - data_len_pos;
18477
18478 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18479 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18480
18481 data_buf_pos++;
18482
18483 uint32_t data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18484
18485 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18486
18487 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18488
18489 uint32_t data_len = atoi (data_len_pos);
18490
18491 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18492
18493 /**
18494 * salt
18495 */
18496
18497 char *salt_pos = data_buf_pos;
18498
18499 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
18500 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
18501 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]);
18502 salt->salt_buf[3] = hex_to_uint (&salt_pos[24]);
18503
18504 // this is actually the CT, which is also the hash later (if matched)
18505
18506 salt->salt_buf[4] = hex_to_uint (&salt_pos[32]);
18507 salt->salt_buf[5] = hex_to_uint (&salt_pos[40]);
18508 salt->salt_buf[6] = hex_to_uint (&salt_pos[48]);
18509 salt->salt_buf[7] = hex_to_uint (&salt_pos[56]);
18510
18511 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18512
18513 salt->salt_iter = 10 - 1;
18514
18515 /**
18516 * digest buf
18517 */
18518
18519 digest[0] = salt->salt_buf[4];
18520 digest[1] = salt->salt_buf[5];
18521 digest[2] = salt->salt_buf[6];
18522 digest[3] = salt->salt_buf[7];
18523
18524 return (PARSER_OK);
18525 }
18526
18527 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18528 {
18529 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
18530
18531 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18532
18533 uint32_t *digest = (uint32_t *) hash_buf->digest;
18534
18535 salt_t *salt = hash_buf->salt;
18536
18537 /**
18538 * parse line
18539 */
18540
18541 char *salt_pos = input_buf + 11 + 1;
18542
18543 char *iter_pos = strchr (salt_pos, ',');
18544
18545 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18546
18547 uint32_t salt_len = iter_pos - salt_pos;
18548
18549 if (salt_len != 20) return (PARSER_SALT_LENGTH);
18550
18551 iter_pos++;
18552
18553 char *hash_pos = strchr (iter_pos, ',');
18554
18555 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18556
18557 uint32_t iter_len = hash_pos - iter_pos;
18558
18559 if (iter_len > 5) return (PARSER_SALT_LENGTH);
18560
18561 hash_pos++;
18562
18563 uint32_t hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
18564
18565 if (hash_len != 64) return (PARSER_HASH_LENGTH);
18566
18567 /**
18568 * salt
18569 */
18570
18571 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
18572 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
18573 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]) & 0xffff0000;
18574 salt->salt_buf[3] = 0x00018000;
18575
18576 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18577 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18578 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
18579 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
18580
18581 salt->salt_len = salt_len / 2;
18582
18583 salt->salt_iter = atoi (iter_pos) - 1;
18584
18585 /**
18586 * digest buf
18587 */
18588
18589 digest[0] = hex_to_uint (&hash_pos[ 0]);
18590 digest[1] = hex_to_uint (&hash_pos[ 8]);
18591 digest[2] = hex_to_uint (&hash_pos[16]);
18592 digest[3] = hex_to_uint (&hash_pos[24]);
18593 digest[4] = hex_to_uint (&hash_pos[32]);
18594 digest[5] = hex_to_uint (&hash_pos[40]);
18595 digest[6] = hex_to_uint (&hash_pos[48]);
18596 digest[7] = hex_to_uint (&hash_pos[56]);
18597
18598 return (PARSER_OK);
18599 }
18600
18601 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18602 {
18603 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
18604
18605 uint32_t *digest = (uint32_t *) hash_buf->digest;
18606
18607 salt_t *salt = hash_buf->salt;
18608
18609 /**
18610 * parse line
18611 */
18612
18613 char *hash_pos = input_buf + 64;
18614 char *salt1_pos = input_buf + 128;
18615 char *salt2_pos = input_buf;
18616
18617 /**
18618 * salt
18619 */
18620
18621 salt->salt_buf[ 0] = hex_to_uint (&salt1_pos[ 0]);
18622 salt->salt_buf[ 1] = hex_to_uint (&salt1_pos[ 8]);
18623 salt->salt_buf[ 2] = hex_to_uint (&salt1_pos[16]);
18624 salt->salt_buf[ 3] = hex_to_uint (&salt1_pos[24]);
18625
18626 salt->salt_buf[ 4] = hex_to_uint (&salt2_pos[ 0]);
18627 salt->salt_buf[ 5] = hex_to_uint (&salt2_pos[ 8]);
18628 salt->salt_buf[ 6] = hex_to_uint (&salt2_pos[16]);
18629 salt->salt_buf[ 7] = hex_to_uint (&salt2_pos[24]);
18630
18631 salt->salt_buf[ 8] = hex_to_uint (&salt2_pos[32]);
18632 salt->salt_buf[ 9] = hex_to_uint (&salt2_pos[40]);
18633 salt->salt_buf[10] = hex_to_uint (&salt2_pos[48]);
18634 salt->salt_buf[11] = hex_to_uint (&salt2_pos[56]);
18635
18636 salt->salt_len = 48;
18637
18638 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
18639
18640 /**
18641 * digest buf
18642 */
18643
18644 digest[0] = hex_to_uint (&hash_pos[ 0]);
18645 digest[1] = hex_to_uint (&hash_pos[ 8]);
18646 digest[2] = hex_to_uint (&hash_pos[16]);
18647 digest[3] = hex_to_uint (&hash_pos[24]);
18648 digest[4] = hex_to_uint (&hash_pos[32]);
18649 digest[5] = hex_to_uint (&hash_pos[40]);
18650 digest[6] = hex_to_uint (&hash_pos[48]);
18651 digest[7] = hex_to_uint (&hash_pos[56]);
18652
18653 return (PARSER_OK);
18654 }
18655
18656 /**
18657 * parallel running threads
18658 */
18659
18660 #ifdef WIN
18661
18662 BOOL WINAPI sigHandler_default (DWORD sig)
18663 {
18664 switch (sig)
18665 {
18666 case CTRL_CLOSE_EVENT:
18667
18668 /*
18669 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
18670 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
18671 * function otherwise it is to late (e.g. after returning from this function)
18672 */
18673
18674 myabort ();
18675
18676 SetConsoleCtrlHandler (NULL, TRUE);
18677
18678 hc_sleep (10);
18679
18680 return TRUE;
18681
18682 case CTRL_C_EVENT:
18683 case CTRL_LOGOFF_EVENT:
18684 case CTRL_SHUTDOWN_EVENT:
18685
18686 myabort ();
18687
18688 SetConsoleCtrlHandler (NULL, TRUE);
18689
18690 return TRUE;
18691 }
18692
18693 return FALSE;
18694 }
18695
18696 BOOL WINAPI sigHandler_benchmark (DWORD sig)
18697 {
18698 switch (sig)
18699 {
18700 case CTRL_CLOSE_EVENT:
18701
18702 myabort ();
18703
18704 SetConsoleCtrlHandler (NULL, TRUE);
18705
18706 hc_sleep (10);
18707
18708 return TRUE;
18709
18710 case CTRL_C_EVENT:
18711 case CTRL_LOGOFF_EVENT:
18712 case CTRL_SHUTDOWN_EVENT:
18713
18714 myquit ();
18715
18716 SetConsoleCtrlHandler (NULL, TRUE);
18717
18718 return TRUE;
18719 }
18720
18721 return FALSE;
18722 }
18723
18724 void hc_signal (BOOL WINAPI (callback) (DWORD))
18725 {
18726 if (callback == NULL)
18727 {
18728 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
18729 }
18730 else
18731 {
18732 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
18733 }
18734 }
18735
18736 #else
18737
18738 void sigHandler_default (int sig)
18739 {
18740 myabort ();
18741
18742 signal (sig, NULL);
18743 }
18744
18745 void sigHandler_benchmark (int sig)
18746 {
18747 myquit ();
18748
18749 signal (sig, NULL);
18750 }
18751
18752 void hc_signal (void (callback) (int))
18753 {
18754 if (callback == NULL) callback = SIG_DFL;
18755
18756 signal (SIGINT, callback);
18757 signal (SIGTERM, callback);
18758 signal (SIGABRT, callback);
18759 }
18760
18761 #endif
18762
18763 void status_display ();
18764
18765 void *thread_keypress (void *p)
18766 {
18767 int benchmark = *((int *) p);
18768
18769 uint quiet = data.quiet;
18770
18771 tty_break();
18772
18773 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
18774 {
18775 int ch = tty_getchar();
18776
18777 if (ch == -1) break;
18778
18779 if (ch == 0) continue;
18780
18781 #ifdef _POSIX
18782 if (ch != '\n')
18783 #endif
18784
18785 hc_thread_mutex_lock (mux_display);
18786
18787 log_info ("");
18788
18789 switch (ch)
18790 {
18791 case 's':
18792 case '\n':
18793
18794 log_info ("");
18795
18796 status_display ();
18797
18798 log_info ("");
18799
18800 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18801 if (quiet == 0) fflush (stdout);
18802
18803 break;
18804
18805 case 'b':
18806
18807 log_info ("");
18808
18809 bypass ();
18810
18811 log_info ("");
18812
18813 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18814 if (quiet == 0) fflush (stdout);
18815
18816 break;
18817
18818 case 'p':
18819
18820 log_info ("");
18821
18822 SuspendThreads ();
18823
18824 log_info ("");
18825
18826 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18827 if (quiet == 0) fflush (stdout);
18828
18829 break;
18830
18831 case 'r':
18832
18833 log_info ("");
18834
18835 ResumeThreads ();
18836
18837 log_info ("");
18838
18839 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18840 if (quiet == 0) fflush (stdout);
18841
18842 break;
18843
18844 case 'c':
18845
18846 log_info ("");
18847
18848 if (benchmark == 1) break;
18849
18850 stop_at_checkpoint ();
18851
18852 log_info ("");
18853
18854 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18855 if (quiet == 0) fflush (stdout);
18856
18857 break;
18858
18859 case 'q':
18860
18861 log_info ("");
18862
18863 if (benchmark == 1)
18864 {
18865 myquit ();
18866 }
18867 else
18868 {
18869 myabort ();
18870 }
18871
18872 break;
18873 }
18874
18875 hc_thread_mutex_unlock (mux_display);
18876 }
18877
18878 tty_fix();
18879
18880 return (p);
18881 }
18882
18883 /**
18884 * rules common
18885 */
18886
18887 bool class_num (char c)
18888 {
18889 return ((c >= '0') && (c <= '9'));
18890 }
18891
18892 bool class_lower (char c)
18893 {
18894 return ((c >= 'a') && (c <= 'z'));
18895 }
18896
18897 bool class_upper (char c)
18898 {
18899 return ((c >= 'A') && (c <= 'Z'));
18900 }
18901
18902 bool class_alpha (char c)
18903 {
18904 return (class_lower (c) || class_upper (c));
18905 }
18906
18907 char conv_ctoi (char c)
18908 {
18909 if (class_num (c))
18910 {
18911 return c - '0';
18912 }
18913 else if (class_upper (c))
18914 {
18915 return c - 'A' + (char) 10;
18916 }
18917
18918 return (char) (-1);
18919 }
18920
18921 char conv_itoc (char c)
18922 {
18923 if (c < 10)
18924 {
18925 return c + '0';
18926 }
18927 else if (c < 37)
18928 {
18929 return c + 'A' - (char) 10;
18930 }
18931
18932 return (char) (-1);
18933 }
18934
18935 /**
18936 * device rules
18937 */
18938
18939 #define INCR_POS if (++rule_pos == rule_len) return (-1)
18940 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
18941 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
18942 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
18943 #define MAX_KERNEL_RULES 255
18944 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
18945 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
18946 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
18947
18948 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
18949 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
18950 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
18951 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
18952
18953 int cpu_rule_to_kernel_rule (char rule_buf[BUFSIZ], uint rule_len, kernel_rule_t *rule)
18954 {
18955 uint rule_pos;
18956 uint rule_cnt;
18957
18958 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
18959 {
18960 switch (rule_buf[rule_pos])
18961 {
18962 case ' ':
18963 rule_cnt--;
18964 break;
18965
18966 case RULE_OP_MANGLE_NOOP:
18967 SET_NAME (rule, rule_buf[rule_pos]);
18968 break;
18969
18970 case RULE_OP_MANGLE_LREST:
18971 SET_NAME (rule, rule_buf[rule_pos]);
18972 break;
18973
18974 case RULE_OP_MANGLE_UREST:
18975 SET_NAME (rule, rule_buf[rule_pos]);
18976 break;
18977
18978 case RULE_OP_MANGLE_LREST_UFIRST:
18979 SET_NAME (rule, rule_buf[rule_pos]);
18980 break;
18981
18982 case RULE_OP_MANGLE_UREST_LFIRST:
18983 SET_NAME (rule, rule_buf[rule_pos]);
18984 break;
18985
18986 case RULE_OP_MANGLE_TREST:
18987 SET_NAME (rule, rule_buf[rule_pos]);
18988 break;
18989
18990 case RULE_OP_MANGLE_TOGGLE_AT:
18991 SET_NAME (rule, rule_buf[rule_pos]);
18992 SET_P0_CONV (rule, rule_buf[rule_pos]);
18993 break;
18994
18995 case RULE_OP_MANGLE_REVERSE:
18996 SET_NAME (rule, rule_buf[rule_pos]);
18997 break;
18998
18999 case RULE_OP_MANGLE_DUPEWORD:
19000 SET_NAME (rule, rule_buf[rule_pos]);
19001 break;
19002
19003 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19004 SET_NAME (rule, rule_buf[rule_pos]);
19005 SET_P0_CONV (rule, rule_buf[rule_pos]);
19006 break;
19007
19008 case RULE_OP_MANGLE_REFLECT:
19009 SET_NAME (rule, rule_buf[rule_pos]);
19010 break;
19011
19012 case RULE_OP_MANGLE_ROTATE_LEFT:
19013 SET_NAME (rule, rule_buf[rule_pos]);
19014 break;
19015
19016 case RULE_OP_MANGLE_ROTATE_RIGHT:
19017 SET_NAME (rule, rule_buf[rule_pos]);
19018 break;
19019
19020 case RULE_OP_MANGLE_APPEND:
19021 SET_NAME (rule, rule_buf[rule_pos]);
19022 SET_P0 (rule, rule_buf[rule_pos]);
19023 break;
19024
19025 case RULE_OP_MANGLE_PREPEND:
19026 SET_NAME (rule, rule_buf[rule_pos]);
19027 SET_P0 (rule, rule_buf[rule_pos]);
19028 break;
19029
19030 case RULE_OP_MANGLE_DELETE_FIRST:
19031 SET_NAME (rule, rule_buf[rule_pos]);
19032 break;
19033
19034 case RULE_OP_MANGLE_DELETE_LAST:
19035 SET_NAME (rule, rule_buf[rule_pos]);
19036 break;
19037
19038 case RULE_OP_MANGLE_DELETE_AT:
19039 SET_NAME (rule, rule_buf[rule_pos]);
19040 SET_P0_CONV (rule, rule_buf[rule_pos]);
19041 break;
19042
19043 case RULE_OP_MANGLE_EXTRACT:
19044 SET_NAME (rule, rule_buf[rule_pos]);
19045 SET_P0_CONV (rule, rule_buf[rule_pos]);
19046 SET_P1_CONV (rule, rule_buf[rule_pos]);
19047 break;
19048
19049 case RULE_OP_MANGLE_OMIT:
19050 SET_NAME (rule, rule_buf[rule_pos]);
19051 SET_P0_CONV (rule, rule_buf[rule_pos]);
19052 SET_P1_CONV (rule, rule_buf[rule_pos]);
19053 break;
19054
19055 case RULE_OP_MANGLE_INSERT:
19056 SET_NAME (rule, rule_buf[rule_pos]);
19057 SET_P0_CONV (rule, rule_buf[rule_pos]);
19058 SET_P1 (rule, rule_buf[rule_pos]);
19059 break;
19060
19061 case RULE_OP_MANGLE_OVERSTRIKE:
19062 SET_NAME (rule, rule_buf[rule_pos]);
19063 SET_P0_CONV (rule, rule_buf[rule_pos]);
19064 SET_P1 (rule, rule_buf[rule_pos]);
19065 break;
19066
19067 case RULE_OP_MANGLE_TRUNCATE_AT:
19068 SET_NAME (rule, rule_buf[rule_pos]);
19069 SET_P0_CONV (rule, rule_buf[rule_pos]);
19070 break;
19071
19072 case RULE_OP_MANGLE_REPLACE:
19073 SET_NAME (rule, rule_buf[rule_pos]);
19074 SET_P0 (rule, rule_buf[rule_pos]);
19075 SET_P1 (rule, rule_buf[rule_pos]);
19076 break;
19077
19078 case RULE_OP_MANGLE_PURGECHAR:
19079 return (-1);
19080 break;
19081
19082 case RULE_OP_MANGLE_TOGGLECASE_REC:
19083 return (-1);
19084 break;
19085
19086 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19087 SET_NAME (rule, rule_buf[rule_pos]);
19088 SET_P0_CONV (rule, rule_buf[rule_pos]);
19089 break;
19090
19091 case RULE_OP_MANGLE_DUPECHAR_LAST:
19092 SET_NAME (rule, rule_buf[rule_pos]);
19093 SET_P0_CONV (rule, rule_buf[rule_pos]);
19094 break;
19095
19096 case RULE_OP_MANGLE_DUPECHAR_ALL:
19097 SET_NAME (rule, rule_buf[rule_pos]);
19098 break;
19099
19100 case RULE_OP_MANGLE_SWITCH_FIRST:
19101 SET_NAME (rule, rule_buf[rule_pos]);
19102 break;
19103
19104 case RULE_OP_MANGLE_SWITCH_LAST:
19105 SET_NAME (rule, rule_buf[rule_pos]);
19106 break;
19107
19108 case RULE_OP_MANGLE_SWITCH_AT:
19109 SET_NAME (rule, rule_buf[rule_pos]);
19110 SET_P0_CONV (rule, rule_buf[rule_pos]);
19111 SET_P1_CONV (rule, rule_buf[rule_pos]);
19112 break;
19113
19114 case RULE_OP_MANGLE_CHR_SHIFTL:
19115 SET_NAME (rule, rule_buf[rule_pos]);
19116 SET_P0_CONV (rule, rule_buf[rule_pos]);
19117 break;
19118
19119 case RULE_OP_MANGLE_CHR_SHIFTR:
19120 SET_NAME (rule, rule_buf[rule_pos]);
19121 SET_P0_CONV (rule, rule_buf[rule_pos]);
19122 break;
19123
19124 case RULE_OP_MANGLE_CHR_INCR:
19125 SET_NAME (rule, rule_buf[rule_pos]);
19126 SET_P0_CONV (rule, rule_buf[rule_pos]);
19127 break;
19128
19129 case RULE_OP_MANGLE_CHR_DECR:
19130 SET_NAME (rule, rule_buf[rule_pos]);
19131 SET_P0_CONV (rule, rule_buf[rule_pos]);
19132 break;
19133
19134 case RULE_OP_MANGLE_REPLACE_NP1:
19135 SET_NAME (rule, rule_buf[rule_pos]);
19136 SET_P0_CONV (rule, rule_buf[rule_pos]);
19137 break;
19138
19139 case RULE_OP_MANGLE_REPLACE_NM1:
19140 SET_NAME (rule, rule_buf[rule_pos]);
19141 SET_P0_CONV (rule, rule_buf[rule_pos]);
19142 break;
19143
19144 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19145 SET_NAME (rule, rule_buf[rule_pos]);
19146 SET_P0_CONV (rule, rule_buf[rule_pos]);
19147 break;
19148
19149 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19150 SET_NAME (rule, rule_buf[rule_pos]);
19151 SET_P0_CONV (rule, rule_buf[rule_pos]);
19152 break;
19153
19154 case RULE_OP_MANGLE_TITLE:
19155 SET_NAME (rule, rule_buf[rule_pos]);
19156 break;
19157
19158 default:
19159 return (-1);
19160 break;
19161 }
19162 }
19163
19164 if (rule_pos < rule_len) return (-1);
19165
19166 return (0);
19167 }
19168
19169 int kernel_rule_to_cpu_rule (char rule_buf[BUFSIZ], kernel_rule_t *rule)
19170 {
19171 uint rule_cnt;
19172 uint rule_pos;
19173 uint rule_len = BUFSIZ - 1; // maximum possible len
19174
19175 char rule_cmd;
19176
19177 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19178 {
19179 GET_NAME (rule);
19180
19181 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19182
19183 switch (rule_cmd)
19184 {
19185 case RULE_OP_MANGLE_NOOP:
19186 rule_buf[rule_pos] = rule_cmd;
19187 break;
19188
19189 case RULE_OP_MANGLE_LREST:
19190 rule_buf[rule_pos] = rule_cmd;
19191 break;
19192
19193 case RULE_OP_MANGLE_UREST:
19194 rule_buf[rule_pos] = rule_cmd;
19195 break;
19196
19197 case RULE_OP_MANGLE_LREST_UFIRST:
19198 rule_buf[rule_pos] = rule_cmd;
19199 break;
19200
19201 case RULE_OP_MANGLE_UREST_LFIRST:
19202 rule_buf[rule_pos] = rule_cmd;
19203 break;
19204
19205 case RULE_OP_MANGLE_TREST:
19206 rule_buf[rule_pos] = rule_cmd;
19207 break;
19208
19209 case RULE_OP_MANGLE_TOGGLE_AT:
19210 rule_buf[rule_pos] = rule_cmd;
19211 GET_P0_CONV (rule);
19212 break;
19213
19214 case RULE_OP_MANGLE_REVERSE:
19215 rule_buf[rule_pos] = rule_cmd;
19216 break;
19217
19218 case RULE_OP_MANGLE_DUPEWORD:
19219 rule_buf[rule_pos] = rule_cmd;
19220 break;
19221
19222 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19223 rule_buf[rule_pos] = rule_cmd;
19224 GET_P0_CONV (rule);
19225 break;
19226
19227 case RULE_OP_MANGLE_REFLECT:
19228 rule_buf[rule_pos] = rule_cmd;
19229 break;
19230
19231 case RULE_OP_MANGLE_ROTATE_LEFT:
19232 rule_buf[rule_pos] = rule_cmd;
19233 break;
19234
19235 case RULE_OP_MANGLE_ROTATE_RIGHT:
19236 rule_buf[rule_pos] = rule_cmd;
19237 break;
19238
19239 case RULE_OP_MANGLE_APPEND:
19240 rule_buf[rule_pos] = rule_cmd;
19241 GET_P0 (rule);
19242 break;
19243
19244 case RULE_OP_MANGLE_PREPEND:
19245 rule_buf[rule_pos] = rule_cmd;
19246 GET_P0 (rule);
19247 break;
19248
19249 case RULE_OP_MANGLE_DELETE_FIRST:
19250 rule_buf[rule_pos] = rule_cmd;
19251 break;
19252
19253 case RULE_OP_MANGLE_DELETE_LAST:
19254 rule_buf[rule_pos] = rule_cmd;
19255 break;
19256
19257 case RULE_OP_MANGLE_DELETE_AT:
19258 rule_buf[rule_pos] = rule_cmd;
19259 GET_P0_CONV (rule);
19260 break;
19261
19262 case RULE_OP_MANGLE_EXTRACT:
19263 rule_buf[rule_pos] = rule_cmd;
19264 GET_P0_CONV (rule);
19265 GET_P1_CONV (rule);
19266 break;
19267
19268 case RULE_OP_MANGLE_OMIT:
19269 rule_buf[rule_pos] = rule_cmd;
19270 GET_P0_CONV (rule);
19271 GET_P1_CONV (rule);
19272 break;
19273
19274 case RULE_OP_MANGLE_INSERT:
19275 rule_buf[rule_pos] = rule_cmd;
19276 GET_P0_CONV (rule);
19277 GET_P1 (rule);
19278 break;
19279
19280 case RULE_OP_MANGLE_OVERSTRIKE:
19281 rule_buf[rule_pos] = rule_cmd;
19282 GET_P0_CONV (rule);
19283 GET_P1 (rule);
19284 break;
19285
19286 case RULE_OP_MANGLE_TRUNCATE_AT:
19287 rule_buf[rule_pos] = rule_cmd;
19288 GET_P0_CONV (rule);
19289 break;
19290
19291 case RULE_OP_MANGLE_REPLACE:
19292 rule_buf[rule_pos] = rule_cmd;
19293 GET_P0 (rule);
19294 GET_P1 (rule);
19295 break;
19296
19297 case RULE_OP_MANGLE_PURGECHAR:
19298 return (-1);
19299 break;
19300
19301 case RULE_OP_MANGLE_TOGGLECASE_REC:
19302 return (-1);
19303 break;
19304
19305 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19306 rule_buf[rule_pos] = rule_cmd;
19307 GET_P0_CONV (rule);
19308 break;
19309
19310 case RULE_OP_MANGLE_DUPECHAR_LAST:
19311 rule_buf[rule_pos] = rule_cmd;
19312 GET_P0_CONV (rule);
19313 break;
19314
19315 case RULE_OP_MANGLE_DUPECHAR_ALL:
19316 rule_buf[rule_pos] = rule_cmd;
19317 break;
19318
19319 case RULE_OP_MANGLE_SWITCH_FIRST:
19320 rule_buf[rule_pos] = rule_cmd;
19321 break;
19322
19323 case RULE_OP_MANGLE_SWITCH_LAST:
19324 rule_buf[rule_pos] = rule_cmd;
19325 break;
19326
19327 case RULE_OP_MANGLE_SWITCH_AT:
19328 rule_buf[rule_pos] = rule_cmd;
19329 GET_P0_CONV (rule);
19330 GET_P1_CONV (rule);
19331 break;
19332
19333 case RULE_OP_MANGLE_CHR_SHIFTL:
19334 rule_buf[rule_pos] = rule_cmd;
19335 GET_P0_CONV (rule);
19336 break;
19337
19338 case RULE_OP_MANGLE_CHR_SHIFTR:
19339 rule_buf[rule_pos] = rule_cmd;
19340 GET_P0_CONV (rule);
19341 break;
19342
19343 case RULE_OP_MANGLE_CHR_INCR:
19344 rule_buf[rule_pos] = rule_cmd;
19345 GET_P0_CONV (rule);
19346 break;
19347
19348 case RULE_OP_MANGLE_CHR_DECR:
19349 rule_buf[rule_pos] = rule_cmd;
19350 GET_P0_CONV (rule);
19351 break;
19352
19353 case RULE_OP_MANGLE_REPLACE_NP1:
19354 rule_buf[rule_pos] = rule_cmd;
19355 GET_P0_CONV (rule);
19356 break;
19357
19358 case RULE_OP_MANGLE_REPLACE_NM1:
19359 rule_buf[rule_pos] = rule_cmd;
19360 GET_P0_CONV (rule);
19361 break;
19362
19363 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19364 rule_buf[rule_pos] = rule_cmd;
19365 GET_P0_CONV (rule);
19366 break;
19367
19368 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19369 rule_buf[rule_pos] = rule_cmd;
19370 GET_P0_CONV (rule);
19371 break;
19372
19373 case RULE_OP_MANGLE_TITLE:
19374 rule_buf[rule_pos] = rule_cmd;
19375 break;
19376
19377 case 0:
19378 return rule_pos - 1;
19379 break;
19380
19381 default:
19382 return (-1);
19383 break;
19384 }
19385 }
19386
19387 if (rule_cnt > 0)
19388 {
19389 return rule_pos;
19390 }
19391
19392 return (-1);
19393 }
19394
19395 /**
19396 * CPU rules : this is from hashcat sources, cpu based rules
19397 */
19398
19399 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19400 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19401
19402 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19403 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19404 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19405
19406 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19407 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19408 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19409
19410 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19411 {
19412 int pos;
19413
19414 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19415
19416 return (arr_len);
19417 }
19418
19419 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19420 {
19421 int pos;
19422
19423 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19424
19425 return (arr_len);
19426 }
19427
19428 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19429 {
19430 int pos;
19431
19432 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19433
19434 return (arr_len);
19435 }
19436
19437 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19438 {
19439 int l;
19440 int r;
19441
19442 for (l = 0; l < arr_len; l++)
19443 {
19444 r = arr_len - 1 - l;
19445
19446 if (l >= r) break;
19447
19448 MANGLE_SWITCH (arr, l, r);
19449 }
19450
19451 return (arr_len);
19452 }
19453
19454 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19455 {
19456 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19457
19458 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19459
19460 return (arr_len * 2);
19461 }
19462
19463 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19464 {
19465 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19466
19467 int orig_len = arr_len;
19468
19469 int i;
19470
19471 for (i = 0; i < times; i++)
19472 {
19473 memcpy (&arr[arr_len], arr, orig_len);
19474
19475 arr_len += orig_len;
19476 }
19477
19478 return (arr_len);
19479 }
19480
19481 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19482 {
19483 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19484
19485 mangle_double (arr, arr_len);
19486
19487 mangle_reverse (arr + arr_len, arr_len);
19488
19489 return (arr_len * 2);
19490 }
19491
19492 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19493 {
19494 int l;
19495 int r;
19496
19497 for (l = 0, r = arr_len - 1; r > 0; r--)
19498 {
19499 MANGLE_SWITCH (arr, l, r);
19500 }
19501
19502 return (arr_len);
19503 }
19504
19505 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19506 {
19507 int l;
19508 int r;
19509
19510 for (l = 0, r = arr_len - 1; l < r; l++)
19511 {
19512 MANGLE_SWITCH (arr, l, r);
19513 }
19514
19515 return (arr_len);
19516 }
19517
19518 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19519 {
19520 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19521
19522 arr[arr_len] = c;
19523
19524 return (arr_len + 1);
19525 }
19526
19527 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19528 {
19529 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19530
19531 int arr_pos;
19532
19533 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19534 {
19535 arr[arr_pos + 1] = arr[arr_pos];
19536 }
19537
19538 arr[0] = c;
19539
19540 return (arr_len + 1);
19541 }
19542
19543 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19544 {
19545 if (upos >= arr_len) return (arr_len);
19546
19547 int arr_pos;
19548
19549 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
19550 {
19551 arr[arr_pos] = arr[arr_pos + 1];
19552 }
19553
19554 return (arr_len - 1);
19555 }
19556
19557 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19558 {
19559 if (upos >= arr_len) return (arr_len);
19560
19561 if ((upos + ulen) > arr_len) return (arr_len);
19562
19563 int arr_pos;
19564
19565 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
19566 {
19567 arr[arr_pos] = arr[upos + arr_pos];
19568 }
19569
19570 return (ulen);
19571 }
19572
19573 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19574 {
19575 if (upos >= arr_len) return (arr_len);
19576
19577 if ((upos + ulen) >= arr_len) return (arr_len);
19578
19579 int arr_pos;
19580
19581 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
19582 {
19583 arr[arr_pos] = arr[arr_pos + ulen];
19584 }
19585
19586 return (arr_len - ulen);
19587 }
19588
19589 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19590 {
19591 if (upos >= arr_len) return (arr_len);
19592
19593 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19594
19595 int arr_pos;
19596
19597 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
19598 {
19599 arr[arr_pos + 1] = arr[arr_pos];
19600 }
19601
19602 arr[upos] = c;
19603
19604 return (arr_len + 1);
19605 }
19606
19607 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)
19608 {
19609 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
19610
19611 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
19612
19613 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
19614
19615 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
19616
19617 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
19618
19619 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
19620
19621 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
19622
19623 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
19624
19625 return (arr_len + arr2_cpy);
19626 }
19627
19628 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19629 {
19630 if (upos >= arr_len) return (arr_len);
19631
19632 arr[upos] = c;
19633
19634 return (arr_len);
19635 }
19636
19637 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19638 {
19639 if (upos >= arr_len) return (arr_len);
19640
19641 memset (arr + upos, 0, arr_len - upos);
19642
19643 return (upos);
19644 }
19645
19646 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
19647 {
19648 int arr_pos;
19649
19650 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
19651 {
19652 if (arr[arr_pos] != oldc) continue;
19653
19654 arr[arr_pos] = newc;
19655 }
19656
19657 return (arr_len);
19658 }
19659
19660 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
19661 {
19662 int arr_pos;
19663
19664 int ret_len;
19665
19666 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
19667 {
19668 if (arr[arr_pos] == c) continue;
19669
19670 arr[ret_len] = arr[arr_pos];
19671
19672 ret_len++;
19673 }
19674
19675 return (ret_len);
19676 }
19677
19678 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
19679 {
19680 if (ulen > arr_len) return (arr_len);
19681
19682 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19683
19684 char cs[100];
19685
19686 memcpy (cs, arr, ulen);
19687
19688 int i;
19689
19690 for (i = 0; i < ulen; i++)
19691 {
19692 char c = cs[i];
19693
19694 arr_len = mangle_insert (arr, arr_len, i, c);
19695 }
19696
19697 return (arr_len);
19698 }
19699
19700 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
19701 {
19702 if (ulen > arr_len) return (arr_len);
19703
19704 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19705
19706 int upos = arr_len - ulen;
19707
19708 int i;
19709
19710 for (i = 0; i < ulen; i++)
19711 {
19712 char c = arr[upos + i];
19713
19714 arr_len = mangle_append (arr, arr_len, c);
19715 }
19716
19717 return (arr_len);
19718 }
19719
19720 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19721 {
19722 if ( arr_len == 0) return (arr_len);
19723 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19724
19725 char c = arr[upos];
19726
19727 int i;
19728
19729 for (i = 0; i < ulen; i++)
19730 {
19731 arr_len = mangle_insert (arr, arr_len, upos, c);
19732 }
19733
19734 return (arr_len);
19735 }
19736
19737 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
19738 {
19739 if ( arr_len == 0) return (arr_len);
19740 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
19741
19742 int arr_pos;
19743
19744 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19745 {
19746 int new_pos = arr_pos * 2;
19747
19748 arr[new_pos] = arr[arr_pos];
19749
19750 arr[new_pos + 1] = arr[arr_pos];
19751 }
19752
19753 return (arr_len * 2);
19754 }
19755
19756 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
19757 {
19758 if (upos >= arr_len) return (arr_len);
19759 if (upos2 >= arr_len) return (arr_len);
19760
19761 MANGLE_SWITCH (arr, upos, upos2);
19762
19763 return (arr_len);
19764 }
19765
19766 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
19767 {
19768 MANGLE_SWITCH (arr, upos, upos2);
19769
19770 return (arr_len);
19771 }
19772
19773 int mangle_chr_shiftl (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19774 {
19775 if (upos >= arr_len) return (arr_len);
19776
19777 arr[upos] <<= 1;
19778
19779 return (arr_len);
19780 }
19781
19782 int mangle_chr_shiftr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19783 {
19784 if (upos >= arr_len) return (arr_len);
19785
19786 arr[upos] >>= 1;
19787
19788 return (arr_len);
19789 }
19790
19791 int mangle_chr_incr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19792 {
19793 if (upos >= arr_len) return (arr_len);
19794
19795 arr[upos] += 1;
19796
19797 return (arr_len);
19798 }
19799
19800 int mangle_chr_decr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19801 {
19802 if (upos >= arr_len) return (arr_len);
19803
19804 arr[upos] -= 1;
19805
19806 return (arr_len);
19807 }
19808
19809 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
19810 {
19811 int upper_next = 1;
19812
19813 int pos;
19814
19815 for (pos = 0; pos < arr_len; pos++)
19816 {
19817 if (arr[pos] == ' ')
19818 {
19819 upper_next = 1;
19820
19821 continue;
19822 }
19823
19824 if (upper_next)
19825 {
19826 upper_next = 0;
19827
19828 MANGLE_UPPER_AT (arr, pos);
19829 }
19830 else
19831 {
19832 MANGLE_LOWER_AT (arr, pos);
19833 }
19834 }
19835
19836 return (arr_len);
19837 }
19838
19839 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], uint32_t rp_gen_func_min, uint32_t rp_gen_func_max)
19840 {
19841 uint32_t rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
19842
19843 uint32_t j;
19844
19845 uint32_t rule_pos = 0;
19846
19847 for (j = 0; j < rp_gen_num; j++)
19848 {
19849 uint32_t r = 0;
19850 uint32_t p1 = 0;
19851 uint32_t p2 = 0;
19852 uint32_t p3 = 0;
19853
19854 switch ((char) get_random_num (0, 9))
19855 {
19856 case 0:
19857 r = get_random_num (0, sizeof (grp_op_nop));
19858 rule_buf[rule_pos++] = grp_op_nop[r];
19859 break;
19860
19861 case 1:
19862 r = get_random_num (0, sizeof (grp_op_pos_p0));
19863 rule_buf[rule_pos++] = grp_op_pos_p0[r];
19864 p1 = get_random_num (0, sizeof (grp_pos));
19865 rule_buf[rule_pos++] = grp_pos[p1];
19866 break;
19867
19868 case 2:
19869 r = get_random_num (0, sizeof (grp_op_pos_p1));
19870 rule_buf[rule_pos++] = grp_op_pos_p1[r];
19871 p1 = get_random_num (1, 6);
19872 rule_buf[rule_pos++] = grp_pos[p1];
19873 break;
19874
19875 case 3:
19876 r = get_random_num (0, sizeof (grp_op_chr));
19877 rule_buf[rule_pos++] = grp_op_chr[r];
19878 p1 = get_random_num (0x20, 0x7e);
19879 rule_buf[rule_pos++] = (char) p1;
19880 break;
19881
19882 case 4:
19883 r = get_random_num (0, sizeof (grp_op_chr_chr));
19884 rule_buf[rule_pos++] = grp_op_chr_chr[r];
19885 p1 = get_random_num (0x20, 0x7e);
19886 rule_buf[rule_pos++] = (char) p1;
19887 p2 = get_random_num (0x20, 0x7e);
19888 while (p1 == p2)
19889 p2 = get_random_num (0x20, 0x7e);
19890 rule_buf[rule_pos++] = (char) p2;
19891 break;
19892
19893 case 5:
19894 r = get_random_num (0, sizeof (grp_op_pos_chr));
19895 rule_buf[rule_pos++] = grp_op_pos_chr[r];
19896 p1 = get_random_num (0, sizeof (grp_pos));
19897 rule_buf[rule_pos++] = grp_pos[p1];
19898 p2 = get_random_num (0x20, 0x7e);
19899 rule_buf[rule_pos++] = (char) p2;
19900 break;
19901
19902 case 6:
19903 r = get_random_num (0, sizeof (grp_op_pos_pos0));
19904 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
19905 p1 = get_random_num (0, sizeof (grp_pos));
19906 rule_buf[rule_pos++] = grp_pos[p1];
19907 p2 = get_random_num (0, sizeof (grp_pos));
19908 while (p1 == p2)
19909 p2 = get_random_num (0, sizeof (grp_pos));
19910 rule_buf[rule_pos++] = grp_pos[p2];
19911 break;
19912
19913 case 7:
19914 r = get_random_num (0, sizeof (grp_op_pos_pos1));
19915 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
19916 p1 = get_random_num (0, sizeof (grp_pos));
19917 rule_buf[rule_pos++] = grp_pos[p1];
19918 p2 = get_random_num (1, sizeof (grp_pos));
19919 while (p1 == p2)
19920 p2 = get_random_num (1, sizeof (grp_pos));
19921 rule_buf[rule_pos++] = grp_pos[p2];
19922 break;
19923
19924 case 8:
19925 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
19926 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
19927 p1 = get_random_num (0, sizeof (grp_pos));
19928 rule_buf[rule_pos++] = grp_pos[p1];
19929 p2 = get_random_num (1, sizeof (grp_pos));
19930 rule_buf[rule_pos++] = grp_pos[p1];
19931 p3 = get_random_num (0, sizeof (grp_pos));
19932 rule_buf[rule_pos++] = grp_pos[p3];
19933 break;
19934 }
19935 }
19936
19937 return (rule_pos);
19938 }
19939
19940 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
19941 {
19942 char mem[BLOCK_SIZE];
19943
19944 if (in == NULL) return (RULE_RC_REJECT_ERROR);
19945
19946 if (out == NULL) return (RULE_RC_REJECT_ERROR);
19947
19948 if (in_len < 1) return (RULE_RC_REJECT_ERROR);
19949
19950 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
19951
19952 int out_len = in_len;
19953 int mem_len = in_len;
19954
19955 memcpy (out, in, out_len);
19956
19957 int rule_pos;
19958
19959 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
19960 {
19961 int upos; int upos2;
19962 int ulen;
19963
19964 switch (rule[rule_pos])
19965 {
19966 case ' ':
19967 break;
19968
19969 case RULE_OP_MANGLE_NOOP:
19970 break;
19971
19972 case RULE_OP_MANGLE_LREST:
19973 out_len = mangle_lrest (out, out_len);
19974 break;
19975
19976 case RULE_OP_MANGLE_UREST:
19977 out_len = mangle_urest (out, out_len);
19978 break;
19979
19980 case RULE_OP_MANGLE_LREST_UFIRST:
19981 out_len = mangle_lrest (out, out_len);
19982 if (out_len) MANGLE_UPPER_AT (out, 0);
19983 break;
19984
19985 case RULE_OP_MANGLE_UREST_LFIRST:
19986 out_len = mangle_urest (out, out_len);
19987 if (out_len) MANGLE_LOWER_AT (out, 0);
19988 break;
19989
19990 case RULE_OP_MANGLE_TREST:
19991 out_len = mangle_trest (out, out_len);
19992 break;
19993
19994 case RULE_OP_MANGLE_TOGGLE_AT:
19995 NEXT_RULEPOS (rule_pos);
19996 NEXT_RPTOI (rule, rule_pos, upos);
19997 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
19998 break;
19999
20000 case RULE_OP_MANGLE_REVERSE:
20001 out_len = mangle_reverse (out, out_len);
20002 break;
20003
20004 case RULE_OP_MANGLE_DUPEWORD:
20005 out_len = mangle_double (out, out_len);
20006 break;
20007
20008 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20009 NEXT_RULEPOS (rule_pos);
20010 NEXT_RPTOI (rule, rule_pos, ulen);
20011 out_len = mangle_double_times (out, out_len, ulen);
20012 break;
20013
20014 case RULE_OP_MANGLE_REFLECT:
20015 out_len = mangle_reflect (out, out_len);
20016 break;
20017
20018 case RULE_OP_MANGLE_ROTATE_LEFT:
20019 mangle_rotate_left (out, out_len);
20020 break;
20021
20022 case RULE_OP_MANGLE_ROTATE_RIGHT:
20023 mangle_rotate_right (out, out_len);
20024 break;
20025
20026 case RULE_OP_MANGLE_APPEND:
20027 NEXT_RULEPOS (rule_pos);
20028 out_len = mangle_append (out, out_len, rule[rule_pos]);
20029 break;
20030
20031 case RULE_OP_MANGLE_PREPEND:
20032 NEXT_RULEPOS (rule_pos);
20033 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
20034 break;
20035
20036 case RULE_OP_MANGLE_DELETE_FIRST:
20037 out_len = mangle_delete_at (out, out_len, 0);
20038 break;
20039
20040 case RULE_OP_MANGLE_DELETE_LAST:
20041 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
20042 break;
20043
20044 case RULE_OP_MANGLE_DELETE_AT:
20045 NEXT_RULEPOS (rule_pos);
20046 NEXT_RPTOI (rule, rule_pos, upos);
20047 out_len = mangle_delete_at (out, out_len, upos);
20048 break;
20049
20050 case RULE_OP_MANGLE_EXTRACT:
20051 NEXT_RULEPOS (rule_pos);
20052 NEXT_RPTOI (rule, rule_pos, upos);
20053 NEXT_RULEPOS (rule_pos);
20054 NEXT_RPTOI (rule, rule_pos, ulen);
20055 out_len = mangle_extract (out, out_len, upos, ulen);
20056 break;
20057
20058 case RULE_OP_MANGLE_OMIT:
20059 NEXT_RULEPOS (rule_pos);
20060 NEXT_RPTOI (rule, rule_pos, upos);
20061 NEXT_RULEPOS (rule_pos);
20062 NEXT_RPTOI (rule, rule_pos, ulen);
20063 out_len = mangle_omit (out, out_len, upos, ulen);
20064 break;
20065
20066 case RULE_OP_MANGLE_INSERT:
20067 NEXT_RULEPOS (rule_pos);
20068 NEXT_RPTOI (rule, rule_pos, upos);
20069 NEXT_RULEPOS (rule_pos);
20070 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
20071 break;
20072
20073 case RULE_OP_MANGLE_OVERSTRIKE:
20074 NEXT_RULEPOS (rule_pos);
20075 NEXT_RPTOI (rule, rule_pos, upos);
20076 NEXT_RULEPOS (rule_pos);
20077 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
20078 break;
20079
20080 case RULE_OP_MANGLE_TRUNCATE_AT:
20081 NEXT_RULEPOS (rule_pos);
20082 NEXT_RPTOI (rule, rule_pos, upos);
20083 out_len = mangle_truncate_at (out, out_len, upos);
20084 break;
20085
20086 case RULE_OP_MANGLE_REPLACE:
20087 NEXT_RULEPOS (rule_pos);
20088 NEXT_RULEPOS (rule_pos);
20089 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
20090 break;
20091
20092 case RULE_OP_MANGLE_PURGECHAR:
20093 NEXT_RULEPOS (rule_pos);
20094 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
20095 break;
20096
20097 case RULE_OP_MANGLE_TOGGLECASE_REC:
20098 /* todo */
20099 break;
20100
20101 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20102 NEXT_RULEPOS (rule_pos);
20103 NEXT_RPTOI (rule, rule_pos, ulen);
20104 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
20105 break;
20106
20107 case RULE_OP_MANGLE_DUPECHAR_LAST:
20108 NEXT_RULEPOS (rule_pos);
20109 NEXT_RPTOI (rule, rule_pos, ulen);
20110 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
20111 break;
20112
20113 case RULE_OP_MANGLE_DUPECHAR_ALL:
20114 out_len = mangle_dupechar (out, out_len);
20115 break;
20116
20117 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20118 NEXT_RULEPOS (rule_pos);
20119 NEXT_RPTOI (rule, rule_pos, ulen);
20120 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20121 break;
20122
20123 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20124 NEXT_RULEPOS (rule_pos);
20125 NEXT_RPTOI (rule, rule_pos, ulen);
20126 out_len = mangle_dupeblock_append (out, out_len, ulen);
20127 break;
20128
20129 case RULE_OP_MANGLE_SWITCH_FIRST:
20130 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20131 break;
20132
20133 case RULE_OP_MANGLE_SWITCH_LAST:
20134 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20135 break;
20136
20137 case RULE_OP_MANGLE_SWITCH_AT:
20138 NEXT_RULEPOS (rule_pos);
20139 NEXT_RPTOI (rule, rule_pos, upos);
20140 NEXT_RULEPOS (rule_pos);
20141 NEXT_RPTOI (rule, rule_pos, upos2);
20142 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20143 break;
20144
20145 case RULE_OP_MANGLE_CHR_SHIFTL:
20146 NEXT_RULEPOS (rule_pos);
20147 NEXT_RPTOI (rule, rule_pos, upos);
20148 mangle_chr_shiftl ((uint8_t *) out, out_len, upos);
20149 break;
20150
20151 case RULE_OP_MANGLE_CHR_SHIFTR:
20152 NEXT_RULEPOS (rule_pos);
20153 NEXT_RPTOI (rule, rule_pos, upos);
20154 mangle_chr_shiftr ((uint8_t *) out, out_len, upos);
20155 break;
20156
20157 case RULE_OP_MANGLE_CHR_INCR:
20158 NEXT_RULEPOS (rule_pos);
20159 NEXT_RPTOI (rule, rule_pos, upos);
20160 mangle_chr_incr ((uint8_t *) out, out_len, upos);
20161 break;
20162
20163 case RULE_OP_MANGLE_CHR_DECR:
20164 NEXT_RULEPOS (rule_pos);
20165 NEXT_RPTOI (rule, rule_pos, upos);
20166 mangle_chr_decr ((uint8_t *) out, out_len, upos);
20167 break;
20168
20169 case RULE_OP_MANGLE_REPLACE_NP1:
20170 NEXT_RULEPOS (rule_pos);
20171 NEXT_RPTOI (rule, rule_pos, upos);
20172 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20173 break;
20174
20175 case RULE_OP_MANGLE_REPLACE_NM1:
20176 NEXT_RULEPOS (rule_pos);
20177 NEXT_RPTOI (rule, rule_pos, upos);
20178 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20179 break;
20180
20181 case RULE_OP_MANGLE_TITLE:
20182 out_len = mangle_title (out, out_len);
20183 break;
20184
20185 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20186 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20187 NEXT_RULEPOS (rule_pos);
20188 NEXT_RPTOI (rule, rule_pos, upos);
20189 NEXT_RULEPOS (rule_pos);
20190 NEXT_RPTOI (rule, rule_pos, ulen);
20191 NEXT_RULEPOS (rule_pos);
20192 NEXT_RPTOI (rule, rule_pos, upos2);
20193 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20194 break;
20195
20196 case RULE_OP_MANGLE_APPEND_MEMORY:
20197 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20198 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20199 memcpy (out + out_len, mem, mem_len);
20200 out_len += mem_len;
20201 break;
20202
20203 case RULE_OP_MANGLE_PREPEND_MEMORY:
20204 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20205 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20206 memcpy (mem + mem_len, out, out_len);
20207 out_len += mem_len;
20208 memcpy (out, mem, out_len);
20209 break;
20210
20211 case RULE_OP_MEMORIZE_WORD:
20212 memcpy (mem, out, out_len);
20213 mem_len = out_len;
20214 break;
20215
20216 case RULE_OP_REJECT_LESS:
20217 NEXT_RULEPOS (rule_pos);
20218 NEXT_RPTOI (rule, rule_pos, upos);
20219 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20220 break;
20221
20222 case RULE_OP_REJECT_GREATER:
20223 NEXT_RULEPOS (rule_pos);
20224 NEXT_RPTOI (rule, rule_pos, upos);
20225 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20226 break;
20227
20228 case RULE_OP_REJECT_CONTAIN:
20229 NEXT_RULEPOS (rule_pos);
20230 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20231 break;
20232
20233 case RULE_OP_REJECT_NOT_CONTAIN:
20234 NEXT_RULEPOS (rule_pos);
20235 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20236 break;
20237
20238 case RULE_OP_REJECT_EQUAL_FIRST:
20239 NEXT_RULEPOS (rule_pos);
20240 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20241 break;
20242
20243 case RULE_OP_REJECT_EQUAL_LAST:
20244 NEXT_RULEPOS (rule_pos);
20245 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20246 break;
20247
20248 case RULE_OP_REJECT_EQUAL_AT:
20249 NEXT_RULEPOS (rule_pos);
20250 NEXT_RPTOI (rule, rule_pos, upos);
20251 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20252 NEXT_RULEPOS (rule_pos);
20253 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20254 break;
20255
20256 case RULE_OP_REJECT_CONTAINS:
20257 NEXT_RULEPOS (rule_pos);
20258 NEXT_RPTOI (rule, rule_pos, upos);
20259 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20260 NEXT_RULEPOS (rule_pos);
20261 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20262 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20263 break;
20264
20265 case RULE_OP_REJECT_MEMORY:
20266 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20267 break;
20268
20269 default:
20270 return (RULE_RC_SYNTAX_ERROR);
20271 break;
20272 }
20273 }
20274
20275 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20276
20277 return (out_len);
20278 }