2ea682fc60315d47ca5ea5759fcbf906de6aa900
[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 case 13000: return ((char *) HT_13000); break;
5615 }
5616
5617 return ((char *) "Unknown");
5618 }
5619
5620 char *strstatus (const uint devices_status)
5621 {
5622 switch (devices_status)
5623 {
5624 case STATUS_INIT: return ((char *) ST_0000); break;
5625 case STATUS_STARTING: return ((char *) ST_0001); break;
5626 case STATUS_RUNNING: return ((char *) ST_0002); break;
5627 case STATUS_PAUSED: return ((char *) ST_0003); break;
5628 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5629 case STATUS_CRACKED: return ((char *) ST_0005); break;
5630 case STATUS_ABORTED: return ((char *) ST_0006); break;
5631 case STATUS_QUIT: return ((char *) ST_0007); break;
5632 case STATUS_BYPASS: return ((char *) ST_0008); break;
5633 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5634 }
5635
5636 return ((char *) "Unknown");
5637 }
5638
5639 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5640 {
5641 uint hash_type = data.hash_type;
5642 uint hash_mode = data.hash_mode;
5643 uint salt_type = data.salt_type;
5644 uint opts_type = data.opts_type;
5645 uint opti_type = data.opti_type;
5646 uint dgst_size = data.dgst_size;
5647
5648 char *hashfile = data.hashfile;
5649
5650 uint len = 4096;
5651
5652 uint digest_buf[64];
5653
5654 uint64_t *digest_buf64 = (uint64_t *) digest_buf;
5655
5656 char *digests_buf_ptr = (char *) data.digests_buf;
5657
5658 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5659
5660 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5661 {
5662 uint tt;
5663
5664 switch (hash_type)
5665 {
5666 case HASH_TYPE_DESCRYPT:
5667 FP (digest_buf[1], digest_buf[0], tt);
5668 break;
5669
5670 case HASH_TYPE_DESRACF:
5671 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 29);
5672 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 29);
5673
5674 FP (digest_buf[1], digest_buf[0], tt);
5675 break;
5676
5677 case HASH_TYPE_LM:
5678 FP (digest_buf[1], digest_buf[0], tt);
5679 break;
5680
5681 case HASH_TYPE_NETNTLM:
5682 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 29);
5683 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 29);
5684 digest_buf[2] = ROTATE_LEFT (digest_buf[2], 29);
5685 digest_buf[3] = ROTATE_LEFT (digest_buf[3], 29);
5686
5687 FP (digest_buf[1], digest_buf[0], tt);
5688 FP (digest_buf[3], digest_buf[2], tt);
5689 break;
5690
5691 case HASH_TYPE_BSDICRYPT:
5692 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 31);
5693 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 31);
5694
5695 FP (digest_buf[1], digest_buf[0], tt);
5696 break;
5697 }
5698 }
5699
5700 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5701 {
5702 switch (hash_type)
5703 {
5704 case HASH_TYPE_MD4:
5705 digest_buf[0] += MD4M_A;
5706 digest_buf[1] += MD4M_B;
5707 digest_buf[2] += MD4M_C;
5708 digest_buf[3] += MD4M_D;
5709 break;
5710
5711 case HASH_TYPE_MD5:
5712 digest_buf[0] += MD5M_A;
5713 digest_buf[1] += MD5M_B;
5714 digest_buf[2] += MD5M_C;
5715 digest_buf[3] += MD5M_D;
5716 break;
5717
5718 case HASH_TYPE_SHA1:
5719 digest_buf[0] += SHA1M_A;
5720 digest_buf[1] += SHA1M_B;
5721 digest_buf[2] += SHA1M_C;
5722 digest_buf[3] += SHA1M_D;
5723 digest_buf[4] += SHA1M_E;
5724 break;
5725
5726 case HASH_TYPE_SHA256:
5727 digest_buf[0] += SHA256M_A;
5728 digest_buf[1] += SHA256M_B;
5729 digest_buf[2] += SHA256M_C;
5730 digest_buf[3] += SHA256M_D;
5731 digest_buf[4] += SHA256M_E;
5732 digest_buf[5] += SHA256M_F;
5733 digest_buf[6] += SHA256M_G;
5734 digest_buf[7] += SHA256M_H;
5735 break;
5736
5737 case HASH_TYPE_SHA384:
5738 digest_buf64[0] += SHA384M_A;
5739 digest_buf64[1] += SHA384M_B;
5740 digest_buf64[2] += SHA384M_C;
5741 digest_buf64[3] += SHA384M_D;
5742 digest_buf64[4] += SHA384M_E;
5743 digest_buf64[5] += SHA384M_F;
5744 digest_buf64[6] += 0;
5745 digest_buf64[7] += 0;
5746 break;
5747
5748 case HASH_TYPE_SHA512:
5749 digest_buf64[0] += SHA512M_A;
5750 digest_buf64[1] += SHA512M_B;
5751 digest_buf64[2] += SHA512M_C;
5752 digest_buf64[3] += SHA512M_D;
5753 digest_buf64[4] += SHA512M_E;
5754 digest_buf64[5] += SHA512M_F;
5755 digest_buf64[6] += SHA512M_G;
5756 digest_buf64[7] += SHA512M_H;
5757 break;
5758 }
5759 }
5760
5761 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
5762 {
5763 if (dgst_size == DGST_SIZE_4_2)
5764 {
5765 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5766 }
5767 else if (dgst_size == DGST_SIZE_4_4)
5768 {
5769 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5770 }
5771 else if (dgst_size == DGST_SIZE_4_5)
5772 {
5773 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5774 }
5775 else if (dgst_size == DGST_SIZE_4_6)
5776 {
5777 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5778 }
5779 else if (dgst_size == DGST_SIZE_4_8)
5780 {
5781 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5782 }
5783 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
5784 {
5785 if (hash_type == HASH_TYPE_WHIRLPOOL)
5786 {
5787 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5788 }
5789 else if (hash_type == HASH_TYPE_SHA384)
5790 {
5791 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5792 }
5793 else if (hash_type == HASH_TYPE_SHA512)
5794 {
5795 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5796 }
5797 else if (hash_type == HASH_TYPE_GOST)
5798 {
5799 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5800 }
5801 }
5802 else if (dgst_size == DGST_SIZE_4_64)
5803 {
5804 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5805 }
5806 else if (dgst_size == DGST_SIZE_8_25)
5807 {
5808 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5809 }
5810 }
5811
5812 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
5813 | (data.salt_type == SALT_TYPE_EXTERN)
5814 | (data.salt_type == SALT_TYPE_EMBEDDED));
5815
5816 salt_t salt;
5817
5818 if (isSalted)
5819 {
5820 memset (&salt, 0, sizeof (salt_t));
5821
5822 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
5823
5824 char *ptr = (char *) salt.salt_buf;
5825
5826 uint len = salt.salt_len;
5827
5828 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5829 {
5830 uint tt;
5831
5832 switch (hash_type)
5833 {
5834 case HASH_TYPE_NETNTLM:
5835
5836 salt.salt_buf[0] = ROTATE_RIGHT (salt.salt_buf[0], 3);
5837 salt.salt_buf[1] = ROTATE_RIGHT (salt.salt_buf[1], 3);
5838
5839 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
5840
5841 break;
5842 }
5843 }
5844
5845 if (opts_type & OPTS_TYPE_ST_UNICODE)
5846 {
5847 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5848 {
5849 ptr[i] = ptr[j];
5850 }
5851
5852 len = len / 2;
5853 }
5854
5855 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
5856 {
5857 uint max = salt.salt_len / 4;
5858
5859 if (len % 4) max++;
5860
5861 for (uint i = 0; i < max; i++)
5862 {
5863 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
5864 }
5865 }
5866
5867 if (opts_type & OPTS_TYPE_ST_HEX)
5868 {
5869 char tmp[64];
5870
5871 memset (tmp, 0, sizeof (tmp));
5872
5873 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5874 {
5875 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
5876 }
5877
5878 len = len * 2;
5879
5880 memcpy (ptr, tmp, len);
5881 }
5882
5883 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
5884
5885 memset (ptr + len, 0, memset_size);
5886
5887 salt.salt_len = len;
5888 }
5889
5890 //
5891 // some modes require special encoding
5892 //
5893
5894 uint out_buf_plain[256];
5895 uint out_buf_salt[256];
5896
5897 char tmp_buf[1024];
5898
5899 memset (out_buf_plain, 0, sizeof (out_buf_plain));
5900 memset (out_buf_salt, 0, sizeof (out_buf_salt));
5901
5902 memset (tmp_buf, 0, sizeof (tmp_buf));
5903
5904 char *ptr_plain = (char *) out_buf_plain;
5905 char *ptr_salt = (char *) out_buf_salt;
5906
5907 if (hash_mode == 22)
5908 {
5909 char username[30];
5910
5911 memset (username, 0, sizeof (username));
5912
5913 memcpy (username, salt.salt_buf, salt.salt_len - 22);
5914
5915 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
5916
5917 uint16_t *ptr = (uint16_t *) digest_buf;
5918
5919 tmp_buf[ 0] = sig[0];
5920 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
5921 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
5922 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
5923 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
5924 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
5925 tmp_buf[ 6] = sig[1];
5926 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
5927 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
5928 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
5929 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
5930 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
5931 tmp_buf[12] = sig[2];
5932 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
5933 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
5934 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
5935 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
5936 tmp_buf[17] = sig[3];
5937 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
5938 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
5939 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
5940 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
5941 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
5942 tmp_buf[23] = sig[4];
5943 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
5944 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
5945 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
5946 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
5947 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
5948 tmp_buf[29] = sig[5];
5949
5950 snprintf (out_buf, len-1, "%s:%s",
5951 tmp_buf,
5952 username);
5953 }
5954 else if (hash_mode == 23)
5955 {
5956 // do not show the \nskyper\n part in output
5957
5958 char *salt_buf_ptr = (char *) salt.salt_buf;
5959
5960 salt_buf_ptr[salt.salt_len - 8] = 0;
5961
5962 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
5963 digest_buf[0],
5964 digest_buf[1],
5965 digest_buf[2],
5966 digest_buf[3],
5967 salt_buf_ptr);
5968 }
5969 else if (hash_mode == 101)
5970 {
5971 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
5972
5973 digest_buf[0] = byte_swap_32 (digest_buf[0]);
5974 digest_buf[1] = byte_swap_32 (digest_buf[1]);
5975 digest_buf[2] = byte_swap_32 (digest_buf[2]);
5976 digest_buf[3] = byte_swap_32 (digest_buf[3]);
5977 digest_buf[4] = byte_swap_32 (digest_buf[4]);
5978
5979 memcpy (tmp_buf, digest_buf, 20);
5980
5981 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
5982
5983 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
5984 }
5985 else if (hash_mode == 111)
5986 {
5987 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
5988
5989 digest_buf[0] = byte_swap_32 (digest_buf[0]);
5990 digest_buf[1] = byte_swap_32 (digest_buf[1]);
5991 digest_buf[2] = byte_swap_32 (digest_buf[2]);
5992 digest_buf[3] = byte_swap_32 (digest_buf[3]);
5993 digest_buf[4] = byte_swap_32 (digest_buf[4]);
5994
5995 memcpy (tmp_buf, digest_buf, 20);
5996 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
5997
5998 base64_encode (int_to_base64, tmp_buf, 20 + salt.salt_len, ptr_plain);
5999
6000 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6001 }
6002 else if (hash_mode == 122)
6003 {
6004 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6005 (unsigned char *) salt.salt_buf,
6006 digest_buf[0],
6007 digest_buf[1],
6008 digest_buf[2],
6009 digest_buf[3],
6010 digest_buf[4]);
6011 }
6012 else if (hash_mode == 124)
6013 {
6014 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6015 (unsigned char *) salt.salt_buf,
6016 digest_buf[0],
6017 digest_buf[1],
6018 digest_buf[2],
6019 digest_buf[3],
6020 digest_buf[4]);
6021 }
6022 else if (hash_mode == 131)
6023 {
6024 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6025 (unsigned char *) salt.salt_buf,
6026 0, 0, 0, 0, 0,
6027 digest_buf[0],
6028 digest_buf[1],
6029 digest_buf[2],
6030 digest_buf[3],
6031 digest_buf[4]);
6032 }
6033 else if (hash_mode == 132)
6034 {
6035 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6036 (unsigned char *) salt.salt_buf,
6037 digest_buf[0],
6038 digest_buf[1],
6039 digest_buf[2],
6040 digest_buf[3],
6041 digest_buf[4]);
6042 }
6043 else if (hash_mode == 133)
6044 {
6045 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6046
6047 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6048 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6049 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6050 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6051 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6052
6053 memcpy (tmp_buf, digest_buf, 20);
6054
6055 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
6056
6057 snprintf (out_buf, len-1, "%s", ptr_plain);
6058 }
6059 else if (hash_mode == 141)
6060 {
6061 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6062
6063 base64_encode (int_to_base64, tmp_buf, salt.salt_len, ptr_salt);
6064
6065 memset (tmp_buf, 0, sizeof (tmp_buf));
6066
6067 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6068
6069 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6070 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6071 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6072 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6073 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6074
6075 memcpy (tmp_buf, digest_buf, 20);
6076
6077 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
6078
6079 ptr_plain[27] = 0;
6080
6081 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6082 }
6083 else if (hash_mode == 400)
6084 {
6085 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6086
6087 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6088 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6089 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6090 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6091
6092 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6093
6094 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6095 }
6096 else if (hash_mode == 500)
6097 {
6098 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6099
6100 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6101 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6102 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6103 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6104
6105 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6106
6107 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6108 {
6109 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6110 }
6111 else
6112 {
6113 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6114 }
6115 }
6116 else if (hash_mode == 501)
6117 {
6118 uint digest_idx = salt.digests_offset + digest_pos;
6119
6120 hashinfo_t **hashinfo_ptr = data.hash_info;
6121 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6122
6123 snprintf (out_buf, len-1, "%s", hash_buf);
6124 }
6125 else if (hash_mode == 1421)
6126 {
6127 uint8_t *salt_ptr = (uint8_t *) salt.salt_buf;
6128
6129 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6130 salt_ptr[0],
6131 salt_ptr[1],
6132 salt_ptr[2],
6133 salt_ptr[3],
6134 salt_ptr[4],
6135 salt_ptr[5],
6136 digest_buf[0],
6137 digest_buf[1],
6138 digest_buf[2],
6139 digest_buf[3],
6140 digest_buf[4],
6141 digest_buf[5],
6142 digest_buf[6],
6143 digest_buf[7]);
6144 }
6145 else if (hash_mode == 1441)
6146 {
6147 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6148
6149 base64_encode (int_to_base64, tmp_buf, salt.salt_len, ptr_salt);
6150
6151 memset (tmp_buf, 0, sizeof (tmp_buf));
6152
6153 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6154
6155 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6156 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6157 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6158 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6159 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6160 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6161 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6162 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6163
6164 memcpy (tmp_buf, digest_buf, 32);
6165
6166 base64_encode (int_to_base64, tmp_buf, 32, ptr_plain);
6167
6168 ptr_plain[43] = 0;
6169
6170 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6171 }
6172 else if (hash_mode == 1500)
6173 {
6174 out_buf[0] = salt.salt_sign[0] & 0xff;
6175 out_buf[1] = salt.salt_sign[1] & 0xff;
6176 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6177 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6178 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6179
6180 memset (tmp_buf, 0, sizeof (tmp_buf));
6181
6182 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6183
6184 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6185 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6186
6187 memcpy (tmp_buf, digest_buf, 8);
6188
6189 base64_encode (int_to_itoa64, tmp_buf, 8, ptr_plain);
6190
6191 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6192
6193 out_buf[13] = 0;
6194 }
6195 else if (hash_mode == 1600)
6196 {
6197 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6198
6199 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6200 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6201 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6202 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6203
6204 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6205
6206 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6207 {
6208 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6209 }
6210 else
6211 {
6212 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6213 }
6214 }
6215 else if (hash_mode == 1711)
6216 {
6217 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6218
6219 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6220 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6221 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6222 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6223 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6224 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6225 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6226 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6227
6228 memcpy (tmp_buf, digest_buf, 64);
6229 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6230
6231 base64_encode (int_to_base64, tmp_buf, 64 + salt.salt_len, ptr_plain);
6232
6233 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6234 }
6235 else if (hash_mode == 1722)
6236 {
6237 uint *ptr = digest_buf;
6238
6239 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6240 (unsigned char *) salt.salt_buf,
6241 ptr[ 1], ptr[ 0],
6242 ptr[ 3], ptr[ 2],
6243 ptr[ 5], ptr[ 4],
6244 ptr[ 7], ptr[ 6],
6245 ptr[ 9], ptr[ 8],
6246 ptr[11], ptr[10],
6247 ptr[13], ptr[12],
6248 ptr[15], ptr[14]);
6249 }
6250 else if (hash_mode == 1731)
6251 {
6252 uint *ptr = digest_buf;
6253
6254 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6255 (unsigned char *) salt.salt_buf,
6256 ptr[ 1], ptr[ 0],
6257 ptr[ 3], ptr[ 2],
6258 ptr[ 5], ptr[ 4],
6259 ptr[ 7], ptr[ 6],
6260 ptr[ 9], ptr[ 8],
6261 ptr[11], ptr[10],
6262 ptr[13], ptr[12],
6263 ptr[15], ptr[14]);
6264 }
6265 else if (hash_mode == 1800)
6266 {
6267 // temp workaround
6268
6269 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6270 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6271 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6272 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6273 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6274 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6275 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6276 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6277
6278 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6279
6280 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6281 {
6282 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6283 }
6284 else
6285 {
6286 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6287 }
6288 }
6289 else if (hash_mode == 2100)
6290 {
6291 uint pos = 0;
6292
6293 snprintf (out_buf + pos, len-1, "%s%i#",
6294 SIGNATURE_DCC2,
6295 salt.salt_iter + 1);
6296
6297 uint signature_len = strlen (out_buf);
6298
6299 pos += signature_len;
6300 len -= signature_len;
6301
6302 char *salt_ptr = (char *) salt.salt_buf;
6303
6304 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6305
6306 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6307 byte_swap_32 (digest_buf[0]),
6308 byte_swap_32 (digest_buf[1]),
6309 byte_swap_32 (digest_buf[2]),
6310 byte_swap_32 (digest_buf[3]));
6311 }
6312 else if ((hash_mode == 2400) || (hash_mode == 2410))
6313 {
6314 memcpy (tmp_buf, digest_buf, 16);
6315
6316 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6317
6318 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6319 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6320 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6321 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6322
6323 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6324 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6325 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6326 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6327
6328 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6329 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6330 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6331 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6332
6333 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6334 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6335 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6336 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6337
6338 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6339 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6340 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6341 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6342
6343 out_buf[16] = 0;
6344 }
6345 else if (hash_mode == 2500)
6346 {
6347 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6348
6349 wpa_t *wpa = &wpas[salt_pos];
6350
6351 uint pke[25];
6352
6353 char *pke_ptr = (char *) pke;
6354
6355 for (uint i = 0; i < 25; i++)
6356 {
6357 pke[i] = byte_swap_32 (wpa->pke[i]);
6358 }
6359
6360 unsigned char mac1[6];
6361 unsigned char mac2[6];
6362
6363 memcpy (mac1, pke_ptr + 23, 6);
6364 memcpy (mac2, pke_ptr + 29, 6);
6365
6366 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6367 (char *) salt.salt_buf,
6368 mac1[0],
6369 mac1[1],
6370 mac1[2],
6371 mac1[3],
6372 mac1[4],
6373 mac1[5],
6374 mac2[0],
6375 mac2[1],
6376 mac2[2],
6377 mac2[3],
6378 mac2[4],
6379 mac2[5]);
6380 }
6381 else if (hash_mode == 4400)
6382 {
6383 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6384 byte_swap_32 (digest_buf[0]),
6385 byte_swap_32 (digest_buf[1]),
6386 byte_swap_32 (digest_buf[2]),
6387 byte_swap_32 (digest_buf[3]));
6388 }
6389 else if (hash_mode == 4700)
6390 {
6391 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6392 byte_swap_32 (digest_buf[0]),
6393 byte_swap_32 (digest_buf[1]),
6394 byte_swap_32 (digest_buf[2]),
6395 byte_swap_32 (digest_buf[3]),
6396 byte_swap_32 (digest_buf[4]));
6397 }
6398 else if (hash_mode == 4800)
6399 {
6400 uint8_t chap_id_byte = (uint8_t) salt.salt_buf[4];
6401
6402 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6403 digest_buf[0],
6404 digest_buf[1],
6405 digest_buf[2],
6406 digest_buf[3],
6407 byte_swap_32 (salt.salt_buf[0]),
6408 byte_swap_32 (salt.salt_buf[1]),
6409 byte_swap_32 (salt.salt_buf[2]),
6410 byte_swap_32 (salt.salt_buf[3]),
6411 chap_id_byte);
6412 }
6413 else if (hash_mode == 4900)
6414 {
6415 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6416 byte_swap_32 (digest_buf[0]),
6417 byte_swap_32 (digest_buf[1]),
6418 byte_swap_32 (digest_buf[2]),
6419 byte_swap_32 (digest_buf[3]),
6420 byte_swap_32 (digest_buf[4]));
6421 }
6422 else if (hash_mode == 5100)
6423 {
6424 snprintf (out_buf, len-1, "%08x%08x",
6425 digest_buf[0],
6426 digest_buf[1]);
6427 }
6428 else if (hash_mode == 5200)
6429 {
6430 snprintf (out_buf, len-1, "%s", hashfile);
6431 }
6432 else if (hash_mode == 5300)
6433 {
6434 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6435
6436 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6437
6438 int buf_len = len -1;
6439
6440 // msg_buf
6441
6442 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6443
6444 for (uint i = 0; i < ikepsk_msg_len; i++)
6445 {
6446 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6447 {
6448 snprintf (out_buf, buf_len, ":");
6449
6450 buf_len--;
6451 out_buf++;
6452 }
6453
6454 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6455
6456 buf_len -= 8;
6457 out_buf += 8;
6458 }
6459
6460 // nr_buf
6461
6462 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6463
6464 for (uint i = 0; i < ikepsk_nr_len; i++)
6465 {
6466 if ((i == 0) || (i == 5))
6467 {
6468 snprintf (out_buf, buf_len, ":");
6469
6470 buf_len--;
6471 out_buf++;
6472 }
6473
6474 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6475
6476 buf_len -= 8;
6477 out_buf += 8;
6478 }
6479
6480 // digest_buf
6481
6482 for (uint i = 0; i < 4; i++)
6483 {
6484 if (i == 0)
6485 {
6486 snprintf (out_buf, buf_len, ":");
6487
6488 buf_len--;
6489 out_buf++;
6490 }
6491
6492 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6493
6494 buf_len -= 8;
6495 out_buf += 8;
6496 }
6497 }
6498 else if (hash_mode == 5400)
6499 {
6500 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6501
6502 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6503
6504 int buf_len = len -1;
6505
6506 // msg_buf
6507
6508 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6509
6510 for (uint i = 0; i < ikepsk_msg_len; i++)
6511 {
6512 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6513 {
6514 snprintf (out_buf, buf_len, ":");
6515
6516 buf_len--;
6517 out_buf++;
6518 }
6519
6520 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6521
6522 buf_len -= 8;
6523 out_buf += 8;
6524 }
6525
6526 // nr_buf
6527
6528 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6529
6530 for (uint i = 0; i < ikepsk_nr_len; i++)
6531 {
6532 if ((i == 0) || (i == 5))
6533 {
6534 snprintf (out_buf, buf_len, ":");
6535
6536 buf_len--;
6537 out_buf++;
6538 }
6539
6540 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6541
6542 buf_len -= 8;
6543 out_buf += 8;
6544 }
6545
6546 // digest_buf
6547
6548 for (uint i = 0; i < 5; i++)
6549 {
6550 if (i == 0)
6551 {
6552 snprintf (out_buf, buf_len, ":");
6553
6554 buf_len--;
6555 out_buf++;
6556 }
6557
6558 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6559
6560 buf_len -= 8;
6561 out_buf += 8;
6562 }
6563 }
6564 else if (hash_mode == 5500)
6565 {
6566 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6567
6568 netntlm_t *netntlm = &netntlms[salt_pos];
6569
6570 char user_buf[64];
6571 char domain_buf[64];
6572 char srvchall_buf[1024];
6573 char clichall_buf[1024];
6574
6575 memset (user_buf, 0, sizeof (user_buf));
6576 memset (domain_buf, 0, sizeof (domain_buf));
6577 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6578 memset (clichall_buf, 0, sizeof (clichall_buf));
6579
6580 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6581 {
6582 char *ptr = (char *) netntlm->userdomain_buf;
6583
6584 user_buf[i] = ptr[j];
6585 }
6586
6587 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6588 {
6589 char *ptr = (char *) netntlm->userdomain_buf;
6590
6591 domain_buf[i] = ptr[netntlm->user_len + j];
6592 }
6593
6594 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6595 {
6596 char *ptr = (char *) netntlm->chall_buf;
6597
6598 sprintf (srvchall_buf + j, "%02x", (uint8_t) ptr[i]);
6599 }
6600
6601 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6602 {
6603 char *ptr = (char *) netntlm->chall_buf;
6604
6605 sprintf (clichall_buf + j, "%02x", (uint8_t) ptr[netntlm->srvchall_len + i]);
6606 }
6607
6608 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6609 user_buf,
6610 domain_buf,
6611 srvchall_buf,
6612 digest_buf[0],
6613 digest_buf[1],
6614 digest_buf[2],
6615 digest_buf[3],
6616 byte_swap_32 (salt.salt_buf_pc[0]),
6617 byte_swap_32 (salt.salt_buf_pc[1]),
6618 clichall_buf);
6619 }
6620 else if (hash_mode == 5600)
6621 {
6622 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6623
6624 netntlm_t *netntlm = &netntlms[salt_pos];
6625
6626 char user_buf[64];
6627 char domain_buf[64];
6628 char srvchall_buf[1024];
6629 char clichall_buf[1024];
6630
6631 memset (user_buf, 0, sizeof (user_buf));
6632 memset (domain_buf, 0, sizeof (domain_buf));
6633 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6634 memset (clichall_buf, 0, sizeof (clichall_buf));
6635
6636 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6637 {
6638 char *ptr = (char *) netntlm->userdomain_buf;
6639
6640 user_buf[i] = ptr[j];
6641 }
6642
6643 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6644 {
6645 char *ptr = (char *) netntlm->userdomain_buf;
6646
6647 domain_buf[i] = ptr[netntlm->user_len + j];
6648 }
6649
6650 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6651 {
6652 char *ptr = (char *) netntlm->chall_buf;
6653
6654 sprintf (srvchall_buf + j, "%02x", (uint8_t) ptr[i]);
6655 }
6656
6657 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6658 {
6659 char *ptr = (char *) netntlm->chall_buf;
6660
6661 sprintf (clichall_buf + j, "%02x", (uint8_t) ptr[netntlm->srvchall_len + i]);
6662 }
6663
6664 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6665 user_buf,
6666 domain_buf,
6667 srvchall_buf,
6668 digest_buf[0],
6669 digest_buf[1],
6670 digest_buf[2],
6671 digest_buf[3],
6672 clichall_buf);
6673 }
6674 else if (hash_mode == 5700)
6675 {
6676 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6677
6678 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6679 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6680 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6681 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6682 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6683 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6684 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6685 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6686
6687 memcpy (tmp_buf, digest_buf, 32);
6688
6689 base64_encode (int_to_itoa64, tmp_buf, 32, ptr_plain);
6690
6691 ptr_plain[43] = 0;
6692
6693 snprintf (out_buf, len-1, "%s", ptr_plain);
6694 }
6695 else if (hash_mode == 5800)
6696 {
6697 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6698 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6699 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6700 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6701 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6702
6703 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6704 digest_buf[0],
6705 digest_buf[1],
6706 digest_buf[2],
6707 digest_buf[3],
6708 digest_buf[4]);
6709 }
6710 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6711 {
6712 snprintf (out_buf, len-1, "%s", hashfile);
6713 }
6714 else if (hash_mode == 6300)
6715 {
6716 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6717
6718 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6719 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6720 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6721 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6722
6723 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6724
6725 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6726 }
6727 else if (hash_mode == 6400)
6728 {
6729 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6730
6731 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6732 }
6733 else if (hash_mode == 6500)
6734 {
6735 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6736
6737 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6738 }
6739 else if (hash_mode == 6600)
6740 {
6741 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6742
6743 agilekey_t *agilekey = &agilekeys[salt_pos];
6744
6745 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6746 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6747
6748 uint buf_len = len - 1;
6749
6750 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6751 buf_len -= 22;
6752
6753 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6754 {
6755 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6756
6757 buf_len -= 2;
6758 }
6759 }
6760 else if (hash_mode == 6700)
6761 {
6762 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6763
6764 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6765 }
6766 else if (hash_mode == 6800)
6767 {
6768 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6769 }
6770 else if (hash_mode == 7100)
6771 {
6772 uint *ptr = digest_buf;
6773
6774 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6775
6776 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6777
6778 uint esalt[16];
6779
6780 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6781 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6782 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6783 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6784 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6785 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6786 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6787 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6788
6789 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",
6790 SIGNATURE_SHA512OSX,
6791 salt.salt_iter + 1,
6792 esalt[ 0], esalt[ 1],
6793 esalt[ 2], esalt[ 3],
6794 esalt[ 4], esalt[ 5],
6795 esalt[ 6], esalt[ 7],
6796 ptr [ 1], ptr [ 0],
6797 ptr [ 3], ptr [ 2],
6798 ptr [ 5], ptr [ 4],
6799 ptr [ 7], ptr [ 6],
6800 ptr [ 9], ptr [ 8],
6801 ptr [11], ptr [10],
6802 ptr [13], ptr [12],
6803 ptr [15], ptr [14]);
6804 }
6805 else if (hash_mode == 7200)
6806 {
6807 uint *ptr = digest_buf;
6808
6809 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6810
6811 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6812
6813 uint len_used = 0;
6814
6815 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
6816
6817 len_used = strlen (out_buf);
6818
6819 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
6820
6821 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
6822 {
6823 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
6824 }
6825
6826 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",
6827 ptr [ 1], ptr [ 0],
6828 ptr [ 3], ptr [ 2],
6829 ptr [ 5], ptr [ 4],
6830 ptr [ 7], ptr [ 6],
6831 ptr [ 9], ptr [ 8],
6832 ptr [11], ptr [10],
6833 ptr [13], ptr [12],
6834 ptr [15], ptr [14]);
6835 }
6836 else if (hash_mode == 7300)
6837 {
6838 rakp_t *rakps = (rakp_t *) data.esalts_buf;
6839
6840 rakp_t *rakp = &rakps[salt_pos];
6841
6842 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
6843 {
6844 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
6845 }
6846
6847 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
6848 digest_buf[0],
6849 digest_buf[1],
6850 digest_buf[2],
6851 digest_buf[3],
6852 digest_buf[4]);
6853 }
6854 else if (hash_mode == 7400)
6855 {
6856 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6857
6858 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6859 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6860 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6861 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6862 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6863 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6864 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6865 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6866
6867 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6868
6869 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
6870 {
6871 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6872 }
6873 else
6874 {
6875 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6876 }
6877 }
6878 else if (hash_mode == 7500)
6879 {
6880 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
6881
6882 krb5pa_t *krb5pa = &krb5pas[salt_pos];
6883
6884 uint8_t *ptr_timestamp = (uint8_t *) krb5pa->timestamp;
6885 uint8_t *ptr_checksum = (uint8_t *) krb5pa->checksum;
6886
6887 char data[128];
6888
6889 char *ptr_data = data;
6890
6891 for (uint i = 0; i < 36; i++, ptr_data += 2)
6892 {
6893 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
6894 }
6895
6896 for (uint i = 0; i < 16; i++, ptr_data += 2)
6897 {
6898 sprintf (ptr_data, "%02x", ptr_checksum[i]);
6899 }
6900
6901 *ptr_data = 0;
6902
6903 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
6904 SIGNATURE_KRB5PA,
6905 (char *) krb5pa->user,
6906 (char *) krb5pa->realm,
6907 (char *) krb5pa->salt,
6908 data);
6909 }
6910 else if (hash_mode == 7700)
6911 {
6912 snprintf (out_buf, len-1, "%s$%08X%08X",
6913 (char *) salt.salt_buf,
6914 digest_buf[0],
6915 digest_buf[1]);
6916 }
6917 else if (hash_mode == 7800)
6918 {
6919 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
6920 (char *) salt.salt_buf,
6921 digest_buf[0],
6922 digest_buf[1],
6923 digest_buf[2],
6924 digest_buf[3],
6925 digest_buf[4]);
6926 }
6927 else if (hash_mode == 7900)
6928 {
6929 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6930
6931 // ugly hack start
6932
6933 char *tmp = (char *) salt.salt_buf_pc;
6934
6935 ptr_plain[42] = tmp[0];
6936
6937 // ugly hack end
6938
6939 ptr_plain[43] = 0;
6940
6941 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6942 }
6943 else if (hash_mode == 8000)
6944 {
6945 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
6946 (unsigned char *) salt.salt_buf,
6947 digest_buf[0],
6948 digest_buf[1],
6949 digest_buf[2],
6950 digest_buf[3],
6951 digest_buf[4],
6952 digest_buf[5],
6953 digest_buf[6],
6954 digest_buf[7]);
6955 }
6956 else if (hash_mode == 8100)
6957 {
6958 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6959 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6960
6961 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
6962 (unsigned char *) salt.salt_buf,
6963 digest_buf[0],
6964 digest_buf[1],
6965 digest_buf[2],
6966 digest_buf[3],
6967 digest_buf[4]);
6968 }
6969 else if (hash_mode == 8200)
6970 {
6971 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
6972
6973 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
6974
6975 char data_buf[4096];
6976
6977 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
6978 {
6979 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
6980 }
6981
6982 data_buf[cloudkey->data_len * 2] = 0;
6983
6984 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6985 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6986 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6987 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6988 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6989 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6990 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6991 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6992
6993 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6994 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6995 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
6996 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
6997
6998 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
6999 digest_buf[0],
7000 digest_buf[1],
7001 digest_buf[2],
7002 digest_buf[3],
7003 digest_buf[4],
7004 digest_buf[5],
7005 digest_buf[6],
7006 digest_buf[7],
7007 salt.salt_buf[0],
7008 salt.salt_buf[1],
7009 salt.salt_buf[2],
7010 salt.salt_buf[3],
7011 salt.salt_iter + 1,
7012 data_buf);
7013 }
7014 else if (hash_mode == 8300)
7015 {
7016 // todo
7017
7018 char digest_buf_c[33];
7019
7020 base32_encode (int_to_itoa32, (char *) digest_buf, 32, digest_buf_c);
7021
7022 digest_buf_c[32] = 0;
7023
7024 // domain
7025
7026 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7027
7028 char domain_buf_c[33];
7029
7030 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7031
7032 for (uint i = 0; i < salt_pc_len; i++)
7033 {
7034 const char next = domain_buf_c[i];
7035
7036 domain_buf_c[i] = '.';
7037
7038 i += next;
7039 }
7040
7041 domain_buf_c[salt_pc_len] = 0;
7042
7043 // final
7044
7045 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7046 }
7047 else if (hash_mode == 8500)
7048 {
7049 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7050 }
7051 else if (hash_mode == 2612)
7052 {
7053 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7054 SIGNATURE_PHPS,
7055 (char *) salt.salt_buf,
7056 digest_buf[0],
7057 digest_buf[1],
7058 digest_buf[2],
7059 digest_buf[3]);
7060 }
7061 else if (hash_mode == 3711)
7062 {
7063 char *salt_ptr = (char *) salt.salt_buf;
7064
7065 salt_ptr[salt.salt_len - 1] = 0;
7066
7067 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7068 SIGNATURE_MEDIAWIKI_B,
7069 salt_ptr,
7070 digest_buf[0],
7071 digest_buf[1],
7072 digest_buf[2],
7073 digest_buf[3]);
7074 }
7075 else if (hash_mode == 8800)
7076 {
7077 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7078
7079 androidfde_t *androidfde = &androidfdes[salt_pos];
7080
7081 char tmp[3073];
7082
7083 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7084 {
7085 sprintf (tmp + j, "%08x", androidfde->data[i]);
7086 }
7087
7088 tmp[3072] = 0;
7089
7090 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7091 SIGNATURE_ANDROIDFDE,
7092 byte_swap_32 (salt.salt_buf[0]),
7093 byte_swap_32 (salt.salt_buf[1]),
7094 byte_swap_32 (salt.salt_buf[2]),
7095 byte_swap_32 (salt.salt_buf[3]),
7096 byte_swap_32 (digest_buf[0]),
7097 byte_swap_32 (digest_buf[1]),
7098 byte_swap_32 (digest_buf[2]),
7099 byte_swap_32 (digest_buf[3]),
7100 tmp);
7101 }
7102 else if (hash_mode == 8900)
7103 {
7104 uint N = salt.scrypt_N;
7105 uint r = salt.scrypt_r;
7106 uint p = salt.scrypt_p;
7107
7108 char base64_salt[32];
7109
7110 memset (base64_salt, 0, 32);
7111
7112 base64_encode (int_to_base64, (char *) salt.salt_buf, salt.salt_len, base64_salt + 0);
7113
7114 memset (tmp_buf, 0, 46);
7115
7116 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7117 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7118 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7119 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7120 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7121 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7122 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7123 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7124 digest_buf[8] = 0; // needed for base64_encode ()
7125
7126 base64_encode (int_to_base64, (char *) digest_buf, 32, tmp_buf + 0);
7127
7128 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7129 SIGNATURE_SCRYPT,
7130 N,
7131 r,
7132 p,
7133 base64_salt,
7134 tmp_buf);
7135 }
7136 else if (hash_mode == 9000)
7137 {
7138 snprintf (out_buf, len-1, "%s", hashfile);
7139 }
7140 else if (hash_mode == 9200)
7141 {
7142 // salt
7143
7144 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7145
7146 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7147
7148 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7149
7150 // hash
7151
7152 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7153 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7154 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7155 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7156 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7157 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7158 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7159 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7160 digest_buf[8] = 0; // needed for base64_encode ()
7161
7162 char tmp_buf[64];
7163 memset (tmp_buf, 0, sizeof (tmp_buf));
7164
7165 base64_encode (int_to_itoa64, (char *) digest_buf, 32, tmp_buf);
7166 tmp_buf[43] = 0; // cut it here
7167
7168 // output
7169
7170 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7171 }
7172 else if (hash_mode == 9300)
7173 {
7174 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7175 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7176 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7177 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7178 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7179 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7180 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7181 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7182 digest_buf[8] = 0; // needed for base64_encode ()
7183
7184 char tmp_buf[64];
7185 memset (tmp_buf, 0, sizeof (tmp_buf));
7186
7187 base64_encode (int_to_itoa64, (char *) digest_buf, 32, tmp_buf);
7188 tmp_buf[43] = 0; // cut it here
7189
7190 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7191
7192 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7193 }
7194 else if (hash_mode == 9400)
7195 {
7196 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7197
7198 office2007_t *office2007 = &office2007s[salt_pos];
7199
7200 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7201 SIGNATURE_OFFICE2007,
7202 2007,
7203 20,
7204 office2007->keySize,
7205 16,
7206 salt.salt_buf[0],
7207 salt.salt_buf[1],
7208 salt.salt_buf[2],
7209 salt.salt_buf[3],
7210 office2007->encryptedVerifier[0],
7211 office2007->encryptedVerifier[1],
7212 office2007->encryptedVerifier[2],
7213 office2007->encryptedVerifier[3],
7214 office2007->encryptedVerifierHash[0],
7215 office2007->encryptedVerifierHash[1],
7216 office2007->encryptedVerifierHash[2],
7217 office2007->encryptedVerifierHash[3],
7218 office2007->encryptedVerifierHash[4]);
7219 }
7220 else if (hash_mode == 9500)
7221 {
7222 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7223
7224 office2010_t *office2010 = &office2010s[salt_pos];
7225
7226 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,
7227
7228 salt.salt_buf[0],
7229 salt.salt_buf[1],
7230 salt.salt_buf[2],
7231 salt.salt_buf[3],
7232 office2010->encryptedVerifier[0],
7233 office2010->encryptedVerifier[1],
7234 office2010->encryptedVerifier[2],
7235 office2010->encryptedVerifier[3],
7236 office2010->encryptedVerifierHash[0],
7237 office2010->encryptedVerifierHash[1],
7238 office2010->encryptedVerifierHash[2],
7239 office2010->encryptedVerifierHash[3],
7240 office2010->encryptedVerifierHash[4],
7241 office2010->encryptedVerifierHash[5],
7242 office2010->encryptedVerifierHash[6],
7243 office2010->encryptedVerifierHash[7]);
7244 }
7245 else if (hash_mode == 9600)
7246 {
7247 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7248
7249 office2013_t *office2013 = &office2013s[salt_pos];
7250
7251 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,
7252
7253 salt.salt_buf[0],
7254 salt.salt_buf[1],
7255 salt.salt_buf[2],
7256 salt.salt_buf[3],
7257 office2013->encryptedVerifier[0],
7258 office2013->encryptedVerifier[1],
7259 office2013->encryptedVerifier[2],
7260 office2013->encryptedVerifier[3],
7261 office2013->encryptedVerifierHash[0],
7262 office2013->encryptedVerifierHash[1],
7263 office2013->encryptedVerifierHash[2],
7264 office2013->encryptedVerifierHash[3],
7265 office2013->encryptedVerifierHash[4],
7266 office2013->encryptedVerifierHash[5],
7267 office2013->encryptedVerifierHash[6],
7268 office2013->encryptedVerifierHash[7]);
7269 }
7270 else if (hash_mode == 9700)
7271 {
7272 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7273
7274 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7275
7276 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7277 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7278 byte_swap_32 (salt.salt_buf[0]),
7279 byte_swap_32 (salt.salt_buf[1]),
7280 byte_swap_32 (salt.salt_buf[2]),
7281 byte_swap_32 (salt.salt_buf[3]),
7282 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7283 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7284 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7285 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7286 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7287 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7288 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7289 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7290 }
7291 else if (hash_mode == 9710)
7292 {
7293 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7294
7295 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7296
7297 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7298 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7299 byte_swap_32 (salt.salt_buf[0]),
7300 byte_swap_32 (salt.salt_buf[1]),
7301 byte_swap_32 (salt.salt_buf[2]),
7302 byte_swap_32 (salt.salt_buf[3]),
7303 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7304 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7305 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7306 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7307 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7308 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7309 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7310 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7311 }
7312 else if (hash_mode == 9720)
7313 {
7314 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7315
7316 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7317
7318 uint8_t *rc4key = (uint8_t *) oldoffice01->rc4key;
7319
7320 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7321 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7322 byte_swap_32 (salt.salt_buf[0]),
7323 byte_swap_32 (salt.salt_buf[1]),
7324 byte_swap_32 (salt.salt_buf[2]),
7325 byte_swap_32 (salt.salt_buf[3]),
7326 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7327 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7328 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7329 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7330 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7331 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7332 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7333 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7334 rc4key[0],
7335 rc4key[1],
7336 rc4key[2],
7337 rc4key[3],
7338 rc4key[4]);
7339 }
7340 else if (hash_mode == 9800)
7341 {
7342 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7343
7344 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7345
7346 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7347 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7348 salt.salt_buf[0],
7349 salt.salt_buf[1],
7350 salt.salt_buf[2],
7351 salt.salt_buf[3],
7352 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7353 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7354 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7355 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7356 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7357 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7358 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7359 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7360 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7361 }
7362 else if (hash_mode == 9810)
7363 {
7364 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7365
7366 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7367
7368 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7369 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7370 salt.salt_buf[0],
7371 salt.salt_buf[1],
7372 salt.salt_buf[2],
7373 salt.salt_buf[3],
7374 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7375 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7376 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7377 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7378 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7379 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7380 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7381 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7382 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7383 }
7384 else if (hash_mode == 9820)
7385 {
7386 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7387
7388 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7389
7390 uint8_t *rc4key = (uint8_t *) oldoffice34->rc4key;
7391
7392 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7393 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7394 salt.salt_buf[0],
7395 salt.salt_buf[1],
7396 salt.salt_buf[2],
7397 salt.salt_buf[3],
7398 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7399 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7400 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7401 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7402 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7403 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7404 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7405 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7406 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7407 rc4key[0],
7408 rc4key[1],
7409 rc4key[2],
7410 rc4key[3],
7411 rc4key[4]);
7412 }
7413 else if (hash_mode == 10000)
7414 {
7415 // salt
7416
7417 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7418
7419 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7420
7421 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7422
7423 // hash
7424
7425 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7426 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7427 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7428 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7429 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7430 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7431 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7432 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7433 digest_buf[8] = 0; // needed for base64_encode ()
7434
7435 char tmp_buf[64];
7436 memset (tmp_buf, 0, sizeof (tmp_buf));
7437
7438 base64_encode (int_to_base64, (char *) digest_buf, 32, tmp_buf);
7439
7440 // output
7441
7442 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7443 }
7444 else if (hash_mode == 10100)
7445 {
7446 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7447 digest_buf[0],
7448 digest_buf[1],
7449 2,
7450 4,
7451 byte_swap_32 (salt.salt_buf[0]),
7452 byte_swap_32 (salt.salt_buf[1]),
7453 byte_swap_32 (salt.salt_buf[2]),
7454 byte_swap_32 (salt.salt_buf[3]));
7455 }
7456 else if (hash_mode == 10200)
7457 {
7458 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7459
7460 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7461
7462 // challenge
7463
7464 char challenge[100];
7465
7466 memset (challenge, 0, sizeof (challenge));
7467
7468 base64_encode (int_to_base64, (char *) salt.salt_buf, salt.salt_len, challenge);
7469
7470 // response
7471
7472 char tmp_buf[100];
7473
7474 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7475 (char *) cram_md5->user,
7476 digest_buf[0],
7477 digest_buf[1],
7478 digest_buf[2],
7479 digest_buf[3]);
7480
7481 char response[100];
7482
7483 memset (response, 0, sizeof (response));
7484
7485 base64_encode (int_to_base64, (char *) tmp_buf, tmp_len, response);
7486
7487 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7488 }
7489 else if (hash_mode == 10300)
7490 {
7491 char tmp_buf[100];
7492
7493 memset (tmp_buf, 0, sizeof (tmp_buf));
7494
7495 memcpy (tmp_buf + 0, digest_buf, 20);
7496 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7497
7498 uint tmp_len = 20 + salt.salt_len;
7499
7500 // base64 encode it
7501
7502 char base64_encoded[100];
7503
7504 memset (base64_encoded, 0, sizeof (base64_encoded));
7505
7506 base64_encode (int_to_base64, (char *) tmp_buf, tmp_len, base64_encoded);
7507
7508 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7509 }
7510 else if (hash_mode == 10400)
7511 {
7512 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7513
7514 pdf_t *pdf = &pdfs[salt_pos];
7515
7516 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",
7517
7518 pdf->V,
7519 pdf->R,
7520 40,
7521 pdf->P,
7522 pdf->enc_md,
7523 pdf->id_len,
7524 byte_swap_32 (pdf->id_buf[0]),
7525 byte_swap_32 (pdf->id_buf[1]),
7526 byte_swap_32 (pdf->id_buf[2]),
7527 byte_swap_32 (pdf->id_buf[3]),
7528 pdf->u_len,
7529 byte_swap_32 (pdf->u_buf[0]),
7530 byte_swap_32 (pdf->u_buf[1]),
7531 byte_swap_32 (pdf->u_buf[2]),
7532 byte_swap_32 (pdf->u_buf[3]),
7533 byte_swap_32 (pdf->u_buf[4]),
7534 byte_swap_32 (pdf->u_buf[5]),
7535 byte_swap_32 (pdf->u_buf[6]),
7536 byte_swap_32 (pdf->u_buf[7]),
7537 pdf->o_len,
7538 byte_swap_32 (pdf->o_buf[0]),
7539 byte_swap_32 (pdf->o_buf[1]),
7540 byte_swap_32 (pdf->o_buf[2]),
7541 byte_swap_32 (pdf->o_buf[3]),
7542 byte_swap_32 (pdf->o_buf[4]),
7543 byte_swap_32 (pdf->o_buf[5]),
7544 byte_swap_32 (pdf->o_buf[6]),
7545 byte_swap_32 (pdf->o_buf[7])
7546 );
7547 }
7548 else if (hash_mode == 10410)
7549 {
7550 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7551
7552 pdf_t *pdf = &pdfs[salt_pos];
7553
7554 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",
7555
7556 pdf->V,
7557 pdf->R,
7558 40,
7559 pdf->P,
7560 pdf->enc_md,
7561 pdf->id_len,
7562 byte_swap_32 (pdf->id_buf[0]),
7563 byte_swap_32 (pdf->id_buf[1]),
7564 byte_swap_32 (pdf->id_buf[2]),
7565 byte_swap_32 (pdf->id_buf[3]),
7566 pdf->u_len,
7567 byte_swap_32 (pdf->u_buf[0]),
7568 byte_swap_32 (pdf->u_buf[1]),
7569 byte_swap_32 (pdf->u_buf[2]),
7570 byte_swap_32 (pdf->u_buf[3]),
7571 byte_swap_32 (pdf->u_buf[4]),
7572 byte_swap_32 (pdf->u_buf[5]),
7573 byte_swap_32 (pdf->u_buf[6]),
7574 byte_swap_32 (pdf->u_buf[7]),
7575 pdf->o_len,
7576 byte_swap_32 (pdf->o_buf[0]),
7577 byte_swap_32 (pdf->o_buf[1]),
7578 byte_swap_32 (pdf->o_buf[2]),
7579 byte_swap_32 (pdf->o_buf[3]),
7580 byte_swap_32 (pdf->o_buf[4]),
7581 byte_swap_32 (pdf->o_buf[5]),
7582 byte_swap_32 (pdf->o_buf[6]),
7583 byte_swap_32 (pdf->o_buf[7])
7584 );
7585 }
7586 else if (hash_mode == 10420)
7587 {
7588 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7589
7590 pdf_t *pdf = &pdfs[salt_pos];
7591
7592 uint8_t *rc4key = (uint8_t *) pdf->rc4key;
7593
7594 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",
7595
7596 pdf->V,
7597 pdf->R,
7598 40,
7599 pdf->P,
7600 pdf->enc_md,
7601 pdf->id_len,
7602 byte_swap_32 (pdf->id_buf[0]),
7603 byte_swap_32 (pdf->id_buf[1]),
7604 byte_swap_32 (pdf->id_buf[2]),
7605 byte_swap_32 (pdf->id_buf[3]),
7606 pdf->u_len,
7607 byte_swap_32 (pdf->u_buf[0]),
7608 byte_swap_32 (pdf->u_buf[1]),
7609 byte_swap_32 (pdf->u_buf[2]),
7610 byte_swap_32 (pdf->u_buf[3]),
7611 byte_swap_32 (pdf->u_buf[4]),
7612 byte_swap_32 (pdf->u_buf[5]),
7613 byte_swap_32 (pdf->u_buf[6]),
7614 byte_swap_32 (pdf->u_buf[7]),
7615 pdf->o_len,
7616 byte_swap_32 (pdf->o_buf[0]),
7617 byte_swap_32 (pdf->o_buf[1]),
7618 byte_swap_32 (pdf->o_buf[2]),
7619 byte_swap_32 (pdf->o_buf[3]),
7620 byte_swap_32 (pdf->o_buf[4]),
7621 byte_swap_32 (pdf->o_buf[5]),
7622 byte_swap_32 (pdf->o_buf[6]),
7623 byte_swap_32 (pdf->o_buf[7]),
7624 rc4key[0],
7625 rc4key[1],
7626 rc4key[2],
7627 rc4key[3],
7628 rc4key[4]
7629 );
7630 }
7631 else if (hash_mode == 10500)
7632 {
7633 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7634
7635 pdf_t *pdf = &pdfs[salt_pos];
7636
7637 if (pdf->id_len == 32)
7638 {
7639 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",
7640
7641 pdf->V,
7642 pdf->R,
7643 128,
7644 pdf->P,
7645 pdf->enc_md,
7646 pdf->id_len,
7647 byte_swap_32 (pdf->id_buf[0]),
7648 byte_swap_32 (pdf->id_buf[1]),
7649 byte_swap_32 (pdf->id_buf[2]),
7650 byte_swap_32 (pdf->id_buf[3]),
7651 byte_swap_32 (pdf->id_buf[4]),
7652 byte_swap_32 (pdf->id_buf[5]),
7653 byte_swap_32 (pdf->id_buf[6]),
7654 byte_swap_32 (pdf->id_buf[7]),
7655 pdf->u_len,
7656 byte_swap_32 (pdf->u_buf[0]),
7657 byte_swap_32 (pdf->u_buf[1]),
7658 byte_swap_32 (pdf->u_buf[2]),
7659 byte_swap_32 (pdf->u_buf[3]),
7660 byte_swap_32 (pdf->u_buf[4]),
7661 byte_swap_32 (pdf->u_buf[5]),
7662 byte_swap_32 (pdf->u_buf[6]),
7663 byte_swap_32 (pdf->u_buf[7]),
7664 pdf->o_len,
7665 byte_swap_32 (pdf->o_buf[0]),
7666 byte_swap_32 (pdf->o_buf[1]),
7667 byte_swap_32 (pdf->o_buf[2]),
7668 byte_swap_32 (pdf->o_buf[3]),
7669 byte_swap_32 (pdf->o_buf[4]),
7670 byte_swap_32 (pdf->o_buf[5]),
7671 byte_swap_32 (pdf->o_buf[6]),
7672 byte_swap_32 (pdf->o_buf[7])
7673 );
7674 }
7675 else
7676 {
7677 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",
7678
7679 pdf->V,
7680 pdf->R,
7681 128,
7682 pdf->P,
7683 pdf->enc_md,
7684 pdf->id_len,
7685 byte_swap_32 (pdf->id_buf[0]),
7686 byte_swap_32 (pdf->id_buf[1]),
7687 byte_swap_32 (pdf->id_buf[2]),
7688 byte_swap_32 (pdf->id_buf[3]),
7689 pdf->u_len,
7690 byte_swap_32 (pdf->u_buf[0]),
7691 byte_swap_32 (pdf->u_buf[1]),
7692 byte_swap_32 (pdf->u_buf[2]),
7693 byte_swap_32 (pdf->u_buf[3]),
7694 byte_swap_32 (pdf->u_buf[4]),
7695 byte_swap_32 (pdf->u_buf[5]),
7696 byte_swap_32 (pdf->u_buf[6]),
7697 byte_swap_32 (pdf->u_buf[7]),
7698 pdf->o_len,
7699 byte_swap_32 (pdf->o_buf[0]),
7700 byte_swap_32 (pdf->o_buf[1]),
7701 byte_swap_32 (pdf->o_buf[2]),
7702 byte_swap_32 (pdf->o_buf[3]),
7703 byte_swap_32 (pdf->o_buf[4]),
7704 byte_swap_32 (pdf->o_buf[5]),
7705 byte_swap_32 (pdf->o_buf[6]),
7706 byte_swap_32 (pdf->o_buf[7])
7707 );
7708 }
7709 }
7710 else if (hash_mode == 10600)
7711 {
7712 uint digest_idx = salt.digests_offset + digest_pos;
7713
7714 hashinfo_t **hashinfo_ptr = data.hash_info;
7715 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7716
7717 snprintf (out_buf, len-1, "%s", hash_buf);
7718 }
7719 else if (hash_mode == 10700)
7720 {
7721 uint digest_idx = salt.digests_offset + digest_pos;
7722
7723 hashinfo_t **hashinfo_ptr = data.hash_info;
7724 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7725
7726 snprintf (out_buf, len-1, "%s", hash_buf);
7727 }
7728 else if (hash_mode == 10900)
7729 {
7730 uint digest_idx = salt.digests_offset + digest_pos;
7731
7732 hashinfo_t **hashinfo_ptr = data.hash_info;
7733 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7734
7735 snprintf (out_buf, len-1, "%s", hash_buf);
7736 }
7737 else if (hash_mode == 11100)
7738 {
7739 uint32_t salt_challenge = salt.salt_buf[0];
7740
7741 salt_challenge = byte_swap_32 (salt_challenge);
7742
7743 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7744
7745 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7746 SIGNATURE_POSTGRESQL_AUTH,
7747 user_name,
7748 salt_challenge,
7749 digest_buf[0],
7750 digest_buf[1],
7751 digest_buf[2],
7752 digest_buf[3]);
7753 }
7754 else if (hash_mode == 11200)
7755 {
7756 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7757 SIGNATURE_MYSQL_AUTH,
7758 (unsigned char *) salt.salt_buf,
7759 digest_buf[0],
7760 digest_buf[1],
7761 digest_buf[2],
7762 digest_buf[3],
7763 digest_buf[4]);
7764 }
7765 else if (hash_mode == 11300)
7766 {
7767 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7768
7769 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7770
7771 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7772 const uint ckey_len = bitcoin_wallet->ckey_len;
7773 const uint public_key_len = bitcoin_wallet->public_key_len;
7774
7775 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7776 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7777 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7778
7779 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7780 {
7781 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->cry_master_buf;
7782
7783 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7784 }
7785
7786 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7787 {
7788 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->ckey_buf;
7789
7790 sprintf (ckey_buf + j, "%02x", ptr[i]);
7791 }
7792
7793 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7794 {
7795 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->public_key_buf;
7796
7797 sprintf (public_key_buf + j, "%02x", ptr[i]);
7798 }
7799
7800 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
7801 SIGNATURE_BITCOIN_WALLET,
7802 cry_master_len * 2,
7803 cry_master_buf,
7804 salt.salt_len,
7805 (unsigned char *) salt.salt_buf,
7806 salt.salt_iter + 1,
7807 ckey_len * 2,
7808 ckey_buf,
7809 public_key_len * 2,
7810 public_key_buf
7811 );
7812
7813 free (cry_master_buf);
7814 free (ckey_buf);
7815 free (public_key_buf);
7816 }
7817 else if (hash_mode == 11400)
7818 {
7819 uint digest_idx = salt.digests_offset + digest_pos;
7820
7821 hashinfo_t **hashinfo_ptr = data.hash_info;
7822 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7823
7824 snprintf (out_buf, len-1, "%s", hash_buf);
7825 }
7826 else if (hash_mode == 11600)
7827 {
7828 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
7829
7830 seven_zip_t *seven_zip = &seven_zips[salt_pos];
7831
7832 const uint data_len = seven_zip->data_len;
7833
7834 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
7835
7836 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
7837 {
7838 const uint8_t *ptr = (const uint8_t *) seven_zip->data_buf;
7839
7840 sprintf (data_buf + j, "%02x", ptr[i]);
7841 }
7842
7843 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
7844 SIGNATURE_SEVEN_ZIP,
7845 0,
7846 salt.salt_sign[0],
7847 0,
7848 (char *) seven_zip->salt_buf,
7849 seven_zip->iv_len,
7850 seven_zip->iv_buf[0],
7851 seven_zip->iv_buf[1],
7852 seven_zip->iv_buf[2],
7853 seven_zip->iv_buf[3],
7854 seven_zip->crc,
7855 seven_zip->data_len,
7856 seven_zip->unpack_size,
7857 data_buf);
7858
7859 free (data_buf);
7860 }
7861 else if (hash_mode == 11700)
7862 {
7863 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7864 digest_buf[0],
7865 digest_buf[1],
7866 digest_buf[2],
7867 digest_buf[3],
7868 digest_buf[4],
7869 digest_buf[5],
7870 digest_buf[6],
7871 digest_buf[7]);
7872 }
7873 else if (hash_mode == 11800)
7874 {
7875 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
7876 digest_buf[ 0],
7877 digest_buf[ 1],
7878 digest_buf[ 2],
7879 digest_buf[ 3],
7880 digest_buf[ 4],
7881 digest_buf[ 5],
7882 digest_buf[ 6],
7883 digest_buf[ 7],
7884 digest_buf[ 8],
7885 digest_buf[ 9],
7886 digest_buf[10],
7887 digest_buf[11],
7888 digest_buf[12],
7889 digest_buf[13],
7890 digest_buf[14],
7891 digest_buf[15]);
7892 }
7893 else if (hash_mode == 11900)
7894 {
7895 uint digest_idx = salt.digests_offset + digest_pos;
7896
7897 hashinfo_t **hashinfo_ptr = data.hash_info;
7898 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7899
7900 snprintf (out_buf, len-1, "%s", hash_buf);
7901 }
7902 else if (hash_mode == 12000)
7903 {
7904 uint digest_idx = salt.digests_offset + digest_pos;
7905
7906 hashinfo_t **hashinfo_ptr = data.hash_info;
7907 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7908
7909 snprintf (out_buf, len-1, "%s", hash_buf);
7910 }
7911 else if (hash_mode == 12100)
7912 {
7913 uint digest_idx = salt.digests_offset + digest_pos;
7914
7915 hashinfo_t **hashinfo_ptr = data.hash_info;
7916 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7917
7918 snprintf (out_buf, len-1, "%s", hash_buf);
7919 }
7920 else if (hash_mode == 12200)
7921 {
7922 uint *ptr_digest = digest_buf;
7923 uint *ptr_salt = salt.salt_buf;
7924
7925 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
7926 SIGNATURE_ECRYPTFS,
7927 ptr_salt[0],
7928 ptr_salt[1],
7929 ptr_digest[0],
7930 ptr_digest[1]);
7931 }
7932 else if (hash_mode == 12300)
7933 {
7934 uint *ptr_digest = digest_buf;
7935 uint *ptr_salt = salt.salt_buf;
7936
7937 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",
7938 ptr_digest[ 0], ptr_digest[ 1],
7939 ptr_digest[ 2], ptr_digest[ 3],
7940 ptr_digest[ 4], ptr_digest[ 5],
7941 ptr_digest[ 6], ptr_digest[ 7],
7942 ptr_digest[ 8], ptr_digest[ 9],
7943 ptr_digest[10], ptr_digest[11],
7944 ptr_digest[12], ptr_digest[13],
7945 ptr_digest[14], ptr_digest[15],
7946 ptr_salt[0],
7947 ptr_salt[1],
7948 ptr_salt[2],
7949 ptr_salt[3]);
7950 }
7951 else if (hash_mode == 12400)
7952 {
7953 // encode iteration count
7954
7955 char salt_iter[5];
7956
7957 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
7958 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
7959 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
7960 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
7961 salt_iter[4] = 0;
7962
7963 // encode salt
7964
7965 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
7966 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
7967 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
7968 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
7969 ptr_salt[4] = 0;
7970
7971 // encode digest
7972
7973 memset (tmp_buf, 0, sizeof (tmp_buf));
7974
7975 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7976 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7977
7978 memcpy (tmp_buf, digest_buf, 8);
7979
7980 base64_encode (int_to_itoa64, tmp_buf, 8, ptr_plain);
7981
7982 ptr_plain[11] = 0;
7983
7984 // fill the resulting buffer
7985
7986 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
7987 }
7988 else if (hash_mode == 12500)
7989 {
7990 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
7991 SIGNATURE_RAR3,
7992 byte_swap_32 (salt.salt_buf[0]),
7993 byte_swap_32 (salt.salt_buf[1]),
7994 salt.salt_buf[2],
7995 salt.salt_buf[3],
7996 salt.salt_buf[4],
7997 salt.salt_buf[5]);
7998 }
7999 else if (hash_mode == 12600)
8000 {
8001 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8002 digest_buf[0] + salt.salt_buf_pc[0],
8003 digest_buf[1] + salt.salt_buf_pc[1],
8004 digest_buf[2] + salt.salt_buf_pc[2],
8005 digest_buf[3] + salt.salt_buf_pc[3],
8006 digest_buf[4] + salt.salt_buf_pc[4],
8007 digest_buf[5] + salt.salt_buf_pc[5],
8008 digest_buf[6] + salt.salt_buf_pc[6],
8009 digest_buf[7] + salt.salt_buf_pc[7]);
8010 }
8011 else if (hash_mode == 12700)
8012 {
8013 uint digest_idx = salt.digests_offset + digest_pos;
8014
8015 hashinfo_t **hashinfo_ptr = data.hash_info;
8016 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8017
8018 snprintf (out_buf, len-1, "%s", hash_buf);
8019 }
8020 else if (hash_mode == 12800)
8021 {
8022 const uint8_t *ptr = (const uint8_t *) salt.salt_buf;
8023
8024 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",
8025 SIGNATURE_MS_DRSR,
8026 ptr[0],
8027 ptr[1],
8028 ptr[2],
8029 ptr[3],
8030 ptr[4],
8031 ptr[5],
8032 ptr[6],
8033 ptr[7],
8034 ptr[8],
8035 ptr[9],
8036 salt.salt_iter + 1,
8037 byte_swap_32 (digest_buf[0]),
8038 byte_swap_32 (digest_buf[1]),
8039 byte_swap_32 (digest_buf[2]),
8040 byte_swap_32 (digest_buf[3]),
8041 byte_swap_32 (digest_buf[4]),
8042 byte_swap_32 (digest_buf[5]),
8043 byte_swap_32 (digest_buf[6]),
8044 byte_swap_32 (digest_buf[7])
8045 );
8046 }
8047 else if (hash_mode == 12900)
8048 {
8049 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",
8050 salt.salt_buf[ 4],
8051 salt.salt_buf[ 5],
8052 salt.salt_buf[ 6],
8053 salt.salt_buf[ 7],
8054 salt.salt_buf[ 8],
8055 salt.salt_buf[ 9],
8056 salt.salt_buf[10],
8057 salt.salt_buf[11],
8058 byte_swap_32 (digest_buf[0]),
8059 byte_swap_32 (digest_buf[1]),
8060 byte_swap_32 (digest_buf[2]),
8061 byte_swap_32 (digest_buf[3]),
8062 byte_swap_32 (digest_buf[4]),
8063 byte_swap_32 (digest_buf[5]),
8064 byte_swap_32 (digest_buf[6]),
8065 byte_swap_32 (digest_buf[7]),
8066 salt.salt_buf[ 0],
8067 salt.salt_buf[ 1],
8068 salt.salt_buf[ 2],
8069 salt.salt_buf[ 3]
8070 );
8071 }
8072 else if (hash_mode == 13000)
8073 {
8074 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8075
8076 rar5_t *rar5 = &rar5s[salt_pos];
8077
8078 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8079 salt.salt_buf[0],
8080 salt.salt_buf[1],
8081 salt.salt_buf[2],
8082 salt.salt_buf[3],
8083 salt.salt_sign[0],
8084 rar5->iv[0],
8085 rar5->iv[1],
8086 rar5->iv[2],
8087 rar5->iv[3],
8088 byte_swap_32 (digest_buf[0]),
8089 byte_swap_32 (digest_buf[1])
8090 );
8091 }
8092 else
8093 {
8094 if (hash_type == HASH_TYPE_MD4)
8095 {
8096 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8097 digest_buf[0],
8098 digest_buf[1],
8099 digest_buf[2],
8100 digest_buf[3]);
8101 }
8102 else if (hash_type == HASH_TYPE_MD5)
8103 {
8104 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8105 digest_buf[0],
8106 digest_buf[1],
8107 digest_buf[2],
8108 digest_buf[3]);
8109 }
8110 else if (hash_type == HASH_TYPE_SHA1)
8111 {
8112 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8113 digest_buf[0],
8114 digest_buf[1],
8115 digest_buf[2],
8116 digest_buf[3],
8117 digest_buf[4]);
8118 }
8119 else if (hash_type == HASH_TYPE_SHA256)
8120 {
8121 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8122 digest_buf[0],
8123 digest_buf[1],
8124 digest_buf[2],
8125 digest_buf[3],
8126 digest_buf[4],
8127 digest_buf[5],
8128 digest_buf[6],
8129 digest_buf[7]);
8130 }
8131 else if (hash_type == HASH_TYPE_SHA384)
8132 {
8133 uint *ptr = digest_buf;
8134
8135 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8136 ptr[ 1], ptr[ 0],
8137 ptr[ 3], ptr[ 2],
8138 ptr[ 5], ptr[ 4],
8139 ptr[ 7], ptr[ 6],
8140 ptr[ 9], ptr[ 8],
8141 ptr[11], ptr[10]);
8142 }
8143 else if (hash_type == HASH_TYPE_SHA512)
8144 {
8145 uint *ptr = digest_buf;
8146
8147 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8148 ptr[ 1], ptr[ 0],
8149 ptr[ 3], ptr[ 2],
8150 ptr[ 5], ptr[ 4],
8151 ptr[ 7], ptr[ 6],
8152 ptr[ 9], ptr[ 8],
8153 ptr[11], ptr[10],
8154 ptr[13], ptr[12],
8155 ptr[15], ptr[14]);
8156 }
8157 else if (hash_type == HASH_TYPE_LM)
8158 {
8159 snprintf (out_buf, len-1, "%08x%08x",
8160 digest_buf[0],
8161 digest_buf[1]);
8162 }
8163 else if (hash_type == HASH_TYPE_ORACLEH)
8164 {
8165 snprintf (out_buf, len-1, "%08X%08X",
8166 digest_buf[0],
8167 digest_buf[1]);
8168 }
8169 else if (hash_type == HASH_TYPE_BCRYPT)
8170 {
8171 base64_encode (int_to_bf64, (char *) salt.salt_buf, 16, tmp_buf + 0);
8172 base64_encode (int_to_bf64, (char *) digest_buf, 23, tmp_buf + 22);
8173
8174 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8175
8176 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8177 }
8178 else if (hash_type == HASH_TYPE_KECCAK)
8179 {
8180 uint *ptr = digest_buf;
8181
8182 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",
8183 ptr[ 1], ptr[ 0],
8184 ptr[ 3], ptr[ 2],
8185 ptr[ 5], ptr[ 4],
8186 ptr[ 7], ptr[ 6],
8187 ptr[ 9], ptr[ 8],
8188 ptr[11], ptr[10],
8189 ptr[13], ptr[12],
8190 ptr[15], ptr[14],
8191 ptr[17], ptr[16],
8192 ptr[19], ptr[18],
8193 ptr[21], ptr[20],
8194 ptr[23], ptr[22],
8195 ptr[25], ptr[24],
8196 ptr[27], ptr[26],
8197 ptr[29], ptr[28],
8198 ptr[31], ptr[30],
8199 ptr[33], ptr[32],
8200 ptr[35], ptr[34],
8201 ptr[37], ptr[36],
8202 ptr[39], ptr[38],
8203 ptr[41], ptr[30],
8204 ptr[43], ptr[42],
8205 ptr[45], ptr[44],
8206 ptr[47], ptr[46],
8207 ptr[49], ptr[48]
8208 );
8209
8210 out_buf[salt.keccak_mdlen * 2] = 0;
8211 }
8212 else if (hash_type == HASH_TYPE_RIPEMD160)
8213 {
8214 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8215 digest_buf[0],
8216 digest_buf[1],
8217 digest_buf[2],
8218 digest_buf[3],
8219 digest_buf[4]);
8220 }
8221 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8222 {
8223 digest_buf[ 0] = digest_buf[ 0];
8224 digest_buf[ 1] = digest_buf[ 1];
8225 digest_buf[ 2] = digest_buf[ 2];
8226 digest_buf[ 3] = digest_buf[ 3];
8227 digest_buf[ 4] = digest_buf[ 4];
8228 digest_buf[ 5] = digest_buf[ 5];
8229 digest_buf[ 6] = digest_buf[ 6];
8230 digest_buf[ 7] = digest_buf[ 7];
8231 digest_buf[ 8] = digest_buf[ 8];
8232 digest_buf[ 9] = digest_buf[ 9];
8233 digest_buf[10] = digest_buf[10];
8234 digest_buf[11] = digest_buf[11];
8235 digest_buf[12] = digest_buf[12];
8236 digest_buf[13] = digest_buf[13];
8237 digest_buf[14] = digest_buf[14];
8238 digest_buf[15] = digest_buf[15];
8239
8240 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8241 digest_buf[ 0],
8242 digest_buf[ 1],
8243 digest_buf[ 2],
8244 digest_buf[ 3],
8245 digest_buf[ 4],
8246 digest_buf[ 5],
8247 digest_buf[ 6],
8248 digest_buf[ 7],
8249 digest_buf[ 8],
8250 digest_buf[ 9],
8251 digest_buf[10],
8252 digest_buf[11],
8253 digest_buf[12],
8254 digest_buf[13],
8255 digest_buf[14],
8256 digest_buf[15]);
8257 }
8258 else if (hash_type == HASH_TYPE_GOST)
8259 {
8260 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8261 digest_buf[0],
8262 digest_buf[1],
8263 digest_buf[2],
8264 digest_buf[3],
8265 digest_buf[4],
8266 digest_buf[5],
8267 digest_buf[6],
8268 digest_buf[7]);
8269 }
8270 else if (hash_type == HASH_TYPE_MYSQL)
8271 {
8272 snprintf (out_buf, len-1, "%08x%08x",
8273 digest_buf[0],
8274 digest_buf[1]);
8275 }
8276 else if (hash_type == HASH_TYPE_LOTUS5)
8277 {
8278 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8279 digest_buf[0],
8280 digest_buf[1],
8281 digest_buf[2],
8282 digest_buf[3]);
8283 }
8284 else if (hash_type == HASH_TYPE_LOTUS6)
8285 {
8286 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8287 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8288 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8289 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8290
8291 char buf[16];
8292
8293 memcpy (buf + 0, salt.salt_buf, 5);
8294 memcpy (buf + 5, digest_buf, 9);
8295
8296 buf[3] -= -4;
8297
8298 base64_encode (int_to_lotus64, buf, 14, tmp_buf);
8299
8300 tmp_buf[18] = salt.salt_buf_pc[7];
8301 tmp_buf[19] = 0;
8302
8303 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8304 }
8305 else if (hash_type == HASH_TYPE_LOTUS8)
8306 {
8307 char buf[52];
8308
8309 memset (buf, 0, sizeof (buf));
8310
8311 // salt
8312
8313 memcpy (buf + 0, salt.salt_buf, 16);
8314
8315 buf[3] -= -4;
8316
8317 // iteration
8318
8319 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8320
8321 // chars
8322
8323 buf[26] = salt.salt_buf_pc[0];
8324 buf[27] = salt.salt_buf_pc[1];
8325
8326 // digest
8327
8328 memcpy (buf + 28, digest_buf, 8);
8329
8330 base64_encode (int_to_lotus64, buf, 36, tmp_buf);
8331
8332 tmp_buf[49] = 0;
8333
8334 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8335 }
8336 else if (hash_type == HASH_TYPE_CRC32)
8337 {
8338 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8339 }
8340 }
8341
8342 if (salt_type == SALT_TYPE_INTERN)
8343 {
8344 size_t pos = strlen (out_buf);
8345
8346 out_buf[pos] = data.separator;
8347
8348 char *ptr = (char *) salt.salt_buf;
8349
8350 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8351
8352 out_buf[pos + 1 + salt.salt_len] = 0;
8353 }
8354 }
8355
8356 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8357 {
8358 memset (hccap, 0, sizeof (hccap_t));
8359
8360 salt_t *salt = &data.salts_buf[salt_pos];
8361
8362 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8363
8364 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8365 wpa_t *wpa = &wpas[salt_pos];
8366
8367 hccap->keyver = wpa->keyver;
8368
8369 hccap->eapol_size = wpa->eapol_size;
8370
8371 if (wpa->keyver != 1)
8372 {
8373 uint eapol_tmp[64];
8374
8375 for (uint i = 0; i < 64; i++)
8376 {
8377 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8378 }
8379
8380 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8381 }
8382 else
8383 {
8384 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8385 }
8386
8387 uint pke_tmp[25];
8388
8389 for (int i = 5; i < 25; i++)
8390 {
8391 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8392 }
8393
8394 char *pke_ptr = (char *) pke_tmp;
8395
8396 memcpy (hccap->mac1, pke_ptr + 23, 6);
8397 memcpy (hccap->mac2, pke_ptr + 29, 6);
8398 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8399 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8400
8401 char *digests_buf_ptr = (char *) data.digests_buf;
8402
8403 uint dgst_size = data.dgst_size;
8404
8405 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8406
8407 if (wpa->keyver != 1)
8408 {
8409 uint digest_tmp[4];
8410
8411 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8412 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8413 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8414 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8415
8416 memcpy (hccap->keymic, digest_tmp, 16);
8417 }
8418 else
8419 {
8420 memcpy (hccap->keymic, digest_ptr, 16);
8421 }
8422 }
8423
8424 void SuspendThreads ()
8425 {
8426 if (data.devices_status == STATUS_RUNNING)
8427 {
8428 hc_timer_set (&data.timer_paused);
8429
8430 data.devices_status = STATUS_PAUSED;
8431
8432 log_info ("Paused");
8433 }
8434 }
8435
8436 void ResumeThreads ()
8437 {
8438 if (data.devices_status == STATUS_PAUSED)
8439 {
8440 float ms_paused;
8441
8442 hc_timer_get (data.timer_paused, ms_paused);
8443
8444 data.ms_paused += ms_paused;
8445
8446 data.devices_status = STATUS_RUNNING;
8447
8448 log_info ("Resumed");
8449 }
8450 }
8451
8452 void bypass ()
8453 {
8454 if (data.devices_status != STATUS_RUNNING) return;
8455
8456 data.devices_status = STATUS_BYPASS;
8457
8458 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8459 }
8460
8461 void stop_at_checkpoint ()
8462 {
8463 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8464 {
8465 if (data.devices_status != STATUS_RUNNING) return;
8466 }
8467
8468 // this feature only makes sense if --restore-disable was not specified
8469
8470 if (data.restore_disable == 1)
8471 {
8472 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8473
8474 return;
8475 }
8476
8477 // check if monitoring of Restore Point updates should be enabled or disabled
8478
8479 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8480 {
8481 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8482
8483 // save the current restore point value
8484
8485 data.checkpoint_cur_words = get_lowest_words_done ();
8486
8487 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8488 }
8489 else
8490 {
8491 data.devices_status = STATUS_RUNNING;
8492
8493 // reset the global value for checkpoint checks
8494
8495 data.checkpoint_cur_words = 0;
8496
8497 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8498 }
8499 }
8500
8501 void myabort ()
8502 {
8503 if (data.devices_status == STATUS_INIT) return;
8504 if (data.devices_status == STATUS_STARTING) return;
8505
8506 data.devices_status = STATUS_ABORTED;
8507 }
8508
8509 void myquit ()
8510 {
8511 if (data.devices_status == STATUS_INIT) return;
8512 if (data.devices_status == STATUS_STARTING) return;
8513
8514 data.devices_status = STATUS_QUIT;
8515 }
8516
8517 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const unsigned char **kernel_sources)
8518 {
8519 FILE *fp;
8520
8521 if ((fp = fopen (kernel_file, "rb")) != NULL)
8522 {
8523 struct stat st;
8524
8525 memset (&st, 0, sizeof (st));
8526
8527 stat (kernel_file, &st);
8528
8529 unsigned char *buf = (unsigned char *) mymalloc (st.st_size + 1);
8530
8531 size_t num_read = fread (buf, sizeof (unsigned char), st.st_size, fp);
8532
8533 if (num_read != (size_t) st.st_size)
8534 {
8535 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8536
8537 exit (-1);
8538 }
8539
8540 fclose (fp);
8541
8542 buf[st.st_size] = 0;
8543
8544 for (int i = 0; i < num_devices; i++)
8545 {
8546 kernel_lengths[i] = (size_t) st.st_size;
8547
8548 kernel_sources[i] = buf;
8549 }
8550 }
8551 else
8552 {
8553 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8554
8555 exit (-1);
8556 }
8557
8558 return;
8559 }
8560
8561 void writeProgramBin (char *dst, unsigned char *binary, size_t binary_size)
8562 {
8563 FILE *fp = fopen (dst, "wb");
8564
8565 fwrite (binary, sizeof (unsigned char), binary_size, fp);
8566
8567 fflush (fp);
8568 fclose (fp);
8569 }
8570
8571 /**
8572 * restore
8573 */
8574
8575 restore_data_t *init_restore (int argc, char **argv)
8576 {
8577 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8578
8579 if (data.restore_disable == 0)
8580 {
8581 FILE *fp = fopen (data.eff_restore_file, "rb");
8582
8583 if (fp)
8584 {
8585 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8586
8587 if (nread != 1)
8588 {
8589 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8590
8591 exit (-1);
8592 }
8593
8594 fclose (fp);
8595
8596 if (rd->pid)
8597 {
8598 char pidbin[BUFSIZ];
8599
8600 int pidbin_len;
8601
8602 #ifdef _POSIX
8603 memset (pidbin, 0, sizeof (pidbin));
8604
8605 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8606
8607 FILE *fd = fopen (pidbin, "rb");
8608
8609 if (fd)
8610 {
8611 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8612
8613 pidbin[pidbin_len] = 0;
8614
8615 fclose (fd);
8616
8617 char *argv0_r = strrchr (argv[0], '/');
8618
8619 char *pidbin_r = strrchr (pidbin, '/');
8620
8621 if (argv0_r == NULL) argv0_r = argv[0];
8622
8623 if (pidbin_r == NULL) pidbin_r = pidbin;
8624
8625 if (strcmp (argv0_r, pidbin_r) == 0)
8626 {
8627 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8628
8629 exit (-1);
8630 }
8631 }
8632
8633 #elif _WIN
8634 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8635
8636 char pidbin2[BUFSIZ];
8637
8638 int pidbin2_len;
8639
8640 memset (pidbin2, 0, sizeof (pidbin2));
8641
8642 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8643 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8644
8645 pidbin[pidbin_len] = 0;
8646 pidbin2[pidbin2_len] = 0;
8647
8648 if (pidbin2_len)
8649 {
8650 if (strcmp (pidbin, pidbin2) == 0)
8651 {
8652 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8653
8654 exit (-1);
8655 }
8656 }
8657 #endif
8658 }
8659
8660 if (rd->version_bin < RESTORE_MIN)
8661 {
8662 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8663
8664 exit (-1);
8665 }
8666 }
8667 }
8668
8669 memset (rd, 0, sizeof (restore_data_t));
8670
8671 rd->version_bin = VERSION_BIN;
8672
8673 #ifdef _POSIX
8674 rd->pid = getpid ();
8675 #elif _WIN
8676 rd->pid = GetCurrentProcessId ();
8677 #endif
8678
8679 if (getcwd (rd->cwd, 255) == NULL)
8680 {
8681 myfree (rd);
8682
8683 return (NULL);
8684 }
8685
8686 rd->argc = argc;
8687 rd->argv = argv;
8688
8689 return (rd);
8690 }
8691
8692 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8693 {
8694 FILE *fp = fopen (eff_restore_file, "rb");
8695
8696 if (fp == NULL)
8697 {
8698 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8699
8700 exit (-1);
8701 }
8702
8703 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8704 {
8705 log_error ("ERROR: cannot read %s", eff_restore_file);
8706
8707 exit (-1);
8708 }
8709
8710 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8711
8712 for (uint i = 0; i < rd->argc; i++)
8713 {
8714 char buf[BUFSIZ];
8715
8716 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8717 {
8718 log_error ("ERROR: cannot read %s", eff_restore_file);
8719
8720 exit (-1);
8721 }
8722
8723 size_t len = strlen (buf);
8724
8725 if (len) buf[len - 1] = 0;
8726
8727 rd->argv[i] = mystrdup (buf);
8728 }
8729
8730 fclose (fp);
8731
8732 char new_cwd[256];
8733
8734 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8735
8736 if (nwd == NULL)
8737 {
8738 log_error ("Restore file is corrupted");
8739 }
8740
8741 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8742 {
8743 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8744 {
8745 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8746
8747 exit (-1);
8748 }
8749
8750 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8751 }
8752
8753
8754 if (chdir (rd->cwd))
8755 {
8756 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8757
8758 exit (-1);
8759 }
8760 }
8761
8762 uint64_t get_lowest_words_done ()
8763 {
8764 uint64_t words_cur = -1;
8765
8766 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8767 {
8768 hc_device_param_t *device_param = &data.devices_param[device_id];
8769
8770 const uint64_t words_done = device_param->words_done;
8771
8772 if (words_done < words_cur) words_cur = words_done;
8773 }
8774
8775 // It's possible that a device's workload isn't finished right after a restore-case.
8776 // In that case, this function would return 0 and overwrite the real restore point
8777 // There's also data.words_cur which is set to rd->words_cur but it changes while
8778 // the attack is running therefore we should stick to rd->words_cur.
8779 // Note that -s influences rd->words_cur we should keep a close look on that.
8780
8781 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
8782
8783 return words_cur;
8784 }
8785
8786 void write_restore (const char *new_restore_file, restore_data_t *rd)
8787 {
8788 uint64_t words_cur = get_lowest_words_done ();
8789
8790 rd->words_cur = words_cur;
8791
8792 FILE *fp = fopen (new_restore_file, "wb");
8793
8794 if (fp == NULL)
8795 {
8796 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
8797
8798 exit (-1);
8799 }
8800
8801 if (setvbuf (fp, NULL, _IONBF, 0))
8802 {
8803 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
8804
8805 exit (-1);
8806 }
8807
8808 fwrite (rd, sizeof (restore_data_t), 1, fp);
8809
8810 for (uint i = 0; i < rd->argc; i++)
8811 {
8812 fprintf (fp, "%s", rd->argv[i]);
8813 fputc ('\n', fp);
8814 }
8815
8816 fflush (fp);
8817
8818 fsync (fileno (fp));
8819
8820 fclose (fp);
8821 }
8822
8823 void cycle_restore ()
8824 {
8825 const char *eff_restore_file = data.eff_restore_file;
8826 const char *new_restore_file = data.new_restore_file;
8827
8828 restore_data_t *rd = data.rd;
8829
8830 write_restore (new_restore_file, rd);
8831
8832 struct stat st;
8833
8834 memset (&st, 0, sizeof(st));
8835
8836 if (stat (eff_restore_file, &st) == 0)
8837 {
8838 if (unlink (eff_restore_file))
8839 {
8840 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
8841 }
8842 }
8843
8844 if (rename (new_restore_file, eff_restore_file))
8845 {
8846 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
8847 }
8848 }
8849
8850 void check_checkpoint ()
8851 {
8852 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
8853
8854 uint64_t words_cur = get_lowest_words_done ();
8855
8856 if (words_cur != data.checkpoint_cur_words)
8857 {
8858 myabort ();
8859 }
8860 }
8861
8862 /**
8863 * adjustments
8864 */
8865
8866 uint set_kernel_accel (uint hash_mode)
8867 {
8868 switch (hash_mode)
8869 {
8870 case 0: return GET_ACCEL (0);
8871 case 10: return GET_ACCEL (10);
8872 case 11: return GET_ACCEL (11);
8873 case 12: return GET_ACCEL (12);
8874 case 20: return GET_ACCEL (20);
8875 case 21: return GET_ACCEL (21);
8876 case 22: return GET_ACCEL (22);
8877 case 23: return GET_ACCEL (23);
8878 case 30: return GET_ACCEL (30);
8879 case 40: return GET_ACCEL (40);
8880 case 50: return GET_ACCEL (50);
8881 case 60: return GET_ACCEL (60);
8882 case 100: return GET_ACCEL (100);
8883 case 101: return GET_ACCEL (101);
8884 case 110: return GET_ACCEL (110);
8885 case 111: return GET_ACCEL (111);
8886 case 112: return GET_ACCEL (112);
8887 case 120: return GET_ACCEL (120);
8888 case 121: return GET_ACCEL (121);
8889 case 122: return GET_ACCEL (122);
8890 case 124: return GET_ACCEL (124);
8891 case 130: return GET_ACCEL (130);
8892 case 131: return GET_ACCEL (131);
8893 case 132: return GET_ACCEL (132);
8894 case 133: return GET_ACCEL (133);
8895 case 140: return GET_ACCEL (140);
8896 case 141: return GET_ACCEL (141);
8897 case 150: return GET_ACCEL (150);
8898 case 160: return GET_ACCEL (160);
8899 case 190: return GET_ACCEL (190);
8900 case 200: return GET_ACCEL (200);
8901 case 300: return GET_ACCEL (300);
8902 case 400: return GET_ACCEL (400);
8903 case 500: return GET_ACCEL (500);
8904 case 501: return GET_ACCEL (501);
8905 case 900: return GET_ACCEL (900);
8906 case 910: return GET_ACCEL (910);
8907 case 1000: return GET_ACCEL (1000);
8908 case 1100: return GET_ACCEL (1100);
8909 case 1400: return GET_ACCEL (1400);
8910 case 1410: return GET_ACCEL (1410);
8911 case 1420: return GET_ACCEL (1420);
8912 case 1421: return GET_ACCEL (1421);
8913 case 1430: return GET_ACCEL (1430);
8914 case 1440: return GET_ACCEL (1440);
8915 case 1441: return GET_ACCEL (1441);
8916 case 1450: return GET_ACCEL (1450);
8917 case 1460: return GET_ACCEL (1460);
8918 case 1500: return GET_ACCEL (1500);
8919 case 1600: return GET_ACCEL (1600);
8920 case 1700: return GET_ACCEL (1700);
8921 case 1710: return GET_ACCEL (1710);
8922 case 1711: return GET_ACCEL (1711);
8923 case 1720: return GET_ACCEL (1720);
8924 case 1722: return GET_ACCEL (1722);
8925 case 1730: return GET_ACCEL (1730);
8926 case 1731: return GET_ACCEL (1731);
8927 case 1740: return GET_ACCEL (1740);
8928 case 1750: return GET_ACCEL (1750);
8929 case 1760: return GET_ACCEL (1760);
8930 case 1800: return GET_ACCEL (1800);
8931 case 2100: return GET_ACCEL (2100);
8932 case 2400: return GET_ACCEL (2400);
8933 case 2410: return GET_ACCEL (2410);
8934 case 2500: return GET_ACCEL (2500);
8935 case 2600: return GET_ACCEL (2600);
8936 case 2611: return GET_ACCEL (2611);
8937 case 2612: return GET_ACCEL (2612);
8938 case 2711: return GET_ACCEL (2711);
8939 case 2811: return GET_ACCEL (2811);
8940 case 3000: return GET_ACCEL (3000);
8941 case 3100: return GET_ACCEL (3100);
8942 case 3200: return GET_ACCEL (3200);
8943 case 3710: return GET_ACCEL (3710);
8944 case 3711: return GET_ACCEL (3711);
8945 case 3800: return GET_ACCEL (3800);
8946 case 4300: return GET_ACCEL (4300);
8947 case 4400: return GET_ACCEL (4400);
8948 case 4500: return GET_ACCEL (4500);
8949 case 4700: return GET_ACCEL (4700);
8950 case 4800: return GET_ACCEL (4800);
8951 case 4900: return GET_ACCEL (4900);
8952 case 5000: return GET_ACCEL (5000);
8953 case 5100: return GET_ACCEL (5100);
8954 case 5200: return GET_ACCEL (5200);
8955 case 5300: return GET_ACCEL (5300);
8956 case 5400: return GET_ACCEL (5400);
8957 case 5500: return GET_ACCEL (5500);
8958 case 5600: return GET_ACCEL (5600);
8959 case 5700: return GET_ACCEL (5700);
8960 case 5800: return GET_ACCEL (5800);
8961 case 6000: return GET_ACCEL (6000);
8962 case 6100: return GET_ACCEL (6100);
8963 case 6211: return GET_ACCEL (6211);
8964 case 6212: return GET_ACCEL (6212);
8965 case 6213: return GET_ACCEL (6213);
8966 case 6221: return GET_ACCEL (6221);
8967 case 6222: return GET_ACCEL (6222);
8968 case 6223: return GET_ACCEL (6223);
8969 case 6231: return GET_ACCEL (6231);
8970 case 6232: return GET_ACCEL (6232);
8971 case 6233: return GET_ACCEL (6233);
8972 case 6241: return GET_ACCEL (6241);
8973 case 6242: return GET_ACCEL (6242);
8974 case 6243: return GET_ACCEL (6243);
8975 case 6300: return GET_ACCEL (6300);
8976 case 6400: return GET_ACCEL (6400);
8977 case 6500: return GET_ACCEL (6500);
8978 case 6600: return GET_ACCEL (6600);
8979 case 6700: return GET_ACCEL (6700);
8980 case 6800: return GET_ACCEL (6800);
8981 case 6900: return GET_ACCEL (6900);
8982 case 7100: return GET_ACCEL (7100);
8983 case 7200: return GET_ACCEL (7200);
8984 case 7300: return GET_ACCEL (7300);
8985 case 7400: return GET_ACCEL (7400);
8986 case 7500: return GET_ACCEL (7500);
8987 case 7600: return GET_ACCEL (7600);
8988 case 7700: return GET_ACCEL (7700);
8989 case 7800: return GET_ACCEL (7800);
8990 case 7900: return GET_ACCEL (7900);
8991 case 8000: return GET_ACCEL (8000);
8992 case 8100: return GET_ACCEL (8100);
8993 case 8200: return GET_ACCEL (8200);
8994 case 8300: return GET_ACCEL (8300);
8995 case 8400: return GET_ACCEL (8400);
8996 case 8500: return GET_ACCEL (8500);
8997 case 8600: return GET_ACCEL (8600);
8998 case 8700: return GET_ACCEL (8700);
8999 case 8800: return GET_ACCEL (8800);
9000 case 8900: return GET_ACCEL (8900);
9001 case 9000: return GET_ACCEL (9000);
9002 case 9100: return GET_ACCEL (9100);
9003 case 9200: return GET_ACCEL (9200);
9004 case 9300: return GET_ACCEL (9300);
9005 case 9400: return GET_ACCEL (9400);
9006 case 9500: return GET_ACCEL (9500);
9007 case 9600: return GET_ACCEL (9600);
9008 case 9700: return GET_ACCEL (9700);
9009 case 9710: return GET_ACCEL (9710);
9010 case 9720: return GET_ACCEL (9720);
9011 case 9800: return GET_ACCEL (9800);
9012 case 9810: return GET_ACCEL (9810);
9013 case 9820: return GET_ACCEL (9820);
9014 case 9900: return GET_ACCEL (9900);
9015 case 10000: return GET_ACCEL (10000);
9016 case 10100: return GET_ACCEL (10100);
9017 case 10200: return GET_ACCEL (10200);
9018 case 10300: return GET_ACCEL (10300);
9019 case 10400: return GET_ACCEL (10400);
9020 case 10410: return GET_ACCEL (10410);
9021 case 10420: return GET_ACCEL (10420);
9022 case 10500: return GET_ACCEL (10500);
9023 case 10600: return GET_ACCEL (10600);
9024 case 10700: return GET_ACCEL (10700);
9025 case 10800: return GET_ACCEL (10800);
9026 case 10900: return GET_ACCEL (10900);
9027 case 11000: return GET_ACCEL (11000);
9028 case 11100: return GET_ACCEL (11100);
9029 case 11200: return GET_ACCEL (11200);
9030 case 11300: return GET_ACCEL (11300);
9031 case 11400: return GET_ACCEL (11400);
9032 case 11500: return GET_ACCEL (11500);
9033 case 11600: return GET_ACCEL (11600);
9034 case 11700: return GET_ACCEL (11700);
9035 case 11800: return GET_ACCEL (11800);
9036 case 11900: return GET_ACCEL (11900);
9037 case 12000: return GET_ACCEL (12000);
9038 case 12100: return GET_ACCEL (12100);
9039 case 12200: return GET_ACCEL (12200);
9040 case 12300: return GET_ACCEL (12300);
9041 case 12400: return GET_ACCEL (12400);
9042 case 12500: return GET_ACCEL (12500);
9043 case 12600: return GET_ACCEL (12600);
9044 case 12700: return GET_ACCEL (12700);
9045 case 12800: return GET_ACCEL (12800);
9046 case 12900: return GET_ACCEL (12900);
9047 case 13000: return GET_ACCEL (13000);
9048 }
9049
9050 return 0;
9051 }
9052
9053 uint set_kernel_loops (uint hash_mode)
9054 {
9055 switch (hash_mode)
9056 {
9057 case 0: return GET_LOOPS (0);
9058 case 10: return GET_LOOPS (10);
9059 case 11: return GET_LOOPS (11);
9060 case 12: return GET_LOOPS (12);
9061 case 20: return GET_LOOPS (20);
9062 case 21: return GET_LOOPS (21);
9063 case 22: return GET_LOOPS (22);
9064 case 23: return GET_LOOPS (23);
9065 case 30: return GET_LOOPS (30);
9066 case 40: return GET_LOOPS (40);
9067 case 50: return GET_LOOPS (50);
9068 case 60: return GET_LOOPS (60);
9069 case 100: return GET_LOOPS (100);
9070 case 101: return GET_LOOPS (101);
9071 case 110: return GET_LOOPS (110);
9072 case 111: return GET_LOOPS (111);
9073 case 112: return GET_LOOPS (112);
9074 case 120: return GET_LOOPS (120);
9075 case 121: return GET_LOOPS (121);
9076 case 122: return GET_LOOPS (122);
9077 case 124: return GET_LOOPS (124);
9078 case 130: return GET_LOOPS (130);
9079 case 131: return GET_LOOPS (131);
9080 case 132: return GET_LOOPS (132);
9081 case 133: return GET_LOOPS (133);
9082 case 140: return GET_LOOPS (140);
9083 case 141: return GET_LOOPS (141);
9084 case 150: return GET_LOOPS (150);
9085 case 160: return GET_LOOPS (160);
9086 case 190: return GET_LOOPS (190);
9087 case 200: return GET_LOOPS (200);
9088 case 300: return GET_LOOPS (300);
9089 case 400: return GET_LOOPS (400);
9090 case 500: return GET_LOOPS (500);
9091 case 501: return GET_LOOPS (501);
9092 case 900: return GET_LOOPS (900);
9093 case 910: return GET_LOOPS (910);
9094 case 1000: return GET_LOOPS (1000);
9095 case 1100: return GET_LOOPS (1100);
9096 case 1400: return GET_LOOPS (1400);
9097 case 1410: return GET_LOOPS (1410);
9098 case 1420: return GET_LOOPS (1420);
9099 case 1421: return GET_LOOPS (1421);
9100 case 1430: return GET_LOOPS (1430);
9101 case 1440: return GET_LOOPS (1440);
9102 case 1441: return GET_LOOPS (1441);
9103 case 1450: return GET_LOOPS (1450);
9104 case 1460: return GET_LOOPS (1460);
9105 case 1500: return GET_LOOPS (1500);
9106 case 1600: return GET_LOOPS (1600);
9107 case 1700: return GET_LOOPS (1700);
9108 case 1710: return GET_LOOPS (1710);
9109 case 1711: return GET_LOOPS (1711);
9110 case 1720: return GET_LOOPS (1720);
9111 case 1722: return GET_LOOPS (1722);
9112 case 1730: return GET_LOOPS (1730);
9113 case 1731: return GET_LOOPS (1731);
9114 case 1740: return GET_LOOPS (1740);
9115 case 1750: return GET_LOOPS (1750);
9116 case 1760: return GET_LOOPS (1760);
9117 case 1800: return GET_LOOPS (1800);
9118 case 2100: return GET_LOOPS (2100);
9119 case 2400: return GET_LOOPS (2400);
9120 case 2410: return GET_LOOPS (2410);
9121 case 2500: return GET_LOOPS (2500);
9122 case 2600: return GET_LOOPS (2600);
9123 case 2611: return GET_LOOPS (2611);
9124 case 2612: return GET_LOOPS (2612);
9125 case 2711: return GET_LOOPS (2711);
9126 case 2811: return GET_LOOPS (2811);
9127 case 3000: return GET_LOOPS (3000);
9128 case 3100: return GET_LOOPS (3100);
9129 case 3200: return GET_LOOPS (3200);
9130 case 3710: return GET_LOOPS (3710);
9131 case 3711: return GET_LOOPS (3711);
9132 case 3800: return GET_LOOPS (3800);
9133 case 4300: return GET_LOOPS (4300);
9134 case 4400: return GET_LOOPS (4400);
9135 case 4500: return GET_LOOPS (4500);
9136 case 4700: return GET_LOOPS (4700);
9137 case 4800: return GET_LOOPS (4800);
9138 case 4900: return GET_LOOPS (4900);
9139 case 5000: return GET_LOOPS (5000);
9140 case 5100: return GET_LOOPS (5100);
9141 case 5200: return GET_LOOPS (5200);
9142 case 5300: return GET_LOOPS (5300);
9143 case 5400: return GET_LOOPS (5400);
9144 case 5500: return GET_LOOPS (5500);
9145 case 5600: return GET_LOOPS (5600);
9146 case 5700: return GET_LOOPS (5700);
9147 case 5800: return GET_LOOPS (5800);
9148 case 6000: return GET_LOOPS (6000);
9149 case 6100: return GET_LOOPS (6100);
9150 case 6211: return GET_LOOPS (6211);
9151 case 6212: return GET_LOOPS (6212);
9152 case 6213: return GET_LOOPS (6213);
9153 case 6221: return GET_LOOPS (6221);
9154 case 6222: return GET_LOOPS (6222);
9155 case 6223: return GET_LOOPS (6223);
9156 case 6231: return GET_LOOPS (6231);
9157 case 6232: return GET_LOOPS (6232);
9158 case 6233: return GET_LOOPS (6233);
9159 case 6241: return GET_LOOPS (6241);
9160 case 6242: return GET_LOOPS (6242);
9161 case 6243: return GET_LOOPS (6243);
9162 case 6300: return GET_LOOPS (6300);
9163 case 6400: return GET_LOOPS (6400);
9164 case 6500: return GET_LOOPS (6500);
9165 case 6600: return GET_LOOPS (6600);
9166 case 6700: return GET_LOOPS (6700);
9167 case 6800: return GET_LOOPS (6800);
9168 case 6900: return GET_LOOPS (6900);
9169 case 7100: return GET_LOOPS (7100);
9170 case 7200: return GET_LOOPS (7200);
9171 case 7300: return GET_LOOPS (7300);
9172 case 7400: return GET_LOOPS (7400);
9173 case 7500: return GET_LOOPS (7500);
9174 case 7600: return GET_LOOPS (7600);
9175 case 7700: return GET_LOOPS (7700);
9176 case 7800: return GET_LOOPS (7800);
9177 case 7900: return GET_LOOPS (7900);
9178 case 8000: return GET_LOOPS (8000);
9179 case 8100: return GET_LOOPS (8100);
9180 case 8200: return GET_LOOPS (8200);
9181 case 8300: return GET_LOOPS (8300);
9182 case 8400: return GET_LOOPS (8400);
9183 case 8500: return GET_LOOPS (8500);
9184 case 8600: return GET_LOOPS (8600);
9185 case 8700: return GET_LOOPS (8700);
9186 case 8800: return GET_LOOPS (8800);
9187 case 8900: return GET_LOOPS (8900);
9188 case 9000: return GET_LOOPS (9000);
9189 case 9100: return GET_LOOPS (9100);
9190 case 9200: return GET_LOOPS (9200);
9191 case 9300: return GET_LOOPS (9300);
9192 case 9400: return GET_LOOPS (9400);
9193 case 9500: return GET_LOOPS (9500);
9194 case 9600: return GET_LOOPS (9600);
9195 case 9700: return GET_LOOPS (9700);
9196 case 9710: return GET_LOOPS (9710);
9197 case 9720: return GET_LOOPS (9720);
9198 case 9800: return GET_LOOPS (9800);
9199 case 9810: return GET_LOOPS (9810);
9200 case 9820: return GET_LOOPS (9820);
9201 case 9900: return GET_LOOPS (9900);
9202 case 10000: return GET_LOOPS (10000);
9203 case 10100: return GET_LOOPS (10100);
9204 case 10200: return GET_LOOPS (10200);
9205 case 10300: return GET_LOOPS (10300);
9206 case 10400: return GET_LOOPS (10400);
9207 case 10410: return GET_LOOPS (10410);
9208 case 10420: return GET_LOOPS (10420);
9209 case 10500: return GET_LOOPS (10500);
9210 case 10600: return GET_LOOPS (10600);
9211 case 10700: return GET_LOOPS (10700);
9212 case 10800: return GET_LOOPS (10800);
9213 case 10900: return GET_LOOPS (10900);
9214 case 11000: return GET_LOOPS (11000);
9215 case 11100: return GET_LOOPS (11100);
9216 case 11200: return GET_LOOPS (11200);
9217 case 11300: return GET_LOOPS (11300);
9218 case 11400: return GET_LOOPS (11400);
9219 case 11500: return GET_LOOPS (11500);
9220 case 11600: return GET_LOOPS (11600);
9221 case 11700: return GET_LOOPS (11700);
9222 case 11800: return GET_LOOPS (11800);
9223 case 11900: return GET_LOOPS (11900);
9224 case 12000: return GET_LOOPS (12000);
9225 case 12100: return GET_LOOPS (12100);
9226 case 12200: return GET_LOOPS (12200);
9227 case 12300: return GET_LOOPS (12300);
9228 case 12400: return GET_LOOPS (12400);
9229 case 12500: return GET_LOOPS (12500);
9230 case 12600: return GET_LOOPS (12600);
9231 case 12700: return GET_LOOPS (12700);
9232 case 12800: return GET_LOOPS (12800);
9233 case 12900: return GET_LOOPS (12900);
9234 case 13000: return GET_LOOPS (13000);
9235 }
9236
9237 return 0;
9238 }
9239
9240 /**
9241 * parser
9242 */
9243
9244 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9245 {
9246 char tmp[256];
9247
9248 if (salt_len > sizeof(tmp))
9249 {
9250 return UINT_MAX;
9251 }
9252
9253 memset (tmp, 0, sizeof (tmp));
9254 memcpy (tmp, in, salt_len);
9255
9256 if (data.opts_type & OPTS_TYPE_ST_HEX)
9257 {
9258 if ((salt_len % 2) == 0)
9259 {
9260 uint new_salt_len = salt_len / 2;
9261
9262 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9263 {
9264 char p0 = tmp[j + 0];
9265 char p1 = tmp[j + 1];
9266
9267 tmp[i] = hex_convert (p1) << 0;
9268 tmp[i] |= hex_convert (p0) << 4;
9269 }
9270
9271 salt_len = new_salt_len;
9272 }
9273 else
9274 {
9275 return UINT_MAX;
9276 }
9277 }
9278 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9279 {
9280 salt_len = base64_decode (base64_to_int, in, salt_len, tmp);
9281 }
9282
9283 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9284
9285 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9286 {
9287 if (salt_len < 20)
9288 {
9289 uint *tmp_uint = (uint *) tmp;
9290
9291 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9292 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9293 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9294 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9295 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9296 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9297 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9298 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9299 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9300 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9301
9302 salt_len = salt_len * 2;
9303 }
9304 else
9305 {
9306 return UINT_MAX;
9307 }
9308 }
9309
9310 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9311 {
9312 lowercase (tmp, salt_len);
9313 }
9314
9315 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9316 {
9317 uppercase (tmp, salt_len);
9318 }
9319
9320 uint len = salt_len;
9321
9322 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9323 {
9324 tmp[len++] = 0x80;
9325 }
9326
9327 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9328 {
9329 tmp[len++] = 0x01;
9330 }
9331
9332 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9333 {
9334 uint *tmp_uint = (uint *) tmp;
9335
9336 uint max = len / 4;
9337
9338 if (len % 4) max++;
9339
9340 for (uint i = 0; i < max; i++)
9341 {
9342 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9343 }
9344
9345 // Important: we may need to increase the length of memcpy since
9346 // we don't want to "loose" some swapped bytes (could happen if
9347 // they do not perfectly fit in the 4-byte blocks)
9348 // Memcpy does always copy the bytes in the BE order, but since
9349 // we swapped them, some important bytes could be in positions
9350 // we normally skip with the original len
9351
9352 if (len % 4) len += 4 - (len % 4);
9353 }
9354
9355 memcpy (out, tmp, len);
9356
9357 return (salt_len);
9358 }
9359
9360 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9361 {
9362 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9363
9364 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9365
9366 uint32_t *digest = (uint32_t *) hash_buf->digest;
9367
9368 salt_t *salt = hash_buf->salt;
9369
9370 memcpy ((char *) salt->salt_sign, input_buf, 6);
9371
9372 char *iter_pos = input_buf + 4;
9373
9374 salt->salt_iter = 1 << atoi (iter_pos);
9375
9376 char *salt_pos = strchr (iter_pos, '$');
9377
9378 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9379
9380 salt_pos++;
9381
9382 uint salt_len = 16;
9383
9384 salt->salt_len = salt_len;
9385
9386 char tmp_buf[100];
9387
9388 memset (tmp_buf, 0, sizeof (tmp_buf));
9389
9390 base64_decode (bf64_to_int, salt_pos, 22, tmp_buf);
9391
9392 char *salt_buf_ptr = (char *) salt->salt_buf;
9393
9394 memcpy (salt_buf_ptr, tmp_buf, 16);
9395
9396 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9397 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9398 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9399 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9400
9401 char *hash_pos = salt_pos + 22;
9402
9403 memset (tmp_buf, 0, sizeof (tmp_buf));
9404
9405 base64_decode (bf64_to_int, hash_pos, 31, tmp_buf);
9406
9407 memcpy (digest, tmp_buf, 24);
9408
9409 digest[0] = byte_swap_32 (digest[0]);
9410 digest[1] = byte_swap_32 (digest[1]);
9411 digest[2] = byte_swap_32 (digest[2]);
9412 digest[3] = byte_swap_32 (digest[3]);
9413 digest[4] = byte_swap_32 (digest[4]);
9414 digest[5] = byte_swap_32 (digest[5]);
9415
9416 digest[5] &= ~0xff; // its just 23 not 24 !
9417
9418 return (PARSER_OK);
9419 }
9420
9421 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9422 {
9423 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9424
9425 uint32_t *digest = (uint32_t *) hash_buf->digest;
9426
9427 char tmp_buf[100];
9428
9429 memset (tmp_buf, 0, sizeof (tmp_buf));
9430
9431 base64_decode (itoa64_to_int, input_buf, 43, tmp_buf);
9432
9433 memcpy (digest, tmp_buf, 32);
9434
9435 digest[0] = byte_swap_32 (digest[0]);
9436 digest[1] = byte_swap_32 (digest[1]);
9437 digest[2] = byte_swap_32 (digest[2]);
9438 digest[3] = byte_swap_32 (digest[3]);
9439 digest[4] = byte_swap_32 (digest[4]);
9440 digest[5] = byte_swap_32 (digest[5]);
9441 digest[6] = byte_swap_32 (digest[6]);
9442 digest[7] = byte_swap_32 (digest[7]);
9443
9444 digest[0] -= SHA256M_A;
9445 digest[1] -= SHA256M_B;
9446 digest[2] -= SHA256M_C;
9447 digest[3] -= SHA256M_D;
9448 digest[4] -= SHA256M_E;
9449 digest[5] -= SHA256M_F;
9450 digest[6] -= SHA256M_G;
9451 digest[7] -= SHA256M_H;
9452
9453 return (PARSER_OK);
9454 }
9455
9456 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9457 {
9458 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9459
9460 uint32_t *digest = (uint32_t *) hash_buf->digest;
9461
9462 digest[0] = hex_to_uint (&input_buf[ 0]);
9463 digest[1] = hex_to_uint (&input_buf[ 8]);
9464
9465 digest[0] = byte_swap_32 (digest[0]);
9466 digest[1] = byte_swap_32 (digest[1]);
9467
9468 uint tt;
9469
9470 IP (digest[0], digest[1], tt);
9471
9472 digest[0] = digest[0];
9473 digest[1] = digest[1];
9474 digest[2] = 0;
9475 digest[3] = 0;
9476
9477 return (PARSER_OK);
9478 }
9479
9480 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9481 {
9482 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9483
9484 uint32_t *digest = (uint32_t *) hash_buf->digest;
9485
9486 salt_t *salt = hash_buf->salt;
9487
9488 char *hash_pos = input_buf + 8;
9489
9490 digest[0] = hex_to_uint (&hash_pos[ 0]);
9491 digest[1] = hex_to_uint (&hash_pos[ 8]);
9492 digest[2] = hex_to_uint (&hash_pos[16]);
9493 digest[3] = hex_to_uint (&hash_pos[24]);
9494 digest[4] = hex_to_uint (&hash_pos[32]);
9495
9496 digest[0] -= SHA1M_A;
9497 digest[1] -= SHA1M_B;
9498 digest[2] -= SHA1M_C;
9499 digest[3] -= SHA1M_D;
9500 digest[4] -= SHA1M_E;
9501
9502 uint salt_len = 8;
9503
9504 char *salt_buf_ptr = (char *) salt->salt_buf;
9505
9506 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9507
9508 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9509
9510 salt->salt_len = salt_len;
9511
9512 return (PARSER_OK);
9513 }
9514
9515 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9516 {
9517 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9518
9519 uint64_t *digest = (uint64_t *) hash_buf->digest;
9520
9521 salt_t *salt = hash_buf->salt;
9522
9523 char *hash_pos = input_buf + 8;
9524
9525 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
9526 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
9527 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
9528 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
9529 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
9530 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
9531 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
9532 digest[7] = hex_to_uint64_t (&hash_pos[112]);
9533
9534 digest[0] -= SHA512M_A;
9535 digest[1] -= SHA512M_B;
9536 digest[2] -= SHA512M_C;
9537 digest[3] -= SHA512M_D;
9538 digest[4] -= SHA512M_E;
9539 digest[5] -= SHA512M_F;
9540 digest[6] -= SHA512M_G;
9541 digest[7] -= SHA512M_H;
9542
9543 uint salt_len = 8;
9544
9545 char *salt_buf_ptr = (char *) salt->salt_buf;
9546
9547 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9548
9549 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9550
9551 salt->salt_len = salt_len;
9552
9553 return (PARSER_OK);
9554 }
9555
9556 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9557 {
9558 if (data.opts_type & OPTS_TYPE_ST_HEX)
9559 {
9560 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9561 }
9562 else
9563 {
9564 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9565 }
9566
9567 uint32_t *digest = (uint32_t *) hash_buf->digest;
9568
9569 salt_t *salt = hash_buf->salt;
9570
9571 digest[0] = hex_to_uint (&input_buf[ 0]);
9572 digest[1] = hex_to_uint (&input_buf[ 8]);
9573 digest[2] = hex_to_uint (&input_buf[16]);
9574 digest[3] = hex_to_uint (&input_buf[24]);
9575
9576 digest[0] = byte_swap_32 (digest[0]);
9577 digest[1] = byte_swap_32 (digest[1]);
9578 digest[2] = byte_swap_32 (digest[2]);
9579 digest[3] = byte_swap_32 (digest[3]);
9580
9581 digest[0] -= MD5M_A;
9582 digest[1] -= MD5M_B;
9583 digest[2] -= MD5M_C;
9584 digest[3] -= MD5M_D;
9585
9586 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9587
9588 uint salt_len = input_len - 32 - 1;
9589
9590 char *salt_buf = input_buf + 32 + 1;
9591
9592 char *salt_buf_ptr = (char *) salt->salt_buf;
9593
9594 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9595
9596 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9597
9598 salt->salt_len = salt_len;
9599
9600 return (PARSER_OK);
9601 }
9602
9603 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9604 {
9605 if (data.opts_type & OPTS_TYPE_ST_HEX)
9606 {
9607 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9608 }
9609 else
9610 {
9611 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9612 }
9613
9614 // unscramble
9615
9616 char clean_input_buf[32];
9617
9618 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9619 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9620
9621 for (int i = 0, j = 0, k = 0; i < 30; i++)
9622 {
9623 if (i == pos[j])
9624 {
9625 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9626
9627 j++;
9628 }
9629 else
9630 {
9631 clean_input_buf[k] = input_buf[i];
9632
9633 k++;
9634 }
9635 }
9636
9637 // base64 decode
9638
9639 uint32_t *digest = (uint32_t *) hash_buf->digest;
9640
9641 salt_t *salt = hash_buf->salt;
9642
9643 char a, b, c, d, e, f;
9644
9645 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9646 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9647 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9648 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9649 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9650 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9651
9652 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9653 | (((d << 12) | (e << 6) | (f)) << 0);
9654
9655 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9656 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9657 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9658 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9659 e = base64_to_int (clean_input_buf[10] & 0x7f);
9660 f = base64_to_int (clean_input_buf[11] & 0x7f);
9661
9662 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9663 | (((d << 12) | (e << 6) | (f)) << 0);
9664
9665 a = base64_to_int (clean_input_buf[12] & 0x7f);
9666 b = base64_to_int (clean_input_buf[13] & 0x7f);
9667 c = base64_to_int (clean_input_buf[14] & 0x7f);
9668 d = base64_to_int (clean_input_buf[15] & 0x7f);
9669 e = base64_to_int (clean_input_buf[16] & 0x7f);
9670 f = base64_to_int (clean_input_buf[17] & 0x7f);
9671
9672 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9673 | (((d << 12) | (e << 6) | (f)) << 0);
9674
9675 a = base64_to_int (clean_input_buf[18] & 0x7f);
9676 b = base64_to_int (clean_input_buf[19] & 0x7f);
9677 c = base64_to_int (clean_input_buf[20] & 0x7f);
9678 d = base64_to_int (clean_input_buf[21] & 0x7f);
9679 e = base64_to_int (clean_input_buf[22] & 0x7f);
9680 f = base64_to_int (clean_input_buf[23] & 0x7f);
9681
9682 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
9683 | (((d << 12) | (e << 6) | (f)) << 0);
9684
9685 digest[0] = byte_swap_32 (digest[0]);
9686 digest[1] = byte_swap_32 (digest[1]);
9687 digest[2] = byte_swap_32 (digest[2]);
9688 digest[3] = byte_swap_32 (digest[3]);
9689
9690 digest[0] -= MD5M_A;
9691 digest[1] -= MD5M_B;
9692 digest[2] -= MD5M_C;
9693 digest[3] -= MD5M_D;
9694
9695 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
9696
9697 uint salt_len = input_len - 30 - 1;
9698
9699 char *salt_buf = input_buf + 30 + 1;
9700
9701 char *salt_buf_ptr = (char *) salt->salt_buf;
9702
9703 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9704
9705 // max. salt length: salt_buf[32] => 32 - 22 (":Administration Tools:") = 10
9706 if (salt_len > 10) return (PARSER_SALT_LENGTH);
9707
9708 salt->salt_len = salt_len;
9709
9710 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9711
9712 salt->salt_len += 22;
9713
9714 return (PARSER_OK);
9715 }
9716
9717 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9718 {
9719 if (data.opts_type & OPTS_TYPE_ST_HEX)
9720 {
9721 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9722 }
9723 else
9724 {
9725 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9726 }
9727
9728 uint32_t *digest = (uint32_t *) hash_buf->digest;
9729
9730 salt_t *salt = hash_buf->salt;
9731
9732 digest[0] = hex_to_uint (&input_buf[ 0]);
9733 digest[1] = hex_to_uint (&input_buf[ 8]);
9734 digest[2] = hex_to_uint (&input_buf[16]);
9735 digest[3] = hex_to_uint (&input_buf[24]);
9736 digest[4] = hex_to_uint (&input_buf[32]);
9737
9738 digest[0] -= SHA1M_A;
9739 digest[1] -= SHA1M_B;
9740 digest[2] -= SHA1M_C;
9741 digest[3] -= SHA1M_D;
9742 digest[4] -= SHA1M_E;
9743
9744 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9745
9746 uint salt_len = input_len - 40 - 1;
9747
9748 char *salt_buf = input_buf + 40 + 1;
9749
9750 char *salt_buf_ptr = (char *) salt->salt_buf;
9751
9752 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9753
9754 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9755
9756 salt->salt_len = salt_len;
9757
9758 return (PARSER_OK);
9759 }
9760
9761 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9762 {
9763 if (data.opts_type & OPTS_TYPE_ST_HEX)
9764 {
9765 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9766 }
9767 else
9768 {
9769 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9770 }
9771
9772 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9773
9774 char *iter_pos = input_buf + 6;
9775
9776 salt_t *salt = hash_buf->salt;
9777
9778 salt->salt_iter = atoi (iter_pos) - 1;
9779
9780 char *salt_pos = strchr (iter_pos, '#');
9781
9782 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9783
9784 salt_pos++;
9785
9786 char *digest_pos = strchr (salt_pos, '#');
9787
9788 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9789
9790 digest_pos++;
9791
9792 uint salt_len = digest_pos - salt_pos - 1;
9793
9794 uint32_t *digest = (uint32_t *) hash_buf->digest;
9795
9796 digest[0] = hex_to_uint (&digest_pos[ 0]);
9797 digest[1] = hex_to_uint (&digest_pos[ 8]);
9798 digest[2] = hex_to_uint (&digest_pos[16]);
9799 digest[3] = hex_to_uint (&digest_pos[24]);
9800
9801 char *salt_buf_ptr = (char *) salt->salt_buf;
9802
9803 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9804
9805 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9806
9807 salt->salt_len = salt_len;
9808
9809 return (PARSER_OK);
9810 }
9811
9812 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9813 {
9814 uint32_t *digest = (uint32_t *) hash_buf->digest;
9815
9816 salt_t *salt = hash_buf->salt;
9817
9818 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9819
9820 hccap_t in;
9821
9822 memcpy (&in, input_buf, input_len);
9823
9824 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9825
9826 memcpy (digest, in.keymic, 16);
9827
9828 /*
9829 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9830 The phrase "Pairwise key expansion"
9831 Access Point Address (Referred to as Authenticator Address AA)
9832 Supplicant Address (referred to as Supplicant Address SA)
9833 Access Point Nonce (referred to as Authenticator Anonce)
9834 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9835 */
9836
9837 uint salt_len = strlen (in.essid);
9838
9839 memcpy (salt->salt_buf, in.essid, salt_len);
9840
9841 salt->salt_len = salt_len;
9842
9843 salt->salt_iter = ROUNDS_WPA2 - 1;
9844
9845 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
9846
9847 memcpy (pke_ptr, "Pairwise key expansion", 23);
9848
9849 if (memcmp (in.mac1, in.mac2, 6) < 0)
9850 {
9851 memcpy (pke_ptr + 23, in.mac1, 6);
9852 memcpy (pke_ptr + 29, in.mac2, 6);
9853 }
9854 else
9855 {
9856 memcpy (pke_ptr + 23, in.mac2, 6);
9857 memcpy (pke_ptr + 29, in.mac1, 6);
9858 }
9859
9860 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
9861 {
9862 memcpy (pke_ptr + 35, in.nonce1, 32);
9863 memcpy (pke_ptr + 67, in.nonce2, 32);
9864 }
9865 else
9866 {
9867 memcpy (pke_ptr + 35, in.nonce2, 32);
9868 memcpy (pke_ptr + 67, in.nonce1, 32);
9869 }
9870
9871 for (int i = 0; i < 25; i++)
9872 {
9873 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
9874 }
9875
9876 wpa->keyver = in.keyver;
9877
9878 if (wpa->keyver > 255)
9879 {
9880 log_info ("ATTENTION!");
9881 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
9882 log_info (" This could be due to a recent aircrack-ng bug.");
9883 log_info (" The key version was automatically reset to a reasonable value.");
9884 log_info ("");
9885
9886 wpa->keyver &= 0xff;
9887 }
9888
9889 wpa->eapol_size = in.eapol_size;
9890
9891 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
9892
9893 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
9894
9895 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
9896
9897 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
9898
9899 if (wpa->keyver == 1)
9900 {
9901 // nothing to do
9902 }
9903 else
9904 {
9905 digest[0] = byte_swap_32 (digest[0]);
9906 digest[1] = byte_swap_32 (digest[1]);
9907 digest[2] = byte_swap_32 (digest[2]);
9908 digest[3] = byte_swap_32 (digest[3]);
9909
9910 for (int i = 0; i < 64; i++)
9911 {
9912 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
9913 }
9914 }
9915
9916 salt->salt_buf[10] = digest[1];
9917 salt->salt_buf[11] = digest[2];
9918
9919 return (PARSER_OK);
9920 }
9921
9922 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9923 {
9924 uint32_t *digest = (uint32_t *) hash_buf->digest;
9925
9926 salt_t *salt = hash_buf->salt;
9927
9928 if (input_len == 0)
9929 {
9930 log_error ("Password Safe v2 container not specified");
9931
9932 exit (-1);
9933 }
9934
9935 FILE *fp = fopen (input_buf, "rb");
9936
9937 if (fp == NULL)
9938 {
9939 log_error ("%s: %s", input_buf, strerror (errno));
9940
9941 exit (-1);
9942 }
9943
9944 typedef struct
9945 {
9946 uint32_t random[2];
9947 uint32_t hash[5];
9948 uint32_t salt[5]; // unused, but makes better valid check
9949 uint32_t iv[2]; // unused, but makes better valid check
9950
9951 } psafe2_hdr;
9952
9953 psafe2_hdr buf;
9954
9955 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
9956
9957 fclose (fp);
9958
9959 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
9960
9961 salt->salt_buf[0] = buf.random[0];
9962 salt->salt_buf[1] = buf.random[1];
9963
9964 salt->salt_len = 8;
9965 salt->salt_iter = 1000;
9966
9967 digest[0] = byte_swap_32 (buf.hash[0]);
9968 digest[1] = byte_swap_32 (buf.hash[1]);
9969 digest[2] = byte_swap_32 (buf.hash[2]);
9970 digest[3] = byte_swap_32 (buf.hash[3]);
9971 digest[4] = byte_swap_32 (buf.hash[4]);
9972
9973 return (PARSER_OK);
9974 }
9975
9976 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9977 {
9978 uint32_t *digest = (uint32_t *) hash_buf->digest;
9979
9980 salt_t *salt = hash_buf->salt;
9981
9982 if (input_len == 0)
9983 {
9984 log_error (".psafe3 not specified");
9985
9986 exit (-1);
9987 }
9988
9989 FILE *fp = fopen (input_buf, "rb");
9990
9991 if (fp == NULL)
9992 {
9993 log_error ("%s: %s", input_buf, strerror (errno));
9994
9995 exit (-1);
9996 }
9997
9998 psafe3_t in;
9999
10000 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10001
10002 fclose (fp);
10003
10004 data.hashfile = input_buf; // we will need this in case it gets cracked
10005
10006 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10007
10008 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10009
10010 salt->salt_iter = in.iterations + 1;
10011
10012 salt->salt_buf[0] = in.salt_buf[0];
10013 salt->salt_buf[1] = in.salt_buf[1];
10014 salt->salt_buf[2] = in.salt_buf[2];
10015 salt->salt_buf[3] = in.salt_buf[3];
10016 salt->salt_buf[4] = in.salt_buf[4];
10017 salt->salt_buf[5] = in.salt_buf[5];
10018 salt->salt_buf[6] = in.salt_buf[6];
10019 salt->salt_buf[7] = in.salt_buf[7];
10020
10021 salt->salt_len = 32;
10022
10023 digest[0] = in.hash_buf[0];
10024 digest[1] = in.hash_buf[1];
10025 digest[2] = in.hash_buf[2];
10026 digest[3] = in.hash_buf[3];
10027 digest[4] = in.hash_buf[4];
10028 digest[5] = in.hash_buf[5];
10029 digest[6] = in.hash_buf[6];
10030 digest[7] = in.hash_buf[7];
10031
10032 digest[0] = byte_swap_32 (digest[0]);
10033 digest[1] = byte_swap_32 (digest[1]);
10034 digest[2] = byte_swap_32 (digest[2]);
10035 digest[3] = byte_swap_32 (digest[3]);
10036 digest[4] = byte_swap_32 (digest[4]);
10037 digest[5] = byte_swap_32 (digest[5]);
10038 digest[6] = byte_swap_32 (digest[6]);
10039 digest[7] = byte_swap_32 (digest[7]);
10040
10041 return (PARSER_OK);
10042 }
10043
10044 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10045 {
10046 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10047
10048 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10049
10050 uint32_t *digest = (uint32_t *) hash_buf->digest;
10051
10052 salt_t *salt = hash_buf->salt;
10053
10054 char *iter_pos = input_buf + 3;
10055
10056 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10057
10058 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10059
10060 memcpy ((char *) salt->salt_sign, input_buf, 4);
10061
10062 salt->salt_iter = salt_iter;
10063
10064 char *salt_pos = iter_pos + 1;
10065
10066 uint salt_len = 8;
10067
10068 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10069
10070 salt->salt_len = salt_len;
10071
10072 char *hash_pos = salt_pos + salt_len;
10073
10074 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10075
10076 return (PARSER_OK);
10077 }
10078
10079 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10080 {
10081 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10082
10083 uint32_t *digest = (uint32_t *) hash_buf->digest;
10084
10085 salt_t *salt = hash_buf->salt;
10086
10087 char *salt_pos = input_buf + 3;
10088
10089 uint iterations_len = 0;
10090
10091 if (memcmp (salt_pos, "rounds=", 7) == 0)
10092 {
10093 salt_pos += 7;
10094
10095 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10096
10097 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10098 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10099
10100 salt_pos[0] = 0x0;
10101
10102 salt->salt_iter = atoi (salt_pos - iterations_len);
10103
10104 salt_pos += 1;
10105
10106 iterations_len += 8;
10107 }
10108 else
10109 {
10110 salt->salt_iter = ROUNDS_MD5CRYPT;
10111 }
10112
10113 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10114
10115 char *hash_pos = strchr (salt_pos, '$');
10116
10117 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10118
10119 uint salt_len = hash_pos - salt_pos;
10120
10121 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10122
10123 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10124
10125 salt->salt_len = salt_len;
10126
10127 hash_pos++;
10128
10129 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10130
10131 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10132
10133 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10134
10135 return (PARSER_OK);
10136 }
10137
10138 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10139 {
10140 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10141
10142 uint32_t *digest = (uint32_t *) hash_buf->digest;
10143
10144 salt_t *salt = hash_buf->salt;
10145
10146 char *salt_pos = input_buf + 6;
10147
10148 uint iterations_len = 0;
10149
10150 if (memcmp (salt_pos, "rounds=", 7) == 0)
10151 {
10152 salt_pos += 7;
10153
10154 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10155
10156 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10157 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10158
10159 salt_pos[0] = 0x0;
10160
10161 salt->salt_iter = atoi (salt_pos - iterations_len);
10162
10163 salt_pos += 1;
10164
10165 iterations_len += 8;
10166 }
10167 else
10168 {
10169 salt->salt_iter = ROUNDS_MD5CRYPT;
10170 }
10171
10172 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10173
10174 char *hash_pos = strchr (salt_pos, '$');
10175
10176 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10177
10178 uint salt_len = hash_pos - salt_pos;
10179
10180 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10181
10182 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10183
10184 salt->salt_len = salt_len;
10185
10186 hash_pos++;
10187
10188 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10189
10190 return (PARSER_OK);
10191 }
10192
10193 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10194 {
10195 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10196
10197 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10198
10199 uint32_t *digest = (uint32_t *) hash_buf->digest;
10200
10201 salt_t *salt = hash_buf->salt;
10202
10203 char *salt_pos = input_buf + 14;
10204
10205 char *hash_pos = strchr (salt_pos, '*');
10206
10207 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10208
10209 hash_pos++;
10210
10211 uint salt_len = hash_pos - salt_pos - 1;
10212
10213 char *salt_buf_ptr = (char *) salt->salt_buf;
10214
10215 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10216
10217 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10218
10219 salt->salt_len = salt_len;
10220
10221 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
10222
10223 base64_decode (base64_to_int, hash_pos, 27, tmp_buf);
10224
10225 memcpy (digest, tmp_buf, 20);
10226
10227 digest[0] = byte_swap_32 (digest[0]);
10228 digest[1] = byte_swap_32 (digest[1]);
10229 digest[2] = byte_swap_32 (digest[2]);
10230 digest[3] = byte_swap_32 (digest[3]);
10231 digest[4] = byte_swap_32 (digest[4]);
10232
10233 digest[0] -= SHA1M_A;
10234 digest[1] -= SHA1M_B;
10235 digest[2] -= SHA1M_C;
10236 digest[3] -= SHA1M_D;
10237 digest[4] -= SHA1M_E;
10238
10239 return (PARSER_OK);
10240 }
10241
10242 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10243 {
10244 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10245
10246 unsigned char c12 = itoa64_to_int (input_buf[12]);
10247
10248 if (c12 & 3) return (PARSER_HASH_VALUE);
10249
10250 uint32_t *digest = (uint32_t *) hash_buf->digest;
10251
10252 salt_t *salt = hash_buf->salt;
10253
10254 // for ascii_digest
10255 salt->salt_sign[0] = input_buf[0];
10256 salt->salt_sign[1] = input_buf[1];
10257
10258 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10259 | itoa64_to_int (input_buf[1]) << 6;
10260
10261 salt->salt_len = 2;
10262
10263 char tmp_buf[100];
10264
10265 memset (tmp_buf, 0, sizeof (tmp_buf));
10266
10267 base64_decode (itoa64_to_int, input_buf + 2, 11, tmp_buf);
10268
10269 memcpy (digest, tmp_buf, 8);
10270
10271 uint tt;
10272
10273 IP (digest[0], digest[1], tt);
10274
10275 digest[2] = 0;
10276 digest[3] = 0;
10277
10278 return (PARSER_OK);
10279 }
10280
10281 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10282 {
10283 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10284
10285 uint32_t *digest = (uint32_t *) hash_buf->digest;
10286
10287 digest[0] = hex_to_uint (&input_buf[ 0]);
10288 digest[1] = hex_to_uint (&input_buf[ 8]);
10289 digest[2] = hex_to_uint (&input_buf[16]);
10290 digest[3] = hex_to_uint (&input_buf[24]);
10291
10292 digest[0] = byte_swap_32 (digest[0]);
10293 digest[1] = byte_swap_32 (digest[1]);
10294 digest[2] = byte_swap_32 (digest[2]);
10295 digest[3] = byte_swap_32 (digest[3]);
10296
10297 digest[0] -= MD4M_A;
10298 digest[1] -= MD4M_B;
10299 digest[2] -= MD4M_C;
10300 digest[3] -= MD4M_D;
10301
10302 return (PARSER_OK);
10303 }
10304
10305 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10306 {
10307 if (data.opts_type & OPTS_TYPE_ST_HEX)
10308 {
10309 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10310 }
10311 else
10312 {
10313 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10314 }
10315
10316 uint32_t *digest = (uint32_t *) hash_buf->digest;
10317
10318 salt_t *salt = hash_buf->salt;
10319
10320 digest[0] = hex_to_uint (&input_buf[ 0]);
10321 digest[1] = hex_to_uint (&input_buf[ 8]);
10322 digest[2] = hex_to_uint (&input_buf[16]);
10323 digest[3] = hex_to_uint (&input_buf[24]);
10324
10325 digest[0] = byte_swap_32 (digest[0]);
10326 digest[1] = byte_swap_32 (digest[1]);
10327 digest[2] = byte_swap_32 (digest[2]);
10328 digest[3] = byte_swap_32 (digest[3]);
10329
10330 digest[0] -= MD4M_A;
10331 digest[1] -= MD4M_B;
10332 digest[2] -= MD4M_C;
10333 digest[3] -= MD4M_D;
10334
10335 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10336
10337 uint salt_len = input_len - 32 - 1;
10338
10339 char *salt_buf = input_buf + 32 + 1;
10340
10341 char *salt_buf_ptr = (char *) salt->salt_buf;
10342
10343 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10344
10345 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10346
10347 salt->salt_len = salt_len;
10348
10349 return (PARSER_OK);
10350 }
10351
10352 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10353 {
10354 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10355
10356 uint32_t *digest = (uint32_t *) hash_buf->digest;
10357
10358 digest[0] = hex_to_uint (&input_buf[ 0]);
10359 digest[1] = hex_to_uint (&input_buf[ 8]);
10360 digest[2] = hex_to_uint (&input_buf[16]);
10361 digest[3] = hex_to_uint (&input_buf[24]);
10362
10363 digest[0] = byte_swap_32 (digest[0]);
10364 digest[1] = byte_swap_32 (digest[1]);
10365 digest[2] = byte_swap_32 (digest[2]);
10366 digest[3] = byte_swap_32 (digest[3]);
10367
10368 digest[0] -= MD5M_A;
10369 digest[1] -= MD5M_B;
10370 digest[2] -= MD5M_C;
10371 digest[3] -= MD5M_D;
10372
10373 return (PARSER_OK);
10374 }
10375
10376 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10377 {
10378 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10379
10380 uint32_t *digest = (uint32_t *) hash_buf->digest;
10381
10382 digest[0] = hex_to_uint (&input_buf[0]);
10383 digest[1] = hex_to_uint (&input_buf[8]);
10384 digest[2] = 0;
10385 digest[3] = 0;
10386
10387 digest[0] = byte_swap_32 (digest[0]);
10388 digest[1] = byte_swap_32 (digest[1]);
10389
10390 return (PARSER_OK);
10391 }
10392
10393 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10394 {
10395 if (data.opts_type & OPTS_TYPE_ST_HEX)
10396 {
10397 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10398 }
10399 else
10400 {
10401 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10402 }
10403
10404 uint32_t *digest = (uint32_t *) hash_buf->digest;
10405
10406 salt_t *salt = hash_buf->salt;
10407
10408 digest[0] = hex_to_uint (&input_buf[ 0]);
10409 digest[1] = hex_to_uint (&input_buf[ 8]);
10410 digest[2] = hex_to_uint (&input_buf[16]);
10411 digest[3] = hex_to_uint (&input_buf[24]);
10412
10413 digest[0] = byte_swap_32 (digest[0]);
10414 digest[1] = byte_swap_32 (digest[1]);
10415 digest[2] = byte_swap_32 (digest[2]);
10416 digest[3] = byte_swap_32 (digest[3]);
10417
10418 digest[0] -= MD5M_A;
10419 digest[1] -= MD5M_B;
10420 digest[2] -= MD5M_C;
10421 digest[3] -= MD5M_D;
10422
10423 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10424
10425 uint salt_len = input_len - 32 - 1;
10426
10427 char *salt_buf = input_buf + 32 + 1;
10428
10429 char *salt_buf_ptr = (char *) salt->salt_buf;
10430
10431 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10432
10433 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10434
10435 salt->salt_len = salt_len;
10436
10437 return (PARSER_OK);
10438 }
10439
10440 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10441 {
10442 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10443
10444 uint32_t *digest = (uint32_t *) hash_buf->digest;
10445
10446 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10447 | itoa64_to_int (input_buf[ 1]) << 6
10448 | itoa64_to_int (input_buf[ 2]) << 12
10449 | itoa64_to_int (input_buf[ 3]) << 18;
10450 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10451 | itoa64_to_int (input_buf[ 5]) << 6
10452 | itoa64_to_int (input_buf[ 6]) << 12
10453 | itoa64_to_int (input_buf[ 7]) << 18;
10454 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10455 | itoa64_to_int (input_buf[ 9]) << 6
10456 | itoa64_to_int (input_buf[10]) << 12
10457 | itoa64_to_int (input_buf[11]) << 18;
10458 digest[3] = itoa64_to_int (input_buf[12]) << 0
10459 | itoa64_to_int (input_buf[13]) << 6
10460 | itoa64_to_int (input_buf[14]) << 12
10461 | itoa64_to_int (input_buf[15]) << 18;
10462
10463 digest[0] -= MD5M_A;
10464 digest[1] -= MD5M_B;
10465 digest[2] -= MD5M_C;
10466 digest[3] -= MD5M_D;
10467
10468 digest[0] &= 0x00ffffff;
10469 digest[1] &= 0x00ffffff;
10470 digest[2] &= 0x00ffffff;
10471 digest[3] &= 0x00ffffff;
10472
10473 return (PARSER_OK);
10474 }
10475
10476 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10477 {
10478 if (data.opts_type & OPTS_TYPE_ST_HEX)
10479 {
10480 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10481 }
10482 else
10483 {
10484 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10485 }
10486
10487 uint32_t *digest = (uint32_t *) hash_buf->digest;
10488
10489 salt_t *salt = hash_buf->salt;
10490
10491 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10492 | itoa64_to_int (input_buf[ 1]) << 6
10493 | itoa64_to_int (input_buf[ 2]) << 12
10494 | itoa64_to_int (input_buf[ 3]) << 18;
10495 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10496 | itoa64_to_int (input_buf[ 5]) << 6
10497 | itoa64_to_int (input_buf[ 6]) << 12
10498 | itoa64_to_int (input_buf[ 7]) << 18;
10499 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10500 | itoa64_to_int (input_buf[ 9]) << 6
10501 | itoa64_to_int (input_buf[10]) << 12
10502 | itoa64_to_int (input_buf[11]) << 18;
10503 digest[3] = itoa64_to_int (input_buf[12]) << 0
10504 | itoa64_to_int (input_buf[13]) << 6
10505 | itoa64_to_int (input_buf[14]) << 12
10506 | itoa64_to_int (input_buf[15]) << 18;
10507
10508 digest[0] -= MD5M_A;
10509 digest[1] -= MD5M_B;
10510 digest[2] -= MD5M_C;
10511 digest[3] -= MD5M_D;
10512
10513 digest[0] &= 0x00ffffff;
10514 digest[1] &= 0x00ffffff;
10515 digest[2] &= 0x00ffffff;
10516 digest[3] &= 0x00ffffff;
10517
10518 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10519
10520 uint salt_len = input_len - 16 - 1;
10521
10522 char *salt_buf = input_buf + 16 + 1;
10523
10524 char *salt_buf_ptr = (char *) salt->salt_buf;
10525
10526 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10527
10528 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10529
10530 salt->salt_len = salt_len;
10531
10532 return (PARSER_OK);
10533 }
10534
10535 void transform_netntlmv1_key (const uint8_t *nthash, uint8_t *key)
10536 {
10537 key[0] = (nthash[0] >> 0);
10538 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10539 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10540 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10541 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10542 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10543 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10544 key[7] = (nthash[6] << 1);
10545
10546 key[0] |= 0x01;
10547 key[1] |= 0x01;
10548 key[2] |= 0x01;
10549 key[3] |= 0x01;
10550 key[4] |= 0x01;
10551 key[5] |= 0x01;
10552 key[6] |= 0x01;
10553 key[7] |= 0x01;
10554 }
10555
10556 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10557 {
10558 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10559
10560 uint32_t *digest = (uint32_t *) hash_buf->digest;
10561
10562 salt_t *salt = hash_buf->salt;
10563
10564 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10565
10566 /**
10567 * parse line
10568 */
10569
10570 char *user_pos = input_buf;
10571
10572 char *unused_pos = strchr (user_pos, ':');
10573
10574 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10575
10576 uint user_len = unused_pos - user_pos;
10577
10578 if (user_len > 60) return (PARSER_SALT_LENGTH);
10579
10580 unused_pos++;
10581
10582 char *domain_pos = strchr (unused_pos, ':');
10583
10584 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10585
10586 uint unused_len = domain_pos - unused_pos;
10587
10588 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10589
10590 domain_pos++;
10591
10592 char *srvchall_pos = strchr (domain_pos, ':');
10593
10594 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10595
10596 uint domain_len = srvchall_pos - domain_pos;
10597
10598 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10599
10600 srvchall_pos++;
10601
10602 char *hash_pos = strchr (srvchall_pos, ':');
10603
10604 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10605
10606 uint srvchall_len = hash_pos - srvchall_pos;
10607
10608 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10609
10610 hash_pos++;
10611
10612 char *clichall_pos = strchr (hash_pos, ':');
10613
10614 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10615
10616 uint hash_len = clichall_pos - hash_pos;
10617
10618 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10619
10620 clichall_pos++;
10621
10622 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10623
10624 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10625
10626 /**
10627 * store some data for later use
10628 */
10629
10630 netntlm->user_len = user_len * 2;
10631 netntlm->domain_len = domain_len * 2;
10632 netntlm->srvchall_len = srvchall_len / 2;
10633 netntlm->clichall_len = clichall_len / 2;
10634
10635 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10636 char *chall_ptr = (char *) netntlm->chall_buf;
10637
10638 /**
10639 * handle username and domainname
10640 */
10641
10642 for (uint i = 0; i < user_len; i++)
10643 {
10644 *userdomain_ptr++ = user_pos[i];
10645 *userdomain_ptr++ = 0;
10646 }
10647
10648 for (uint i = 0; i < domain_len; i++)
10649 {
10650 *userdomain_ptr++ = domain_pos[i];
10651 *userdomain_ptr++ = 0;
10652 }
10653
10654 /**
10655 * handle server challenge encoding
10656 */
10657
10658 for (uint i = 0; i < srvchall_len; i += 2)
10659 {
10660 const char p0 = srvchall_pos[i + 0];
10661 const char p1 = srvchall_pos[i + 1];
10662
10663 *chall_ptr++ = hex_convert (p1) << 0
10664 | hex_convert (p0) << 4;
10665 }
10666
10667 /**
10668 * handle client challenge encoding
10669 */
10670
10671 for (uint i = 0; i < clichall_len; i += 2)
10672 {
10673 const char p0 = clichall_pos[i + 0];
10674 const char p1 = clichall_pos[i + 1];
10675
10676 *chall_ptr++ = hex_convert (p1) << 0
10677 | hex_convert (p0) << 4;
10678 }
10679
10680 /**
10681 * store data
10682 */
10683
10684 char *salt_buf_ptr = (char *) salt->salt_buf;
10685
10686 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10687
10688 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10689
10690 salt->salt_len = salt_len;
10691
10692 digest[0] = hex_to_uint (&hash_pos[ 0]);
10693 digest[1] = hex_to_uint (&hash_pos[ 8]);
10694 digest[2] = hex_to_uint (&hash_pos[16]);
10695 digest[3] = hex_to_uint (&hash_pos[24]);
10696
10697 digest[0] = byte_swap_32 (digest[0]);
10698 digest[1] = byte_swap_32 (digest[1]);
10699 digest[2] = byte_swap_32 (digest[2]);
10700 digest[3] = byte_swap_32 (digest[3]);
10701
10702 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10703
10704 uint digest_tmp[2];
10705
10706 digest_tmp[0] = hex_to_uint (&hash_pos[32]);
10707 digest_tmp[1] = hex_to_uint (&hash_pos[40]);
10708
10709 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10710 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10711
10712 /* special case 2: ESS */
10713
10714 if (srvchall_len == 48)
10715 {
10716 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10717 {
10718 uint w[16];
10719
10720 w[ 0] = netntlm->chall_buf[6];
10721 w[ 1] = netntlm->chall_buf[7];
10722 w[ 2] = netntlm->chall_buf[0];
10723 w[ 3] = netntlm->chall_buf[1];
10724 w[ 4] = 0x80;
10725 w[ 5] = 0;
10726 w[ 6] = 0;
10727 w[ 7] = 0;
10728 w[ 8] = 0;
10729 w[ 9] = 0;
10730 w[10] = 0;
10731 w[11] = 0;
10732 w[12] = 0;
10733 w[13] = 0;
10734 w[14] = 16 * 8;
10735 w[15] = 0;
10736
10737 uint dgst[4];
10738
10739 dgst[0] = MAGIC_A;
10740 dgst[1] = MAGIC_B;
10741 dgst[2] = MAGIC_C;
10742 dgst[3] = MAGIC_D;
10743
10744 md5_64 (w, dgst);
10745
10746 salt->salt_buf[0] = dgst[0];
10747 salt->salt_buf[1] = dgst[1];
10748 }
10749 }
10750
10751 /* precompute netntlmv1 exploit start */
10752
10753 for (uint i = 0; i < 0x10000; i++)
10754 {
10755 uint key_md4[2] = { i, 0 };
10756 uint key_des[2] = { 0, 0 };
10757
10758 transform_netntlmv1_key ((uint8_t *) key_md4, (uint8_t *) key_des);
10759
10760 uint Kc[16];
10761 uint Kd[16];
10762
10763 _des_keysetup (key_des, Kc, Kd, c_skb);
10764
10765 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10766
10767 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10768
10769 if (data3[0] != digest_tmp[0]) continue;
10770 if (data3[1] != digest_tmp[1]) continue;
10771
10772 salt->salt_buf[2] = i;
10773
10774 salt->salt_len = 24;
10775
10776 break;
10777 }
10778
10779 salt->salt_buf_pc[0] = digest_tmp[0];
10780 salt->salt_buf_pc[1] = digest_tmp[1];
10781
10782 /* precompute netntlmv1 exploit stop */
10783
10784 uint32_t tt;
10785
10786 IP (digest[0], digest[1], tt);
10787 IP (digest[2], digest[3], tt);
10788
10789 digest[0] = ROTATE_RIGHT (digest[0], 29);
10790 digest[1] = ROTATE_RIGHT (digest[1], 29);
10791 digest[2] = ROTATE_RIGHT (digest[2], 29);
10792 digest[3] = ROTATE_RIGHT (digest[3], 29);
10793
10794 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10795
10796 salt->salt_buf[0] = ROTATE_LEFT (salt->salt_buf[0], 3);
10797 salt->salt_buf[1] = ROTATE_LEFT (salt->salt_buf[1], 3);
10798
10799 return (PARSER_OK);
10800 }
10801
10802 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10803 {
10804 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10805
10806 uint32_t *digest = (uint32_t *) hash_buf->digest;
10807
10808 salt_t *salt = hash_buf->salt;
10809
10810 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10811
10812 /**
10813 * parse line
10814 */
10815
10816 char *user_pos = input_buf;
10817
10818 char *unused_pos = strchr (user_pos, ':');
10819
10820 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10821
10822 uint user_len = unused_pos - user_pos;
10823
10824 if (user_len > 60) return (PARSER_SALT_LENGTH);
10825
10826 unused_pos++;
10827
10828 char *domain_pos = strchr (unused_pos, ':');
10829
10830 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10831
10832 uint unused_len = domain_pos - unused_pos;
10833
10834 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10835
10836 domain_pos++;
10837
10838 char *srvchall_pos = strchr (domain_pos, ':');
10839
10840 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10841
10842 uint domain_len = srvchall_pos - domain_pos;
10843
10844 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10845
10846 srvchall_pos++;
10847
10848 char *hash_pos = strchr (srvchall_pos, ':');
10849
10850 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10851
10852 uint srvchall_len = hash_pos - srvchall_pos;
10853
10854 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
10855
10856 hash_pos++;
10857
10858 char *clichall_pos = strchr (hash_pos, ':');
10859
10860 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10861
10862 uint hash_len = clichall_pos - hash_pos;
10863
10864 if (hash_len != 32) return (PARSER_HASH_LENGTH);
10865
10866 clichall_pos++;
10867
10868 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10869
10870 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
10871
10872 if (clichall_len % 2) return (PARSER_SALT_VALUE);
10873
10874 /**
10875 * store some data for later use
10876 */
10877
10878 netntlm->user_len = user_len * 2;
10879 netntlm->domain_len = domain_len * 2;
10880 netntlm->srvchall_len = srvchall_len / 2;
10881 netntlm->clichall_len = clichall_len / 2;
10882
10883 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10884 char *chall_ptr = (char *) netntlm->chall_buf;
10885
10886 /**
10887 * handle username and domainname
10888 */
10889
10890 for (uint i = 0; i < user_len; i++)
10891 {
10892 *userdomain_ptr++ = toupper (user_pos[i]);
10893 *userdomain_ptr++ = 0;
10894 }
10895
10896 for (uint i = 0; i < domain_len; i++)
10897 {
10898 *userdomain_ptr++ = domain_pos[i];
10899 *userdomain_ptr++ = 0;
10900 }
10901
10902 *userdomain_ptr++ = 0x80;
10903
10904 /**
10905 * handle server challenge encoding
10906 */
10907
10908 for (uint i = 0; i < srvchall_len; i += 2)
10909 {
10910 const char p0 = srvchall_pos[i + 0];
10911 const char p1 = srvchall_pos[i + 1];
10912
10913 *chall_ptr++ = hex_convert (p1) << 0
10914 | hex_convert (p0) << 4;
10915 }
10916
10917 /**
10918 * handle client challenge encoding
10919 */
10920
10921 for (uint i = 0; i < clichall_len; i += 2)
10922 {
10923 const char p0 = clichall_pos[i + 0];
10924 const char p1 = clichall_pos[i + 1];
10925
10926 *chall_ptr++ = hex_convert (p1) << 0
10927 | hex_convert (p0) << 4;
10928 }
10929
10930 *chall_ptr++ = 0x80;
10931
10932 /**
10933 * handle hash itself
10934 */
10935
10936 digest[0] = hex_to_uint (&hash_pos[ 0]);
10937 digest[1] = hex_to_uint (&hash_pos[ 8]);
10938 digest[2] = hex_to_uint (&hash_pos[16]);
10939 digest[3] = hex_to_uint (&hash_pos[24]);
10940
10941 digest[0] = byte_swap_32 (digest[0]);
10942 digest[1] = byte_swap_32 (digest[1]);
10943 digest[2] = byte_swap_32 (digest[2]);
10944 digest[3] = byte_swap_32 (digest[3]);
10945
10946 /**
10947 * reuse challange data as salt_buf, its the buffer that is most likely unique
10948 */
10949
10950 salt->salt_buf[0] = 0;
10951 salt->salt_buf[1] = 0;
10952 salt->salt_buf[2] = 0;
10953 salt->salt_buf[3] = 0;
10954 salt->salt_buf[4] = 0;
10955 salt->salt_buf[5] = 0;
10956 salt->salt_buf[6] = 0;
10957 salt->salt_buf[7] = 0;
10958
10959 uint *uptr;
10960
10961 uptr = (uint *) netntlm->userdomain_buf;
10962
10963 for (uint i = 0; i < 16; i += 16)
10964 {
10965 md5_64 (uptr, salt->salt_buf);
10966 }
10967
10968 uptr = (uint *) netntlm->chall_buf;
10969
10970 for (uint i = 0; i < 256; i += 16)
10971 {
10972 md5_64 (uptr, salt->salt_buf);
10973 }
10974
10975 salt->salt_len = 16;
10976
10977 return (PARSER_OK);
10978 }
10979
10980 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10981 {
10982 if (data.opts_type & OPTS_TYPE_ST_HEX)
10983 {
10984 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
10985 }
10986 else
10987 {
10988 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
10989 }
10990
10991 uint32_t *digest = (uint32_t *) hash_buf->digest;
10992
10993 salt_t *salt = hash_buf->salt;
10994
10995 digest[0] = hex_to_uint (&input_buf[ 0]);
10996 digest[1] = hex_to_uint (&input_buf[ 8]);
10997 digest[2] = hex_to_uint (&input_buf[16]);
10998 digest[3] = hex_to_uint (&input_buf[24]);
10999
11000 digest[0] = byte_swap_32 (digest[0]);
11001 digest[1] = byte_swap_32 (digest[1]);
11002 digest[2] = byte_swap_32 (digest[2]);
11003 digest[3] = byte_swap_32 (digest[3]);
11004
11005 digest[0] -= MD5M_A;
11006 digest[1] -= MD5M_B;
11007 digest[2] -= MD5M_C;
11008 digest[3] -= MD5M_D;
11009
11010 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11011
11012 uint salt_len = input_len - 32 - 1;
11013
11014 char *salt_buf = input_buf + 32 + 1;
11015
11016 char *salt_buf_ptr = (char *) salt->salt_buf;
11017
11018 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11019
11020 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11021
11022 salt->salt_len = salt_len;
11023
11024 return (PARSER_OK);
11025 }
11026
11027 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11028 {
11029 if (data.opts_type & OPTS_TYPE_ST_HEX)
11030 {
11031 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11032 }
11033 else
11034 {
11035 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11036 }
11037
11038 uint32_t *digest = (uint32_t *) hash_buf->digest;
11039
11040 salt_t *salt = hash_buf->salt;
11041
11042 digest[0] = hex_to_uint (&input_buf[ 0]);
11043 digest[1] = hex_to_uint (&input_buf[ 8]);
11044 digest[2] = hex_to_uint (&input_buf[16]);
11045 digest[3] = hex_to_uint (&input_buf[24]);
11046
11047 digest[0] = byte_swap_32 (digest[0]);
11048 digest[1] = byte_swap_32 (digest[1]);
11049 digest[2] = byte_swap_32 (digest[2]);
11050 digest[3] = byte_swap_32 (digest[3]);
11051
11052 digest[0] -= MD5M_A;
11053 digest[1] -= MD5M_B;
11054 digest[2] -= MD5M_C;
11055 digest[3] -= MD5M_D;
11056
11057 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11058
11059 uint salt_len = input_len - 32 - 1;
11060
11061 char *salt_buf = input_buf + 32 + 1;
11062
11063 char *salt_buf_ptr = (char *) salt->salt_buf;
11064
11065 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11066
11067 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11068
11069 salt->salt_len = salt_len;
11070
11071 return (PARSER_OK);
11072 }
11073
11074 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11075 {
11076 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11077
11078 uint32_t *digest = (uint32_t *) hash_buf->digest;
11079
11080 salt_t *salt = hash_buf->salt;
11081
11082 digest[0] = hex_to_uint (&input_buf[ 0]);
11083 digest[1] = hex_to_uint (&input_buf[ 8]);
11084 digest[2] = hex_to_uint (&input_buf[16]);
11085 digest[3] = hex_to_uint (&input_buf[24]);
11086
11087 digest[0] = byte_swap_32 (digest[0]);
11088 digest[1] = byte_swap_32 (digest[1]);
11089 digest[2] = byte_swap_32 (digest[2]);
11090 digest[3] = byte_swap_32 (digest[3]);
11091
11092 digest[0] -= MD5M_A;
11093 digest[1] -= MD5M_B;
11094 digest[2] -= MD5M_C;
11095 digest[3] -= MD5M_D;
11096
11097 /**
11098 * This is a virtual salt. While the algorithm is basically not salted
11099 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11100 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11101 */
11102
11103 char *salt_buf_ptr = (char *) salt->salt_buf;
11104
11105 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11106
11107 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11108
11109 salt->salt_len = salt_len;
11110
11111 return (PARSER_OK);
11112 }
11113
11114 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11115 {
11116 if (data.opts_type & OPTS_TYPE_ST_HEX)
11117 {
11118 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11119 }
11120 else
11121 {
11122 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11123 }
11124
11125 uint32_t *digest = (uint32_t *) hash_buf->digest;
11126
11127 salt_t *salt = hash_buf->salt;
11128
11129 digest[0] = hex_to_uint (&input_buf[ 0]);
11130 digest[1] = hex_to_uint (&input_buf[ 8]);
11131 digest[2] = hex_to_uint (&input_buf[16]);
11132 digest[3] = hex_to_uint (&input_buf[24]);
11133
11134 digest[0] = byte_swap_32 (digest[0]);
11135 digest[1] = byte_swap_32 (digest[1]);
11136 digest[2] = byte_swap_32 (digest[2]);
11137 digest[3] = byte_swap_32 (digest[3]);
11138
11139 digest[0] -= MD5M_A;
11140 digest[1] -= MD5M_B;
11141 digest[2] -= MD5M_C;
11142 digest[3] -= MD5M_D;
11143
11144 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11145
11146 uint salt_len = input_len - 32 - 1;
11147
11148 char *salt_buf = input_buf + 32 + 1;
11149
11150 char *salt_buf_ptr = (char *) salt->salt_buf;
11151
11152 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11153
11154 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11155
11156 salt->salt_len = salt_len;
11157
11158 return (PARSER_OK);
11159 }
11160
11161 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11162 {
11163 if (data.opts_type & OPTS_TYPE_ST_HEX)
11164 {
11165 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11166 }
11167 else
11168 {
11169 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11170 }
11171
11172 uint32_t *digest = (uint32_t *) hash_buf->digest;
11173
11174 salt_t *salt = hash_buf->salt;
11175
11176 digest[0] = hex_to_uint (&input_buf[ 0]);
11177 digest[1] = hex_to_uint (&input_buf[ 8]);
11178 digest[2] = hex_to_uint (&input_buf[16]);
11179 digest[3] = hex_to_uint (&input_buf[24]);
11180
11181 digest[0] = byte_swap_32 (digest[0]);
11182 digest[1] = byte_swap_32 (digest[1]);
11183 digest[2] = byte_swap_32 (digest[2]);
11184 digest[3] = byte_swap_32 (digest[3]);
11185
11186 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11187
11188 uint salt_len = input_len - 32 - 1;
11189
11190 char *salt_buf = input_buf + 32 + 1;
11191
11192 char *salt_buf_ptr = (char *) salt->salt_buf;
11193
11194 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11195
11196 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11197
11198 salt->salt_len = salt_len;
11199
11200 return (PARSER_OK);
11201 }
11202
11203 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11204 {
11205 if (data.opts_type & OPTS_TYPE_ST_HEX)
11206 {
11207 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11208 }
11209 else
11210 {
11211 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11212 }
11213
11214 uint32_t *digest = (uint32_t *) hash_buf->digest;
11215
11216 salt_t *salt = hash_buf->salt;
11217
11218 digest[0] = hex_to_uint (&input_buf[ 0]);
11219 digest[1] = hex_to_uint (&input_buf[ 8]);
11220 digest[2] = hex_to_uint (&input_buf[16]);
11221 digest[3] = hex_to_uint (&input_buf[24]);
11222
11223 digest[0] = byte_swap_32 (digest[0]);
11224 digest[1] = byte_swap_32 (digest[1]);
11225 digest[2] = byte_swap_32 (digest[2]);
11226 digest[3] = byte_swap_32 (digest[3]);
11227
11228 digest[0] -= MD4M_A;
11229 digest[1] -= MD4M_B;
11230 digest[2] -= MD4M_C;
11231 digest[3] -= MD4M_D;
11232
11233 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11234
11235 uint salt_len = input_len - 32 - 1;
11236
11237 char *salt_buf = input_buf + 32 + 1;
11238
11239 char *salt_buf_ptr = (char *) salt->salt_buf;
11240
11241 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11242
11243 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11244
11245 salt->salt_len = salt_len;
11246
11247 return (PARSER_OK);
11248 }
11249
11250 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11251 {
11252 if (data.opts_type & OPTS_TYPE_ST_HEX)
11253 {
11254 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11255 }
11256 else
11257 {
11258 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11259 }
11260
11261 uint32_t *digest = (uint32_t *) hash_buf->digest;
11262
11263 salt_t *salt = hash_buf->salt;
11264
11265 digest[0] = hex_to_uint (&input_buf[ 0]);
11266 digest[1] = hex_to_uint (&input_buf[ 8]);
11267 digest[2] = hex_to_uint (&input_buf[16]);
11268 digest[3] = hex_to_uint (&input_buf[24]);
11269
11270 digest[0] = byte_swap_32 (digest[0]);
11271 digest[1] = byte_swap_32 (digest[1]);
11272 digest[2] = byte_swap_32 (digest[2]);
11273 digest[3] = byte_swap_32 (digest[3]);
11274
11275 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11276
11277 uint salt_len = input_len - 32 - 1;
11278
11279 char *salt_buf = input_buf + 32 + 1;
11280
11281 uint salt_pc_block[16];
11282
11283 memset (salt_pc_block, 0, sizeof (salt_pc_block));
11284
11285 char *salt_pc_block_ptr = (char *) salt_pc_block;
11286
11287 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11288
11289 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11290
11291 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11292
11293 salt_pc_block[14] = salt_len * 8;
11294
11295 uint salt_pc_digest[4];
11296
11297 salt_pc_digest[0] = MAGIC_A;
11298 salt_pc_digest[1] = MAGIC_B;
11299 salt_pc_digest[2] = MAGIC_C;
11300 salt_pc_digest[3] = MAGIC_D;
11301
11302 md5_64 (salt_pc_block, salt_pc_digest);
11303
11304 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11305 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11306 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11307 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11308
11309 char *salt_buf_ptr = (char *) salt->salt_buf;
11310
11311 memcpy (salt_buf_ptr, salt_buf, salt_len);
11312
11313 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
11314
11315 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11316 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11317 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11318 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11319
11320 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11321
11322 return (PARSER_OK);
11323 }
11324
11325 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11326 {
11327 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11328
11329 uint32_t *digest = (uint32_t *) hash_buf->digest;
11330
11331 digest[0] = hex_to_uint (&input_buf[ 0]);
11332 digest[1] = hex_to_uint (&input_buf[ 8]);
11333 digest[2] = hex_to_uint (&input_buf[16]);
11334 digest[3] = hex_to_uint (&input_buf[24]);
11335 digest[4] = hex_to_uint (&input_buf[32]);
11336
11337 digest[0] -= SHA1M_A;
11338 digest[1] -= SHA1M_B;
11339 digest[2] -= SHA1M_C;
11340 digest[3] -= SHA1M_D;
11341 digest[4] -= SHA1M_E;
11342
11343 return (PARSER_OK);
11344 }
11345
11346 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11347 {
11348 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11349
11350 uint32_t *digest = (uint32_t *) hash_buf->digest;
11351
11352 digest[0] = hex_to_uint (&input_buf[ 0]);
11353 digest[1] = hex_to_uint (&input_buf[ 8]);
11354 digest[2] = hex_to_uint (&input_buf[16]);
11355 digest[3] = hex_to_uint (&input_buf[24]);
11356 digest[4] = hex_to_uint (&input_buf[32]);
11357
11358 return (PARSER_OK);
11359 }
11360
11361 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11362 {
11363 if (data.opts_type & OPTS_TYPE_ST_HEX)
11364 {
11365 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11366 }
11367 else
11368 {
11369 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11370 }
11371
11372 uint32_t *digest = (uint32_t *) hash_buf->digest;
11373
11374 salt_t *salt = hash_buf->salt;
11375
11376 digest[0] = hex_to_uint (&input_buf[ 0]);
11377 digest[1] = hex_to_uint (&input_buf[ 8]);
11378 digest[2] = hex_to_uint (&input_buf[16]);
11379 digest[3] = hex_to_uint (&input_buf[24]);
11380 digest[4] = hex_to_uint (&input_buf[32]);
11381
11382 digest[0] -= SHA1M_A;
11383 digest[1] -= SHA1M_B;
11384 digest[2] -= SHA1M_C;
11385 digest[3] -= SHA1M_D;
11386 digest[4] -= SHA1M_E;
11387
11388 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11389
11390 uint salt_len = input_len - 40 - 1;
11391
11392 char *salt_buf = input_buf + 40 + 1;
11393
11394 char *salt_buf_ptr = (char *) salt->salt_buf;
11395
11396 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11397
11398 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11399
11400 salt->salt_len = salt_len;
11401
11402 return (PARSER_OK);
11403 }
11404
11405 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11406 {
11407 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11408
11409 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11410
11411 uint32_t *digest = (uint32_t *) hash_buf->digest;
11412
11413 char tmp_buf[100];
11414
11415 memset (tmp_buf, 0, sizeof (tmp_buf));
11416
11417 base64_decode (base64_to_int, input_buf + 5, input_len - 5, tmp_buf);
11418
11419 memcpy (digest, tmp_buf, 20);
11420
11421 digest[0] = byte_swap_32 (digest[0]);
11422 digest[1] = byte_swap_32 (digest[1]);
11423 digest[2] = byte_swap_32 (digest[2]);
11424 digest[3] = byte_swap_32 (digest[3]);
11425 digest[4] = byte_swap_32 (digest[4]);
11426
11427 digest[0] -= SHA1M_A;
11428 digest[1] -= SHA1M_B;
11429 digest[2] -= SHA1M_C;
11430 digest[3] -= SHA1M_D;
11431 digest[4] -= SHA1M_E;
11432
11433 return (PARSER_OK);
11434 }
11435
11436 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11437 {
11438 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11439
11440 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11441
11442 uint32_t *digest = (uint32_t *) hash_buf->digest;
11443
11444 salt_t *salt = hash_buf->salt;
11445
11446 char tmp_buf[100];
11447
11448 memset (tmp_buf, 0, sizeof (tmp_buf));
11449
11450 int tmp_len = base64_decode (base64_to_int, input_buf + 6, input_len - 6, tmp_buf);
11451
11452 memcpy (digest, tmp_buf, 20);
11453
11454 salt->salt_len = tmp_len - 20;
11455
11456 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11457
11458 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11459 {
11460 char *ptr = (char *) salt->salt_buf;
11461
11462 ptr[salt->salt_len] = 0x80;
11463 }
11464
11465 digest[0] = byte_swap_32 (digest[0]);
11466 digest[1] = byte_swap_32 (digest[1]);
11467 digest[2] = byte_swap_32 (digest[2]);
11468 digest[3] = byte_swap_32 (digest[3]);
11469 digest[4] = byte_swap_32 (digest[4]);
11470
11471 digest[0] -= SHA1M_A;
11472 digest[1] -= SHA1M_B;
11473 digest[2] -= SHA1M_C;
11474 digest[3] -= SHA1M_D;
11475 digest[4] -= SHA1M_E;
11476
11477 return (PARSER_OK);
11478 }
11479
11480 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11481 {
11482 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11483
11484 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11485
11486 uint32_t *digest = (uint32_t *) hash_buf->digest;
11487
11488 salt_t *salt = hash_buf->salt;
11489
11490 char *salt_buf = input_buf + 6;
11491
11492 uint salt_len = 8;
11493
11494 char *salt_buf_ptr = (char *) salt->salt_buf;
11495
11496 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11497
11498 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11499
11500 salt->salt_len = salt_len;
11501
11502 char *hash_pos = input_buf + 6 + 8 + 40;
11503
11504 digest[0] = hex_to_uint (&hash_pos[ 0]);
11505 digest[1] = hex_to_uint (&hash_pos[ 8]);
11506 digest[2] = hex_to_uint (&hash_pos[16]);
11507 digest[3] = hex_to_uint (&hash_pos[24]);
11508 digest[4] = hex_to_uint (&hash_pos[32]);
11509
11510 digest[0] -= SHA1M_A;
11511 digest[1] -= SHA1M_B;
11512 digest[2] -= SHA1M_C;
11513 digest[3] -= SHA1M_D;
11514 digest[4] -= SHA1M_E;
11515
11516 return (PARSER_OK);
11517 }
11518
11519 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11520 {
11521 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11522
11523 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11524
11525 uint32_t *digest = (uint32_t *) hash_buf->digest;
11526
11527 salt_t *salt = hash_buf->salt;
11528
11529 char *salt_buf = input_buf + 6;
11530
11531 uint salt_len = 8;
11532
11533 char *salt_buf_ptr = (char *) salt->salt_buf;
11534
11535 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11536
11537 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11538
11539 salt->salt_len = salt_len;
11540
11541 char *hash_pos = input_buf + 6 + 8;
11542
11543 digest[0] = hex_to_uint (&hash_pos[ 0]);
11544 digest[1] = hex_to_uint (&hash_pos[ 8]);
11545 digest[2] = hex_to_uint (&hash_pos[16]);
11546 digest[3] = hex_to_uint (&hash_pos[24]);
11547 digest[4] = hex_to_uint (&hash_pos[32]);
11548
11549 digest[0] -= SHA1M_A;
11550 digest[1] -= SHA1M_B;
11551 digest[2] -= SHA1M_C;
11552 digest[3] -= SHA1M_D;
11553 digest[4] -= SHA1M_E;
11554
11555 return (PARSER_OK);
11556 }
11557
11558 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11559 {
11560 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11561
11562 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11563
11564 uint64_t *digest = (uint64_t *) hash_buf->digest;
11565
11566 salt_t *salt = hash_buf->salt;
11567
11568 char *salt_buf = input_buf + 6;
11569
11570 uint salt_len = 8;
11571
11572 char *salt_buf_ptr = (char *) salt->salt_buf;
11573
11574 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11575
11576 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11577
11578 salt->salt_len = salt_len;
11579
11580 char *hash_pos = input_buf + 6 + 8;
11581
11582 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
11583 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
11584 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
11585 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
11586 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
11587 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
11588 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
11589 digest[7] = hex_to_uint64_t (&hash_pos[112]);
11590
11591 digest[0] -= SHA512M_A;
11592 digest[1] -= SHA512M_B;
11593 digest[2] -= SHA512M_C;
11594 digest[3] -= SHA512M_D;
11595 digest[4] -= SHA512M_E;
11596 digest[5] -= SHA512M_F;
11597 digest[6] -= SHA512M_G;
11598 digest[7] -= SHA512M_H;
11599
11600 return (PARSER_OK);
11601 }
11602
11603 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11604 {
11605 if (data.opts_type & OPTS_TYPE_ST_HEX)
11606 {
11607 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11608 }
11609 else
11610 {
11611 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11612 }
11613
11614 uint32_t *digest = (uint32_t *) hash_buf->digest;
11615
11616 salt_t *salt = hash_buf->salt;
11617
11618 digest[0] = hex_to_uint (&input_buf[ 0]);
11619 digest[1] = hex_to_uint (&input_buf[ 8]);
11620 digest[2] = 0;
11621 digest[3] = 0;
11622
11623 digest[0] = byte_swap_32 (digest[0]);
11624 digest[1] = byte_swap_32 (digest[1]);
11625
11626 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11627
11628 uint salt_len = input_len - 16 - 1;
11629
11630 char *salt_buf = input_buf + 16 + 1;
11631
11632 char *salt_buf_ptr = (char *) salt->salt_buf;
11633
11634 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11635
11636 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11637
11638 salt->salt_len = salt_len;
11639
11640 return (PARSER_OK);
11641 }
11642
11643 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11644 {
11645 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11646
11647 uint32_t *digest = (uint32_t *) hash_buf->digest;
11648
11649 salt_t *salt = hash_buf->salt;
11650
11651 digest[0] = hex_to_uint (&input_buf[ 0]);
11652 digest[1] = hex_to_uint (&input_buf[ 8]);
11653 digest[2] = hex_to_uint (&input_buf[16]);
11654 digest[3] = hex_to_uint (&input_buf[24]);
11655 digest[4] = hex_to_uint (&input_buf[32]);
11656
11657 digest[0] -= SHA1M_A;
11658 digest[1] -= SHA1M_B;
11659 digest[2] -= SHA1M_C;
11660 digest[3] -= SHA1M_D;
11661 digest[4] -= SHA1M_E;
11662
11663 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11664
11665 uint salt_len = input_len - 40 - 1;
11666
11667 char *salt_buf = input_buf + 40 + 1;
11668
11669 char *salt_buf_ptr = (char *) salt->salt_buf;
11670
11671 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11672
11673 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11674
11675 salt->salt_len = salt_len;
11676
11677 return (PARSER_OK);
11678 }
11679
11680 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11681 {
11682 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11683
11684 uint32_t *digest = (uint32_t *) hash_buf->digest;
11685
11686 salt_t *salt = hash_buf->salt;
11687
11688 char *hash_pos = input_buf;
11689
11690 digest[ 0] = hex_to_uint (&hash_pos[ 0]);
11691 digest[ 1] = hex_to_uint (&hash_pos[ 8]);
11692 digest[ 2] = hex_to_uint (&hash_pos[ 16]);
11693 digest[ 3] = hex_to_uint (&hash_pos[ 24]);
11694 digest[ 4] = hex_to_uint (&hash_pos[ 32]);
11695 digest[ 5] = hex_to_uint (&hash_pos[ 40]);
11696 digest[ 6] = hex_to_uint (&hash_pos[ 48]);
11697 digest[ 7] = hex_to_uint (&hash_pos[ 56]);
11698 digest[ 8] = hex_to_uint (&hash_pos[ 64]);
11699 digest[ 9] = hex_to_uint (&hash_pos[ 72]);
11700 digest[10] = hex_to_uint (&hash_pos[ 80]);
11701 digest[11] = hex_to_uint (&hash_pos[ 88]);
11702 digest[12] = hex_to_uint (&hash_pos[ 96]);
11703 digest[13] = hex_to_uint (&hash_pos[104]);
11704 digest[14] = hex_to_uint (&hash_pos[112]);
11705 digest[15] = hex_to_uint (&hash_pos[120]);
11706
11707 char *salt_pos = input_buf + 128;
11708
11709 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
11710 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
11711 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]);
11712 salt->salt_buf[3] = hex_to_uint (&salt_pos[24]);
11713
11714 salt->salt_iter = ROUNDS_ORACLET - 1;
11715 salt->salt_len = 16;
11716
11717 return (PARSER_OK);
11718 }
11719
11720 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11721 {
11722 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11723
11724 uint32_t *digest = (uint32_t *) hash_buf->digest;
11725
11726 digest[0] = hex_to_uint (&input_buf[ 0]);
11727 digest[1] = hex_to_uint (&input_buf[ 8]);
11728 digest[2] = hex_to_uint (&input_buf[16]);
11729 digest[3] = hex_to_uint (&input_buf[24]);
11730 digest[4] = hex_to_uint (&input_buf[32]);
11731 digest[5] = hex_to_uint (&input_buf[40]);
11732 digest[6] = hex_to_uint (&input_buf[48]);
11733 digest[7] = hex_to_uint (&input_buf[56]);
11734
11735 digest[0] -= SHA256M_A;
11736 digest[1] -= SHA256M_B;
11737 digest[2] -= SHA256M_C;
11738 digest[3] -= SHA256M_D;
11739 digest[4] -= SHA256M_E;
11740 digest[5] -= SHA256M_F;
11741 digest[6] -= SHA256M_G;
11742 digest[7] -= SHA256M_H;
11743
11744 return (PARSER_OK);
11745 }
11746
11747 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11748 {
11749 if (data.opts_type & OPTS_TYPE_ST_HEX)
11750 {
11751 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11752 }
11753 else
11754 {
11755 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11756 }
11757
11758 uint32_t *digest = (uint32_t *) hash_buf->digest;
11759
11760 salt_t *salt = hash_buf->salt;
11761
11762 digest[0] = hex_to_uint (&input_buf[ 0]);
11763 digest[1] = hex_to_uint (&input_buf[ 8]);
11764 digest[2] = hex_to_uint (&input_buf[16]);
11765 digest[3] = hex_to_uint (&input_buf[24]);
11766 digest[4] = hex_to_uint (&input_buf[32]);
11767 digest[5] = hex_to_uint (&input_buf[40]);
11768 digest[6] = hex_to_uint (&input_buf[48]);
11769 digest[7] = hex_to_uint (&input_buf[56]);
11770
11771 digest[0] -= SHA256M_A;
11772 digest[1] -= SHA256M_B;
11773 digest[2] -= SHA256M_C;
11774 digest[3] -= SHA256M_D;
11775 digest[4] -= SHA256M_E;
11776 digest[5] -= SHA256M_F;
11777 digest[6] -= SHA256M_G;
11778 digest[7] -= SHA256M_H;
11779
11780 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11781
11782 uint salt_len = input_len - 64 - 1;
11783
11784 char *salt_buf = input_buf + 64 + 1;
11785
11786 char *salt_buf_ptr = (char *) salt->salt_buf;
11787
11788 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11789
11790 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11791
11792 salt->salt_len = salt_len;
11793
11794 return (PARSER_OK);
11795 }
11796
11797 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11798 {
11799 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11800
11801 uint64_t *digest = (uint64_t *) hash_buf->digest;
11802
11803 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11804 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11805 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11806 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11807 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11808 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11809 digest[6] = 0;
11810 digest[7] = 0;
11811
11812 digest[0] -= SHA384M_A;
11813 digest[1] -= SHA384M_B;
11814 digest[2] -= SHA384M_C;
11815 digest[3] -= SHA384M_D;
11816 digest[4] -= SHA384M_E;
11817 digest[5] -= SHA384M_F;
11818 digest[6] -= 0;
11819 digest[7] -= 0;
11820
11821 return (PARSER_OK);
11822 }
11823
11824 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11825 {
11826 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
11827
11828 uint64_t *digest = (uint64_t *) hash_buf->digest;
11829
11830 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11831 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11832 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11833 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11834 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11835 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11836 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
11837 digest[7] = hex_to_uint64_t (&input_buf[112]);
11838
11839 digest[0] -= SHA512M_A;
11840 digest[1] -= SHA512M_B;
11841 digest[2] -= SHA512M_C;
11842 digest[3] -= SHA512M_D;
11843 digest[4] -= SHA512M_E;
11844 digest[5] -= SHA512M_F;
11845 digest[6] -= SHA512M_G;
11846 digest[7] -= SHA512M_H;
11847
11848 return (PARSER_OK);
11849 }
11850
11851 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11852 {
11853 if (data.opts_type & OPTS_TYPE_ST_HEX)
11854 {
11855 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
11856 }
11857 else
11858 {
11859 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
11860 }
11861
11862 uint64_t *digest = (uint64_t *) hash_buf->digest;
11863
11864 salt_t *salt = hash_buf->salt;
11865
11866 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11867 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11868 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11869 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11870 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11871 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11872 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
11873 digest[7] = hex_to_uint64_t (&input_buf[112]);
11874
11875 digest[0] -= SHA512M_A;
11876 digest[1] -= SHA512M_B;
11877 digest[2] -= SHA512M_C;
11878 digest[3] -= SHA512M_D;
11879 digest[4] -= SHA512M_E;
11880 digest[5] -= SHA512M_F;
11881 digest[6] -= SHA512M_G;
11882 digest[7] -= SHA512M_H;
11883
11884 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11885
11886 uint salt_len = input_len - 128 - 1;
11887
11888 char *salt_buf = input_buf + 128 + 1;
11889
11890 char *salt_buf_ptr = (char *) salt->salt_buf;
11891
11892 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11893
11894 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11895
11896 salt->salt_len = salt_len;
11897
11898 return (PARSER_OK);
11899 }
11900
11901 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11902 {
11903 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
11904
11905 uint64_t *digest = (uint64_t *) hash_buf->digest;
11906
11907 salt_t *salt = hash_buf->salt;
11908
11909 char *salt_pos = input_buf + 3;
11910
11911 uint iterations_len = 0;
11912
11913 if (memcmp (salt_pos, "rounds=", 7) == 0)
11914 {
11915 salt_pos += 7;
11916
11917 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
11918
11919 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
11920 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
11921
11922 salt_pos[0] = 0x0;
11923
11924 salt->salt_iter = atoi (salt_pos - iterations_len);
11925
11926 salt_pos += 1;
11927
11928 iterations_len += 8;
11929 }
11930 else
11931 {
11932 salt->salt_iter = ROUNDS_SHA512CRYPT;
11933 }
11934
11935 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
11936
11937 char *hash_pos = strchr (salt_pos, '$');
11938
11939 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11940
11941 uint salt_len = hash_pos - salt_pos;
11942
11943 if (salt_len > 16) return (PARSER_SALT_LENGTH);
11944
11945 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
11946
11947 salt->salt_len = salt_len;
11948
11949 hash_pos++;
11950
11951 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
11952
11953 return (PARSER_OK);
11954 }
11955
11956 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11957 {
11958 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
11959
11960 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
11961
11962 uint64_t *digest = (uint64_t *) hash_buf->digest;
11963
11964 salt_t *salt = hash_buf->salt;
11965
11966 uint keccak_mdlen = input_len / 2;
11967
11968 for (uint i = 0; i < keccak_mdlen / 8; i++)
11969 {
11970 digest[i] = hex_to_uint64_t (&input_buf[i * 16]);
11971
11972 digest[i] = byte_swap_64 (digest[i]);
11973 }
11974
11975 salt->keccak_mdlen = keccak_mdlen;
11976
11977 return (PARSER_OK);
11978 }
11979
11980 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11981 {
11982 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
11983
11984 uint32_t *digest = (uint32_t *) hash_buf->digest;
11985
11986 salt_t *salt = hash_buf->salt;
11987
11988 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
11989
11990 /**
11991 * Parse that strange long line
11992 */
11993
11994 char *in_off[9];
11995
11996 size_t in_len[9];
11997
11998 in_off[0] = strtok (input_buf, ":");
11999
12000 in_len[0] = strlen (in_off[0]);
12001
12002 size_t i;
12003
12004 for (i = 1; i < 9; i++)
12005 {
12006 in_off[i] = strtok (NULL, ":");
12007
12008 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12009
12010 in_len[i] = strlen (in_off[i]);
12011 }
12012
12013 char *ptr;
12014
12015 ptr = (char *) ikepsk->msg_buf;
12016
12017 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_char (in_off[0] + i);
12018 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_char (in_off[1] + i);
12019 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_char (in_off[2] + i);
12020 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_char (in_off[3] + i);
12021 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_char (in_off[4] + i);
12022 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_char (in_off[5] + i);
12023
12024 *ptr = 0x80;
12025
12026 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12027
12028 ptr = (char *) ikepsk->nr_buf;
12029
12030 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_char (in_off[6] + i);
12031 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_char (in_off[7] + i);
12032
12033 *ptr = 0x80;
12034
12035 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12036
12037 /**
12038 * Store to database
12039 */
12040
12041 ptr = in_off[8];
12042
12043 digest[0] = hex_to_uint (&ptr[ 0]);
12044 digest[1] = hex_to_uint (&ptr[ 8]);
12045 digest[2] = hex_to_uint (&ptr[16]);
12046 digest[3] = hex_to_uint (&ptr[24]);
12047
12048 digest[0] = byte_swap_32 (digest[0]);
12049 digest[1] = byte_swap_32 (digest[1]);
12050 digest[2] = byte_swap_32 (digest[2]);
12051 digest[3] = byte_swap_32 (digest[3]);
12052
12053 salt->salt_len = 32;
12054
12055 salt->salt_buf[0] = ikepsk->nr_buf[0];
12056 salt->salt_buf[1] = ikepsk->nr_buf[1];
12057 salt->salt_buf[2] = ikepsk->nr_buf[2];
12058 salt->salt_buf[3] = ikepsk->nr_buf[3];
12059 salt->salt_buf[4] = ikepsk->nr_buf[4];
12060 salt->salt_buf[5] = ikepsk->nr_buf[5];
12061 salt->salt_buf[6] = ikepsk->nr_buf[6];
12062 salt->salt_buf[7] = ikepsk->nr_buf[7];
12063
12064 return (PARSER_OK);
12065 }
12066
12067 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12068 {
12069 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12070
12071 uint32_t *digest = (uint32_t *) hash_buf->digest;
12072
12073 salt_t *salt = hash_buf->salt;
12074
12075 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12076
12077 /**
12078 * Parse that strange long line
12079 */
12080
12081 char *in_off[9];
12082
12083 size_t in_len[9];
12084
12085 in_off[0] = strtok (input_buf, ":");
12086
12087 in_len[0] = strlen (in_off[0]);
12088
12089 size_t i;
12090
12091 for (i = 1; i < 9; i++)
12092 {
12093 in_off[i] = strtok (NULL, ":");
12094
12095 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12096
12097 in_len[i] = strlen (in_off[i]);
12098 }
12099
12100 char *ptr;
12101
12102 ptr = (char *) ikepsk->msg_buf;
12103
12104 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_char (in_off[0] + i);
12105 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_char (in_off[1] + i);
12106 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_char (in_off[2] + i);
12107 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_char (in_off[3] + i);
12108 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_char (in_off[4] + i);
12109 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_char (in_off[5] + i);
12110
12111 *ptr = 0x80;
12112
12113 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12114
12115 ptr = (char *) ikepsk->nr_buf;
12116
12117 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_char (in_off[6] + i);
12118 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_char (in_off[7] + i);
12119
12120 *ptr = 0x80;
12121
12122 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12123
12124 /**
12125 * Store to database
12126 */
12127
12128 ptr = in_off[8];
12129
12130 digest[0] = hex_to_uint (&ptr[ 0]);
12131 digest[1] = hex_to_uint (&ptr[ 8]);
12132 digest[2] = hex_to_uint (&ptr[16]);
12133 digest[3] = hex_to_uint (&ptr[24]);
12134 digest[4] = hex_to_uint (&ptr[32]);
12135
12136 salt->salt_len = 32;
12137
12138 salt->salt_buf[0] = ikepsk->nr_buf[0];
12139 salt->salt_buf[1] = ikepsk->nr_buf[1];
12140 salt->salt_buf[2] = ikepsk->nr_buf[2];
12141 salt->salt_buf[3] = ikepsk->nr_buf[3];
12142 salt->salt_buf[4] = ikepsk->nr_buf[4];
12143 salt->salt_buf[5] = ikepsk->nr_buf[5];
12144 salt->salt_buf[6] = ikepsk->nr_buf[6];
12145 salt->salt_buf[7] = ikepsk->nr_buf[7];
12146
12147 return (PARSER_OK);
12148 }
12149
12150 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12151 {
12152 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12153
12154 uint32_t *digest = (uint32_t *) hash_buf->digest;
12155
12156 digest[0] = hex_to_uint (&input_buf[ 0]);
12157 digest[1] = hex_to_uint (&input_buf[ 8]);
12158 digest[2] = hex_to_uint (&input_buf[16]);
12159 digest[3] = hex_to_uint (&input_buf[24]);
12160 digest[4] = hex_to_uint (&input_buf[32]);
12161
12162 digest[0] = byte_swap_32 (digest[0]);
12163 digest[1] = byte_swap_32 (digest[1]);
12164 digest[2] = byte_swap_32 (digest[2]);
12165 digest[3] = byte_swap_32 (digest[3]);
12166 digest[4] = byte_swap_32 (digest[4]);
12167
12168 return (PARSER_OK);
12169 }
12170
12171 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12172 {
12173 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12174
12175 uint32_t *digest = (uint32_t *) hash_buf->digest;
12176
12177 digest[ 0] = hex_to_uint (&input_buf[ 0]);
12178 digest[ 1] = hex_to_uint (&input_buf[ 8]);
12179 digest[ 2] = hex_to_uint (&input_buf[ 16]);
12180 digest[ 3] = hex_to_uint (&input_buf[ 24]);
12181 digest[ 4] = hex_to_uint (&input_buf[ 32]);
12182 digest[ 5] = hex_to_uint (&input_buf[ 40]);
12183 digest[ 6] = hex_to_uint (&input_buf[ 48]);
12184 digest[ 7] = hex_to_uint (&input_buf[ 56]);
12185 digest[ 8] = hex_to_uint (&input_buf[ 64]);
12186 digest[ 9] = hex_to_uint (&input_buf[ 72]);
12187 digest[10] = hex_to_uint (&input_buf[ 80]);
12188 digest[11] = hex_to_uint (&input_buf[ 88]);
12189 digest[12] = hex_to_uint (&input_buf[ 96]);
12190 digest[13] = hex_to_uint (&input_buf[104]);
12191 digest[14] = hex_to_uint (&input_buf[112]);
12192 digest[15] = hex_to_uint (&input_buf[120]);
12193
12194 return (PARSER_OK);
12195 }
12196
12197 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12198 {
12199 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12200
12201 uint32_t *digest = (uint32_t *) hash_buf->digest;
12202
12203 salt_t *salt = hash_buf->salt;
12204
12205 digest[0] = hex_to_uint (&input_buf[ 0]);
12206 digest[1] = hex_to_uint (&input_buf[ 8]);
12207 digest[2] = hex_to_uint (&input_buf[16]);
12208 digest[3] = hex_to_uint (&input_buf[24]);
12209 digest[4] = hex_to_uint (&input_buf[32]);
12210
12211 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12212
12213 uint salt_len = input_len - 40 - 1;
12214
12215 char *salt_buf = input_buf + 40 + 1;
12216
12217 char *salt_buf_ptr = (char *) salt->salt_buf;
12218
12219 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12220
12221 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12222
12223 salt->salt_len = salt_len;
12224
12225 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12226
12227 return (PARSER_OK);
12228 }
12229
12230 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12231 {
12232 uint32_t *digest = (uint32_t *) hash_buf->digest;
12233
12234 salt_t *salt = hash_buf->salt;
12235
12236 tc_t *tc = (tc_t *) hash_buf->esalt;
12237
12238 if (input_len == 0)
12239 {
12240 log_error ("TrueCrypt container not specified");
12241
12242 exit (-1);
12243 }
12244
12245 FILE *fp = fopen (input_buf, "rb");
12246
12247 if (fp == NULL)
12248 {
12249 log_error ("%s: %s", input_buf, strerror (errno));
12250
12251 exit (-1);
12252 }
12253
12254 char buf[512];
12255
12256 int n = fread (buf, 1, sizeof (buf), fp);
12257
12258 fclose (fp);
12259
12260 if (n != 512) return (PARSER_TC_FILE_SIZE);
12261
12262 memcpy (tc->salt_buf, buf, 64);
12263
12264 memcpy (tc->data_buf, buf + 64, 512 - 64);
12265
12266 salt->salt_buf[0] = tc->salt_buf[0];
12267
12268 salt->salt_len = 4;
12269
12270 salt->salt_iter = 1000 - 1;
12271
12272 digest[0] = tc->data_buf[0];
12273
12274 return (PARSER_OK);
12275 }
12276
12277 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12278 {
12279 uint32_t *digest = (uint32_t *) hash_buf->digest;
12280
12281 salt_t *salt = hash_buf->salt;
12282
12283 tc_t *tc = (tc_t *) hash_buf->esalt;
12284
12285 if (input_len == 0)
12286 {
12287 log_error ("TrueCrypt container not specified");
12288
12289 exit (-1);
12290 }
12291
12292 FILE *fp = fopen (input_buf, "rb");
12293
12294 if (fp == NULL)
12295 {
12296 log_error ("%s: %s", input_buf, strerror (errno));
12297
12298 exit (-1);
12299 }
12300
12301 char buf[512];
12302
12303 int n = fread (buf, 1, sizeof (buf), fp);
12304
12305 fclose (fp);
12306
12307 if (n != 512) return (PARSER_TC_FILE_SIZE);
12308
12309 memcpy (tc->salt_buf, buf, 64);
12310
12311 memcpy (tc->data_buf, buf + 64, 512 - 64);
12312
12313 salt->salt_buf[0] = tc->salt_buf[0];
12314
12315 salt->salt_len = 4;
12316
12317 salt->salt_iter = 2000 - 1;
12318
12319 digest[0] = tc->data_buf[0];
12320
12321 return (PARSER_OK);
12322 }
12323
12324 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12325 {
12326 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12327
12328 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12329
12330 uint32_t *digest = (uint32_t *) hash_buf->digest;
12331
12332 salt_t *salt = hash_buf->salt;
12333
12334 char *salt_pos = input_buf + 6;
12335
12336 char *hash_pos = strchr (salt_pos, '$');
12337
12338 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12339
12340 uint salt_len = hash_pos - salt_pos;
12341
12342 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12343
12344 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12345
12346 salt->salt_len = salt_len;
12347
12348 salt->salt_iter = 1000;
12349
12350 hash_pos++;
12351
12352 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12353
12354 return (PARSER_OK);
12355 }
12356
12357 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12358 {
12359 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12360
12361 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12362
12363 uint32_t *digest = (uint32_t *) hash_buf->digest;
12364
12365 salt_t *salt = hash_buf->salt;
12366
12367 char *iter_pos = input_buf + 7;
12368
12369 char *salt_pos = strchr (iter_pos, '$');
12370
12371 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12372
12373 salt_pos++;
12374
12375 char *hash_pos = strchr (salt_pos, '$');
12376
12377 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12378
12379 uint salt_len = hash_pos - salt_pos;
12380
12381 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12382
12383 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12384
12385 salt->salt_len = salt_len;
12386
12387 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12388
12389 salt->salt_sign[0] = atoi (salt_iter);
12390
12391 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12392
12393 hash_pos++;
12394
12395 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12396
12397 digest[0] = byte_swap_32 (digest[0]);
12398 digest[1] = byte_swap_32 (digest[1]);
12399 digest[2] = byte_swap_32 (digest[2]);
12400 digest[3] = byte_swap_32 (digest[3]);
12401 digest[4] = byte_swap_32 (digest[4]);
12402
12403 return (PARSER_OK);
12404 }
12405
12406 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12407 {
12408 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12409
12410 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12411
12412 uint32_t *digest = (uint32_t *) hash_buf->digest;
12413
12414 salt_t *salt = hash_buf->salt;
12415
12416 char *iter_pos = input_buf + 9;
12417
12418 char *salt_pos = strchr (iter_pos, '$');
12419
12420 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12421
12422 salt_pos++;
12423
12424 char *hash_pos = strchr (salt_pos, '$');
12425
12426 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12427
12428 uint salt_len = hash_pos - salt_pos;
12429
12430 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12431
12432 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12433
12434 salt->salt_len = salt_len;
12435
12436 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12437
12438 salt->salt_sign[0] = atoi (salt_iter);
12439
12440 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12441
12442 hash_pos++;
12443
12444 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12445
12446 digest[0] = byte_swap_32 (digest[0]);
12447 digest[1] = byte_swap_32 (digest[1]);
12448 digest[2] = byte_swap_32 (digest[2]);
12449 digest[3] = byte_swap_32 (digest[3]);
12450 digest[4] = byte_swap_32 (digest[4]);
12451 digest[5] = byte_swap_32 (digest[5]);
12452 digest[6] = byte_swap_32 (digest[6]);
12453 digest[7] = byte_swap_32 (digest[7]);
12454
12455 return (PARSER_OK);
12456 }
12457
12458 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12459 {
12460 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12461
12462 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12463
12464 uint64_t *digest = (uint64_t *) hash_buf->digest;
12465
12466 salt_t *salt = hash_buf->salt;
12467
12468 char *iter_pos = input_buf + 9;
12469
12470 char *salt_pos = strchr (iter_pos, '$');
12471
12472 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12473
12474 salt_pos++;
12475
12476 char *hash_pos = strchr (salt_pos, '$');
12477
12478 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12479
12480 uint salt_len = hash_pos - salt_pos;
12481
12482 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12483
12484 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12485
12486 salt->salt_len = salt_len;
12487
12488 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12489
12490 salt->salt_sign[0] = atoi (salt_iter);
12491
12492 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12493
12494 hash_pos++;
12495
12496 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12497
12498 digest[0] = byte_swap_64 (digest[0]);
12499 digest[1] = byte_swap_64 (digest[1]);
12500 digest[2] = byte_swap_64 (digest[2]);
12501 digest[3] = byte_swap_64 (digest[3]);
12502 digest[4] = byte_swap_64 (digest[4]);
12503 digest[5] = byte_swap_64 (digest[5]);
12504 digest[6] = byte_swap_64 (digest[6]);
12505 digest[7] = byte_swap_64 (digest[7]);
12506
12507 return (PARSER_OK);
12508 }
12509
12510 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12511 {
12512 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12513
12514 uint32_t *digest = (uint32_t *) hash_buf->digest;
12515
12516 salt_t *salt = hash_buf->salt;
12517
12518 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12519
12520 /**
12521 * parse line
12522 */
12523
12524 char *iterations_pos = input_buf;
12525
12526 char *saltbuf_pos = strchr (iterations_pos, ':');
12527
12528 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12529
12530 uint iterations_len = saltbuf_pos - iterations_pos;
12531
12532 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12533
12534 saltbuf_pos++;
12535
12536 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12537
12538 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12539
12540 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12541
12542 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12543
12544 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12545
12546 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12547
12548 cipherbuf_pos++;
12549
12550 /**
12551 * pbkdf2 iterations
12552 */
12553
12554 salt->salt_iter = atoi (iterations_pos) - 1;
12555
12556 /**
12557 * handle salt encoding
12558 */
12559
12560 char *saltbuf_ptr = (char *) salt->salt_buf;
12561
12562 for (uint i = 0; i < saltbuf_len; i += 2)
12563 {
12564 const char p0 = saltbuf_pos[i + 0];
12565 const char p1 = saltbuf_pos[i + 1];
12566
12567 *saltbuf_ptr++ = hex_convert (p1) << 0
12568 | hex_convert (p0) << 4;
12569 }
12570
12571 salt->salt_len = saltbuf_len / 2;
12572
12573 /**
12574 * handle cipher encoding
12575 */
12576
12577 uint *tmp = (uint *) mymalloc (32);
12578
12579 char *cipherbuf_ptr = (char *) tmp;
12580
12581 for (uint i = 2016; i < cipherbuf_len; i += 2)
12582 {
12583 const char p0 = cipherbuf_pos[i + 0];
12584 const char p1 = cipherbuf_pos[i + 1];
12585
12586 *cipherbuf_ptr++ = hex_convert (p1) << 0
12587 | hex_convert (p0) << 4;
12588 }
12589
12590 // iv is stored at salt_buf 4 (length 16)
12591 // data is stored at salt_buf 8 (length 16)
12592
12593 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12594 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12595 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12596 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12597
12598 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12599 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12600 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12601 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12602
12603 free (tmp);
12604
12605 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12606 {
12607 const char p0 = cipherbuf_pos[j + 0];
12608 const char p1 = cipherbuf_pos[j + 1];
12609
12610 agilekey->cipher[i] = hex_convert (p1) << 0
12611 | hex_convert (p0) << 4;
12612 }
12613
12614 /**
12615 * digest buf
12616 */
12617
12618 digest[0] = 0x10101010;
12619 digest[1] = 0x10101010;
12620 digest[2] = 0x10101010;
12621 digest[3] = 0x10101010;
12622
12623 return (PARSER_OK);
12624 }
12625
12626 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12627 {
12628 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12629
12630 uint32_t *digest = (uint32_t *) hash_buf->digest;
12631
12632 salt_t *salt = hash_buf->salt;
12633
12634 char *hashbuf_pos = input_buf;
12635
12636 char *iterations_pos = strchr (hashbuf_pos, ':');
12637
12638 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12639
12640 uint hash_len = iterations_pos - hashbuf_pos;
12641
12642 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12643
12644 iterations_pos++;
12645
12646 char *saltbuf_pos = strchr (iterations_pos, ':');
12647
12648 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12649
12650 uint iterations_len = saltbuf_pos - iterations_pos;
12651
12652 saltbuf_pos++;
12653
12654 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12655
12656 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12657
12658 char *salt_buf_ptr = (char *) salt->salt_buf;
12659
12660 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12661
12662 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12663
12664 salt->salt_len = salt_len;
12665
12666 salt->salt_iter = atoi (iterations_pos) - 1;
12667
12668 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
12669 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
12670 digest[2] = hex_to_uint (&hashbuf_pos[16]);
12671 digest[3] = hex_to_uint (&hashbuf_pos[24]);
12672
12673 return (PARSER_OK);
12674 }
12675
12676 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12677 {
12678 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12679
12680 uint32_t *digest = (uint32_t *) hash_buf->digest;
12681
12682 digest[0] = hex_to_uint (&input_buf[ 0]);
12683 digest[1] = hex_to_uint (&input_buf[ 8]);
12684 digest[2] = hex_to_uint (&input_buf[16]);
12685 digest[3] = hex_to_uint (&input_buf[24]);
12686 digest[4] = hex_to_uint (&input_buf[32]);
12687 digest[5] = hex_to_uint (&input_buf[40]);
12688 digest[6] = hex_to_uint (&input_buf[48]);
12689 digest[7] = hex_to_uint (&input_buf[56]);
12690
12691 digest[0] = byte_swap_32 (digest[0]);
12692 digest[1] = byte_swap_32 (digest[1]);
12693 digest[2] = byte_swap_32 (digest[2]);
12694 digest[3] = byte_swap_32 (digest[3]);
12695 digest[4] = byte_swap_32 (digest[4]);
12696 digest[5] = byte_swap_32 (digest[5]);
12697 digest[6] = byte_swap_32 (digest[6]);
12698 digest[7] = byte_swap_32 (digest[7]);
12699
12700 return (PARSER_OK);
12701 }
12702
12703 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12704 {
12705 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12706
12707 uint32_t *digest = (uint32_t *) hash_buf->digest;
12708
12709 salt_t *salt = hash_buf->salt;
12710
12711 char *salt_pos = input_buf + 3;
12712
12713 uint iterations_len = 0;
12714
12715 if (memcmp (salt_pos, "rounds=", 7) == 0)
12716 {
12717 salt_pos += 7;
12718
12719 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12720
12721 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12722 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12723
12724 salt_pos[0] = 0x0;
12725
12726 salt->salt_iter = atoi (salt_pos - iterations_len);
12727
12728 salt_pos += 1;
12729
12730 iterations_len += 8;
12731 }
12732 else
12733 {
12734 salt->salt_iter = ROUNDS_SHA256CRYPT;
12735 }
12736
12737 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12738
12739 char *hash_pos = strchr (salt_pos, '$');
12740
12741 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12742
12743 uint salt_len = hash_pos - salt_pos;
12744
12745 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12746
12747 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12748
12749 salt->salt_len = salt_len;
12750
12751 hash_pos++;
12752
12753 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12754
12755 return (PARSER_OK);
12756 }
12757
12758 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12759 {
12760 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12761
12762 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12763
12764 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12765
12766 uint64_t *digest = (uint64_t *) hash_buf->digest;
12767
12768 salt_t *salt = hash_buf->salt;
12769
12770 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12771
12772 char *iter_pos = input_buf + 4;
12773
12774 char *salt_pos = strchr (iter_pos, '$');
12775
12776 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12777
12778 salt_pos++;
12779
12780 char *hash_pos = strchr (salt_pos, '$');
12781
12782 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12783
12784 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12785
12786 hash_pos++;
12787
12788 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
12789 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
12790 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
12791 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
12792 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
12793 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
12794 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
12795 digest[7] = hex_to_uint64_t (&hash_pos[112]);
12796
12797 uint salt_len = hash_pos - salt_pos - 1;
12798
12799 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12800
12801 salt->salt_len = salt_len / 2;
12802
12803 pbkdf2_sha512->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
12804 pbkdf2_sha512->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
12805 pbkdf2_sha512->salt_buf[2] = hex_to_uint (&salt_pos[16]);
12806 pbkdf2_sha512->salt_buf[3] = hex_to_uint (&salt_pos[24]);
12807 pbkdf2_sha512->salt_buf[4] = hex_to_uint (&salt_pos[32]);
12808 pbkdf2_sha512->salt_buf[5] = hex_to_uint (&salt_pos[40]);
12809 pbkdf2_sha512->salt_buf[6] = hex_to_uint (&salt_pos[48]);
12810 pbkdf2_sha512->salt_buf[7] = hex_to_uint (&salt_pos[56]);
12811
12812 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12813 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12814 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12815 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12816 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12817 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12818 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12819 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12820 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12821 pbkdf2_sha512->salt_buf[9] = 0x80;
12822
12823 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12824
12825 salt->salt_iter = atoi (iter_pos) - 1;
12826
12827 return (PARSER_OK);
12828 }
12829
12830 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12831 {
12832 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12833
12834 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12835
12836 uint32_t *digest = (uint32_t *) hash_buf->digest;
12837
12838 salt_t *salt = hash_buf->salt;
12839
12840 char *salt_pos = input_buf + 14;
12841
12842 char *hash_pos = strchr (salt_pos, '*');
12843
12844 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12845
12846 hash_pos++;
12847
12848 uint salt_len = hash_pos - salt_pos - 1;
12849
12850 char *salt_buf_ptr = (char *) salt->salt_buf;
12851
12852 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
12853
12854 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12855
12856 salt->salt_len = salt_len;
12857
12858 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
12859
12860 base64_decode (base64_to_int, hash_pos, 43, tmp_buf);
12861
12862 memcpy (digest, tmp_buf, 32);
12863
12864 digest[0] = byte_swap_32 (digest[0]);
12865 digest[1] = byte_swap_32 (digest[1]);
12866 digest[2] = byte_swap_32 (digest[2]);
12867 digest[3] = byte_swap_32 (digest[3]);
12868 digest[4] = byte_swap_32 (digest[4]);
12869 digest[5] = byte_swap_32 (digest[5]);
12870 digest[6] = byte_swap_32 (digest[6]);
12871 digest[7] = byte_swap_32 (digest[7]);
12872
12873 digest[0] -= SHA256M_A;
12874 digest[1] -= SHA256M_B;
12875 digest[2] -= SHA256M_C;
12876 digest[3] -= SHA256M_D;
12877 digest[4] -= SHA256M_E;
12878 digest[5] -= SHA256M_F;
12879 digest[6] -= SHA256M_G;
12880 digest[7] -= SHA256M_H;
12881
12882 return (PARSER_OK);
12883 }
12884
12885 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12886 {
12887 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
12888
12889 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12890
12891 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
12892
12893 uint64_t *digest = (uint64_t *) hash_buf->digest;
12894
12895 salt_t *salt = hash_buf->salt;
12896
12897 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12898
12899 char *iter_pos = input_buf + 19;
12900
12901 char *salt_pos = strchr (iter_pos, '.');
12902
12903 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12904
12905 salt_pos++;
12906
12907 char *hash_pos = strchr (salt_pos, '.');
12908
12909 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12910
12911 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12912
12913 hash_pos++;
12914
12915 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
12916 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
12917 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
12918 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
12919 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
12920 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
12921 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
12922 digest[7] = hex_to_uint64_t (&hash_pos[112]);
12923
12924 uint salt_len = hash_pos - salt_pos - 1;
12925
12926 salt_len /= 2;
12927
12928 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
12929
12930 uint i;
12931
12932 for (i = 0; i < salt_len; i++)
12933 {
12934 salt_buf_ptr[i] = hex_to_char (&salt_pos[i * 2]);
12935 }
12936
12937 salt_buf_ptr[salt_len + 3] = 0x01;
12938 salt_buf_ptr[salt_len + 4] = 0x80;
12939
12940 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12941
12942 salt->salt_len = salt_len;
12943
12944 salt->salt_iter = atoi (iter_pos) - 1;
12945
12946 return (PARSER_OK);
12947 }
12948
12949 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12950 {
12951 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
12952
12953 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12954
12955 uint64_t *digest = (uint64_t *) hash_buf->digest;
12956
12957 salt_t *salt = hash_buf->salt;
12958
12959 char tmp_buf[120];
12960
12961 memset (tmp_buf, 0, sizeof (tmp_buf));
12962
12963 int tmp_len = base64_decode (base64_to_int, input_buf + 9, input_len - 9, tmp_buf);
12964
12965 memcpy (digest, tmp_buf, 64);
12966
12967 digest[0] = byte_swap_64 (digest[0]);
12968 digest[1] = byte_swap_64 (digest[1]);
12969 digest[2] = byte_swap_64 (digest[2]);
12970 digest[3] = byte_swap_64 (digest[3]);
12971 digest[4] = byte_swap_64 (digest[4]);
12972 digest[5] = byte_swap_64 (digest[5]);
12973 digest[6] = byte_swap_64 (digest[6]);
12974 digest[7] = byte_swap_64 (digest[7]);
12975
12976 digest[0] -= SHA512M_A;
12977 digest[1] -= SHA512M_B;
12978 digest[2] -= SHA512M_C;
12979 digest[3] -= SHA512M_D;
12980 digest[4] -= SHA512M_E;
12981 digest[5] -= SHA512M_F;
12982 digest[6] -= SHA512M_G;
12983 digest[7] -= SHA512M_H;
12984
12985 salt->salt_len = tmp_len - 64;
12986
12987 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
12988
12989 if (data.opts_type & OPTS_TYPE_ST_ADD80)
12990 {
12991 char *ptr = (char *) salt->salt_buf;
12992
12993 ptr[salt->salt_len] = 0x80;
12994 }
12995
12996 return (PARSER_OK);
12997 }
12998
12999 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13000 {
13001 if (data.opts_type & OPTS_TYPE_ST_HEX)
13002 {
13003 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13004 }
13005 else
13006 {
13007 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13008 }
13009
13010 uint32_t *digest = (uint32_t *) hash_buf->digest;
13011
13012 salt_t *salt = hash_buf->salt;
13013
13014 digest[0] = hex_to_uint (&input_buf[ 0]);
13015 digest[1] = hex_to_uint (&input_buf[ 8]);
13016 digest[2] = hex_to_uint (&input_buf[16]);
13017 digest[3] = hex_to_uint (&input_buf[24]);
13018
13019 digest[0] = byte_swap_32 (digest[0]);
13020 digest[1] = byte_swap_32 (digest[1]);
13021 digest[2] = byte_swap_32 (digest[2]);
13022 digest[3] = byte_swap_32 (digest[3]);
13023
13024 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13025
13026 uint salt_len = input_len - 32 - 1;
13027
13028 char *salt_buf = input_buf + 32 + 1;
13029
13030 char *salt_buf_ptr = (char *) salt->salt_buf;
13031
13032 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13033
13034 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13035
13036 salt->salt_len = salt_len;
13037
13038 return (PARSER_OK);
13039 }
13040
13041 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13042 {
13043 if (data.opts_type & OPTS_TYPE_ST_HEX)
13044 {
13045 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13046 }
13047 else
13048 {
13049 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13050 }
13051
13052 uint32_t *digest = (uint32_t *) hash_buf->digest;
13053
13054 salt_t *salt = hash_buf->salt;
13055
13056 digest[0] = hex_to_uint (&input_buf[ 0]);
13057 digest[1] = hex_to_uint (&input_buf[ 8]);
13058 digest[2] = hex_to_uint (&input_buf[16]);
13059 digest[3] = hex_to_uint (&input_buf[24]);
13060 digest[4] = hex_to_uint (&input_buf[32]);
13061
13062 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13063
13064 uint salt_len = input_len - 40 - 1;
13065
13066 char *salt_buf = input_buf + 40 + 1;
13067
13068 char *salt_buf_ptr = (char *) salt->salt_buf;
13069
13070 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13071
13072 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13073
13074 salt->salt_len = salt_len;
13075
13076 return (PARSER_OK);
13077 }
13078
13079 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13080 {
13081 if (data.opts_type & OPTS_TYPE_ST_HEX)
13082 {
13083 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13084 }
13085 else
13086 {
13087 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13088 }
13089
13090 uint32_t *digest = (uint32_t *) hash_buf->digest;
13091
13092 salt_t *salt = hash_buf->salt;
13093
13094 digest[0] = hex_to_uint (&input_buf[ 0]);
13095 digest[1] = hex_to_uint (&input_buf[ 8]);
13096 digest[2] = hex_to_uint (&input_buf[16]);
13097 digest[3] = hex_to_uint (&input_buf[24]);
13098 digest[4] = hex_to_uint (&input_buf[32]);
13099 digest[5] = hex_to_uint (&input_buf[40]);
13100 digest[6] = hex_to_uint (&input_buf[48]);
13101 digest[7] = hex_to_uint (&input_buf[56]);
13102
13103 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13104
13105 uint salt_len = input_len - 64 - 1;
13106
13107 char *salt_buf = input_buf + 64 + 1;
13108
13109 char *salt_buf_ptr = (char *) salt->salt_buf;
13110
13111 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13112
13113 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13114
13115 salt->salt_len = salt_len;
13116
13117 return (PARSER_OK);
13118 }
13119
13120 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13121 {
13122 if (data.opts_type & OPTS_TYPE_ST_HEX)
13123 {
13124 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13125 }
13126 else
13127 {
13128 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13129 }
13130
13131 uint64_t *digest = (uint64_t *) hash_buf->digest;
13132
13133 salt_t *salt = hash_buf->salt;
13134
13135 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
13136 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
13137 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
13138 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
13139 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
13140 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
13141 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
13142 digest[7] = hex_to_uint64_t (&input_buf[112]);
13143
13144 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13145
13146 uint salt_len = input_len - 128 - 1;
13147
13148 char *salt_buf = input_buf + 128 + 1;
13149
13150 char *salt_buf_ptr = (char *) salt->salt_buf;
13151
13152 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13153
13154 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13155
13156 salt->salt_len = salt_len;
13157
13158 return (PARSER_OK);
13159 }
13160
13161 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13162 {
13163 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13164
13165 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13166
13167 uint32_t *digest = (uint32_t *) hash_buf->digest;
13168
13169 salt_t *salt = hash_buf->salt;
13170
13171 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13172
13173 /**
13174 * parse line
13175 */
13176
13177 char *user_pos = input_buf + 10 + 1;
13178
13179 char *realm_pos = strchr (user_pos, '$');
13180
13181 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13182
13183 uint user_len = realm_pos - user_pos;
13184
13185 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13186
13187 realm_pos++;
13188
13189 char *salt_pos = strchr (realm_pos, '$');
13190
13191 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13192
13193 uint realm_len = salt_pos - realm_pos;
13194
13195 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13196
13197 salt_pos++;
13198
13199 char *data_pos = strchr (salt_pos, '$');
13200
13201 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13202
13203 uint salt_len = data_pos - salt_pos;
13204
13205 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13206
13207 data_pos++;
13208
13209 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13210
13211 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13212
13213 /**
13214 * copy data
13215 */
13216
13217 memcpy (krb5pa->user, user_pos, user_len);
13218 memcpy (krb5pa->realm, realm_pos, realm_len);
13219 memcpy (krb5pa->salt, salt_pos, salt_len);
13220
13221 char *timestamp_ptr = (char *) krb5pa->timestamp;
13222
13223 for (uint i = 0; i < (36 * 2); i += 2)
13224 {
13225 const char p0 = data_pos[i + 0];
13226 const char p1 = data_pos[i + 1];
13227
13228 *timestamp_ptr++ = hex_convert (p1) << 0
13229 | hex_convert (p0) << 4;
13230 }
13231
13232 char *checksum_ptr = (char *) krb5pa->checksum;
13233
13234 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13235 {
13236 const char p0 = data_pos[i + 0];
13237 const char p1 = data_pos[i + 1];
13238
13239 *checksum_ptr++ = hex_convert (p1) << 0
13240 | hex_convert (p0) << 4;
13241 }
13242
13243 /**
13244 * copy some data to generic buffers to make sorting happy
13245 */
13246
13247 salt->salt_buf[0] = krb5pa->timestamp[0];
13248 salt->salt_buf[1] = krb5pa->timestamp[1];
13249 salt->salt_buf[2] = krb5pa->timestamp[2];
13250 salt->salt_buf[3] = krb5pa->timestamp[3];
13251 salt->salt_buf[4] = krb5pa->timestamp[4];
13252 salt->salt_buf[5] = krb5pa->timestamp[5];
13253 salt->salt_buf[6] = krb5pa->timestamp[6];
13254 salt->salt_buf[7] = krb5pa->timestamp[7];
13255 salt->salt_buf[8] = krb5pa->timestamp[8];
13256
13257 salt->salt_len = 36;
13258
13259 digest[0] = krb5pa->checksum[0];
13260 digest[1] = krb5pa->checksum[1];
13261 digest[2] = krb5pa->checksum[2];
13262 digest[3] = krb5pa->checksum[3];
13263
13264 return (PARSER_OK);
13265 }
13266
13267 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13268 {
13269 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13270
13271 uint32_t *digest = (uint32_t *) hash_buf->digest;
13272
13273 salt_t *salt = hash_buf->salt;
13274
13275 /**
13276 * parse line
13277 */
13278
13279 char *salt_pos = input_buf;
13280
13281 char *hash_pos = strchr (salt_pos, '$');
13282
13283 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13284
13285 uint salt_len = hash_pos - salt_pos;
13286
13287 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13288
13289 hash_pos++;
13290
13291 uint hash_len = input_len - 1 - salt_len;
13292
13293 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13294
13295 /**
13296 * valid some data
13297 */
13298
13299 uint user_len = 0;
13300
13301 for (uint i = 0; i < salt_len; i++)
13302 {
13303 if (salt_pos[i] == ' ') continue;
13304
13305 user_len++;
13306 }
13307
13308 // SAP user names cannot be longer than 12 characters
13309 if (user_len > 12) return (PARSER_SALT_LENGTH);
13310
13311 // SAP user name cannot start with ! or ?
13312 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13313
13314 /**
13315 * copy data
13316 */
13317
13318 char *salt_buf_ptr = (char *) salt->salt_buf;
13319
13320 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13321
13322 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13323
13324 salt->salt_len = salt_len;
13325
13326 digest[0] = hex_to_uint (&hash_pos[0]);
13327 digest[1] = hex_to_uint (&hash_pos[8]);
13328 digest[2] = 0;
13329 digest[3] = 0;
13330
13331 digest[0] = byte_swap_32 (digest[0]);
13332 digest[1] = byte_swap_32 (digest[1]);
13333
13334 return (PARSER_OK);
13335 }
13336
13337 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13338 {
13339 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13340
13341 uint32_t *digest = (uint32_t *) hash_buf->digest;
13342
13343 salt_t *salt = hash_buf->salt;
13344
13345 /**
13346 * parse line
13347 */
13348
13349 char *salt_pos = input_buf;
13350
13351 char *hash_pos = strchr (salt_pos, '$');
13352
13353 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13354
13355 uint salt_len = hash_pos - salt_pos;
13356
13357 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13358
13359 hash_pos++;
13360
13361 uint hash_len = input_len - 1 - salt_len;
13362
13363 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13364
13365 /**
13366 * valid some data
13367 */
13368
13369 uint user_len = 0;
13370
13371 for (uint i = 0; i < salt_len; i++)
13372 {
13373 if (salt_pos[i] == ' ') continue;
13374
13375 user_len++;
13376 }
13377
13378 // SAP user names cannot be longer than 12 characters
13379 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
13380 // so far nobody complained so we stay with this because it helps in optimization
13381 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
13382
13383 if (user_len > 12) return (PARSER_SALT_LENGTH);
13384
13385 // SAP user name cannot start with ! or ?
13386 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13387
13388 /**
13389 * copy data
13390 */
13391
13392 char *salt_buf_ptr = (char *) salt->salt_buf;
13393
13394 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13395
13396 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13397
13398 salt->salt_len = salt_len;
13399
13400 digest[0] = hex_to_uint (&hash_pos[ 0]);
13401 digest[1] = hex_to_uint (&hash_pos[ 8]);
13402 digest[2] = hex_to_uint (&hash_pos[16]);
13403 digest[3] = hex_to_uint (&hash_pos[24]);
13404 digest[4] = hex_to_uint (&hash_pos[32]);
13405
13406 return (PARSER_OK);
13407 }
13408
13409 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13410 {
13411 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13412
13413 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13414
13415 uint64_t *digest = (uint64_t *) hash_buf->digest;
13416
13417 salt_t *salt = hash_buf->salt;
13418
13419 char *iter_pos = input_buf + 3;
13420
13421 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13422
13423 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13424
13425 memcpy ((char *) salt->salt_sign, input_buf, 4);
13426
13427 salt->salt_iter = salt_iter;
13428
13429 char *salt_pos = iter_pos + 1;
13430
13431 uint salt_len = 8;
13432
13433 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13434
13435 salt->salt_len = salt_len;
13436
13437 char *hash_pos = salt_pos + salt_len;
13438
13439 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13440
13441 // ugly hack start
13442
13443 char *tmp = (char *) salt->salt_buf_pc;
13444
13445 tmp[0] = hash_pos[42];
13446
13447 // ugly hack end
13448
13449 digest[ 0] = byte_swap_64 (digest[ 0]);
13450 digest[ 1] = byte_swap_64 (digest[ 1]);
13451 digest[ 2] = byte_swap_64 (digest[ 2]);
13452 digest[ 3] = byte_swap_64 (digest[ 3]);
13453 digest[ 4] = 0;
13454 digest[ 5] = 0;
13455 digest[ 6] = 0;
13456 digest[ 7] = 0;
13457
13458 return (PARSER_OK);
13459 }
13460
13461 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13462 {
13463 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13464
13465 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13466
13467 uint32_t *digest = (uint32_t *) hash_buf->digest;
13468
13469 salt_t *salt = hash_buf->salt;
13470
13471 char *salt_buf = input_buf + 6;
13472
13473 uint salt_len = 16;
13474
13475 char *salt_buf_ptr = (char *) salt->salt_buf;
13476
13477 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13478
13479 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13480
13481 salt->salt_len = salt_len;
13482
13483 char *hash_pos = input_buf + 6 + 16;
13484
13485 digest[0] = hex_to_uint (&hash_pos[ 0]);
13486 digest[1] = hex_to_uint (&hash_pos[ 8]);
13487 digest[2] = hex_to_uint (&hash_pos[16]);
13488 digest[3] = hex_to_uint (&hash_pos[24]);
13489 digest[4] = hex_to_uint (&hash_pos[32]);
13490 digest[5] = hex_to_uint (&hash_pos[40]);
13491 digest[6] = hex_to_uint (&hash_pos[48]);
13492 digest[7] = hex_to_uint (&hash_pos[56]);
13493
13494 return (PARSER_OK);
13495 }
13496
13497 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13498 {
13499 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13500
13501 uint32_t *digest = (uint32_t *) hash_buf->digest;
13502
13503 digest[0] = hex_to_uint (&input_buf[ 0]);
13504 digest[1] = hex_to_uint (&input_buf[ 8]);
13505 digest[2] = 0;
13506 digest[3] = 0;
13507
13508 return (PARSER_OK);
13509 }
13510
13511 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13512 {
13513 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13514
13515 uint32_t *digest = (uint32_t *) hash_buf->digest;
13516
13517 salt_t *salt = hash_buf->salt;
13518
13519 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13520
13521 char *saltbuf_pos = input_buf;
13522
13523 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13524
13525 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13526
13527 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13528
13529 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13530 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13531
13532 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13533
13534 hashbuf_pos++;
13535
13536 uint hashbuf_len = input_len - saltbuf_len - 1;
13537
13538 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13539
13540 char *salt_ptr = (char *) saltbuf_pos;
13541 char *rakp_ptr = (char *) rakp->salt_buf;
13542
13543 uint i;
13544 uint j;
13545
13546 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13547 {
13548 rakp_ptr[j] = hex_to_char (&salt_ptr[i]);
13549 }
13550
13551 rakp_ptr[j] = 0x80;
13552
13553 rakp->salt_len = j;
13554
13555 for (i = 0; i < 64; i++)
13556 {
13557 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13558 }
13559
13560 salt->salt_buf[0] = rakp->salt_buf[0];
13561 salt->salt_buf[1] = rakp->salt_buf[1];
13562 salt->salt_buf[2] = rakp->salt_buf[2];
13563 salt->salt_buf[3] = rakp->salt_buf[3];
13564 salt->salt_buf[4] = rakp->salt_buf[4];
13565 salt->salt_buf[5] = rakp->salt_buf[5];
13566 salt->salt_buf[6] = rakp->salt_buf[6];
13567 salt->salt_buf[7] = rakp->salt_buf[7];
13568
13569 salt->salt_len = 32; // muss min. 32 haben
13570
13571 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
13572 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
13573 digest[2] = hex_to_uint (&hashbuf_pos[16]);
13574 digest[3] = hex_to_uint (&hashbuf_pos[24]);
13575 digest[4] = hex_to_uint (&hashbuf_pos[32]);
13576
13577 return (PARSER_OK);
13578 }
13579
13580 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13581 {
13582 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13583
13584 uint32_t *digest = (uint32_t *) hash_buf->digest;
13585
13586 salt_t *salt = hash_buf->salt;
13587
13588 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13589
13590 char *salt_pos = input_buf + 1;
13591
13592 memcpy (salt->salt_buf, salt_pos, 8);
13593
13594 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13595 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13596
13597 salt->salt_len = 8;
13598
13599 char *hash_pos = salt_pos + 8;
13600
13601 digest[0] = hex_to_uint (&hash_pos[ 0]);
13602 digest[1] = hex_to_uint (&hash_pos[ 8]);
13603 digest[2] = hex_to_uint (&hash_pos[16]);
13604 digest[3] = hex_to_uint (&hash_pos[24]);
13605 digest[4] = hex_to_uint (&hash_pos[32]);
13606
13607 digest[0] -= SHA1M_A;
13608 digest[1] -= SHA1M_B;
13609 digest[2] -= SHA1M_C;
13610 digest[3] -= SHA1M_D;
13611 digest[4] -= SHA1M_E;
13612
13613 return (PARSER_OK);
13614 }
13615
13616 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13617 {
13618 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13619
13620 uint32_t *digest = (uint32_t *) hash_buf->digest;
13621
13622 salt_t *salt = hash_buf->salt;
13623
13624 digest[0] = hex_to_uint (&input_buf[ 0]);
13625 digest[1] = hex_to_uint (&input_buf[ 8]);
13626 digest[2] = hex_to_uint (&input_buf[16]);
13627 digest[3] = hex_to_uint (&input_buf[24]);
13628
13629 digest[0] = byte_swap_32 (digest[0]);
13630 digest[1] = byte_swap_32 (digest[1]);
13631 digest[2] = byte_swap_32 (digest[2]);
13632 digest[3] = byte_swap_32 (digest[3]);
13633
13634 digest[0] -= MD5M_A;
13635 digest[1] -= MD5M_B;
13636 digest[2] -= MD5M_C;
13637 digest[3] -= MD5M_D;
13638
13639 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13640
13641 char *salt_buf_ptr = input_buf + 32 + 1;
13642
13643 uint32_t *salt_buf = salt->salt_buf;
13644
13645 salt_buf[0] = hex_to_uint (&salt_buf_ptr[ 0]);
13646 salt_buf[1] = hex_to_uint (&salt_buf_ptr[ 8]);
13647 salt_buf[2] = hex_to_uint (&salt_buf_ptr[16]);
13648 salt_buf[3] = hex_to_uint (&salt_buf_ptr[24]);
13649
13650 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13651 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13652 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13653 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13654
13655 salt->salt_len = 16 + 1;
13656
13657 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13658
13659 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13660
13661 salt_buf[4] = hex_to_char (&idbyte_buf_ptr[0]) & 0xff;
13662
13663 return (PARSER_OK);
13664 }
13665
13666 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13667 {
13668 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13669
13670 uint32_t *digest = (uint32_t *) hash_buf->digest;
13671
13672 salt_t *salt = hash_buf->salt;
13673
13674 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13675
13676 /**
13677 * parse line
13678 */
13679
13680 char *hashbuf_pos = input_buf;
13681
13682 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13683
13684 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13685
13686 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13687
13688 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13689
13690 saltbuf_pos++;
13691
13692 char *iteration_pos = strchr (saltbuf_pos, ':');
13693
13694 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13695
13696 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13697
13698 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13699
13700 iteration_pos++;
13701
13702 char *databuf_pos = strchr (iteration_pos, ':');
13703
13704 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13705
13706 const uint iteration_len = databuf_pos - iteration_pos;
13707
13708 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13709 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13710
13711 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13712
13713 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13714 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13715
13716 databuf_pos++;
13717
13718 // digest
13719
13720 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
13721 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
13722 digest[2] = hex_to_uint (&hashbuf_pos[16]);
13723 digest[3] = hex_to_uint (&hashbuf_pos[24]);
13724 digest[4] = hex_to_uint (&hashbuf_pos[32]);
13725 digest[5] = hex_to_uint (&hashbuf_pos[40]);
13726 digest[6] = hex_to_uint (&hashbuf_pos[48]);
13727 digest[7] = hex_to_uint (&hashbuf_pos[56]);
13728
13729 // salt
13730
13731 char *saltbuf_ptr = (char *) salt->salt_buf;
13732
13733 for (uint i = 0; i < saltbuf_len; i += 2)
13734 {
13735 const char p0 = saltbuf_pos[i + 0];
13736 const char p1 = saltbuf_pos[i + 1];
13737
13738 *saltbuf_ptr++ = hex_convert (p1) << 0
13739 | hex_convert (p0) << 4;
13740 }
13741
13742 salt->salt_buf[4] = 0x01000000;
13743 salt->salt_buf[5] = 0x80;
13744
13745 salt->salt_len = saltbuf_len / 2;
13746
13747 // iteration
13748
13749 salt->salt_iter = atoi (iteration_pos) - 1;
13750
13751 // data
13752
13753 char *databuf_ptr = (char *) cloudkey->data_buf;
13754
13755 for (uint i = 0; i < databuf_len; i += 2)
13756 {
13757 const char p0 = databuf_pos[i + 0];
13758 const char p1 = databuf_pos[i + 1];
13759
13760 *databuf_ptr++ = hex_convert (p1) << 0
13761 | hex_convert (p0) << 4;
13762 }
13763
13764 *databuf_ptr++ = 0x80;
13765
13766 for (uint i = 0; i < 512; i++)
13767 {
13768 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13769 }
13770
13771 cloudkey->data_len = databuf_len / 2;
13772
13773 return (PARSER_OK);
13774 }
13775
13776 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13777 {
13778 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13779
13780 uint32_t *digest = (uint32_t *) hash_buf->digest;
13781
13782 salt_t *salt = hash_buf->salt;
13783
13784 /**
13785 * parse line
13786 */
13787
13788 char *hashbuf_pos = input_buf;
13789
13790 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13791
13792 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13793
13794 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13795
13796 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13797
13798 domainbuf_pos++;
13799
13800 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13801
13802 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13803
13804 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13805
13806 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13807
13808 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13809
13810 saltbuf_pos++;
13811
13812 char *iteration_pos = strchr (saltbuf_pos, ':');
13813
13814 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13815
13816 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13817
13818 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13819
13820 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13821
13822 iteration_pos++;
13823
13824 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13825
13826 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13827 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13828
13829 // ok, the plan for this algorithm is the following:
13830 // we have 2 salts here, the domain-name and a random salt
13831 // while both are used in the initial transformation,
13832 // only the random salt is used in the following iterations
13833 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13834 // and one that includes only the real salt (stored into salt_buf[]).
13835 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13836
13837 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
13838
13839 base32_decode (itoa32_to_int, hashbuf_pos, 32, tmp_buf);
13840
13841 memcpy (digest, tmp_buf, 20);
13842
13843 digest[0] = byte_swap_32 (digest[0]);
13844 digest[1] = byte_swap_32 (digest[1]);
13845 digest[2] = byte_swap_32 (digest[2]);
13846 digest[3] = byte_swap_32 (digest[3]);
13847 digest[4] = byte_swap_32 (digest[4]);
13848
13849 // domain
13850
13851 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13852
13853 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
13854
13855 char *len_ptr = NULL;
13856
13857 for (uint i = 0; i < domainbuf_len; i++)
13858 {
13859 if (salt_buf_pc_ptr[i] == '.')
13860 {
13861 len_ptr = &salt_buf_pc_ptr[i];
13862
13863 *len_ptr = 0;
13864 }
13865 else
13866 {
13867 *len_ptr += 1;
13868 }
13869 }
13870
13871 salt->salt_buf_pc[7] = domainbuf_len;
13872
13873 // "real" salt
13874
13875 char *salt_buf_ptr = (char *) salt->salt_buf;
13876
13877 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
13878
13879 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13880
13881 salt->salt_len = salt_len;
13882
13883 // iteration
13884
13885 salt->salt_iter = atoi (iteration_pos);
13886
13887 return (PARSER_OK);
13888 }
13889
13890 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13891 {
13892 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
13893
13894 uint32_t *digest = (uint32_t *) hash_buf->digest;
13895
13896 salt_t *salt = hash_buf->salt;
13897
13898 digest[0] = hex_to_uint (&input_buf[ 0]);
13899 digest[1] = hex_to_uint (&input_buf[ 8]);
13900 digest[2] = hex_to_uint (&input_buf[16]);
13901 digest[3] = hex_to_uint (&input_buf[24]);
13902 digest[4] = hex_to_uint (&input_buf[32]);
13903
13904 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13905
13906 uint salt_len = input_len - 40 - 1;
13907
13908 char *salt_buf = input_buf + 40 + 1;
13909
13910 char *salt_buf_ptr = (char *) salt->salt_buf;
13911
13912 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13913
13914 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13915
13916 salt->salt_len = salt_len;
13917
13918 return (PARSER_OK);
13919 }
13920
13921 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13922 {
13923 const uint8_t ascii_to_ebcdic[] =
13924 {
13925 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
13926 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
13927 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
13928 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
13929 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
13930 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
13931 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
13932 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
13933 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
13934 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
13935 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
13936 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
13937 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
13938 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
13939 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
13940 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
13941 };
13942
13943 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
13944
13945 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13946
13947 uint32_t *digest = (uint32_t *) hash_buf->digest;
13948
13949 salt_t *salt = hash_buf->salt;
13950
13951 char *salt_pos = input_buf + 6 + 1;
13952
13953 char *digest_pos = strchr (salt_pos, '*');
13954
13955 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13956
13957 uint salt_len = digest_pos - salt_pos;
13958
13959 if (salt_len > 8) return (PARSER_SALT_LENGTH);
13960
13961 uint hash_len = input_len - 1 - salt_len - 1 - 6;
13962
13963 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13964
13965 digest_pos++;
13966
13967 char *salt_buf_ptr = (char *) salt->salt_buf;
13968 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13969
13970 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13971
13972 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13973
13974 salt->salt_len = salt_len;
13975
13976 for (uint i = 0; i < salt_len; i++)
13977 {
13978 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
13979 }
13980 for (uint i = salt_len; i < 8; i++)
13981 {
13982 salt_buf_pc_ptr[i] = 0x40;
13983 }
13984
13985 uint tt;
13986
13987 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
13988
13989 salt->salt_buf_pc[0] = ROTATE_LEFT (salt->salt_buf_pc[0], 3u);
13990 salt->salt_buf_pc[1] = ROTATE_LEFT (salt->salt_buf_pc[1], 3u);
13991
13992 digest[0] = hex_to_uint (&digest_pos[ 0]);
13993 digest[1] = hex_to_uint (&digest_pos[ 8]);
13994
13995 digest[0] = byte_swap_32 (digest[0]);
13996 digest[1] = byte_swap_32 (digest[1]);
13997
13998 IP (digest[0], digest[1], tt);
13999
14000 digest[0] = ROTATE_RIGHT (digest[0], 29);
14001 digest[1] = ROTATE_RIGHT (digest[1], 29);
14002 digest[2] = 0;
14003 digest[3] = 0;
14004
14005 return (PARSER_OK);
14006 }
14007
14008 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14009 {
14010 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14011
14012 uint32_t *digest = (uint32_t *) hash_buf->digest;
14013
14014 digest[0] = hex_to_uint (&input_buf[ 0]);
14015 digest[1] = hex_to_uint (&input_buf[ 8]);
14016 digest[2] = hex_to_uint (&input_buf[16]);
14017 digest[3] = hex_to_uint (&input_buf[24]);
14018
14019 digest[0] = byte_swap_32 (digest[0]);
14020 digest[1] = byte_swap_32 (digest[1]);
14021 digest[2] = byte_swap_32 (digest[2]);
14022 digest[3] = byte_swap_32 (digest[3]);
14023
14024 return (PARSER_OK);
14025 }
14026
14027 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14028 {
14029 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14030
14031 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14032
14033 uint32_t *digest = (uint32_t *) hash_buf->digest;
14034
14035 salt_t *salt = hash_buf->salt;
14036
14037 char tmp_buf[120];
14038
14039 memset (tmp_buf, 0, sizeof (tmp_buf));
14040
14041 base64_decode (lotus64_to_int, input_buf + 2, input_len - 3, tmp_buf);
14042
14043 tmp_buf[3] += -4; // dont ask!
14044
14045 memcpy (salt->salt_buf, tmp_buf, 5);
14046
14047 salt->salt_len = 5;
14048
14049 memcpy (digest, tmp_buf + 5, 9);
14050
14051 // yes, only 9 byte are needed to crack, but 10 to display
14052
14053 salt->salt_buf_pc[7] = input_buf[20];
14054
14055 return (PARSER_OK);
14056 }
14057
14058 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14059 {
14060 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14061
14062 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14063
14064 uint32_t *digest = (uint32_t *) hash_buf->digest;
14065
14066 salt_t *salt = hash_buf->salt;
14067
14068 char tmp_buf[120];
14069
14070 memset (tmp_buf, 0, sizeof (tmp_buf));
14071
14072 base64_decode (lotus64_to_int, input_buf + 2, input_len - 3, tmp_buf);
14073
14074 tmp_buf[3] += -4; // dont ask!
14075
14076 // salt
14077
14078 memcpy (salt->salt_buf, tmp_buf, 16);
14079
14080 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)
14081
14082 // iteration
14083
14084 char tmp_iter_buf[11];
14085
14086 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14087
14088 tmp_iter_buf[10] = 0;
14089
14090 salt->salt_iter = atoi (tmp_iter_buf);
14091
14092 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14093 {
14094 return (PARSER_SALT_ITERATION);
14095 }
14096
14097 salt->salt_iter--; // first round in init
14098
14099 // 2 additional bytes for display only
14100
14101 salt->salt_buf_pc[0] = tmp_buf[26];
14102 salt->salt_buf_pc[1] = tmp_buf[27];
14103
14104 // digest
14105
14106 memcpy (digest, tmp_buf + 28, 8);
14107
14108 digest[0] = byte_swap_32 (digest[0]);
14109 digest[1] = byte_swap_32 (digest[1]);
14110 digest[2] = 0;
14111 digest[3] = 0;
14112
14113 return (PARSER_OK);
14114 }
14115
14116 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14117 {
14118 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14119
14120 uint32_t *digest = (uint32_t *) hash_buf->digest;
14121
14122 salt_t *salt = hash_buf->salt;
14123
14124 char *salt_buf_pos = input_buf;
14125
14126 char *hash_buf_pos = salt_buf_pos + 6;
14127
14128 digest[0] = hex_to_uint (&hash_buf_pos[ 0]);
14129 digest[1] = hex_to_uint (&hash_buf_pos[ 8]);
14130 digest[2] = hex_to_uint (&hash_buf_pos[16]);
14131 digest[3] = hex_to_uint (&hash_buf_pos[24]);
14132 digest[4] = hex_to_uint (&hash_buf_pos[32]);
14133 digest[5] = hex_to_uint (&hash_buf_pos[40]);
14134 digest[6] = hex_to_uint (&hash_buf_pos[48]);
14135 digest[7] = hex_to_uint (&hash_buf_pos[56]);
14136
14137 digest[0] -= SHA256M_A;
14138 digest[1] -= SHA256M_B;
14139 digest[2] -= SHA256M_C;
14140 digest[3] -= SHA256M_D;
14141 digest[4] -= SHA256M_E;
14142 digest[5] -= SHA256M_F;
14143 digest[6] -= SHA256M_G;
14144 digest[7] -= SHA256M_H;
14145
14146 char *salt_buf_ptr = (char *) salt->salt_buf;
14147
14148 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14149
14150 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14151
14152 salt->salt_len = salt_len;
14153
14154 return (PARSER_OK);
14155 }
14156
14157 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14158 {
14159 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14160
14161 uint32_t *digest = (uint32_t *) hash_buf->digest;
14162
14163 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14164
14165 salt_t *salt = hash_buf->salt;
14166
14167 char *salt_buf = input_buf + 6;
14168
14169 char *digest_buf = strchr (salt_buf, '$');
14170
14171 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14172
14173 uint salt_len = digest_buf - salt_buf;
14174
14175 digest_buf++; // skip the '$' symbol
14176
14177 char *salt_buf_ptr = (char *) salt->salt_buf;
14178
14179 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14180
14181 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14182
14183 salt->salt_len = salt_len;
14184
14185 digest[0] = hex_to_uint (&digest_buf[ 0]);
14186 digest[1] = hex_to_uint (&digest_buf[ 8]);
14187 digest[2] = hex_to_uint (&digest_buf[16]);
14188 digest[3] = hex_to_uint (&digest_buf[24]);
14189
14190 digest[0] = byte_swap_32 (digest[0]);
14191 digest[1] = byte_swap_32 (digest[1]);
14192 digest[2] = byte_swap_32 (digest[2]);
14193 digest[3] = byte_swap_32 (digest[3]);
14194
14195 digest[0] -= MD5M_A;
14196 digest[1] -= MD5M_B;
14197 digest[2] -= MD5M_C;
14198 digest[3] -= MD5M_D;
14199
14200 return (PARSER_OK);
14201 }
14202
14203 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14204 {
14205 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14206
14207 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14208
14209 uint32_t *digest = (uint32_t *) hash_buf->digest;
14210
14211 salt_t *salt = hash_buf->salt;
14212
14213 char *salt_buf = input_buf + 3;
14214
14215 char *digest_buf = strchr (salt_buf, '$');
14216
14217 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14218
14219 uint salt_len = digest_buf - salt_buf;
14220
14221 digest_buf++; // skip the '$' symbol
14222
14223 char *salt_buf_ptr = (char *) salt->salt_buf;
14224
14225 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14226
14227 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14228
14229 salt_buf_ptr[salt_len] = 0x2d;
14230
14231 salt->salt_len = salt_len + 1;
14232
14233 digest[0] = hex_to_uint (&digest_buf[ 0]);
14234 digest[1] = hex_to_uint (&digest_buf[ 8]);
14235 digest[2] = hex_to_uint (&digest_buf[16]);
14236 digest[3] = hex_to_uint (&digest_buf[24]);
14237
14238 digest[0] = byte_swap_32 (digest[0]);
14239 digest[1] = byte_swap_32 (digest[1]);
14240 digest[2] = byte_swap_32 (digest[2]);
14241 digest[3] = byte_swap_32 (digest[3]);
14242
14243 digest[0] -= MD5M_A;
14244 digest[1] -= MD5M_B;
14245 digest[2] -= MD5M_C;
14246 digest[3] -= MD5M_D;
14247
14248 return (PARSER_OK);
14249 }
14250
14251 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14252 {
14253 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14254
14255 uint32_t *digest = (uint32_t *) hash_buf->digest;
14256
14257 char tmp_buf[100];
14258
14259 memset (tmp_buf, 0, sizeof (tmp_buf));
14260
14261 base64_decode (base64_to_int, input_buf, input_len, tmp_buf);
14262
14263 memcpy (digest, tmp_buf, 20);
14264
14265 digest[0] = byte_swap_32 (digest[0]);
14266 digest[1] = byte_swap_32 (digest[1]);
14267 digest[2] = byte_swap_32 (digest[2]);
14268 digest[3] = byte_swap_32 (digest[3]);
14269 digest[4] = byte_swap_32 (digest[4]);
14270
14271 digest[0] -= SHA1M_A;
14272 digest[1] -= SHA1M_B;
14273 digest[2] -= SHA1M_C;
14274 digest[3] -= SHA1M_D;
14275 digest[4] -= SHA1M_E;
14276
14277 return (PARSER_OK);
14278 }
14279
14280 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14281 {
14282 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14283
14284 uint32_t *digest = (uint32_t *) hash_buf->digest;
14285
14286 salt_t *salt = hash_buf->salt;
14287
14288 digest[0] = hex_to_uint (&input_buf[ 0]);
14289 digest[1] = hex_to_uint (&input_buf[ 8]);
14290 digest[2] = hex_to_uint (&input_buf[16]);
14291 digest[3] = hex_to_uint (&input_buf[24]);
14292
14293 digest[0] = byte_swap_32 (digest[0]);
14294 digest[1] = byte_swap_32 (digest[1]);
14295 digest[2] = byte_swap_32 (digest[2]);
14296 digest[3] = byte_swap_32 (digest[3]);
14297
14298 digest[0] -= MD5M_A;
14299 digest[1] -= MD5M_B;
14300 digest[2] -= MD5M_C;
14301 digest[3] -= MD5M_D;
14302
14303 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14304
14305 uint salt_len = input_len - 32 - 1;
14306
14307 char *salt_buf = input_buf + 32 + 1;
14308
14309 char *salt_buf_ptr = (char *) salt->salt_buf;
14310
14311 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14312
14313 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14314
14315 /*
14316 * add static "salt" part
14317 */
14318
14319 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14320
14321 salt_len += 8;
14322
14323 salt->salt_len = salt_len;
14324
14325 return (PARSER_OK);
14326 }
14327
14328 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14329 {
14330 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14331
14332 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14333
14334 uint32_t *digest = (uint32_t *) hash_buf->digest;
14335
14336 salt_t *salt = hash_buf->salt;
14337
14338 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14339
14340 /**
14341 * parse line
14342 */
14343
14344 char *saltlen_pos = input_buf + 1 + 3 + 1;
14345
14346 char *saltbuf_pos = strchr (saltlen_pos, '$');
14347
14348 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14349
14350 uint saltlen_len = saltbuf_pos - saltlen_pos;
14351
14352 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14353
14354 saltbuf_pos++;
14355
14356 char *keylen_pos = strchr (saltbuf_pos, '$');
14357
14358 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14359
14360 uint saltbuf_len = keylen_pos - saltbuf_pos;
14361
14362 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14363
14364 keylen_pos++;
14365
14366 char *keybuf_pos = strchr (keylen_pos, '$');
14367
14368 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14369
14370 uint keylen_len = keybuf_pos - keylen_pos;
14371
14372 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14373
14374 keybuf_pos++;
14375
14376 char *databuf_pos = strchr (keybuf_pos, '$');
14377
14378 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14379
14380 uint keybuf_len = databuf_pos - keybuf_pos;
14381
14382 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14383
14384 databuf_pos++;
14385
14386 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14387
14388 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14389
14390 /**
14391 * copy data
14392 */
14393
14394 digest[0] = hex_to_uint (&keybuf_pos[ 0]);
14395 digest[1] = hex_to_uint (&keybuf_pos[ 8]);
14396 digest[2] = hex_to_uint (&keybuf_pos[16]);
14397 digest[3] = hex_to_uint (&keybuf_pos[24]);
14398
14399 salt->salt_buf[0] = hex_to_uint (&saltbuf_pos[ 0]);
14400 salt->salt_buf[1] = hex_to_uint (&saltbuf_pos[ 8]);
14401 salt->salt_buf[2] = hex_to_uint (&saltbuf_pos[16]);
14402 salt->salt_buf[3] = hex_to_uint (&saltbuf_pos[24]);
14403
14404 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14405 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14406 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14407 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14408
14409 salt->salt_len = 16;
14410 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14411
14412 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14413 {
14414 androidfde->data[j] = hex_to_uint (&databuf_pos[i]);
14415 }
14416
14417 return (PARSER_OK);
14418 }
14419
14420 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14421 {
14422 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14423
14424 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14425
14426 uint32_t *digest = (uint32_t *) hash_buf->digest;
14427
14428 salt_t *salt = hash_buf->salt;
14429
14430 /**
14431 * parse line
14432 */
14433
14434 // first is the N salt parameter
14435
14436 char *N_pos = input_buf + 6;
14437
14438 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14439
14440 N_pos++;
14441
14442 salt->scrypt_N = atoi (N_pos);
14443
14444 // r
14445
14446 char *r_pos = strchr (N_pos, ':');
14447
14448 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14449
14450 r_pos++;
14451
14452 salt->scrypt_r = atoi (r_pos);
14453
14454 // p
14455
14456 char *p_pos = strchr (r_pos, ':');
14457
14458 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14459
14460 p_pos++;
14461
14462 salt->scrypt_p = atoi (p_pos);
14463
14464 // salt
14465
14466 char *saltbuf_pos = strchr (p_pos, ':');
14467
14468 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14469
14470 saltbuf_pos++;
14471
14472 char *hash_pos = strchr (saltbuf_pos, ':');
14473
14474 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14475
14476 hash_pos++;
14477
14478 // base64 decode
14479
14480 char tmp_buf[32];
14481
14482 memset (tmp_buf, 0, sizeof (tmp_buf));
14483
14484 int tmp_len = base64_decode (base64_to_int, saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14485
14486 char *salt_buf_ptr = (char *) salt->salt_buf;
14487
14488 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14489
14490 salt->salt_len = tmp_len;
14491 salt->salt_iter = 1;
14492
14493 // digest - base64 decode
14494
14495 memset (tmp_buf, 0, sizeof (tmp_buf));
14496
14497 tmp_len = input_len - (hash_pos - input_buf);
14498
14499 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14500
14501 base64_decode (base64_to_int, hash_pos, tmp_len, tmp_buf);
14502
14503 memcpy (digest, tmp_buf, 32);
14504
14505 return (PARSER_OK);
14506 }
14507
14508 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14509 {
14510 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14511
14512 uint32_t *digest = (uint32_t *) hash_buf->digest;
14513
14514 salt_t *salt = hash_buf->salt;
14515
14516 /**
14517 * parse line
14518 */
14519
14520 char decrypted[76]; // iv + hash
14521
14522 juniper_decrypt_hash (input_buf, decrypted);
14523
14524 char *md5crypt_hash = decrypted + 12;
14525
14526 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14527
14528 salt->salt_iter = ROUNDS_MD5CRYPT;
14529
14530 char *salt_pos = md5crypt_hash + 3;
14531
14532 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14533
14534 salt->salt_len = hash_pos - salt_pos; // should be 8
14535
14536 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14537
14538 hash_pos++;
14539
14540 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14541
14542 return (PARSER_OK);
14543 }
14544
14545 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14546 {
14547 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14548
14549 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14550
14551 uint32_t *digest = (uint32_t *) hash_buf->digest;
14552
14553 salt_t *salt = hash_buf->salt;
14554
14555 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14556
14557 /**
14558 * parse line
14559 */
14560
14561 // first is *raw* salt
14562
14563 char *salt_pos = input_buf + 3;
14564
14565 char *hash_pos = strchr (salt_pos, '$');
14566
14567 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14568
14569 uint salt_len = hash_pos - salt_pos;
14570
14571 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14572
14573 hash_pos++;
14574
14575 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14576
14577 memcpy (salt_buf_ptr, salt_pos, 14);
14578
14579 salt_buf_ptr[17] = 0x01;
14580 salt_buf_ptr[18] = 0x80;
14581
14582 // add some stuff to normal salt to make sorted happy
14583
14584 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14585 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14586 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14587 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14588
14589 salt->salt_len = salt_len;
14590 salt->salt_iter = ROUNDS_CISCO8 - 1;
14591
14592 // base64 decode hash
14593
14594 char tmp_buf[100];
14595
14596 memset (tmp_buf, 0, sizeof (tmp_buf));
14597
14598 uint hash_len = input_len - 3 - salt_len - 1;
14599
14600 int tmp_len = base64_decode (itoa64_to_int, hash_pos, hash_len, tmp_buf);
14601
14602 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14603
14604 memcpy (digest, tmp_buf, 32);
14605
14606 digest[0] = byte_swap_32 (digest[0]);
14607 digest[1] = byte_swap_32 (digest[1]);
14608 digest[2] = byte_swap_32 (digest[2]);
14609 digest[3] = byte_swap_32 (digest[3]);
14610 digest[4] = byte_swap_32 (digest[4]);
14611 digest[5] = byte_swap_32 (digest[5]);
14612 digest[6] = byte_swap_32 (digest[6]);
14613 digest[7] = byte_swap_32 (digest[7]);
14614
14615 return (PARSER_OK);
14616 }
14617
14618 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14619 {
14620 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14621
14622 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14623
14624 uint32_t *digest = (uint32_t *) hash_buf->digest;
14625
14626 salt_t *salt = hash_buf->salt;
14627
14628 /**
14629 * parse line
14630 */
14631
14632 // first is *raw* salt
14633
14634 char *salt_pos = input_buf + 3;
14635
14636 char *hash_pos = strchr (salt_pos, '$');
14637
14638 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14639
14640 uint salt_len = hash_pos - salt_pos;
14641
14642 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14643
14644 salt->salt_len = salt_len;
14645 hash_pos++;
14646
14647 char *salt_buf_ptr = (char *) salt->salt_buf;
14648
14649 memcpy (salt_buf_ptr, salt_pos, salt_len);
14650 salt_buf_ptr[salt_len] = 0;
14651
14652 // base64 decode hash
14653
14654 char tmp_buf[100];
14655
14656 memset (tmp_buf, 0, sizeof (tmp_buf));
14657
14658 uint hash_len = input_len - 3 - salt_len - 1;
14659
14660 int tmp_len = base64_decode (itoa64_to_int, hash_pos, hash_len, tmp_buf);
14661
14662 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14663
14664 memcpy (digest, tmp_buf, 32);
14665
14666 // fixed:
14667 salt->scrypt_N = 16384;
14668 salt->scrypt_r = 1;
14669 salt->scrypt_p = 1;
14670 salt->salt_iter = 1;
14671
14672 return (PARSER_OK);
14673 }
14674
14675 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14676 {
14677 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14678
14679 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14680
14681 uint32_t *digest = (uint32_t *) hash_buf->digest;
14682
14683 salt_t *salt = hash_buf->salt;
14684
14685 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14686
14687 /**
14688 * parse line
14689 */
14690
14691 char *version_pos = input_buf + 8 + 1;
14692
14693 char *verifierHashSize_pos = strchr (version_pos, '*');
14694
14695 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14696
14697 uint32_t version_len = verifierHashSize_pos - version_pos;
14698
14699 if (version_len != 4) return (PARSER_SALT_LENGTH);
14700
14701 verifierHashSize_pos++;
14702
14703 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14704
14705 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14706
14707 uint32_t verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14708
14709 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14710
14711 keySize_pos++;
14712
14713 char *saltSize_pos = strchr (keySize_pos, '*');
14714
14715 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14716
14717 uint32_t keySize_len = saltSize_pos - keySize_pos;
14718
14719 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14720
14721 saltSize_pos++;
14722
14723 char *osalt_pos = strchr (saltSize_pos, '*');
14724
14725 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14726
14727 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14728
14729 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14730
14731 osalt_pos++;
14732
14733 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14734
14735 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14736
14737 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14738
14739 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14740
14741 encryptedVerifier_pos++;
14742
14743 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14744
14745 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14746
14747 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14748
14749 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14750
14751 encryptedVerifierHash_pos++;
14752
14753 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;
14754
14755 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14756
14757 const uint version = atoi (version_pos);
14758
14759 if (version != 2007) return (PARSER_SALT_VALUE);
14760
14761 const uint verifierHashSize = atoi (verifierHashSize_pos);
14762
14763 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14764
14765 const uint keySize = atoi (keySize_pos);
14766
14767 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14768
14769 office2007->keySize = keySize;
14770
14771 const uint saltSize = atoi (saltSize_pos);
14772
14773 if (saltSize != 16) return (PARSER_SALT_VALUE);
14774
14775 /**
14776 * salt
14777 */
14778
14779 salt->salt_len = 16;
14780 salt->salt_iter = ROUNDS_OFFICE2007;
14781
14782 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14783 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14784 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14785 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14786
14787 /**
14788 * esalt
14789 */
14790
14791 office2007->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14792 office2007->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14793 office2007->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14794 office2007->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14795
14796 office2007->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14797 office2007->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14798 office2007->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14799 office2007->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14800 office2007->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14801
14802 /**
14803 * digest
14804 */
14805
14806 digest[0] = office2007->encryptedVerifierHash[0];
14807 digest[1] = office2007->encryptedVerifierHash[1];
14808 digest[2] = office2007->encryptedVerifierHash[2];
14809 digest[3] = office2007->encryptedVerifierHash[3];
14810
14811 return (PARSER_OK);
14812 }
14813
14814 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14815 {
14816 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14817
14818 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14819
14820 uint32_t *digest = (uint32_t *) hash_buf->digest;
14821
14822 salt_t *salt = hash_buf->salt;
14823
14824 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14825
14826 /**
14827 * parse line
14828 */
14829
14830 char *version_pos = input_buf + 8 + 1;
14831
14832 char *spinCount_pos = strchr (version_pos, '*');
14833
14834 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14835
14836 uint32_t version_len = spinCount_pos - version_pos;
14837
14838 if (version_len != 4) return (PARSER_SALT_LENGTH);
14839
14840 spinCount_pos++;
14841
14842 char *keySize_pos = strchr (spinCount_pos, '*');
14843
14844 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14845
14846 uint32_t spinCount_len = keySize_pos - spinCount_pos;
14847
14848 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14849
14850 keySize_pos++;
14851
14852 char *saltSize_pos = strchr (keySize_pos, '*');
14853
14854 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14855
14856 uint32_t keySize_len = saltSize_pos - keySize_pos;
14857
14858 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14859
14860 saltSize_pos++;
14861
14862 char *osalt_pos = strchr (saltSize_pos, '*');
14863
14864 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14865
14866 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14867
14868 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14869
14870 osalt_pos++;
14871
14872 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14873
14874 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14875
14876 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14877
14878 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14879
14880 encryptedVerifier_pos++;
14881
14882 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14883
14884 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14885
14886 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14887
14888 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14889
14890 encryptedVerifierHash_pos++;
14891
14892 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;
14893
14894 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14895
14896 const uint version = atoi (version_pos);
14897
14898 if (version != 2010) return (PARSER_SALT_VALUE);
14899
14900 const uint spinCount = atoi (spinCount_pos);
14901
14902 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14903
14904 const uint keySize = atoi (keySize_pos);
14905
14906 if (keySize != 128) return (PARSER_SALT_VALUE);
14907
14908 const uint saltSize = atoi (saltSize_pos);
14909
14910 if (saltSize != 16) return (PARSER_SALT_VALUE);
14911
14912 /**
14913 * salt
14914 */
14915
14916 salt->salt_len = 16;
14917 salt->salt_iter = spinCount;
14918
14919 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14920 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14921 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14922 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14923
14924 /**
14925 * esalt
14926 */
14927
14928 office2010->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14929 office2010->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14930 office2010->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14931 office2010->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14932
14933 office2010->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14934 office2010->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14935 office2010->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14936 office2010->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14937 office2010->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14938 office2010->encryptedVerifierHash[5] = hex_to_uint (&encryptedVerifierHash_pos[40]);
14939 office2010->encryptedVerifierHash[6] = hex_to_uint (&encryptedVerifierHash_pos[48]);
14940 office2010->encryptedVerifierHash[7] = hex_to_uint (&encryptedVerifierHash_pos[56]);
14941
14942 /**
14943 * digest
14944 */
14945
14946 digest[0] = office2010->encryptedVerifierHash[0];
14947 digest[1] = office2010->encryptedVerifierHash[1];
14948 digest[2] = office2010->encryptedVerifierHash[2];
14949 digest[3] = office2010->encryptedVerifierHash[3];
14950
14951 return (PARSER_OK);
14952 }
14953
14954 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14955 {
14956 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
14957
14958 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14959
14960 uint32_t *digest = (uint32_t *) hash_buf->digest;
14961
14962 salt_t *salt = hash_buf->salt;
14963
14964 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
14965
14966 /**
14967 * parse line
14968 */
14969
14970 char *version_pos = input_buf + 8 + 1;
14971
14972 char *spinCount_pos = strchr (version_pos, '*');
14973
14974 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14975
14976 uint32_t version_len = spinCount_pos - version_pos;
14977
14978 if (version_len != 4) return (PARSER_SALT_LENGTH);
14979
14980 spinCount_pos++;
14981
14982 char *keySize_pos = strchr (spinCount_pos, '*');
14983
14984 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14985
14986 uint32_t spinCount_len = keySize_pos - spinCount_pos;
14987
14988 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14989
14990 keySize_pos++;
14991
14992 char *saltSize_pos = strchr (keySize_pos, '*');
14993
14994 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14995
14996 uint32_t keySize_len = saltSize_pos - keySize_pos;
14997
14998 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14999
15000 saltSize_pos++;
15001
15002 char *osalt_pos = strchr (saltSize_pos, '*');
15003
15004 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15005
15006 uint32_t saltSize_len = osalt_pos - saltSize_pos;
15007
15008 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15009
15010 osalt_pos++;
15011
15012 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15013
15014 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15015
15016 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15017
15018 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15019
15020 encryptedVerifier_pos++;
15021
15022 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15023
15024 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15025
15026 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15027
15028 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15029
15030 encryptedVerifierHash_pos++;
15031
15032 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;
15033
15034 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15035
15036 const uint version = atoi (version_pos);
15037
15038 if (version != 2013) return (PARSER_SALT_VALUE);
15039
15040 const uint spinCount = atoi (spinCount_pos);
15041
15042 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15043
15044 const uint keySize = atoi (keySize_pos);
15045
15046 if (keySize != 256) return (PARSER_SALT_VALUE);
15047
15048 const uint saltSize = atoi (saltSize_pos);
15049
15050 if (saltSize != 16) return (PARSER_SALT_VALUE);
15051
15052 /**
15053 * salt
15054 */
15055
15056 salt->salt_len = 16;
15057 salt->salt_iter = spinCount;
15058
15059 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15060 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15061 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15062 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15063
15064 /**
15065 * esalt
15066 */
15067
15068 office2013->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15069 office2013->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15070 office2013->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15071 office2013->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15072
15073 office2013->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15074 office2013->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15075 office2013->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15076 office2013->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15077 office2013->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15078 office2013->encryptedVerifierHash[5] = hex_to_uint (&encryptedVerifierHash_pos[40]);
15079 office2013->encryptedVerifierHash[6] = hex_to_uint (&encryptedVerifierHash_pos[48]);
15080 office2013->encryptedVerifierHash[7] = hex_to_uint (&encryptedVerifierHash_pos[56]);
15081
15082 /**
15083 * digest
15084 */
15085
15086 digest[0] = office2013->encryptedVerifierHash[0];
15087 digest[1] = office2013->encryptedVerifierHash[1];
15088 digest[2] = office2013->encryptedVerifierHash[2];
15089 digest[3] = office2013->encryptedVerifierHash[3];
15090
15091 return (PARSER_OK);
15092 }
15093
15094 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15095 {
15096 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15097
15098 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15099
15100 uint32_t *digest = (uint32_t *) hash_buf->digest;
15101
15102 salt_t *salt = hash_buf->salt;
15103
15104 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15105
15106 /**
15107 * parse line
15108 */
15109
15110 char *version_pos = input_buf + 11;
15111
15112 char *osalt_pos = strchr (version_pos, '*');
15113
15114 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15115
15116 uint32_t version_len = osalt_pos - version_pos;
15117
15118 if (version_len != 1) return (PARSER_SALT_LENGTH);
15119
15120 osalt_pos++;
15121
15122 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15123
15124 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15125
15126 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15127
15128 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15129
15130 encryptedVerifier_pos++;
15131
15132 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15133
15134 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15135
15136 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15137
15138 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15139
15140 encryptedVerifierHash_pos++;
15141
15142 uint32_t encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15143
15144 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15145
15146 const uint version = *version_pos - 0x30;
15147
15148 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15149
15150 /**
15151 * esalt
15152 */
15153
15154 oldoffice01->version = version;
15155
15156 oldoffice01->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15157 oldoffice01->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15158 oldoffice01->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15159 oldoffice01->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15160
15161 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15162 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15163 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15164 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15165
15166 oldoffice01->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15167 oldoffice01->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15168 oldoffice01->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15169 oldoffice01->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15170
15171 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15172 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15173 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15174 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15175
15176 /**
15177 * salt
15178 */
15179
15180 salt->salt_len = 16;
15181
15182 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15183 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15184 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15185 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15186
15187 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15188 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15189 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15190 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15191
15192 // this is a workaround as office produces multiple documents with the same salt
15193
15194 salt->salt_len += 32;
15195
15196 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15197 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15198 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15199 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15200 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15201 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15202 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15203 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15204
15205 /**
15206 * digest
15207 */
15208
15209 digest[0] = oldoffice01->encryptedVerifierHash[0];
15210 digest[1] = oldoffice01->encryptedVerifierHash[1];
15211 digest[2] = oldoffice01->encryptedVerifierHash[2];
15212 digest[3] = oldoffice01->encryptedVerifierHash[3];
15213
15214 return (PARSER_OK);
15215 }
15216
15217 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15218 {
15219 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15220 }
15221
15222 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15223 {
15224 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15225
15226 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15227
15228 uint32_t *digest = (uint32_t *) hash_buf->digest;
15229
15230 salt_t *salt = hash_buf->salt;
15231
15232 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15233
15234 /**
15235 * parse line
15236 */
15237
15238 char *version_pos = input_buf + 11;
15239
15240 char *osalt_pos = strchr (version_pos, '*');
15241
15242 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15243
15244 uint32_t version_len = osalt_pos - version_pos;
15245
15246 if (version_len != 1) return (PARSER_SALT_LENGTH);
15247
15248 osalt_pos++;
15249
15250 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15251
15252 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15253
15254 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15255
15256 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15257
15258 encryptedVerifier_pos++;
15259
15260 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15261
15262 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15263
15264 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15265
15266 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15267
15268 encryptedVerifierHash_pos++;
15269
15270 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15271
15272 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15273
15274 uint32_t encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15275
15276 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15277
15278 rc4key_pos++;
15279
15280 uint32_t rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15281
15282 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15283
15284 const uint version = *version_pos - 0x30;
15285
15286 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15287
15288 /**
15289 * esalt
15290 */
15291
15292 oldoffice01->version = version;
15293
15294 oldoffice01->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15295 oldoffice01->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15296 oldoffice01->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15297 oldoffice01->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15298
15299 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15300 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15301 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15302 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15303
15304 oldoffice01->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15305 oldoffice01->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15306 oldoffice01->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15307 oldoffice01->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15308
15309 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15310 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15311 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15312 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15313
15314 oldoffice01->rc4key[1] = 0;
15315 oldoffice01->rc4key[0] = 0;
15316
15317 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15318 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15319 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15320 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15321 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15322 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15323 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15324 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15325 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15326 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15327
15328 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15329 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15330
15331 /**
15332 * salt
15333 */
15334
15335 salt->salt_len = 16;
15336
15337 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15338 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15339 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15340 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15341
15342 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15343 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15344 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15345 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15346
15347 // this is a workaround as office produces multiple documents with the same salt
15348
15349 salt->salt_len += 32;
15350
15351 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15352 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15353 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15354 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15355 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15356 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15357 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15358 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15359
15360 /**
15361 * digest
15362 */
15363
15364 digest[0] = oldoffice01->rc4key[0];
15365 digest[1] = oldoffice01->rc4key[1];
15366 digest[2] = 0;
15367 digest[3] = 0;
15368
15369 return (PARSER_OK);
15370 }
15371
15372 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15373 {
15374 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15375
15376 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15377
15378 uint32_t *digest = (uint32_t *) hash_buf->digest;
15379
15380 salt_t *salt = hash_buf->salt;
15381
15382 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15383
15384 /**
15385 * parse line
15386 */
15387
15388 char *version_pos = input_buf + 11;
15389
15390 char *osalt_pos = strchr (version_pos, '*');
15391
15392 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15393
15394 uint32_t version_len = osalt_pos - version_pos;
15395
15396 if (version_len != 1) return (PARSER_SALT_LENGTH);
15397
15398 osalt_pos++;
15399
15400 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15401
15402 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15403
15404 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15405
15406 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15407
15408 encryptedVerifier_pos++;
15409
15410 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15411
15412 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15413
15414 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15415
15416 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15417
15418 encryptedVerifierHash_pos++;
15419
15420 uint32_t encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15421
15422 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15423
15424 const uint version = *version_pos - 0x30;
15425
15426 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15427
15428 /**
15429 * esalt
15430 */
15431
15432 oldoffice34->version = version;
15433
15434 oldoffice34->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15435 oldoffice34->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15436 oldoffice34->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15437 oldoffice34->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15438
15439 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15440 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15441 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15442 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15443
15444 oldoffice34->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15445 oldoffice34->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15446 oldoffice34->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15447 oldoffice34->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15448 oldoffice34->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15449
15450 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15451 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15452 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15453 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15454 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15455
15456 /**
15457 * salt
15458 */
15459
15460 salt->salt_len = 16;
15461
15462 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15463 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15464 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15465 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15466
15467 // this is a workaround as office produces multiple documents with the same salt
15468
15469 salt->salt_len += 32;
15470
15471 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15472 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15473 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15474 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15475 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15476 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15477 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15478 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15479
15480 /**
15481 * digest
15482 */
15483
15484 digest[0] = oldoffice34->encryptedVerifierHash[0];
15485 digest[1] = oldoffice34->encryptedVerifierHash[1];
15486 digest[2] = oldoffice34->encryptedVerifierHash[2];
15487 digest[3] = oldoffice34->encryptedVerifierHash[3];
15488
15489 return (PARSER_OK);
15490 }
15491
15492 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15493 {
15494 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15495
15496 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15497 }
15498
15499 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15500 {
15501 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15502
15503 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15504
15505 uint32_t *digest = (uint32_t *) hash_buf->digest;
15506
15507 salt_t *salt = hash_buf->salt;
15508
15509 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15510
15511 /**
15512 * parse line
15513 */
15514
15515 char *version_pos = input_buf + 11;
15516
15517 char *osalt_pos = strchr (version_pos, '*');
15518
15519 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15520
15521 uint32_t version_len = osalt_pos - version_pos;
15522
15523 if (version_len != 1) return (PARSER_SALT_LENGTH);
15524
15525 osalt_pos++;
15526
15527 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15528
15529 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15530
15531 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15532
15533 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15534
15535 encryptedVerifier_pos++;
15536
15537 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15538
15539 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15540
15541 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15542
15543 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15544
15545 encryptedVerifierHash_pos++;
15546
15547 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15548
15549 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15550
15551 uint32_t encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15552
15553 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15554
15555 rc4key_pos++;
15556
15557 uint32_t rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15558
15559 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15560
15561 const uint version = *version_pos - 0x30;
15562
15563 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15564
15565 /**
15566 * esalt
15567 */
15568
15569 oldoffice34->version = version;
15570
15571 oldoffice34->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15572 oldoffice34->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15573 oldoffice34->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15574 oldoffice34->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15575
15576 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15577 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15578 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15579 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15580
15581 oldoffice34->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15582 oldoffice34->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15583 oldoffice34->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15584 oldoffice34->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15585 oldoffice34->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15586
15587 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15588 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15589 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15590 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15591 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15592
15593 oldoffice34->rc4key[1] = 0;
15594 oldoffice34->rc4key[0] = 0;
15595
15596 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15597 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15598 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15599 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15600 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15601 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15602 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15603 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15604 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15605 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15606
15607 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15608 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15609
15610 /**
15611 * salt
15612 */
15613
15614 salt->salt_len = 16;
15615
15616 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15617 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15618 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15619 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15620
15621 // this is a workaround as office produces multiple documents with the same salt
15622
15623 salt->salt_len += 32;
15624
15625 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15626 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15627 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15628 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15629 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15630 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15631 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15632 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15633
15634 /**
15635 * digest
15636 */
15637
15638 digest[0] = oldoffice34->rc4key[0];
15639 digest[1] = oldoffice34->rc4key[1];
15640 digest[2] = 0;
15641 digest[3] = 0;
15642
15643 return (PARSER_OK);
15644 }
15645
15646 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15647 {
15648 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15649
15650 uint32_t *digest = (uint32_t *) hash_buf->digest;
15651
15652 digest[0] = hex_to_uint (&input_buf[ 0]);
15653 digest[1] = hex_to_uint (&input_buf[ 8]);
15654 digest[2] = hex_to_uint (&input_buf[16]);
15655 digest[3] = hex_to_uint (&input_buf[24]);
15656
15657 digest[0] = byte_swap_32 (digest[0]);
15658 digest[1] = byte_swap_32 (digest[1]);
15659 digest[2] = byte_swap_32 (digest[2]);
15660 digest[3] = byte_swap_32 (digest[3]);
15661
15662 return (PARSER_OK);
15663 }
15664
15665 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15666 {
15667 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15668
15669 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15670
15671 uint32_t *digest = (uint32_t *) hash_buf->digest;
15672
15673 salt_t *salt = hash_buf->salt;
15674
15675 char *signature_pos = input_buf;
15676
15677 char *salt_pos = strchr (signature_pos, '$');
15678
15679 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15680
15681 uint32_t signature_len = salt_pos - signature_pos;
15682
15683 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15684
15685 salt_pos++;
15686
15687 char *hash_pos = strchr (salt_pos, '$');
15688
15689 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15690
15691 uint32_t salt_len = hash_pos - salt_pos;
15692
15693 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15694
15695 hash_pos++;
15696
15697 uint32_t hash_len = input_len - signature_len - 1 - salt_len - 1;
15698
15699 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15700
15701 digest[0] = hex_to_uint (&hash_pos[ 0]);
15702 digest[1] = hex_to_uint (&hash_pos[ 8]);
15703 digest[2] = hex_to_uint (&hash_pos[16]);
15704 digest[3] = hex_to_uint (&hash_pos[24]);
15705 digest[4] = hex_to_uint (&hash_pos[32]);
15706
15707 digest[0] -= SHA1M_A;
15708 digest[1] -= SHA1M_B;
15709 digest[2] -= SHA1M_C;
15710 digest[3] -= SHA1M_D;
15711 digest[4] -= SHA1M_E;
15712
15713 char *salt_buf_ptr = (char *) salt->salt_buf;
15714
15715 memcpy (salt_buf_ptr, salt_pos, salt_len);
15716
15717 salt->salt_len = salt_len;
15718
15719 return (PARSER_OK);
15720 }
15721
15722 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15723 {
15724 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15725
15726 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15727
15728 uint32_t *digest = (uint32_t *) hash_buf->digest;
15729
15730 salt_t *salt = hash_buf->salt;
15731
15732 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15733
15734 /**
15735 * parse line
15736 */
15737
15738 char *iter_pos = input_buf + 14;
15739
15740 const int iter = atoi (iter_pos);
15741
15742 if (iter < 1) return (PARSER_SALT_ITERATION);
15743
15744 salt->salt_iter = iter - 1;
15745
15746 char *salt_pos = strchr (iter_pos, '$');
15747
15748 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15749
15750 salt_pos++;
15751
15752 char *hash_pos = strchr (salt_pos, '$');
15753
15754 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15755
15756 const uint salt_len = hash_pos - salt_pos;
15757
15758 hash_pos++;
15759
15760 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15761
15762 memcpy (salt_buf_ptr, salt_pos, salt_len);
15763
15764 salt->salt_len = salt_len;
15765
15766 salt_buf_ptr[salt_len + 3] = 0x01;
15767 salt_buf_ptr[salt_len + 4] = 0x80;
15768
15769 // add some stuff to normal salt to make sorted happy
15770
15771 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15772 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15773 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15774 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15775 salt->salt_buf[4] = salt->salt_iter;
15776
15777 // base64 decode hash
15778
15779 char tmp_buf[100];
15780
15781 memset (tmp_buf, 0, sizeof (tmp_buf));
15782
15783 uint hash_len = input_len - (hash_pos - input_buf);
15784
15785 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15786
15787 base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf);
15788
15789 memcpy (digest, tmp_buf, 32);
15790
15791 digest[0] = byte_swap_32 (digest[0]);
15792 digest[1] = byte_swap_32 (digest[1]);
15793 digest[2] = byte_swap_32 (digest[2]);
15794 digest[3] = byte_swap_32 (digest[3]);
15795 digest[4] = byte_swap_32 (digest[4]);
15796 digest[5] = byte_swap_32 (digest[5]);
15797 digest[6] = byte_swap_32 (digest[6]);
15798 digest[7] = byte_swap_32 (digest[7]);
15799
15800 return (PARSER_OK);
15801 }
15802
15803 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15804 {
15805 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15806
15807 uint32_t *digest = (uint32_t *) hash_buf->digest;
15808
15809 salt_t *salt = hash_buf->salt;
15810
15811 digest[0] = hex_to_uint (&input_buf[ 0]);
15812 digest[1] = hex_to_uint (&input_buf[ 8]);
15813 digest[2] = 0;
15814 digest[3] = 0;
15815
15816 digest[0] = byte_swap_32 (digest[0]);
15817 digest[1] = byte_swap_32 (digest[1]);
15818
15819 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15820 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15821 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15822
15823 char iter_c = input_buf[17];
15824 char iter_d = input_buf[19];
15825
15826 // atm only defaults, let's see if there's more request
15827 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15828 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15829
15830 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15831
15832 salt->salt_buf[0] = hex_to_uint (&salt_buf[ 0]);
15833 salt->salt_buf[1] = hex_to_uint (&salt_buf[ 8]);
15834 salt->salt_buf[2] = hex_to_uint (&salt_buf[16]);
15835 salt->salt_buf[3] = hex_to_uint (&salt_buf[24]);
15836
15837 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15838 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15839 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15840 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15841
15842 salt->salt_len = 16;
15843
15844 return (PARSER_OK);
15845 }
15846
15847 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15848 {
15849 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
15850
15851 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15852
15853 uint32_t *digest = (uint32_t *) hash_buf->digest;
15854
15855 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
15856
15857 salt_t *salt = hash_buf->salt;
15858
15859 char *salt_pos = input_buf + 10;
15860
15861 char *hash_pos = strchr (salt_pos, '$');
15862
15863 uint salt_len = hash_pos - salt_pos;
15864
15865 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15866
15867 hash_pos++;
15868
15869 uint hash_len = input_len - 10 - salt_len - 1;
15870
15871 // base64 decode salt
15872
15873 char tmp_buf[100];
15874
15875 memset (tmp_buf, 0, sizeof (tmp_buf));
15876
15877 salt_len = base64_decode (base64_to_int, salt_pos, salt_len, tmp_buf);
15878
15879 if (salt_len > 55) return (PARSER_SALT_LENGTH);
15880
15881 tmp_buf[salt_len] = 0x80;
15882
15883 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
15884
15885 salt->salt_len = salt_len;
15886
15887 // base64 decode salt
15888
15889 memset (tmp_buf, 0, sizeof (tmp_buf));
15890
15891 hash_len = base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf);
15892
15893 uint user_len = hash_len - 32;
15894
15895 char *tmp_hash = tmp_buf + user_len;
15896
15897 user_len--; // skip the trailing space
15898
15899 digest[0] = hex_to_uint (&tmp_hash[ 0]);
15900 digest[1] = hex_to_uint (&tmp_hash[ 8]);
15901 digest[2] = hex_to_uint (&tmp_hash[16]);
15902 digest[3] = hex_to_uint (&tmp_hash[24]);
15903
15904 digest[0] = byte_swap_32 (digest[0]);
15905 digest[1] = byte_swap_32 (digest[1]);
15906 digest[2] = byte_swap_32 (digest[2]);
15907 digest[3] = byte_swap_32 (digest[3]);
15908
15909 // store username for host only (output hash if cracked)
15910
15911 memset (cram_md5->user, 0, sizeof (cram_md5->user));
15912 memcpy (cram_md5->user, tmp_buf, user_len);
15913
15914 return (PARSER_OK);
15915 }
15916
15917 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15918 {
15919 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
15920
15921 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15922
15923 uint32_t *digest = (uint32_t *) hash_buf->digest;
15924
15925 salt_t *salt = hash_buf->salt;
15926
15927 char *iter_pos = input_buf + 10;
15928
15929 uint32_t iter = atoi (iter_pos);
15930
15931 if (iter < 1)
15932 {
15933 return (PARSER_SALT_ITERATION);
15934 }
15935
15936 iter--; // first iteration is special
15937
15938 salt->salt_iter = iter;
15939
15940 char *base64_pos = strchr (iter_pos, '}');
15941
15942 if (base64_pos == NULL)
15943 {
15944 return (PARSER_SIGNATURE_UNMATCHED);
15945 }
15946
15947 base64_pos++;
15948
15949 // base64 decode salt
15950
15951 uint32_t base64_len = input_len - (base64_pos - input_buf);
15952
15953 char tmp_buf[100];
15954
15955 memset (tmp_buf, 0, sizeof (tmp_buf));
15956
15957 uint32_t decoded_len = base64_decode (base64_to_int, base64_pos, base64_len, tmp_buf);
15958
15959 if (decoded_len < 24)
15960 {
15961 return (PARSER_SALT_LENGTH);
15962 }
15963
15964 // copy the salt
15965
15966 uint salt_len = decoded_len - 20;
15967
15968 if (salt_len < 4) return (PARSER_SALT_LENGTH);
15969 if (salt_len > 16) return (PARSER_SALT_LENGTH);
15970
15971 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
15972
15973 salt->salt_len = salt_len;
15974
15975 // set digest
15976
15977 uint32_t *digest_ptr = (uint32_t*) tmp_buf;
15978
15979 digest[0] = byte_swap_32 (digest_ptr[0]);
15980 digest[1] = byte_swap_32 (digest_ptr[1]);
15981 digest[2] = byte_swap_32 (digest_ptr[2]);
15982 digest[3] = byte_swap_32 (digest_ptr[3]);
15983 digest[4] = byte_swap_32 (digest_ptr[4]);
15984
15985 return (PARSER_OK);
15986 }
15987
15988 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15989 {
15990 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
15991
15992 uint32_t *digest = (uint32_t *) hash_buf->digest;
15993
15994 salt_t *salt = hash_buf->salt;
15995
15996 digest[0] = hex_to_uint (&input_buf[ 0]);
15997 digest[1] = hex_to_uint (&input_buf[ 8]);
15998 digest[2] = hex_to_uint (&input_buf[16]);
15999 digest[3] = hex_to_uint (&input_buf[24]);
16000 digest[4] = hex_to_uint (&input_buf[32]);
16001
16002 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16003
16004 uint salt_len = input_len - 40 - 1;
16005
16006 char *salt_buf = input_buf + 40 + 1;
16007
16008 char *salt_buf_ptr = (char *) salt->salt_buf;
16009
16010 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16011
16012 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16013
16014 salt->salt_len = salt_len;
16015
16016 return (PARSER_OK);
16017 }
16018
16019 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16020 {
16021 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16022
16023 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16024
16025 uint32_t *digest = (uint32_t *) hash_buf->digest;
16026
16027 salt_t *salt = hash_buf->salt;
16028
16029 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16030
16031 /**
16032 * parse line
16033 */
16034
16035 char *V_pos = input_buf + 5;
16036
16037 char *R_pos = strchr (V_pos, '*');
16038
16039 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16040
16041 uint32_t V_len = R_pos - V_pos;
16042
16043 R_pos++;
16044
16045 char *bits_pos = strchr (R_pos, '*');
16046
16047 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16048
16049 uint32_t R_len = bits_pos - R_pos;
16050
16051 bits_pos++;
16052
16053 char *P_pos = strchr (bits_pos, '*');
16054
16055 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16056
16057 uint32_t bits_len = P_pos - bits_pos;
16058
16059 P_pos++;
16060
16061 char *enc_md_pos = strchr (P_pos, '*');
16062
16063 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16064
16065 uint32_t P_len = enc_md_pos - P_pos;
16066
16067 enc_md_pos++;
16068
16069 char *id_len_pos = strchr (enc_md_pos, '*');
16070
16071 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16072
16073 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16074
16075 id_len_pos++;
16076
16077 char *id_buf_pos = strchr (id_len_pos, '*');
16078
16079 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16080
16081 uint32_t id_len_len = id_buf_pos - id_len_pos;
16082
16083 id_buf_pos++;
16084
16085 char *u_len_pos = strchr (id_buf_pos, '*');
16086
16087 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16088
16089 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16090
16091 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16092
16093 u_len_pos++;
16094
16095 char *u_buf_pos = strchr (u_len_pos, '*');
16096
16097 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16098
16099 uint32_t u_len_len = u_buf_pos - u_len_pos;
16100
16101 u_buf_pos++;
16102
16103 char *o_len_pos = strchr (u_buf_pos, '*');
16104
16105 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16106
16107 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16108
16109 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16110
16111 o_len_pos++;
16112
16113 char *o_buf_pos = strchr (o_len_pos, '*');
16114
16115 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16116
16117 uint32_t o_len_len = o_buf_pos - o_len_pos;
16118
16119 o_buf_pos++;
16120
16121 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;
16122
16123 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16124
16125 // validate data
16126
16127 const int V = atoi (V_pos);
16128 const int R = atoi (R_pos);
16129 const int P = atoi (P_pos);
16130
16131 if (V != 1) return (PARSER_SALT_VALUE);
16132 if (R != 2) return (PARSER_SALT_VALUE);
16133
16134 const int enc_md = atoi (enc_md_pos);
16135
16136 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16137
16138 const int id_len = atoi (id_len_pos);
16139 const int u_len = atoi (u_len_pos);
16140 const int o_len = atoi (o_len_pos);
16141
16142 if (id_len != 16) return (PARSER_SALT_VALUE);
16143 if (u_len != 32) return (PARSER_SALT_VALUE);
16144 if (o_len != 32) return (PARSER_SALT_VALUE);
16145
16146 const int bits = atoi (bits_pos);
16147
16148 if (bits != 40) return (PARSER_SALT_VALUE);
16149
16150 // copy data to esalt
16151
16152 pdf->V = V;
16153 pdf->R = R;
16154 pdf->P = P;
16155
16156 pdf->enc_md = enc_md;
16157
16158 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16159 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16160 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16161 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16162 pdf->id_len = id_len;
16163
16164 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16165 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16166 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16167 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16168 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16169 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16170 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16171 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16172 pdf->u_len = u_len;
16173
16174 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16175 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16176 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16177 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16178 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16179 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16180 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16181 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16182 pdf->o_len = o_len;
16183
16184 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16185 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16186 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16187 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16188
16189 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16190 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16191 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16192 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16193 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16194 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16195 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16196 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16197
16198 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16199 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16200 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16201 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16202 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16203 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16204 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16205 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16206
16207 // we use ID for salt, maybe needs to change, we will see...
16208
16209 salt->salt_buf[0] = pdf->id_buf[0];
16210 salt->salt_buf[1] = pdf->id_buf[1];
16211 salt->salt_buf[2] = pdf->id_buf[2];
16212 salt->salt_buf[3] = pdf->id_buf[3];
16213 salt->salt_len = pdf->id_len;
16214
16215 digest[0] = pdf->u_buf[0];
16216 digest[1] = pdf->u_buf[1];
16217 digest[2] = pdf->u_buf[2];
16218 digest[3] = pdf->u_buf[3];
16219
16220 return (PARSER_OK);
16221 }
16222
16223 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16224 {
16225 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16226 }
16227
16228 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16229 {
16230 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16231
16232 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16233
16234 uint32_t *digest = (uint32_t *) hash_buf->digest;
16235
16236 salt_t *salt = hash_buf->salt;
16237
16238 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16239
16240 /**
16241 * parse line
16242 */
16243
16244 char *V_pos = input_buf + 5;
16245
16246 char *R_pos = strchr (V_pos, '*');
16247
16248 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16249
16250 uint32_t V_len = R_pos - V_pos;
16251
16252 R_pos++;
16253
16254 char *bits_pos = strchr (R_pos, '*');
16255
16256 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16257
16258 uint32_t R_len = bits_pos - R_pos;
16259
16260 bits_pos++;
16261
16262 char *P_pos = strchr (bits_pos, '*');
16263
16264 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16265
16266 uint32_t bits_len = P_pos - bits_pos;
16267
16268 P_pos++;
16269
16270 char *enc_md_pos = strchr (P_pos, '*');
16271
16272 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16273
16274 uint32_t P_len = enc_md_pos - P_pos;
16275
16276 enc_md_pos++;
16277
16278 char *id_len_pos = strchr (enc_md_pos, '*');
16279
16280 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16281
16282 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16283
16284 id_len_pos++;
16285
16286 char *id_buf_pos = strchr (id_len_pos, '*');
16287
16288 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16289
16290 uint32_t id_len_len = id_buf_pos - id_len_pos;
16291
16292 id_buf_pos++;
16293
16294 char *u_len_pos = strchr (id_buf_pos, '*');
16295
16296 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16297
16298 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16299
16300 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16301
16302 u_len_pos++;
16303
16304 char *u_buf_pos = strchr (u_len_pos, '*');
16305
16306 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16307
16308 uint32_t u_len_len = u_buf_pos - u_len_pos;
16309
16310 u_buf_pos++;
16311
16312 char *o_len_pos = strchr (u_buf_pos, '*');
16313
16314 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16315
16316 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16317
16318 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16319
16320 o_len_pos++;
16321
16322 char *o_buf_pos = strchr (o_len_pos, '*');
16323
16324 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16325
16326 uint32_t o_len_len = o_buf_pos - o_len_pos;
16327
16328 o_buf_pos++;
16329
16330 char *rc4key_pos = strchr (o_buf_pos, ':');
16331
16332 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16333
16334 uint32_t o_buf_len = rc4key_pos - o_buf_pos;
16335
16336 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16337
16338 rc4key_pos++;
16339
16340 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;
16341
16342 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16343
16344 // validate data
16345
16346 const int V = atoi (V_pos);
16347 const int R = atoi (R_pos);
16348 const int P = atoi (P_pos);
16349
16350 if (V != 1) return (PARSER_SALT_VALUE);
16351 if (R != 2) return (PARSER_SALT_VALUE);
16352
16353 const int enc_md = atoi (enc_md_pos);
16354
16355 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16356
16357 const int id_len = atoi (id_len_pos);
16358 const int u_len = atoi (u_len_pos);
16359 const int o_len = atoi (o_len_pos);
16360
16361 if (id_len != 16) return (PARSER_SALT_VALUE);
16362 if (u_len != 32) return (PARSER_SALT_VALUE);
16363 if (o_len != 32) return (PARSER_SALT_VALUE);
16364
16365 const int bits = atoi (bits_pos);
16366
16367 if (bits != 40) return (PARSER_SALT_VALUE);
16368
16369 // copy data to esalt
16370
16371 pdf->V = V;
16372 pdf->R = R;
16373 pdf->P = P;
16374
16375 pdf->enc_md = enc_md;
16376
16377 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16378 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16379 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16380 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16381 pdf->id_len = id_len;
16382
16383 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16384 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16385 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16386 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16387 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16388 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16389 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16390 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16391 pdf->u_len = u_len;
16392
16393 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16394 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16395 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16396 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16397 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16398 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16399 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16400 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16401 pdf->o_len = o_len;
16402
16403 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16404 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16405 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16406 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16407
16408 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16409 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16410 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16411 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16412 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16413 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16414 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16415 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16416
16417 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16418 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16419 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16420 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16421 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16422 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16423 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16424 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16425
16426 pdf->rc4key[1] = 0;
16427 pdf->rc4key[0] = 0;
16428
16429 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16430 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16431 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16432 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16433 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16434 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16435 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16436 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16437 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16438 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16439
16440 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16441 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16442
16443 // we use ID for salt, maybe needs to change, we will see...
16444
16445 salt->salt_buf[0] = pdf->id_buf[0];
16446 salt->salt_buf[1] = pdf->id_buf[1];
16447 salt->salt_buf[2] = pdf->id_buf[2];
16448 salt->salt_buf[3] = pdf->id_buf[3];
16449 salt->salt_buf[4] = pdf->u_buf[0];
16450 salt->salt_buf[5] = pdf->u_buf[1];
16451 salt->salt_buf[6] = pdf->o_buf[0];
16452 salt->salt_buf[7] = pdf->o_buf[1];
16453 salt->salt_len = pdf->id_len + 16;
16454
16455 digest[0] = pdf->rc4key[0];
16456 digest[1] = pdf->rc4key[1];
16457 digest[2] = 0;
16458 digest[3] = 0;
16459
16460 return (PARSER_OK);
16461 }
16462
16463 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16464 {
16465 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16466
16467 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16468
16469 uint32_t *digest = (uint32_t *) hash_buf->digest;
16470
16471 salt_t *salt = hash_buf->salt;
16472
16473 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16474
16475 /**
16476 * parse line
16477 */
16478
16479 char *V_pos = input_buf + 5;
16480
16481 char *R_pos = strchr (V_pos, '*');
16482
16483 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16484
16485 uint32_t V_len = R_pos - V_pos;
16486
16487 R_pos++;
16488
16489 char *bits_pos = strchr (R_pos, '*');
16490
16491 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16492
16493 uint32_t R_len = bits_pos - R_pos;
16494
16495 bits_pos++;
16496
16497 char *P_pos = strchr (bits_pos, '*');
16498
16499 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16500
16501 uint32_t bits_len = P_pos - bits_pos;
16502
16503 P_pos++;
16504
16505 char *enc_md_pos = strchr (P_pos, '*');
16506
16507 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16508
16509 uint32_t P_len = enc_md_pos - P_pos;
16510
16511 enc_md_pos++;
16512
16513 char *id_len_pos = strchr (enc_md_pos, '*');
16514
16515 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16516
16517 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16518
16519 id_len_pos++;
16520
16521 char *id_buf_pos = strchr (id_len_pos, '*');
16522
16523 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16524
16525 uint32_t id_len_len = id_buf_pos - id_len_pos;
16526
16527 id_buf_pos++;
16528
16529 char *u_len_pos = strchr (id_buf_pos, '*');
16530
16531 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16532
16533 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16534
16535 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16536
16537 u_len_pos++;
16538
16539 char *u_buf_pos = strchr (u_len_pos, '*');
16540
16541 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16542
16543 uint32_t u_len_len = u_buf_pos - u_len_pos;
16544
16545 u_buf_pos++;
16546
16547 char *o_len_pos = strchr (u_buf_pos, '*');
16548
16549 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16550
16551 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16552
16553 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16554
16555 o_len_pos++;
16556
16557 char *o_buf_pos = strchr (o_len_pos, '*');
16558
16559 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16560
16561 uint32_t o_len_len = o_buf_pos - o_len_pos;
16562
16563 o_buf_pos++;
16564
16565 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;
16566
16567 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16568
16569 // validate data
16570
16571 const int V = atoi (V_pos);
16572 const int R = atoi (R_pos);
16573 const int P = atoi (P_pos);
16574
16575 int vr_ok = 0;
16576
16577 if ((V == 2) && (R == 3)) vr_ok = 1;
16578 if ((V == 4) && (R == 4)) vr_ok = 1;
16579
16580 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16581
16582 const int id_len = atoi (id_len_pos);
16583 const int u_len = atoi (u_len_pos);
16584 const int o_len = atoi (o_len_pos);
16585
16586 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16587
16588 if (u_len != 32) return (PARSER_SALT_VALUE);
16589 if (o_len != 32) return (PARSER_SALT_VALUE);
16590
16591 const int bits = atoi (bits_pos);
16592
16593 if (bits != 128) return (PARSER_SALT_VALUE);
16594
16595 int enc_md = 1;
16596
16597 if (R >= 4)
16598 {
16599 enc_md = atoi (enc_md_pos);
16600 }
16601
16602 // copy data to esalt
16603
16604 pdf->V = V;
16605 pdf->R = R;
16606 pdf->P = P;
16607
16608 pdf->enc_md = enc_md;
16609
16610 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16611 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16612 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16613 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16614
16615 if (id_len == 32)
16616 {
16617 pdf->id_buf[4] = hex_to_uint (&id_buf_pos[32]);
16618 pdf->id_buf[5] = hex_to_uint (&id_buf_pos[40]);
16619 pdf->id_buf[6] = hex_to_uint (&id_buf_pos[48]);
16620 pdf->id_buf[7] = hex_to_uint (&id_buf_pos[56]);
16621 }
16622
16623 pdf->id_len = id_len;
16624
16625 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16626 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16627 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16628 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16629 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16630 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16631 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16632 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16633 pdf->u_len = u_len;
16634
16635 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16636 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16637 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16638 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16639 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16640 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16641 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16642 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16643 pdf->o_len = o_len;
16644
16645 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16646 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16647 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16648 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16649
16650 if (id_len == 32)
16651 {
16652 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16653 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16654 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16655 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16656 }
16657
16658 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16659 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16660 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16661 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16662 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16663 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16664 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16665 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16666
16667 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16668 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16669 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16670 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16671 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16672 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16673 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16674 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16675
16676 // precompute rc4 data for later use
16677
16678 uint padding[8] =
16679 {
16680 0x5e4ebf28,
16681 0x418a754e,
16682 0x564e0064,
16683 0x0801faff,
16684 0xb6002e2e,
16685 0x803e68d0,
16686 0xfea90c2f,
16687 0x7a695364
16688 };
16689
16690 // md5
16691
16692 uint salt_pc_block[32];
16693
16694 char *salt_pc_ptr = (char *) salt_pc_block;
16695
16696 memcpy (salt_pc_ptr, padding, 32);
16697 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16698
16699 uint salt_pc_digest[4];
16700
16701 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16702
16703 pdf->rc4data[0] = salt_pc_digest[0];
16704 pdf->rc4data[1] = salt_pc_digest[1];
16705
16706 // we use ID for salt, maybe needs to change, we will see...
16707
16708 salt->salt_buf[0] = pdf->id_buf[0];
16709 salt->salt_buf[1] = pdf->id_buf[1];
16710 salt->salt_buf[2] = pdf->id_buf[2];
16711 salt->salt_buf[3] = pdf->id_buf[3];
16712 salt->salt_buf[4] = pdf->u_buf[0];
16713 salt->salt_buf[5] = pdf->u_buf[1];
16714 salt->salt_buf[6] = pdf->o_buf[0];
16715 salt->salt_buf[7] = pdf->o_buf[1];
16716 salt->salt_len = pdf->id_len + 16;
16717
16718 salt->salt_iter = ROUNDS_PDF14;
16719
16720 digest[0] = pdf->u_buf[0];
16721 digest[1] = pdf->u_buf[1];
16722 digest[2] = 0;
16723 digest[3] = 0;
16724
16725 return (PARSER_OK);
16726 }
16727
16728 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16729 {
16730 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16731
16732 if (ret != PARSER_OK)
16733 {
16734 return ret;
16735 }
16736
16737 uint32_t *digest = (uint32_t *) hash_buf->digest;
16738
16739 salt_t *salt = hash_buf->salt;
16740
16741 digest[0] -= SHA256M_A;
16742 digest[1] -= SHA256M_B;
16743 digest[2] -= SHA256M_C;
16744 digest[3] -= SHA256M_D;
16745 digest[4] -= SHA256M_E;
16746 digest[5] -= SHA256M_F;
16747 digest[6] -= SHA256M_G;
16748 digest[7] -= SHA256M_H;
16749
16750 salt->salt_buf[2] = 0x80;
16751
16752 return (PARSER_OK);
16753 }
16754
16755 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16756 {
16757 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16758
16759 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16760
16761 uint32_t *digest = (uint32_t *) hash_buf->digest;
16762
16763 salt_t *salt = hash_buf->salt;
16764
16765 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16766
16767 /**
16768 * parse line
16769 */
16770
16771 char *V_pos = input_buf + 5;
16772
16773 char *R_pos = strchr (V_pos, '*');
16774
16775 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16776
16777 uint32_t V_len = R_pos - V_pos;
16778
16779 R_pos++;
16780
16781 char *bits_pos = strchr (R_pos, '*');
16782
16783 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16784
16785 uint32_t R_len = bits_pos - R_pos;
16786
16787 bits_pos++;
16788
16789 char *P_pos = strchr (bits_pos, '*');
16790
16791 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16792
16793 uint32_t bits_len = P_pos - bits_pos;
16794
16795 P_pos++;
16796
16797 char *enc_md_pos = strchr (P_pos, '*');
16798
16799 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16800
16801 uint32_t P_len = enc_md_pos - P_pos;
16802
16803 enc_md_pos++;
16804
16805 char *id_len_pos = strchr (enc_md_pos, '*');
16806
16807 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16808
16809 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16810
16811 id_len_pos++;
16812
16813 char *id_buf_pos = strchr (id_len_pos, '*');
16814
16815 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16816
16817 uint32_t id_len_len = id_buf_pos - id_len_pos;
16818
16819 id_buf_pos++;
16820
16821 char *u_len_pos = strchr (id_buf_pos, '*');
16822
16823 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16824
16825 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16826
16827 u_len_pos++;
16828
16829 char *u_buf_pos = strchr (u_len_pos, '*');
16830
16831 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16832
16833 uint32_t u_len_len = u_buf_pos - u_len_pos;
16834
16835 u_buf_pos++;
16836
16837 char *o_len_pos = strchr (u_buf_pos, '*');
16838
16839 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16840
16841 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16842
16843 o_len_pos++;
16844
16845 char *o_buf_pos = strchr (o_len_pos, '*');
16846
16847 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16848
16849 uint32_t o_len_len = o_buf_pos - o_len_pos;
16850
16851 o_buf_pos++;
16852
16853 char *last = strchr (o_buf_pos, '*');
16854
16855 if (last == NULL) last = input_buf + input_len;
16856
16857 uint32_t o_buf_len = last - o_buf_pos;
16858
16859 // validate data
16860
16861 const int V = atoi (V_pos);
16862 const int R = atoi (R_pos);
16863
16864 int vr_ok = 0;
16865
16866 if ((V == 5) && (R == 5)) vr_ok = 1;
16867 if ((V == 5) && (R == 6)) vr_ok = 1;
16868
16869 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16870
16871 const int bits = atoi (bits_pos);
16872
16873 if (bits != 256) return (PARSER_SALT_VALUE);
16874
16875 int enc_md = atoi (enc_md_pos);
16876
16877 if (enc_md != 1) return (PARSER_SALT_VALUE);
16878
16879 const uint id_len = atoi (id_len_pos);
16880 const uint u_len = atoi (u_len_pos);
16881 const uint o_len = atoi (o_len_pos);
16882
16883 if (V_len > 6) return (PARSER_SALT_LENGTH);
16884 if (R_len > 6) return (PARSER_SALT_LENGTH);
16885 if (P_len > 6) return (PARSER_SALT_LENGTH);
16886 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
16887 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
16888 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
16889 if (bits_len > 6) return (PARSER_SALT_LENGTH);
16890 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
16891
16892 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
16893 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
16894 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
16895
16896 // copy data to esalt
16897
16898 if (u_len < 40) return (PARSER_SALT_VALUE);
16899
16900 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
16901 {
16902 pdf->u_buf[i] = hex_to_uint (&u_buf_pos[j]);
16903 }
16904
16905 salt->salt_buf[0] = pdf->u_buf[8];
16906 salt->salt_buf[1] = pdf->u_buf[9];
16907
16908 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16909 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16910
16911 salt->salt_len = 8;
16912 salt->salt_iter = ROUNDS_PDF17L8;
16913
16914 digest[0] = pdf->u_buf[0];
16915 digest[1] = pdf->u_buf[1];
16916 digest[2] = pdf->u_buf[2];
16917 digest[3] = pdf->u_buf[3];
16918 digest[4] = pdf->u_buf[4];
16919 digest[5] = pdf->u_buf[5];
16920 digest[6] = pdf->u_buf[6];
16921 digest[7] = pdf->u_buf[7];
16922
16923 return (PARSER_OK);
16924 }
16925
16926 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16927 {
16928 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
16929
16930 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
16931
16932 uint32_t *digest = (uint32_t *) hash_buf->digest;
16933
16934 salt_t *salt = hash_buf->salt;
16935
16936 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16937
16938 /**
16939 * parse line
16940 */
16941
16942 // iterations
16943
16944 char *iter_pos = input_buf + 7;
16945
16946 uint32_t iter = atoi (iter_pos);
16947
16948 if (iter < 1) return (PARSER_SALT_ITERATION);
16949 if (iter > 999999) return (PARSER_SALT_ITERATION);
16950
16951 // first is *raw* salt
16952
16953 char *salt_pos = strchr (iter_pos, ':');
16954
16955 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16956
16957 salt_pos++;
16958
16959 char *hash_pos = strchr (salt_pos, ':');
16960
16961 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16962
16963 uint32_t salt_len = hash_pos - salt_pos;
16964
16965 if (salt_len > 64) return (PARSER_SALT_LENGTH);
16966
16967 hash_pos++;
16968
16969 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
16970
16971 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
16972
16973 // decode salt
16974
16975 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16976
16977 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
16978
16979 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
16980
16981 salt_buf_ptr[salt_len + 3] = 0x01;
16982 salt_buf_ptr[salt_len + 4] = 0x80;
16983
16984 salt->salt_len = salt_len;
16985 salt->salt_iter = iter - 1;
16986
16987 // decode hash
16988
16989 char tmp_buf[100];
16990
16991 memset (tmp_buf, 0, sizeof (tmp_buf));
16992
16993 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
16994
16995 if (hash_len < 16) return (PARSER_HASH_LENGTH);
16996
16997 memcpy (digest, tmp_buf, 16);
16998
16999 digest[0] = byte_swap_32 (digest[0]);
17000 digest[1] = byte_swap_32 (digest[1]);
17001 digest[2] = byte_swap_32 (digest[2]);
17002 digest[3] = byte_swap_32 (digest[3]);
17003
17004 // add some stuff to normal salt to make sorted happy
17005
17006 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17007 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17008 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17009 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17010 salt->salt_buf[4] = salt->salt_iter;
17011
17012 return (PARSER_OK);
17013 }
17014
17015 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17016 {
17017 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17018
17019 uint32_t *digest = (uint32_t *) hash_buf->digest;
17020
17021 salt_t *salt = hash_buf->salt;
17022
17023 digest[0] = hex_to_uint (&input_buf[ 0]);
17024 digest[1] = hex_to_uint (&input_buf[ 8]);
17025 digest[2] = hex_to_uint (&input_buf[16]);
17026 digest[3] = hex_to_uint (&input_buf[24]);
17027
17028 digest[0] = byte_swap_32 (digest[0]);
17029 digest[1] = byte_swap_32 (digest[1]);
17030 digest[2] = byte_swap_32 (digest[2]);
17031 digest[3] = byte_swap_32 (digest[3]);
17032
17033 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17034
17035 uint salt_len = input_len - 32 - 1;
17036
17037 char *salt_buf = input_buf + 32 + 1;
17038
17039 char *salt_buf_ptr = (char *) salt->salt_buf;
17040
17041 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17042
17043 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17044
17045 salt->salt_len = salt_len;
17046
17047 return (PARSER_OK);
17048 }
17049
17050 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17051 {
17052 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17053
17054 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17055
17056 uint32_t *digest = (uint32_t *) hash_buf->digest;
17057
17058 salt_t *salt = hash_buf->salt;
17059
17060 char *user_pos = input_buf + 10;
17061
17062 char *salt_pos = strchr (user_pos, '*');
17063
17064 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17065
17066 salt_pos++;
17067
17068 char *hash_pos = strchr (salt_pos, '*');
17069
17070 hash_pos++;
17071
17072 uint hash_len = input_len - (hash_pos - input_buf);
17073
17074 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17075
17076 uint user_len = salt_pos - user_pos - 1;
17077
17078 uint salt_len = hash_pos - salt_pos - 1;
17079
17080 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17081
17082 /*
17083 * store digest
17084 */
17085
17086 digest[0] = hex_to_uint (&hash_pos[ 0]);
17087 digest[1] = hex_to_uint (&hash_pos[ 8]);
17088 digest[2] = hex_to_uint (&hash_pos[16]);
17089 digest[3] = hex_to_uint (&hash_pos[24]);
17090
17091 digest[0] = byte_swap_32 (digest[0]);
17092 digest[1] = byte_swap_32 (digest[1]);
17093 digest[2] = byte_swap_32 (digest[2]);
17094 digest[3] = byte_swap_32 (digest[3]);
17095
17096 digest[0] -= MD5M_A;
17097 digest[1] -= MD5M_B;
17098 digest[2] -= MD5M_C;
17099 digest[3] -= MD5M_D;
17100
17101 /*
17102 * store salt
17103 */
17104
17105 char *salt_buf_ptr = (char *) salt->salt_buf;
17106
17107 // first 4 bytes are the "challenge"
17108
17109 salt_buf_ptr[0] = hex_to_char (&salt_pos[0]);
17110 salt_buf_ptr[1] = hex_to_char (&salt_pos[2]);
17111 salt_buf_ptr[2] = hex_to_char (&salt_pos[4]);
17112 salt_buf_ptr[3] = hex_to_char (&salt_pos[6]);
17113
17114 // append the user name
17115
17116 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17117
17118 salt->salt_len = 4 + user_len;
17119
17120 return (PARSER_OK);
17121 }
17122
17123 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17124 {
17125 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17126
17127 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17128
17129 uint32_t *digest = (uint32_t *) hash_buf->digest;
17130
17131 salt_t *salt = hash_buf->salt;
17132
17133 char *salt_pos = input_buf + 9;
17134
17135 char *hash_pos = strchr (salt_pos, '*');
17136
17137 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17138
17139 hash_pos++;
17140
17141 uint hash_len = input_len - (hash_pos - input_buf);
17142
17143 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17144
17145 uint salt_len = hash_pos - salt_pos - 1;
17146
17147 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17148
17149 /*
17150 * store digest
17151 */
17152
17153 digest[0] = hex_to_uint (&hash_pos[ 0]);
17154 digest[1] = hex_to_uint (&hash_pos[ 8]);
17155 digest[2] = hex_to_uint (&hash_pos[16]);
17156 digest[3] = hex_to_uint (&hash_pos[24]);
17157 digest[4] = hex_to_uint (&hash_pos[32]);
17158
17159 /*
17160 * store salt
17161 */
17162
17163 char *salt_buf_ptr = (char *) salt->salt_buf;
17164
17165 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17166
17167 salt->salt_len = salt_len;
17168
17169 return (PARSER_OK);
17170 }
17171
17172 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17173 {
17174 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17175
17176 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17177
17178 uint32_t *digest = (uint32_t *) hash_buf->digest;
17179
17180 salt_t *salt = hash_buf->salt;
17181
17182 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17183
17184 /**
17185 * parse line
17186 */
17187
17188 char *cry_master_len_pos = input_buf + 9;
17189
17190 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17191
17192 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17193
17194 uint32_t cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17195
17196 cry_master_buf_pos++;
17197
17198 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17199
17200 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17201
17202 uint32_t cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17203
17204 cry_salt_len_pos++;
17205
17206 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17207
17208 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17209
17210 uint32_t cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17211
17212 cry_salt_buf_pos++;
17213
17214 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17215
17216 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17217
17218 uint32_t cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17219
17220 cry_rounds_pos++;
17221
17222 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17223
17224 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17225
17226 uint32_t cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17227
17228 ckey_len_pos++;
17229
17230 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17231
17232 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17233
17234 uint32_t ckey_len_len = ckey_buf_pos - ckey_len_pos;
17235
17236 ckey_buf_pos++;
17237
17238 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17239
17240 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17241
17242 uint32_t ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17243
17244 public_key_len_pos++;
17245
17246 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17247
17248 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17249
17250 uint32_t public_key_len_len = public_key_buf_pos - public_key_len_pos;
17251
17252 public_key_buf_pos++;
17253
17254 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;
17255
17256 const uint cry_master_len = atoi (cry_master_len_pos);
17257 const uint cry_salt_len = atoi (cry_salt_len_pos);
17258 const uint ckey_len = atoi (ckey_len_pos);
17259 const uint public_key_len = atoi (public_key_len_pos);
17260
17261 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17262 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17263 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17264 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17265
17266 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 8)
17267 {
17268 bitcoin_wallet->cry_master_buf[i] = hex_to_uint (&cry_master_buf_pos[j]);
17269
17270 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17271 }
17272
17273 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 8)
17274 {
17275 bitcoin_wallet->ckey_buf[i] = hex_to_uint (&ckey_buf_pos[j]);
17276
17277 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17278 }
17279
17280 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 8)
17281 {
17282 bitcoin_wallet->public_key_buf[i] = hex_to_uint (&public_key_buf_pos[j]);
17283
17284 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17285 }
17286
17287 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17288 bitcoin_wallet->ckey_len = ckey_len / 2;
17289 bitcoin_wallet->public_key_len = public_key_len / 2;
17290
17291 /*
17292 * store digest (should be unique enought, hopefully)
17293 */
17294
17295 digest[0] = bitcoin_wallet->cry_master_buf[0];
17296 digest[1] = bitcoin_wallet->cry_master_buf[1];
17297 digest[2] = bitcoin_wallet->cry_master_buf[2];
17298 digest[3] = bitcoin_wallet->cry_master_buf[3];
17299
17300 /*
17301 * store salt
17302 */
17303
17304 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17305
17306 const uint cry_rounds = atoi (cry_rounds_pos);
17307
17308 salt->salt_iter = cry_rounds - 1;
17309
17310 char *salt_buf_ptr = (char *) salt->salt_buf;
17311
17312 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17313
17314 salt->salt_len = salt_len;
17315
17316 return (PARSER_OK);
17317 }
17318
17319 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17320 {
17321 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17322
17323 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17324
17325 uint32_t *digest = (uint32_t *) hash_buf->digest;
17326
17327 salt_t *salt = hash_buf->salt;
17328
17329 sip_t *sip = (sip_t *) hash_buf->esalt;
17330
17331 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17332
17333 char temp_input_buf[input_len + 1];
17334
17335 memset (temp_input_buf, 0, sizeof (temp_input_buf));
17336 memcpy (temp_input_buf, input_buf, input_len);
17337
17338 // URI_server:
17339
17340 char *URI_server_pos = temp_input_buf + 6;
17341
17342 char *URI_client_pos = strchr (URI_server_pos, '*');
17343
17344 if (URI_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17345
17346 URI_client_pos[0] = 0;
17347 URI_client_pos++;
17348
17349 uint URI_server_len = strlen (URI_server_pos);
17350
17351 if (URI_server_len > 512) return (PARSER_SALT_LENGTH);
17352
17353 // URI_client:
17354
17355 char *user_pos = strchr (URI_client_pos, '*');
17356
17357 if (user_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17358
17359 user_pos[0] = 0;
17360 user_pos++;
17361
17362 uint URI_client_len = strlen (URI_client_pos);
17363
17364 if (URI_client_len > 512) return (PARSER_SALT_LENGTH);
17365
17366 // user:
17367
17368 char *realm_pos = strchr (user_pos, '*');
17369
17370 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17371
17372 realm_pos[0] = 0;
17373 realm_pos++;
17374
17375 uint user_len = strlen (user_pos);
17376
17377 if (user_len > 116) return (PARSER_SALT_LENGTH);
17378
17379 // realm:
17380
17381 char *method_pos = strchr (realm_pos, '*');
17382
17383 if (method_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17384
17385 method_pos[0] = 0;
17386 method_pos++;
17387
17388 uint realm_len = strlen (realm_pos);
17389
17390 if (realm_len > 116) return (PARSER_SALT_LENGTH);
17391
17392 // method:
17393
17394 char *URI_prefix_pos = strchr (method_pos, '*');
17395
17396 if (URI_prefix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17397
17398 URI_prefix_pos[0] = 0;
17399 URI_prefix_pos++;
17400
17401 uint method_len = strlen (method_pos);
17402
17403 if (method_len > 246) return (PARSER_SALT_LENGTH);
17404
17405 // URI_prefix:
17406
17407 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17408
17409 if (URI_resource_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17410
17411 URI_resource_pos[0] = 0;
17412 URI_resource_pos++;
17413
17414 uint URI_prefix_len = strlen (URI_prefix_pos);
17415
17416 if (URI_prefix_len > 245) return (PARSER_SALT_LENGTH);
17417
17418 // URI_resource:
17419
17420 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17421
17422 if (URI_suffix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17423
17424 URI_suffix_pos[0] = 0;
17425 URI_suffix_pos++;
17426
17427 uint URI_resource_len = strlen (URI_resource_pos);
17428
17429 if (URI_resource_len < 1) return (PARSER_SALT_LENGTH);
17430 if (URI_resource_len > 246) return (PARSER_SALT_LENGTH);
17431
17432 // URI_suffix:
17433
17434 char *nonce_pos = strchr (URI_suffix_pos, '*');
17435
17436 if (nonce_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17437
17438 nonce_pos[0] = 0;
17439 nonce_pos++;
17440
17441 uint URI_suffix_len = strlen (URI_suffix_pos);
17442
17443 if (URI_suffix_len > 245) return (PARSER_SALT_LENGTH);
17444
17445 // nonce:
17446
17447 char *nonce_client_pos = strchr (nonce_pos, '*');
17448
17449 if (nonce_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17450
17451 nonce_client_pos[0] = 0;
17452 nonce_client_pos++;
17453
17454 uint nonce_len = strlen (nonce_pos);
17455
17456 if (nonce_len < 1) return (PARSER_SALT_LENGTH);
17457 if (nonce_len > 50) return (PARSER_SALT_LENGTH);
17458
17459 // nonce_client:
17460
17461 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17462
17463 if (nonce_count_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17464
17465 nonce_count_pos[0] = 0;
17466 nonce_count_pos++;
17467
17468 uint nonce_client_len = strlen (nonce_client_pos);
17469
17470 if (nonce_client_len > 50) return (PARSER_SALT_LENGTH);
17471
17472 // nonce_count:
17473
17474 char *qop_pos = strchr (nonce_count_pos, '*');
17475
17476 if (qop_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17477
17478 qop_pos[0] = 0;
17479 qop_pos++;
17480
17481 uint nonce_count_len = strlen (nonce_count_pos);
17482
17483 if (nonce_count_len > 50) return (PARSER_SALT_LENGTH);
17484
17485 // qop:
17486
17487 char *directive_pos = strchr (qop_pos, '*');
17488
17489 if (directive_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17490
17491 directive_pos[0] = 0;
17492 directive_pos++;
17493
17494 uint qop_len = strlen (qop_pos);
17495
17496 if (qop_len > 50) return (PARSER_SALT_LENGTH);
17497
17498 // directive
17499
17500 char *digest_pos = strchr (directive_pos, '*');
17501
17502 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17503
17504 digest_pos[0] = 0;
17505 digest_pos++;
17506
17507 uint directive_len = strlen (directive_pos);
17508
17509 if (directive_len != 3) return (PARSER_SALT_LENGTH);
17510
17511 if (memcmp (directive_pos, "MD5", 3))
17512 {
17513 log_info ("ERROR: only the MD5 directive is currently supported\n");
17514
17515 return (PARSER_SIP_AUTH_DIRECTIVE);
17516 }
17517
17518 /*
17519 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17520 */
17521
17522 uint md5_len = 0;
17523
17524 uint md5_max_len = 4 * 64;
17525
17526 uint md5_remaining_len = md5_max_len;
17527
17528 uint tmp_md5_buf[md5_max_len / 4];
17529
17530 memset (tmp_md5_buf, 0, sizeof (tmp_md5_buf));
17531
17532 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17533
17534 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17535
17536 md5_len += method_len + 1;
17537 tmp_md5_ptr += method_len + 1;
17538
17539 if (URI_prefix_len > 0)
17540 {
17541 md5_remaining_len = md5_max_len - md5_len;
17542
17543 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17544
17545 md5_len += URI_prefix_len + 1;
17546 tmp_md5_ptr += URI_prefix_len + 1;
17547 }
17548
17549 md5_remaining_len = md5_max_len - md5_len;
17550
17551 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17552
17553 md5_len += URI_resource_len;
17554 tmp_md5_ptr += URI_resource_len;
17555
17556 if (URI_suffix_len > 0)
17557 {
17558 md5_remaining_len = md5_max_len - md5_len;
17559
17560 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17561
17562 md5_len += 1 + URI_suffix_len;
17563 }
17564
17565 uint tmp_digest[4];
17566
17567 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17568
17569 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17570 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17571 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17572 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17573
17574 /*
17575 * esalt
17576 */
17577
17578 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17579
17580 uint esalt_len = 0;
17581
17582 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17583
17584 // there are 2 possibilities for the esalt:
17585
17586 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17587 {
17588 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17589
17590 if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH);
17591
17592 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17593 nonce_pos,
17594 nonce_count_pos,
17595 nonce_client_pos,
17596 qop_pos,
17597 tmp_digest[0],
17598 tmp_digest[1],
17599 tmp_digest[2],
17600 tmp_digest[3]);
17601 }
17602 else
17603 {
17604 esalt_len = 1 + nonce_len + 1 + 32;
17605
17606 if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH);
17607
17608 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17609 nonce_pos,
17610 tmp_digest[0],
17611 tmp_digest[1],
17612 tmp_digest[2],
17613 tmp_digest[3]);
17614 }
17615
17616 // add 0x80 to esalt
17617
17618 esalt_buf_ptr[esalt_len] = 0x80;
17619
17620 sip->esalt_len = esalt_len;
17621
17622 /*
17623 * actual salt
17624 */
17625
17626 char *sip_salt_ptr = (char *) sip->salt_buf;
17627
17628 uint salt_len = user_len + 1 + realm_len + 1;
17629
17630 uint max_salt_len = 119;
17631
17632 if (salt_len > max_salt_len) return (PARSER_SALT_LENGTH);
17633
17634 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17635
17636 sip->salt_len = salt_len;
17637
17638 /*
17639 * fake salt (for sorting)
17640 */
17641
17642 char *salt_buf_ptr = (char *) salt->salt_buf;
17643
17644 max_salt_len = 55;
17645
17646 uint fake_salt_len = salt_len;
17647
17648 if (fake_salt_len > max_salt_len)
17649 {
17650 fake_salt_len = max_salt_len;
17651 }
17652
17653 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17654
17655 salt->salt_len = fake_salt_len;
17656
17657 /*
17658 * digest
17659 */
17660
17661 digest[0] = hex_to_uint (&digest_pos[ 0]);
17662 digest[1] = hex_to_uint (&digest_pos[ 8]);
17663 digest[2] = hex_to_uint (&digest_pos[16]);
17664 digest[3] = hex_to_uint (&digest_pos[24]);
17665
17666 digest[0] = byte_swap_32 (digest[0]);
17667 digest[1] = byte_swap_32 (digest[1]);
17668 digest[2] = byte_swap_32 (digest[2]);
17669 digest[3] = byte_swap_32 (digest[3]);
17670
17671 return (PARSER_OK);
17672 }
17673
17674 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17675 {
17676 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17677
17678 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17679
17680 uint32_t *digest = (uint32_t *) hash_buf->digest;
17681
17682 salt_t *salt = hash_buf->salt;
17683
17684 // digest
17685
17686 char *digest_pos = input_buf;
17687
17688 digest[0] = hex_to_uint (&digest_pos[0]);
17689 digest[1] = 0;
17690 digest[2] = 0;
17691 digest[3] = 0;
17692
17693 // salt
17694
17695 char *salt_buf = input_buf + 8 + 1;
17696
17697 uint salt_len = 8;
17698
17699 char *salt_buf_ptr = (char *) salt->salt_buf;
17700
17701 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17702
17703 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17704
17705 salt->salt_len = salt_len;
17706
17707 return (PARSER_OK);
17708 }
17709
17710 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17711 {
17712 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
17713
17714 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17715
17716 uint32_t *digest = (uint32_t *) hash_buf->digest;
17717
17718 salt_t *salt = hash_buf->salt;
17719
17720 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
17721
17722 /**
17723 * parse line
17724 */
17725
17726 char *p_buf_pos = input_buf + 4;
17727
17728 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
17729
17730 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17731
17732 uint32_t p_buf_len = NumCyclesPower_pos - p_buf_pos;
17733
17734 NumCyclesPower_pos++;
17735
17736 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
17737
17738 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17739
17740 uint32_t NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
17741
17742 salt_len_pos++;
17743
17744 char *salt_buf_pos = strchr (salt_len_pos, '$');
17745
17746 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17747
17748 uint32_t salt_len_len = salt_buf_pos - salt_len_pos;
17749
17750 salt_buf_pos++;
17751
17752 char *iv_len_pos = strchr (salt_buf_pos, '$');
17753
17754 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17755
17756 uint32_t salt_buf_len = iv_len_pos - salt_buf_pos;
17757
17758 iv_len_pos++;
17759
17760 char *iv_buf_pos = strchr (iv_len_pos, '$');
17761
17762 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17763
17764 uint32_t iv_len_len = iv_buf_pos - iv_len_pos;
17765
17766 iv_buf_pos++;
17767
17768 char *crc_buf_pos = strchr (iv_buf_pos, '$');
17769
17770 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17771
17772 uint32_t iv_buf_len = crc_buf_pos - iv_buf_pos;
17773
17774 crc_buf_pos++;
17775
17776 char *data_len_pos = strchr (crc_buf_pos, '$');
17777
17778 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17779
17780 uint32_t crc_buf_len = data_len_pos - crc_buf_pos;
17781
17782 data_len_pos++;
17783
17784 char *unpack_size_pos = strchr (data_len_pos, '$');
17785
17786 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17787
17788 uint32_t data_len_len = unpack_size_pos - data_len_pos;
17789
17790 unpack_size_pos++;
17791
17792 char *data_buf_pos = strchr (unpack_size_pos, '$');
17793
17794 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17795
17796 uint32_t unpack_size_len = data_buf_pos - unpack_size_pos;
17797
17798 data_buf_pos++;
17799
17800 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;
17801
17802 const uint iter = atoi (NumCyclesPower_pos);
17803 const uint crc = atoi (crc_buf_pos);
17804 const uint p_buf = atoi (p_buf_pos);
17805 const uint salt_len = atoi (salt_len_pos);
17806 const uint iv_len = atoi (iv_len_pos);
17807 const uint unpack_size = atoi (unpack_size_pos);
17808 const uint data_len = atoi (data_len_pos);
17809
17810 /**
17811 * verify some data
17812 */
17813
17814 if (p_buf != 0) return (PARSER_SALT_VALUE);
17815 if (salt_len != 0) return (PARSER_SALT_VALUE);
17816
17817 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
17818
17819 if (data_len > 384) return (PARSER_SALT_VALUE);
17820
17821 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
17822
17823 /**
17824 * store data
17825 */
17826
17827 seven_zip->iv_buf[0] = hex_to_uint (&iv_buf_pos[ 0]);
17828 seven_zip->iv_buf[1] = hex_to_uint (&iv_buf_pos[ 8]);
17829 seven_zip->iv_buf[2] = hex_to_uint (&iv_buf_pos[16]);
17830 seven_zip->iv_buf[3] = hex_to_uint (&iv_buf_pos[24]);
17831
17832 seven_zip->iv_len = iv_len;
17833
17834 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
17835
17836 seven_zip->salt_len = 0;
17837
17838 seven_zip->crc = crc;
17839
17840 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
17841 {
17842 seven_zip->data_buf[i] = hex_to_uint (&data_buf_pos[j]);
17843
17844 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
17845 }
17846
17847 seven_zip->data_len = data_len;
17848
17849 seven_zip->unpack_size = unpack_size;
17850
17851 // real salt
17852
17853 salt->salt_buf[0] = seven_zip->data_buf[0];
17854 salt->salt_buf[1] = seven_zip->data_buf[1];
17855 salt->salt_buf[2] = seven_zip->data_buf[2];
17856 salt->salt_buf[3] = seven_zip->data_buf[3];
17857
17858 salt->salt_len = 16;
17859
17860 salt->salt_sign[0] = iter;
17861
17862 salt->salt_iter = 1 << iter;
17863
17864 /**
17865 * digest
17866 */
17867
17868 digest[0] = crc;
17869 digest[1] = 0;
17870 digest[2] = 0;
17871 digest[3] = 0;
17872
17873 return (PARSER_OK);
17874 }
17875
17876 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17877 {
17878 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
17879
17880 uint32_t *digest = (uint32_t *) hash_buf->digest;
17881
17882 digest[0] = hex_to_uint (&input_buf[ 0]);
17883 digest[1] = hex_to_uint (&input_buf[ 8]);
17884 digest[2] = hex_to_uint (&input_buf[16]);
17885 digest[3] = hex_to_uint (&input_buf[24]);
17886 digest[4] = hex_to_uint (&input_buf[32]);
17887 digest[5] = hex_to_uint (&input_buf[40]);
17888 digest[6] = hex_to_uint (&input_buf[48]);
17889 digest[7] = hex_to_uint (&input_buf[56]);
17890
17891 digest[0] = byte_swap_32 (digest[0]);
17892 digest[1] = byte_swap_32 (digest[1]);
17893 digest[2] = byte_swap_32 (digest[2]);
17894 digest[3] = byte_swap_32 (digest[3]);
17895 digest[4] = byte_swap_32 (digest[4]);
17896 digest[5] = byte_swap_32 (digest[5]);
17897 digest[6] = byte_swap_32 (digest[6]);
17898 digest[7] = byte_swap_32 (digest[7]);
17899
17900 return (PARSER_OK);
17901 }
17902
17903 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17904 {
17905 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
17906
17907 uint32_t *digest = (uint32_t *) hash_buf->digest;
17908
17909 digest[ 0] = hex_to_uint (&input_buf[ 0]);
17910 digest[ 1] = hex_to_uint (&input_buf[ 8]);
17911 digest[ 2] = hex_to_uint (&input_buf[ 16]);
17912 digest[ 3] = hex_to_uint (&input_buf[ 24]);
17913 digest[ 4] = hex_to_uint (&input_buf[ 32]);
17914 digest[ 5] = hex_to_uint (&input_buf[ 40]);
17915 digest[ 6] = hex_to_uint (&input_buf[ 48]);
17916 digest[ 7] = hex_to_uint (&input_buf[ 56]);
17917 digest[ 8] = hex_to_uint (&input_buf[ 64]);
17918 digest[ 9] = hex_to_uint (&input_buf[ 72]);
17919 digest[10] = hex_to_uint (&input_buf[ 80]);
17920 digest[11] = hex_to_uint (&input_buf[ 88]);
17921 digest[12] = hex_to_uint (&input_buf[ 96]);
17922 digest[13] = hex_to_uint (&input_buf[104]);
17923 digest[14] = hex_to_uint (&input_buf[112]);
17924 digest[15] = hex_to_uint (&input_buf[120]);
17925
17926 digest[ 0] = byte_swap_32 (digest[ 0]);
17927 digest[ 1] = byte_swap_32 (digest[ 1]);
17928 digest[ 2] = byte_swap_32 (digest[ 2]);
17929 digest[ 3] = byte_swap_32 (digest[ 3]);
17930 digest[ 4] = byte_swap_32 (digest[ 4]);
17931 digest[ 5] = byte_swap_32 (digest[ 5]);
17932 digest[ 6] = byte_swap_32 (digest[ 6]);
17933 digest[ 7] = byte_swap_32 (digest[ 7]);
17934 digest[ 8] = byte_swap_32 (digest[ 8]);
17935 digest[ 9] = byte_swap_32 (digest[ 9]);
17936 digest[10] = byte_swap_32 (digest[10]);
17937 digest[11] = byte_swap_32 (digest[11]);
17938 digest[12] = byte_swap_32 (digest[12]);
17939 digest[13] = byte_swap_32 (digest[13]);
17940 digest[14] = byte_swap_32 (digest[14]);
17941 digest[15] = byte_swap_32 (digest[15]);
17942
17943 return (PARSER_OK);
17944 }
17945
17946 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17947 {
17948 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
17949
17950 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17951
17952 uint32_t *digest = (uint32_t *) hash_buf->digest;
17953
17954 salt_t *salt = hash_buf->salt;
17955
17956 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
17957
17958 /**
17959 * parse line
17960 */
17961
17962 // iterations
17963
17964 char *iter_pos = input_buf + 4;
17965
17966 uint32_t iter = atoi (iter_pos);
17967
17968 if (iter < 1) return (PARSER_SALT_ITERATION);
17969 if (iter > 999999) return (PARSER_SALT_ITERATION);
17970
17971 // first is *raw* salt
17972
17973 char *salt_pos = strchr (iter_pos, ':');
17974
17975 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17976
17977 salt_pos++;
17978
17979 char *hash_pos = strchr (salt_pos, ':');
17980
17981 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17982
17983 uint32_t salt_len = hash_pos - salt_pos;
17984
17985 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17986
17987 hash_pos++;
17988
17989 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
17990
17991 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17992
17993 // decode salt
17994
17995 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
17996
17997 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17998
17999 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18000
18001 salt_buf_ptr[salt_len + 3] = 0x01;
18002 salt_buf_ptr[salt_len + 4] = 0x80;
18003
18004 salt->salt_len = salt_len;
18005 salt->salt_iter = iter - 1;
18006
18007 // decode hash
18008
18009 char tmp_buf[100];
18010
18011 memset (tmp_buf, 0, sizeof (tmp_buf));
18012
18013 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
18014
18015 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18016
18017 memcpy (digest, tmp_buf, 16);
18018
18019 // add some stuff to normal salt to make sorted happy
18020
18021 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
18022 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
18023 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
18024 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
18025 salt->salt_buf[4] = salt->salt_iter;
18026
18027 return (PARSER_OK);
18028 }
18029
18030 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18031 {
18032 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
18033
18034 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
18035
18036 uint32_t *digest = (uint32_t *) hash_buf->digest;
18037
18038 salt_t *salt = hash_buf->salt;
18039
18040 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
18041
18042 /**
18043 * parse line
18044 */
18045
18046 // iterations
18047
18048 char *iter_pos = input_buf + 5;
18049
18050 uint32_t iter = atoi (iter_pos);
18051
18052 if (iter < 1) return (PARSER_SALT_ITERATION);
18053 if (iter > 999999) return (PARSER_SALT_ITERATION);
18054
18055 // first is *raw* salt
18056
18057 char *salt_pos = strchr (iter_pos, ':');
18058
18059 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18060
18061 salt_pos++;
18062
18063 char *hash_pos = strchr (salt_pos, ':');
18064
18065 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18066
18067 uint32_t salt_len = hash_pos - salt_pos;
18068
18069 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18070
18071 hash_pos++;
18072
18073 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
18074
18075 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18076
18077 // decode salt
18078
18079 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18080
18081 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18082
18083 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18084
18085 salt_buf_ptr[salt_len + 3] = 0x01;
18086 salt_buf_ptr[salt_len + 4] = 0x80;
18087
18088 salt->salt_len = salt_len;
18089 salt->salt_iter = iter - 1;
18090
18091 // decode hash
18092
18093 char tmp_buf[100];
18094
18095 memset (tmp_buf, 0, sizeof (tmp_buf));
18096
18097 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
18098
18099 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18100
18101 memcpy (digest, tmp_buf, 16);
18102
18103 digest[0] = byte_swap_32 (digest[0]);
18104 digest[1] = byte_swap_32 (digest[1]);
18105 digest[2] = byte_swap_32 (digest[2]);
18106 digest[3] = byte_swap_32 (digest[3]);
18107
18108 // add some stuff to normal salt to make sorted happy
18109
18110 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18111 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18112 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18113 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18114 salt->salt_buf[4] = salt->salt_iter;
18115
18116 return (PARSER_OK);
18117 }
18118
18119 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18120 {
18121 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18122
18123 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18124
18125 uint64_t *digest = (uint64_t *) hash_buf->digest;
18126
18127 salt_t *salt = hash_buf->salt;
18128
18129 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18130
18131 /**
18132 * parse line
18133 */
18134
18135 // iterations
18136
18137 char *iter_pos = input_buf + 7;
18138
18139 uint32_t iter = atoi (iter_pos);
18140
18141 if (iter < 1) return (PARSER_SALT_ITERATION);
18142 if (iter > 999999) return (PARSER_SALT_ITERATION);
18143
18144 // first is *raw* salt
18145
18146 char *salt_pos = strchr (iter_pos, ':');
18147
18148 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18149
18150 salt_pos++;
18151
18152 char *hash_pos = strchr (salt_pos, ':');
18153
18154 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18155
18156 uint32_t salt_len = hash_pos - salt_pos;
18157
18158 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18159
18160 hash_pos++;
18161
18162 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
18163
18164 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18165
18166 // decode salt
18167
18168 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18169
18170 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18171
18172 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18173
18174 salt_buf_ptr[salt_len + 3] = 0x01;
18175 salt_buf_ptr[salt_len + 4] = 0x80;
18176
18177 salt->salt_len = salt_len;
18178 salt->salt_iter = iter - 1;
18179
18180 // decode hash
18181
18182 char tmp_buf[100];
18183
18184 memset (tmp_buf, 0, sizeof (tmp_buf));
18185
18186 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
18187
18188 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18189
18190 memcpy (digest, tmp_buf, 64);
18191
18192 digest[0] = byte_swap_64 (digest[0]);
18193 digest[1] = byte_swap_64 (digest[1]);
18194 digest[2] = byte_swap_64 (digest[2]);
18195 digest[3] = byte_swap_64 (digest[3]);
18196 digest[4] = byte_swap_64 (digest[4]);
18197 digest[5] = byte_swap_64 (digest[5]);
18198 digest[6] = byte_swap_64 (digest[6]);
18199 digest[7] = byte_swap_64 (digest[7]);
18200
18201 // add some stuff to normal salt to make sorted happy
18202
18203 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18204 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18205 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18206 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18207 salt->salt_buf[4] = salt->salt_iter;
18208
18209 return (PARSER_OK);
18210 }
18211
18212 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18213 {
18214 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18215
18216 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18217
18218 uint *digest = (uint *) hash_buf->digest;
18219
18220 salt_t *salt = hash_buf->salt;
18221
18222 /**
18223 * parse line
18224 */
18225
18226 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18227
18228 char *hash_pos = strchr (salt_pos, '$');
18229
18230 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18231
18232 uint32_t salt_len = hash_pos - salt_pos;
18233
18234 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18235
18236 hash_pos++;
18237
18238 uint32_t hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18239
18240 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18241
18242 // decode hash
18243
18244 digest[ 0] = hex_to_uint (&hash_pos[0]);
18245 digest[ 1] = hex_to_uint (&hash_pos[8]);
18246 digest[ 2] = 0;
18247 digest[ 3] = 0;
18248 digest[ 4] = 0;
18249 digest[ 5] = 0;
18250 digest[ 6] = 0;
18251 digest[ 7] = 0;
18252 digest[ 8] = 0;
18253 digest[ 9] = 0;
18254 digest[10] = 0;
18255 digest[11] = 0;
18256 digest[12] = 0;
18257 digest[13] = 0;
18258 digest[14] = 0;
18259 digest[15] = 0;
18260
18261 // decode salt
18262
18263 salt->salt_buf[0] = hex_to_uint (&salt_pos[0]);
18264 salt->salt_buf[1] = hex_to_uint (&salt_pos[8]);
18265
18266 salt->salt_iter = ROUNDS_ECRYPTFS;
18267 salt->salt_len = 8;
18268
18269 return (PARSER_OK);
18270 }
18271
18272 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18273 {
18274 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18275
18276 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18277
18278 unsigned char c19 = itoa64_to_int (input_buf[19]);
18279
18280 if (c19 & 3) return (PARSER_HASH_VALUE);
18281
18282 salt_t *salt = hash_buf->salt;
18283
18284 uint32_t *digest = (uint32_t *) hash_buf->digest;
18285
18286 // iteration count
18287
18288 salt->salt_iter = itoa64_to_int (input_buf[1])
18289 | itoa64_to_int (input_buf[2]) << 6
18290 | itoa64_to_int (input_buf[3]) << 12
18291 | itoa64_to_int (input_buf[4]) << 18;
18292
18293 // set salt
18294
18295 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18296 | itoa64_to_int (input_buf[6]) << 6
18297 | itoa64_to_int (input_buf[7]) << 12
18298 | itoa64_to_int (input_buf[8]) << 18;
18299
18300 salt->salt_len = 4;
18301
18302 char tmp_buf[100];
18303
18304 memset (tmp_buf, 0, sizeof (tmp_buf));
18305
18306 base64_decode (itoa64_to_int, input_buf + 9, 11, tmp_buf);
18307
18308 memcpy (digest, tmp_buf, 8);
18309
18310 uint tt;
18311
18312 IP (digest[0], digest[1], tt);
18313
18314 digest[0] = ROTATE_RIGHT (digest[0], 31);
18315 digest[1] = ROTATE_RIGHT (digest[1], 31);
18316 digest[2] = 0;
18317 digest[3] = 0;
18318
18319 return (PARSER_OK);
18320 }
18321
18322 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18323 {
18324 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18325
18326 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18327
18328 uint32_t *digest = (uint32_t *) hash_buf->digest;
18329
18330 salt_t *salt = hash_buf->salt;
18331
18332 /**
18333 * parse line
18334 */
18335
18336 char *type_pos = input_buf + 6 + 1;
18337
18338 char *salt_pos = strchr (type_pos, '*');
18339
18340 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18341
18342 uint32_t type_len = salt_pos - type_pos;
18343
18344 if (type_len != 1) return (PARSER_SALT_LENGTH);
18345
18346 salt_pos++;
18347
18348 char *crypted_pos = strchr (salt_pos, '*');
18349
18350 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18351
18352 uint32_t salt_len = crypted_pos - salt_pos;
18353
18354 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18355
18356 crypted_pos++;
18357
18358 uint32_t crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18359
18360 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18361
18362 /**
18363 * copy data
18364 */
18365
18366 salt->salt_buf[0] = hex_to_uint (&salt_pos[0]);
18367 salt->salt_buf[1] = hex_to_uint (&salt_pos[8]);
18368
18369 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18370 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18371
18372 salt->salt_buf[2] = hex_to_uint (&crypted_pos[ 0]);
18373 salt->salt_buf[3] = hex_to_uint (&crypted_pos[ 8]);
18374 salt->salt_buf[4] = hex_to_uint (&crypted_pos[16]);
18375 salt->salt_buf[5] = hex_to_uint (&crypted_pos[24]);
18376
18377 salt->salt_len = 24;
18378 salt->salt_iter = ROUNDS_RAR3;
18379
18380 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18381 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18382
18383 digest[0] = 0xc43d7b00;
18384 digest[1] = 0x40070000;
18385 digest[2] = 0;
18386 digest[3] = 0;
18387
18388 return (PARSER_OK);
18389 }
18390
18391 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18392 {
18393 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
18394
18395 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
18396
18397 uint32_t *digest = (uint32_t *) hash_buf->digest;
18398
18399 salt_t *salt = hash_buf->salt;
18400
18401 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
18402
18403 /**
18404 * parse line
18405 */
18406
18407 char *param0_pos = input_buf + 1 + 4 + 1;
18408
18409 char *param1_pos = strchr (param0_pos, '$');
18410
18411 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18412
18413 uint32_t param0_len = param1_pos - param0_pos;
18414
18415 param1_pos++;
18416
18417 char *param2_pos = strchr (param1_pos, '$');
18418
18419 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18420
18421 uint32_t param1_len = param2_pos - param1_pos;
18422
18423 param2_pos++;
18424
18425 char *param3_pos = strchr (param2_pos, '$');
18426
18427 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18428
18429 uint32_t param2_len = param3_pos - param2_pos;
18430
18431 param3_pos++;
18432
18433 char *param4_pos = strchr (param3_pos, '$');
18434
18435 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18436
18437 uint32_t param3_len = param4_pos - param3_pos;
18438
18439 param4_pos++;
18440
18441 char *param5_pos = strchr (param4_pos, '$');
18442
18443 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18444
18445 uint32_t param4_len = param5_pos - param4_pos;
18446
18447 param5_pos++;
18448
18449 uint32_t param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
18450
18451 char *salt_buf = param1_pos;
18452 char *iv = param3_pos;
18453 char *pswcheck = param5_pos;
18454
18455 const uint salt_len = atoi (param0_pos);
18456 const uint iterations = atoi (param2_pos);
18457 const uint pswcheck_len = atoi (param4_pos);
18458
18459 /**
18460 * verify some data
18461 */
18462
18463 if (param1_len != 32) return (PARSER_SALT_VALUE);
18464 if (param3_len != 32) return (PARSER_SALT_VALUE);
18465 if (param5_len != 16) return (PARSER_SALT_VALUE);
18466
18467 if (salt_len != 16) return (PARSER_SALT_VALUE);
18468 if (iterations == 0) return (PARSER_SALT_VALUE);
18469 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
18470
18471 /**
18472 * store data
18473 */
18474
18475 salt->salt_buf[0] = hex_to_uint (&salt_buf[ 0]);
18476 salt->salt_buf[1] = hex_to_uint (&salt_buf[ 8]);
18477 salt->salt_buf[2] = hex_to_uint (&salt_buf[16]);
18478 salt->salt_buf[3] = hex_to_uint (&salt_buf[24]);
18479
18480 rar5->iv[0] = hex_to_uint (&iv[ 0]);
18481 rar5->iv[1] = hex_to_uint (&iv[ 8]);
18482 rar5->iv[2] = hex_to_uint (&iv[16]);
18483 rar5->iv[3] = hex_to_uint (&iv[24]);
18484
18485 salt->salt_len = 16;
18486
18487 salt->salt_sign[0] = iterations;
18488
18489 salt->salt_iter = ((1 << iterations) + 32) - 1;
18490
18491 /**
18492 * digest buf
18493 */
18494
18495 digest[0] = hex_to_uint (&pswcheck[ 0]);
18496 digest[1] = hex_to_uint (&pswcheck[ 8]);
18497 digest[2] = 0;
18498 digest[3] = 0;
18499
18500 return (PARSER_OK);
18501 }
18502
18503 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18504 {
18505 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18506
18507 uint32_t *digest = (uint32_t *) hash_buf->digest;
18508
18509 salt_t *salt = hash_buf->salt;
18510
18511 digest[0] = hex_to_uint (&input_buf[ 0]);
18512 digest[1] = hex_to_uint (&input_buf[ 8]);
18513 digest[2] = hex_to_uint (&input_buf[16]);
18514 digest[3] = hex_to_uint (&input_buf[24]);
18515 digest[4] = hex_to_uint (&input_buf[32]);
18516 digest[5] = hex_to_uint (&input_buf[40]);
18517 digest[6] = hex_to_uint (&input_buf[48]);
18518 digest[7] = hex_to_uint (&input_buf[56]);
18519
18520 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18521
18522 uint salt_len = input_len - 64 - 1;
18523
18524 char *salt_buf = input_buf + 64 + 1;
18525
18526 char *salt_buf_ptr = (char *) salt->salt_buf;
18527
18528 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18529
18530 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18531
18532 salt->salt_len = salt_len;
18533
18534 /**
18535 * we can precompute the first sha256 transform
18536 */
18537
18538 uint w[16];
18539
18540 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18541 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18542 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18543 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18544 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18545 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18546 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18547 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18548 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18549 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18550 w[10] = byte_swap_32 (salt->salt_buf[10]);
18551 w[11] = byte_swap_32 (salt->salt_buf[11]);
18552 w[12] = byte_swap_32 (salt->salt_buf[12]);
18553 w[13] = byte_swap_32 (salt->salt_buf[13]);
18554 w[14] = byte_swap_32 (salt->salt_buf[14]);
18555 w[15] = byte_swap_32 (salt->salt_buf[15]);
18556
18557 uint pc256[8];
18558
18559 pc256[0] = SHA256M_A;
18560 pc256[1] = SHA256M_B;
18561 pc256[2] = SHA256M_C;
18562 pc256[3] = SHA256M_D;
18563 pc256[4] = SHA256M_E;
18564 pc256[5] = SHA256M_F;
18565 pc256[6] = SHA256M_G;
18566 pc256[7] = SHA256M_H;
18567
18568 sha256_64 (w, pc256);
18569
18570 salt->salt_buf_pc[0] = pc256[0];
18571 salt->salt_buf_pc[1] = pc256[1];
18572 salt->salt_buf_pc[2] = pc256[2];
18573 salt->salt_buf_pc[3] = pc256[3];
18574 salt->salt_buf_pc[4] = pc256[4];
18575 salt->salt_buf_pc[5] = pc256[5];
18576 salt->salt_buf_pc[6] = pc256[6];
18577 salt->salt_buf_pc[7] = pc256[7];
18578
18579 digest[0] -= pc256[0];
18580 digest[1] -= pc256[1];
18581 digest[2] -= pc256[2];
18582 digest[3] -= pc256[3];
18583 digest[4] -= pc256[4];
18584 digest[5] -= pc256[5];
18585 digest[6] -= pc256[6];
18586 digest[7] -= pc256[7];
18587
18588 return (PARSER_OK);
18589 }
18590
18591 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18592 {
18593 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18594
18595 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18596
18597 uint32_t *digest = (uint32_t *) hash_buf->digest;
18598
18599 salt_t *salt = hash_buf->salt;
18600
18601 /**
18602 * parse line
18603 */
18604
18605 char *data_len_pos = input_buf + 1 + 10 + 1;
18606
18607 char *data_buf_pos = strchr (data_len_pos, '$');
18608
18609 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18610
18611 uint32_t data_len_len = data_buf_pos - data_len_pos;
18612
18613 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18614 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18615
18616 data_buf_pos++;
18617
18618 uint32_t data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18619
18620 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18621
18622 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18623
18624 uint32_t data_len = atoi (data_len_pos);
18625
18626 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18627
18628 /**
18629 * salt
18630 */
18631
18632 char *salt_pos = data_buf_pos;
18633
18634 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
18635 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
18636 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]);
18637 salt->salt_buf[3] = hex_to_uint (&salt_pos[24]);
18638
18639 // this is actually the CT, which is also the hash later (if matched)
18640
18641 salt->salt_buf[4] = hex_to_uint (&salt_pos[32]);
18642 salt->salt_buf[5] = hex_to_uint (&salt_pos[40]);
18643 salt->salt_buf[6] = hex_to_uint (&salt_pos[48]);
18644 salt->salt_buf[7] = hex_to_uint (&salt_pos[56]);
18645
18646 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18647
18648 salt->salt_iter = 10 - 1;
18649
18650 /**
18651 * digest buf
18652 */
18653
18654 digest[0] = salt->salt_buf[4];
18655 digest[1] = salt->salt_buf[5];
18656 digest[2] = salt->salt_buf[6];
18657 digest[3] = salt->salt_buf[7];
18658
18659 return (PARSER_OK);
18660 }
18661
18662 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18663 {
18664 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
18665
18666 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18667
18668 uint32_t *digest = (uint32_t *) hash_buf->digest;
18669
18670 salt_t *salt = hash_buf->salt;
18671
18672 /**
18673 * parse line
18674 */
18675
18676 char *salt_pos = input_buf + 11 + 1;
18677
18678 char *iter_pos = strchr (salt_pos, ',');
18679
18680 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18681
18682 uint32_t salt_len = iter_pos - salt_pos;
18683
18684 if (salt_len != 20) return (PARSER_SALT_LENGTH);
18685
18686 iter_pos++;
18687
18688 char *hash_pos = strchr (iter_pos, ',');
18689
18690 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18691
18692 uint32_t iter_len = hash_pos - iter_pos;
18693
18694 if (iter_len > 5) return (PARSER_SALT_LENGTH);
18695
18696 hash_pos++;
18697
18698 uint32_t hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
18699
18700 if (hash_len != 64) return (PARSER_HASH_LENGTH);
18701
18702 /**
18703 * salt
18704 */
18705
18706 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
18707 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
18708 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]) & 0xffff0000;
18709 salt->salt_buf[3] = 0x00018000;
18710
18711 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18712 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18713 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
18714 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
18715
18716 salt->salt_len = salt_len / 2;
18717
18718 salt->salt_iter = atoi (iter_pos) - 1;
18719
18720 /**
18721 * digest buf
18722 */
18723
18724 digest[0] = hex_to_uint (&hash_pos[ 0]);
18725 digest[1] = hex_to_uint (&hash_pos[ 8]);
18726 digest[2] = hex_to_uint (&hash_pos[16]);
18727 digest[3] = hex_to_uint (&hash_pos[24]);
18728 digest[4] = hex_to_uint (&hash_pos[32]);
18729 digest[5] = hex_to_uint (&hash_pos[40]);
18730 digest[6] = hex_to_uint (&hash_pos[48]);
18731 digest[7] = hex_to_uint (&hash_pos[56]);
18732
18733 return (PARSER_OK);
18734 }
18735
18736 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18737 {
18738 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
18739
18740 uint32_t *digest = (uint32_t *) hash_buf->digest;
18741
18742 salt_t *salt = hash_buf->salt;
18743
18744 /**
18745 * parse line
18746 */
18747
18748 char *hash_pos = input_buf + 64;
18749 char *salt1_pos = input_buf + 128;
18750 char *salt2_pos = input_buf;
18751
18752 /**
18753 * salt
18754 */
18755
18756 salt->salt_buf[ 0] = hex_to_uint (&salt1_pos[ 0]);
18757 salt->salt_buf[ 1] = hex_to_uint (&salt1_pos[ 8]);
18758 salt->salt_buf[ 2] = hex_to_uint (&salt1_pos[16]);
18759 salt->salt_buf[ 3] = hex_to_uint (&salt1_pos[24]);
18760
18761 salt->salt_buf[ 4] = hex_to_uint (&salt2_pos[ 0]);
18762 salt->salt_buf[ 5] = hex_to_uint (&salt2_pos[ 8]);
18763 salt->salt_buf[ 6] = hex_to_uint (&salt2_pos[16]);
18764 salt->salt_buf[ 7] = hex_to_uint (&salt2_pos[24]);
18765
18766 salt->salt_buf[ 8] = hex_to_uint (&salt2_pos[32]);
18767 salt->salt_buf[ 9] = hex_to_uint (&salt2_pos[40]);
18768 salt->salt_buf[10] = hex_to_uint (&salt2_pos[48]);
18769 salt->salt_buf[11] = hex_to_uint (&salt2_pos[56]);
18770
18771 salt->salt_len = 48;
18772
18773 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
18774
18775 /**
18776 * digest buf
18777 */
18778
18779 digest[0] = hex_to_uint (&hash_pos[ 0]);
18780 digest[1] = hex_to_uint (&hash_pos[ 8]);
18781 digest[2] = hex_to_uint (&hash_pos[16]);
18782 digest[3] = hex_to_uint (&hash_pos[24]);
18783 digest[4] = hex_to_uint (&hash_pos[32]);
18784 digest[5] = hex_to_uint (&hash_pos[40]);
18785 digest[6] = hex_to_uint (&hash_pos[48]);
18786 digest[7] = hex_to_uint (&hash_pos[56]);
18787
18788 return (PARSER_OK);
18789 }
18790
18791 /**
18792 * parallel running threads
18793 */
18794
18795 #ifdef WIN
18796
18797 BOOL WINAPI sigHandler_default (DWORD sig)
18798 {
18799 switch (sig)
18800 {
18801 case CTRL_CLOSE_EVENT:
18802
18803 /*
18804 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
18805 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
18806 * function otherwise it is to late (e.g. after returning from this function)
18807 */
18808
18809 myabort ();
18810
18811 SetConsoleCtrlHandler (NULL, TRUE);
18812
18813 hc_sleep (10);
18814
18815 return TRUE;
18816
18817 case CTRL_C_EVENT:
18818 case CTRL_LOGOFF_EVENT:
18819 case CTRL_SHUTDOWN_EVENT:
18820
18821 myabort ();
18822
18823 SetConsoleCtrlHandler (NULL, TRUE);
18824
18825 return TRUE;
18826 }
18827
18828 return FALSE;
18829 }
18830
18831 BOOL WINAPI sigHandler_benchmark (DWORD sig)
18832 {
18833 switch (sig)
18834 {
18835 case CTRL_CLOSE_EVENT:
18836
18837 myabort ();
18838
18839 SetConsoleCtrlHandler (NULL, TRUE);
18840
18841 hc_sleep (10);
18842
18843 return TRUE;
18844
18845 case CTRL_C_EVENT:
18846 case CTRL_LOGOFF_EVENT:
18847 case CTRL_SHUTDOWN_EVENT:
18848
18849 myquit ();
18850
18851 SetConsoleCtrlHandler (NULL, TRUE);
18852
18853 return TRUE;
18854 }
18855
18856 return FALSE;
18857 }
18858
18859 void hc_signal (BOOL WINAPI (callback) (DWORD))
18860 {
18861 if (callback == NULL)
18862 {
18863 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
18864 }
18865 else
18866 {
18867 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
18868 }
18869 }
18870
18871 #else
18872
18873 void sigHandler_default (int sig)
18874 {
18875 myabort ();
18876
18877 signal (sig, NULL);
18878 }
18879
18880 void sigHandler_benchmark (int sig)
18881 {
18882 myquit ();
18883
18884 signal (sig, NULL);
18885 }
18886
18887 void hc_signal (void (callback) (int))
18888 {
18889 if (callback == NULL) callback = SIG_DFL;
18890
18891 signal (SIGINT, callback);
18892 signal (SIGTERM, callback);
18893 signal (SIGABRT, callback);
18894 }
18895
18896 #endif
18897
18898 void status_display ();
18899
18900 void *thread_keypress (void *p)
18901 {
18902 int benchmark = *((int *) p);
18903
18904 uint quiet = data.quiet;
18905
18906 tty_break();
18907
18908 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
18909 {
18910 int ch = tty_getchar();
18911
18912 if (ch == -1) break;
18913
18914 if (ch == 0) continue;
18915
18916 #ifdef _POSIX
18917 if (ch != '\n')
18918 #endif
18919
18920 hc_thread_mutex_lock (mux_display);
18921
18922 log_info ("");
18923
18924 switch (ch)
18925 {
18926 case 's':
18927 case '\n':
18928
18929 log_info ("");
18930
18931 status_display ();
18932
18933 log_info ("");
18934
18935 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18936 if (quiet == 0) fflush (stdout);
18937
18938 break;
18939
18940 case 'b':
18941
18942 log_info ("");
18943
18944 bypass ();
18945
18946 log_info ("");
18947
18948 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18949 if (quiet == 0) fflush (stdout);
18950
18951 break;
18952
18953 case 'p':
18954
18955 log_info ("");
18956
18957 SuspendThreads ();
18958
18959 log_info ("");
18960
18961 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18962 if (quiet == 0) fflush (stdout);
18963
18964 break;
18965
18966 case 'r':
18967
18968 log_info ("");
18969
18970 ResumeThreads ();
18971
18972 log_info ("");
18973
18974 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18975 if (quiet == 0) fflush (stdout);
18976
18977 break;
18978
18979 case 'c':
18980
18981 log_info ("");
18982
18983 if (benchmark == 1) break;
18984
18985 stop_at_checkpoint ();
18986
18987 log_info ("");
18988
18989 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18990 if (quiet == 0) fflush (stdout);
18991
18992 break;
18993
18994 case 'q':
18995
18996 log_info ("");
18997
18998 if (benchmark == 1)
18999 {
19000 myquit ();
19001 }
19002 else
19003 {
19004 myabort ();
19005 }
19006
19007 break;
19008 }
19009
19010 hc_thread_mutex_unlock (mux_display);
19011 }
19012
19013 tty_fix();
19014
19015 return (p);
19016 }
19017
19018 /**
19019 * rules common
19020 */
19021
19022 bool class_num (char c)
19023 {
19024 return ((c >= '0') && (c <= '9'));
19025 }
19026
19027 bool class_lower (char c)
19028 {
19029 return ((c >= 'a') && (c <= 'z'));
19030 }
19031
19032 bool class_upper (char c)
19033 {
19034 return ((c >= 'A') && (c <= 'Z'));
19035 }
19036
19037 bool class_alpha (char c)
19038 {
19039 return (class_lower (c) || class_upper (c));
19040 }
19041
19042 char conv_ctoi (char c)
19043 {
19044 if (class_num (c))
19045 {
19046 return c - '0';
19047 }
19048 else if (class_upper (c))
19049 {
19050 return c - 'A' + (char) 10;
19051 }
19052
19053 return (char) (-1);
19054 }
19055
19056 char conv_itoc (char c)
19057 {
19058 if (c < 10)
19059 {
19060 return c + '0';
19061 }
19062 else if (c < 37)
19063 {
19064 return c + 'A' - (char) 10;
19065 }
19066
19067 return (char) (-1);
19068 }
19069
19070 /**
19071 * device rules
19072 */
19073
19074 #define INCR_POS if (++rule_pos == rule_len) return (-1)
19075 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
19076 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
19077 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
19078 #define MAX_KERNEL_RULES 255
19079 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
19080 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19081 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19082
19083 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
19084 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
19085 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19086 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19087
19088 int cpu_rule_to_kernel_rule (char rule_buf[BUFSIZ], uint rule_len, kernel_rule_t *rule)
19089 {
19090 uint rule_pos;
19091 uint rule_cnt;
19092
19093 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19094 {
19095 switch (rule_buf[rule_pos])
19096 {
19097 case ' ':
19098 rule_cnt--;
19099 break;
19100
19101 case RULE_OP_MANGLE_NOOP:
19102 SET_NAME (rule, rule_buf[rule_pos]);
19103 break;
19104
19105 case RULE_OP_MANGLE_LREST:
19106 SET_NAME (rule, rule_buf[rule_pos]);
19107 break;
19108
19109 case RULE_OP_MANGLE_UREST:
19110 SET_NAME (rule, rule_buf[rule_pos]);
19111 break;
19112
19113 case RULE_OP_MANGLE_LREST_UFIRST:
19114 SET_NAME (rule, rule_buf[rule_pos]);
19115 break;
19116
19117 case RULE_OP_MANGLE_UREST_LFIRST:
19118 SET_NAME (rule, rule_buf[rule_pos]);
19119 break;
19120
19121 case RULE_OP_MANGLE_TREST:
19122 SET_NAME (rule, rule_buf[rule_pos]);
19123 break;
19124
19125 case RULE_OP_MANGLE_TOGGLE_AT:
19126 SET_NAME (rule, rule_buf[rule_pos]);
19127 SET_P0_CONV (rule, rule_buf[rule_pos]);
19128 break;
19129
19130 case RULE_OP_MANGLE_REVERSE:
19131 SET_NAME (rule, rule_buf[rule_pos]);
19132 break;
19133
19134 case RULE_OP_MANGLE_DUPEWORD:
19135 SET_NAME (rule, rule_buf[rule_pos]);
19136 break;
19137
19138 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19139 SET_NAME (rule, rule_buf[rule_pos]);
19140 SET_P0_CONV (rule, rule_buf[rule_pos]);
19141 break;
19142
19143 case RULE_OP_MANGLE_REFLECT:
19144 SET_NAME (rule, rule_buf[rule_pos]);
19145 break;
19146
19147 case RULE_OP_MANGLE_ROTATE_LEFT:
19148 SET_NAME (rule, rule_buf[rule_pos]);
19149 break;
19150
19151 case RULE_OP_MANGLE_ROTATE_RIGHT:
19152 SET_NAME (rule, rule_buf[rule_pos]);
19153 break;
19154
19155 case RULE_OP_MANGLE_APPEND:
19156 SET_NAME (rule, rule_buf[rule_pos]);
19157 SET_P0 (rule, rule_buf[rule_pos]);
19158 break;
19159
19160 case RULE_OP_MANGLE_PREPEND:
19161 SET_NAME (rule, rule_buf[rule_pos]);
19162 SET_P0 (rule, rule_buf[rule_pos]);
19163 break;
19164
19165 case RULE_OP_MANGLE_DELETE_FIRST:
19166 SET_NAME (rule, rule_buf[rule_pos]);
19167 break;
19168
19169 case RULE_OP_MANGLE_DELETE_LAST:
19170 SET_NAME (rule, rule_buf[rule_pos]);
19171 break;
19172
19173 case RULE_OP_MANGLE_DELETE_AT:
19174 SET_NAME (rule, rule_buf[rule_pos]);
19175 SET_P0_CONV (rule, rule_buf[rule_pos]);
19176 break;
19177
19178 case RULE_OP_MANGLE_EXTRACT:
19179 SET_NAME (rule, rule_buf[rule_pos]);
19180 SET_P0_CONV (rule, rule_buf[rule_pos]);
19181 SET_P1_CONV (rule, rule_buf[rule_pos]);
19182 break;
19183
19184 case RULE_OP_MANGLE_OMIT:
19185 SET_NAME (rule, rule_buf[rule_pos]);
19186 SET_P0_CONV (rule, rule_buf[rule_pos]);
19187 SET_P1_CONV (rule, rule_buf[rule_pos]);
19188 break;
19189
19190 case RULE_OP_MANGLE_INSERT:
19191 SET_NAME (rule, rule_buf[rule_pos]);
19192 SET_P0_CONV (rule, rule_buf[rule_pos]);
19193 SET_P1 (rule, rule_buf[rule_pos]);
19194 break;
19195
19196 case RULE_OP_MANGLE_OVERSTRIKE:
19197 SET_NAME (rule, rule_buf[rule_pos]);
19198 SET_P0_CONV (rule, rule_buf[rule_pos]);
19199 SET_P1 (rule, rule_buf[rule_pos]);
19200 break;
19201
19202 case RULE_OP_MANGLE_TRUNCATE_AT:
19203 SET_NAME (rule, rule_buf[rule_pos]);
19204 SET_P0_CONV (rule, rule_buf[rule_pos]);
19205 break;
19206
19207 case RULE_OP_MANGLE_REPLACE:
19208 SET_NAME (rule, rule_buf[rule_pos]);
19209 SET_P0 (rule, rule_buf[rule_pos]);
19210 SET_P1 (rule, rule_buf[rule_pos]);
19211 break;
19212
19213 case RULE_OP_MANGLE_PURGECHAR:
19214 return (-1);
19215 break;
19216
19217 case RULE_OP_MANGLE_TOGGLECASE_REC:
19218 return (-1);
19219 break;
19220
19221 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19222 SET_NAME (rule, rule_buf[rule_pos]);
19223 SET_P0_CONV (rule, rule_buf[rule_pos]);
19224 break;
19225
19226 case RULE_OP_MANGLE_DUPECHAR_LAST:
19227 SET_NAME (rule, rule_buf[rule_pos]);
19228 SET_P0_CONV (rule, rule_buf[rule_pos]);
19229 break;
19230
19231 case RULE_OP_MANGLE_DUPECHAR_ALL:
19232 SET_NAME (rule, rule_buf[rule_pos]);
19233 break;
19234
19235 case RULE_OP_MANGLE_SWITCH_FIRST:
19236 SET_NAME (rule, rule_buf[rule_pos]);
19237 break;
19238
19239 case RULE_OP_MANGLE_SWITCH_LAST:
19240 SET_NAME (rule, rule_buf[rule_pos]);
19241 break;
19242
19243 case RULE_OP_MANGLE_SWITCH_AT:
19244 SET_NAME (rule, rule_buf[rule_pos]);
19245 SET_P0_CONV (rule, rule_buf[rule_pos]);
19246 SET_P1_CONV (rule, rule_buf[rule_pos]);
19247 break;
19248
19249 case RULE_OP_MANGLE_CHR_SHIFTL:
19250 SET_NAME (rule, rule_buf[rule_pos]);
19251 SET_P0_CONV (rule, rule_buf[rule_pos]);
19252 break;
19253
19254 case RULE_OP_MANGLE_CHR_SHIFTR:
19255 SET_NAME (rule, rule_buf[rule_pos]);
19256 SET_P0_CONV (rule, rule_buf[rule_pos]);
19257 break;
19258
19259 case RULE_OP_MANGLE_CHR_INCR:
19260 SET_NAME (rule, rule_buf[rule_pos]);
19261 SET_P0_CONV (rule, rule_buf[rule_pos]);
19262 break;
19263
19264 case RULE_OP_MANGLE_CHR_DECR:
19265 SET_NAME (rule, rule_buf[rule_pos]);
19266 SET_P0_CONV (rule, rule_buf[rule_pos]);
19267 break;
19268
19269 case RULE_OP_MANGLE_REPLACE_NP1:
19270 SET_NAME (rule, rule_buf[rule_pos]);
19271 SET_P0_CONV (rule, rule_buf[rule_pos]);
19272 break;
19273
19274 case RULE_OP_MANGLE_REPLACE_NM1:
19275 SET_NAME (rule, rule_buf[rule_pos]);
19276 SET_P0_CONV (rule, rule_buf[rule_pos]);
19277 break;
19278
19279 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19280 SET_NAME (rule, rule_buf[rule_pos]);
19281 SET_P0_CONV (rule, rule_buf[rule_pos]);
19282 break;
19283
19284 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19285 SET_NAME (rule, rule_buf[rule_pos]);
19286 SET_P0_CONV (rule, rule_buf[rule_pos]);
19287 break;
19288
19289 case RULE_OP_MANGLE_TITLE:
19290 SET_NAME (rule, rule_buf[rule_pos]);
19291 break;
19292
19293 default:
19294 return (-1);
19295 break;
19296 }
19297 }
19298
19299 if (rule_pos < rule_len) return (-1);
19300
19301 return (0);
19302 }
19303
19304 int kernel_rule_to_cpu_rule (char rule_buf[BUFSIZ], kernel_rule_t *rule)
19305 {
19306 uint rule_cnt;
19307 uint rule_pos;
19308 uint rule_len = BUFSIZ - 1; // maximum possible len
19309
19310 char rule_cmd;
19311
19312 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19313 {
19314 GET_NAME (rule);
19315
19316 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19317
19318 switch (rule_cmd)
19319 {
19320 case RULE_OP_MANGLE_NOOP:
19321 rule_buf[rule_pos] = rule_cmd;
19322 break;
19323
19324 case RULE_OP_MANGLE_LREST:
19325 rule_buf[rule_pos] = rule_cmd;
19326 break;
19327
19328 case RULE_OP_MANGLE_UREST:
19329 rule_buf[rule_pos] = rule_cmd;
19330 break;
19331
19332 case RULE_OP_MANGLE_LREST_UFIRST:
19333 rule_buf[rule_pos] = rule_cmd;
19334 break;
19335
19336 case RULE_OP_MANGLE_UREST_LFIRST:
19337 rule_buf[rule_pos] = rule_cmd;
19338 break;
19339
19340 case RULE_OP_MANGLE_TREST:
19341 rule_buf[rule_pos] = rule_cmd;
19342 break;
19343
19344 case RULE_OP_MANGLE_TOGGLE_AT:
19345 rule_buf[rule_pos] = rule_cmd;
19346 GET_P0_CONV (rule);
19347 break;
19348
19349 case RULE_OP_MANGLE_REVERSE:
19350 rule_buf[rule_pos] = rule_cmd;
19351 break;
19352
19353 case RULE_OP_MANGLE_DUPEWORD:
19354 rule_buf[rule_pos] = rule_cmd;
19355 break;
19356
19357 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19358 rule_buf[rule_pos] = rule_cmd;
19359 GET_P0_CONV (rule);
19360 break;
19361
19362 case RULE_OP_MANGLE_REFLECT:
19363 rule_buf[rule_pos] = rule_cmd;
19364 break;
19365
19366 case RULE_OP_MANGLE_ROTATE_LEFT:
19367 rule_buf[rule_pos] = rule_cmd;
19368 break;
19369
19370 case RULE_OP_MANGLE_ROTATE_RIGHT:
19371 rule_buf[rule_pos] = rule_cmd;
19372 break;
19373
19374 case RULE_OP_MANGLE_APPEND:
19375 rule_buf[rule_pos] = rule_cmd;
19376 GET_P0 (rule);
19377 break;
19378
19379 case RULE_OP_MANGLE_PREPEND:
19380 rule_buf[rule_pos] = rule_cmd;
19381 GET_P0 (rule);
19382 break;
19383
19384 case RULE_OP_MANGLE_DELETE_FIRST:
19385 rule_buf[rule_pos] = rule_cmd;
19386 break;
19387
19388 case RULE_OP_MANGLE_DELETE_LAST:
19389 rule_buf[rule_pos] = rule_cmd;
19390 break;
19391
19392 case RULE_OP_MANGLE_DELETE_AT:
19393 rule_buf[rule_pos] = rule_cmd;
19394 GET_P0_CONV (rule);
19395 break;
19396
19397 case RULE_OP_MANGLE_EXTRACT:
19398 rule_buf[rule_pos] = rule_cmd;
19399 GET_P0_CONV (rule);
19400 GET_P1_CONV (rule);
19401 break;
19402
19403 case RULE_OP_MANGLE_OMIT:
19404 rule_buf[rule_pos] = rule_cmd;
19405 GET_P0_CONV (rule);
19406 GET_P1_CONV (rule);
19407 break;
19408
19409 case RULE_OP_MANGLE_INSERT:
19410 rule_buf[rule_pos] = rule_cmd;
19411 GET_P0_CONV (rule);
19412 GET_P1 (rule);
19413 break;
19414
19415 case RULE_OP_MANGLE_OVERSTRIKE:
19416 rule_buf[rule_pos] = rule_cmd;
19417 GET_P0_CONV (rule);
19418 GET_P1 (rule);
19419 break;
19420
19421 case RULE_OP_MANGLE_TRUNCATE_AT:
19422 rule_buf[rule_pos] = rule_cmd;
19423 GET_P0_CONV (rule);
19424 break;
19425
19426 case RULE_OP_MANGLE_REPLACE:
19427 rule_buf[rule_pos] = rule_cmd;
19428 GET_P0 (rule);
19429 GET_P1 (rule);
19430 break;
19431
19432 case RULE_OP_MANGLE_PURGECHAR:
19433 return (-1);
19434 break;
19435
19436 case RULE_OP_MANGLE_TOGGLECASE_REC:
19437 return (-1);
19438 break;
19439
19440 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19441 rule_buf[rule_pos] = rule_cmd;
19442 GET_P0_CONV (rule);
19443 break;
19444
19445 case RULE_OP_MANGLE_DUPECHAR_LAST:
19446 rule_buf[rule_pos] = rule_cmd;
19447 GET_P0_CONV (rule);
19448 break;
19449
19450 case RULE_OP_MANGLE_DUPECHAR_ALL:
19451 rule_buf[rule_pos] = rule_cmd;
19452 break;
19453
19454 case RULE_OP_MANGLE_SWITCH_FIRST:
19455 rule_buf[rule_pos] = rule_cmd;
19456 break;
19457
19458 case RULE_OP_MANGLE_SWITCH_LAST:
19459 rule_buf[rule_pos] = rule_cmd;
19460 break;
19461
19462 case RULE_OP_MANGLE_SWITCH_AT:
19463 rule_buf[rule_pos] = rule_cmd;
19464 GET_P0_CONV (rule);
19465 GET_P1_CONV (rule);
19466 break;
19467
19468 case RULE_OP_MANGLE_CHR_SHIFTL:
19469 rule_buf[rule_pos] = rule_cmd;
19470 GET_P0_CONV (rule);
19471 break;
19472
19473 case RULE_OP_MANGLE_CHR_SHIFTR:
19474 rule_buf[rule_pos] = rule_cmd;
19475 GET_P0_CONV (rule);
19476 break;
19477
19478 case RULE_OP_MANGLE_CHR_INCR:
19479 rule_buf[rule_pos] = rule_cmd;
19480 GET_P0_CONV (rule);
19481 break;
19482
19483 case RULE_OP_MANGLE_CHR_DECR:
19484 rule_buf[rule_pos] = rule_cmd;
19485 GET_P0_CONV (rule);
19486 break;
19487
19488 case RULE_OP_MANGLE_REPLACE_NP1:
19489 rule_buf[rule_pos] = rule_cmd;
19490 GET_P0_CONV (rule);
19491 break;
19492
19493 case RULE_OP_MANGLE_REPLACE_NM1:
19494 rule_buf[rule_pos] = rule_cmd;
19495 GET_P0_CONV (rule);
19496 break;
19497
19498 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19499 rule_buf[rule_pos] = rule_cmd;
19500 GET_P0_CONV (rule);
19501 break;
19502
19503 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19504 rule_buf[rule_pos] = rule_cmd;
19505 GET_P0_CONV (rule);
19506 break;
19507
19508 case RULE_OP_MANGLE_TITLE:
19509 rule_buf[rule_pos] = rule_cmd;
19510 break;
19511
19512 case 0:
19513 return rule_pos - 1;
19514 break;
19515
19516 default:
19517 return (-1);
19518 break;
19519 }
19520 }
19521
19522 if (rule_cnt > 0)
19523 {
19524 return rule_pos;
19525 }
19526
19527 return (-1);
19528 }
19529
19530 /**
19531 * CPU rules : this is from hashcat sources, cpu based rules
19532 */
19533
19534 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19535 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19536
19537 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19538 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19539 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19540
19541 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19542 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19543 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19544
19545 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19546 {
19547 int pos;
19548
19549 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19550
19551 return (arr_len);
19552 }
19553
19554 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19555 {
19556 int pos;
19557
19558 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19559
19560 return (arr_len);
19561 }
19562
19563 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19564 {
19565 int pos;
19566
19567 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19568
19569 return (arr_len);
19570 }
19571
19572 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19573 {
19574 int l;
19575 int r;
19576
19577 for (l = 0; l < arr_len; l++)
19578 {
19579 r = arr_len - 1 - l;
19580
19581 if (l >= r) break;
19582
19583 MANGLE_SWITCH (arr, l, r);
19584 }
19585
19586 return (arr_len);
19587 }
19588
19589 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19590 {
19591 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19592
19593 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19594
19595 return (arr_len * 2);
19596 }
19597
19598 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19599 {
19600 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19601
19602 int orig_len = arr_len;
19603
19604 int i;
19605
19606 for (i = 0; i < times; i++)
19607 {
19608 memcpy (&arr[arr_len], arr, orig_len);
19609
19610 arr_len += orig_len;
19611 }
19612
19613 return (arr_len);
19614 }
19615
19616 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19617 {
19618 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19619
19620 mangle_double (arr, arr_len);
19621
19622 mangle_reverse (arr + arr_len, arr_len);
19623
19624 return (arr_len * 2);
19625 }
19626
19627 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19628 {
19629 int l;
19630 int r;
19631
19632 for (l = 0, r = arr_len - 1; r > 0; r--)
19633 {
19634 MANGLE_SWITCH (arr, l, r);
19635 }
19636
19637 return (arr_len);
19638 }
19639
19640 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19641 {
19642 int l;
19643 int r;
19644
19645 for (l = 0, r = arr_len - 1; l < r; l++)
19646 {
19647 MANGLE_SWITCH (arr, l, r);
19648 }
19649
19650 return (arr_len);
19651 }
19652
19653 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19654 {
19655 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19656
19657 arr[arr_len] = c;
19658
19659 return (arr_len + 1);
19660 }
19661
19662 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19663 {
19664 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19665
19666 int arr_pos;
19667
19668 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19669 {
19670 arr[arr_pos + 1] = arr[arr_pos];
19671 }
19672
19673 arr[0] = c;
19674
19675 return (arr_len + 1);
19676 }
19677
19678 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19679 {
19680 if (upos >= arr_len) return (arr_len);
19681
19682 int arr_pos;
19683
19684 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
19685 {
19686 arr[arr_pos] = arr[arr_pos + 1];
19687 }
19688
19689 return (arr_len - 1);
19690 }
19691
19692 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19693 {
19694 if (upos >= arr_len) return (arr_len);
19695
19696 if ((upos + ulen) > arr_len) return (arr_len);
19697
19698 int arr_pos;
19699
19700 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
19701 {
19702 arr[arr_pos] = arr[upos + arr_pos];
19703 }
19704
19705 return (ulen);
19706 }
19707
19708 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19709 {
19710 if (upos >= arr_len) return (arr_len);
19711
19712 if ((upos + ulen) >= arr_len) return (arr_len);
19713
19714 int arr_pos;
19715
19716 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
19717 {
19718 arr[arr_pos] = arr[arr_pos + ulen];
19719 }
19720
19721 return (arr_len - ulen);
19722 }
19723
19724 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19725 {
19726 if (upos >= arr_len) return (arr_len);
19727
19728 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19729
19730 int arr_pos;
19731
19732 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
19733 {
19734 arr[arr_pos + 1] = arr[arr_pos];
19735 }
19736
19737 arr[upos] = c;
19738
19739 return (arr_len + 1);
19740 }
19741
19742 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)
19743 {
19744 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
19745
19746 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
19747
19748 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
19749
19750 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
19751
19752 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
19753
19754 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
19755
19756 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
19757
19758 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
19759
19760 return (arr_len + arr2_cpy);
19761 }
19762
19763 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19764 {
19765 if (upos >= arr_len) return (arr_len);
19766
19767 arr[upos] = c;
19768
19769 return (arr_len);
19770 }
19771
19772 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19773 {
19774 if (upos >= arr_len) return (arr_len);
19775
19776 memset (arr + upos, 0, arr_len - upos);
19777
19778 return (upos);
19779 }
19780
19781 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
19782 {
19783 int arr_pos;
19784
19785 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
19786 {
19787 if (arr[arr_pos] != oldc) continue;
19788
19789 arr[arr_pos] = newc;
19790 }
19791
19792 return (arr_len);
19793 }
19794
19795 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
19796 {
19797 int arr_pos;
19798
19799 int ret_len;
19800
19801 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
19802 {
19803 if (arr[arr_pos] == c) continue;
19804
19805 arr[ret_len] = arr[arr_pos];
19806
19807 ret_len++;
19808 }
19809
19810 return (ret_len);
19811 }
19812
19813 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
19814 {
19815 if (ulen > arr_len) return (arr_len);
19816
19817 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19818
19819 char cs[100];
19820
19821 memcpy (cs, arr, ulen);
19822
19823 int i;
19824
19825 for (i = 0; i < ulen; i++)
19826 {
19827 char c = cs[i];
19828
19829 arr_len = mangle_insert (arr, arr_len, i, c);
19830 }
19831
19832 return (arr_len);
19833 }
19834
19835 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
19836 {
19837 if (ulen > arr_len) return (arr_len);
19838
19839 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19840
19841 int upos = arr_len - ulen;
19842
19843 int i;
19844
19845 for (i = 0; i < ulen; i++)
19846 {
19847 char c = arr[upos + i];
19848
19849 arr_len = mangle_append (arr, arr_len, c);
19850 }
19851
19852 return (arr_len);
19853 }
19854
19855 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19856 {
19857 if ( arr_len == 0) return (arr_len);
19858 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19859
19860 char c = arr[upos];
19861
19862 int i;
19863
19864 for (i = 0; i < ulen; i++)
19865 {
19866 arr_len = mangle_insert (arr, arr_len, upos, c);
19867 }
19868
19869 return (arr_len);
19870 }
19871
19872 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
19873 {
19874 if ( arr_len == 0) return (arr_len);
19875 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
19876
19877 int arr_pos;
19878
19879 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19880 {
19881 int new_pos = arr_pos * 2;
19882
19883 arr[new_pos] = arr[arr_pos];
19884
19885 arr[new_pos + 1] = arr[arr_pos];
19886 }
19887
19888 return (arr_len * 2);
19889 }
19890
19891 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
19892 {
19893 if (upos >= arr_len) return (arr_len);
19894 if (upos2 >= arr_len) return (arr_len);
19895
19896 MANGLE_SWITCH (arr, upos, upos2);
19897
19898 return (arr_len);
19899 }
19900
19901 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
19902 {
19903 MANGLE_SWITCH (arr, upos, upos2);
19904
19905 return (arr_len);
19906 }
19907
19908 int mangle_chr_shiftl (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19909 {
19910 if (upos >= arr_len) return (arr_len);
19911
19912 arr[upos] <<= 1;
19913
19914 return (arr_len);
19915 }
19916
19917 int mangle_chr_shiftr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19918 {
19919 if (upos >= arr_len) return (arr_len);
19920
19921 arr[upos] >>= 1;
19922
19923 return (arr_len);
19924 }
19925
19926 int mangle_chr_incr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19927 {
19928 if (upos >= arr_len) return (arr_len);
19929
19930 arr[upos] += 1;
19931
19932 return (arr_len);
19933 }
19934
19935 int mangle_chr_decr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19936 {
19937 if (upos >= arr_len) return (arr_len);
19938
19939 arr[upos] -= 1;
19940
19941 return (arr_len);
19942 }
19943
19944 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
19945 {
19946 int upper_next = 1;
19947
19948 int pos;
19949
19950 for (pos = 0; pos < arr_len; pos++)
19951 {
19952 if (arr[pos] == ' ')
19953 {
19954 upper_next = 1;
19955
19956 continue;
19957 }
19958
19959 if (upper_next)
19960 {
19961 upper_next = 0;
19962
19963 MANGLE_UPPER_AT (arr, pos);
19964 }
19965 else
19966 {
19967 MANGLE_LOWER_AT (arr, pos);
19968 }
19969 }
19970
19971 return (arr_len);
19972 }
19973
19974 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], uint32_t rp_gen_func_min, uint32_t rp_gen_func_max)
19975 {
19976 uint32_t rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
19977
19978 uint32_t j;
19979
19980 uint32_t rule_pos = 0;
19981
19982 for (j = 0; j < rp_gen_num; j++)
19983 {
19984 uint32_t r = 0;
19985 uint32_t p1 = 0;
19986 uint32_t p2 = 0;
19987 uint32_t p3 = 0;
19988
19989 switch ((char) get_random_num (0, 9))
19990 {
19991 case 0:
19992 r = get_random_num (0, sizeof (grp_op_nop));
19993 rule_buf[rule_pos++] = grp_op_nop[r];
19994 break;
19995
19996 case 1:
19997 r = get_random_num (0, sizeof (grp_op_pos_p0));
19998 rule_buf[rule_pos++] = grp_op_pos_p0[r];
19999 p1 = get_random_num (0, sizeof (grp_pos));
20000 rule_buf[rule_pos++] = grp_pos[p1];
20001 break;
20002
20003 case 2:
20004 r = get_random_num (0, sizeof (grp_op_pos_p1));
20005 rule_buf[rule_pos++] = grp_op_pos_p1[r];
20006 p1 = get_random_num (1, 6);
20007 rule_buf[rule_pos++] = grp_pos[p1];
20008 break;
20009
20010 case 3:
20011 r = get_random_num (0, sizeof (grp_op_chr));
20012 rule_buf[rule_pos++] = grp_op_chr[r];
20013 p1 = get_random_num (0x20, 0x7e);
20014 rule_buf[rule_pos++] = (char) p1;
20015 break;
20016
20017 case 4:
20018 r = get_random_num (0, sizeof (grp_op_chr_chr));
20019 rule_buf[rule_pos++] = grp_op_chr_chr[r];
20020 p1 = get_random_num (0x20, 0x7e);
20021 rule_buf[rule_pos++] = (char) p1;
20022 p2 = get_random_num (0x20, 0x7e);
20023 while (p1 == p2)
20024 p2 = get_random_num (0x20, 0x7e);
20025 rule_buf[rule_pos++] = (char) p2;
20026 break;
20027
20028 case 5:
20029 r = get_random_num (0, sizeof (grp_op_pos_chr));
20030 rule_buf[rule_pos++] = grp_op_pos_chr[r];
20031 p1 = get_random_num (0, sizeof (grp_pos));
20032 rule_buf[rule_pos++] = grp_pos[p1];
20033 p2 = get_random_num (0x20, 0x7e);
20034 rule_buf[rule_pos++] = (char) p2;
20035 break;
20036
20037 case 6:
20038 r = get_random_num (0, sizeof (grp_op_pos_pos0));
20039 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
20040 p1 = get_random_num (0, sizeof (grp_pos));
20041 rule_buf[rule_pos++] = grp_pos[p1];
20042 p2 = get_random_num (0, sizeof (grp_pos));
20043 while (p1 == p2)
20044 p2 = get_random_num (0, sizeof (grp_pos));
20045 rule_buf[rule_pos++] = grp_pos[p2];
20046 break;
20047
20048 case 7:
20049 r = get_random_num (0, sizeof (grp_op_pos_pos1));
20050 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
20051 p1 = get_random_num (0, sizeof (grp_pos));
20052 rule_buf[rule_pos++] = grp_pos[p1];
20053 p2 = get_random_num (1, sizeof (grp_pos));
20054 while (p1 == p2)
20055 p2 = get_random_num (1, sizeof (grp_pos));
20056 rule_buf[rule_pos++] = grp_pos[p2];
20057 break;
20058
20059 case 8:
20060 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
20061 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
20062 p1 = get_random_num (0, sizeof (grp_pos));
20063 rule_buf[rule_pos++] = grp_pos[p1];
20064 p2 = get_random_num (1, sizeof (grp_pos));
20065 rule_buf[rule_pos++] = grp_pos[p1];
20066 p3 = get_random_num (0, sizeof (grp_pos));
20067 rule_buf[rule_pos++] = grp_pos[p3];
20068 break;
20069 }
20070 }
20071
20072 return (rule_pos);
20073 }
20074
20075 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
20076 {
20077 char mem[BLOCK_SIZE];
20078
20079 if (in == NULL) return (RULE_RC_REJECT_ERROR);
20080
20081 if (out == NULL) return (RULE_RC_REJECT_ERROR);
20082
20083 if (in_len < 1) return (RULE_RC_REJECT_ERROR);
20084
20085 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
20086
20087 int out_len = in_len;
20088 int mem_len = in_len;
20089
20090 memcpy (out, in, out_len);
20091
20092 int rule_pos;
20093
20094 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
20095 {
20096 int upos; int upos2;
20097 int ulen;
20098
20099 switch (rule[rule_pos])
20100 {
20101 case ' ':
20102 break;
20103
20104 case RULE_OP_MANGLE_NOOP:
20105 break;
20106
20107 case RULE_OP_MANGLE_LREST:
20108 out_len = mangle_lrest (out, out_len);
20109 break;
20110
20111 case RULE_OP_MANGLE_UREST:
20112 out_len = mangle_urest (out, out_len);
20113 break;
20114
20115 case RULE_OP_MANGLE_LREST_UFIRST:
20116 out_len = mangle_lrest (out, out_len);
20117 if (out_len) MANGLE_UPPER_AT (out, 0);
20118 break;
20119
20120 case RULE_OP_MANGLE_UREST_LFIRST:
20121 out_len = mangle_urest (out, out_len);
20122 if (out_len) MANGLE_LOWER_AT (out, 0);
20123 break;
20124
20125 case RULE_OP_MANGLE_TREST:
20126 out_len = mangle_trest (out, out_len);
20127 break;
20128
20129 case RULE_OP_MANGLE_TOGGLE_AT:
20130 NEXT_RULEPOS (rule_pos);
20131 NEXT_RPTOI (rule, rule_pos, upos);
20132 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
20133 break;
20134
20135 case RULE_OP_MANGLE_REVERSE:
20136 out_len = mangle_reverse (out, out_len);
20137 break;
20138
20139 case RULE_OP_MANGLE_DUPEWORD:
20140 out_len = mangle_double (out, out_len);
20141 break;
20142
20143 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20144 NEXT_RULEPOS (rule_pos);
20145 NEXT_RPTOI (rule, rule_pos, ulen);
20146 out_len = mangle_double_times (out, out_len, ulen);
20147 break;
20148
20149 case RULE_OP_MANGLE_REFLECT:
20150 out_len = mangle_reflect (out, out_len);
20151 break;
20152
20153 case RULE_OP_MANGLE_ROTATE_LEFT:
20154 mangle_rotate_left (out, out_len);
20155 break;
20156
20157 case RULE_OP_MANGLE_ROTATE_RIGHT:
20158 mangle_rotate_right (out, out_len);
20159 break;
20160
20161 case RULE_OP_MANGLE_APPEND:
20162 NEXT_RULEPOS (rule_pos);
20163 out_len = mangle_append (out, out_len, rule[rule_pos]);
20164 break;
20165
20166 case RULE_OP_MANGLE_PREPEND:
20167 NEXT_RULEPOS (rule_pos);
20168 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
20169 break;
20170
20171 case RULE_OP_MANGLE_DELETE_FIRST:
20172 out_len = mangle_delete_at (out, out_len, 0);
20173 break;
20174
20175 case RULE_OP_MANGLE_DELETE_LAST:
20176 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
20177 break;
20178
20179 case RULE_OP_MANGLE_DELETE_AT:
20180 NEXT_RULEPOS (rule_pos);
20181 NEXT_RPTOI (rule, rule_pos, upos);
20182 out_len = mangle_delete_at (out, out_len, upos);
20183 break;
20184
20185 case RULE_OP_MANGLE_EXTRACT:
20186 NEXT_RULEPOS (rule_pos);
20187 NEXT_RPTOI (rule, rule_pos, upos);
20188 NEXT_RULEPOS (rule_pos);
20189 NEXT_RPTOI (rule, rule_pos, ulen);
20190 out_len = mangle_extract (out, out_len, upos, ulen);
20191 break;
20192
20193 case RULE_OP_MANGLE_OMIT:
20194 NEXT_RULEPOS (rule_pos);
20195 NEXT_RPTOI (rule, rule_pos, upos);
20196 NEXT_RULEPOS (rule_pos);
20197 NEXT_RPTOI (rule, rule_pos, ulen);
20198 out_len = mangle_omit (out, out_len, upos, ulen);
20199 break;
20200
20201 case RULE_OP_MANGLE_INSERT:
20202 NEXT_RULEPOS (rule_pos);
20203 NEXT_RPTOI (rule, rule_pos, upos);
20204 NEXT_RULEPOS (rule_pos);
20205 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
20206 break;
20207
20208 case RULE_OP_MANGLE_OVERSTRIKE:
20209 NEXT_RULEPOS (rule_pos);
20210 NEXT_RPTOI (rule, rule_pos, upos);
20211 NEXT_RULEPOS (rule_pos);
20212 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
20213 break;
20214
20215 case RULE_OP_MANGLE_TRUNCATE_AT:
20216 NEXT_RULEPOS (rule_pos);
20217 NEXT_RPTOI (rule, rule_pos, upos);
20218 out_len = mangle_truncate_at (out, out_len, upos);
20219 break;
20220
20221 case RULE_OP_MANGLE_REPLACE:
20222 NEXT_RULEPOS (rule_pos);
20223 NEXT_RULEPOS (rule_pos);
20224 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
20225 break;
20226
20227 case RULE_OP_MANGLE_PURGECHAR:
20228 NEXT_RULEPOS (rule_pos);
20229 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
20230 break;
20231
20232 case RULE_OP_MANGLE_TOGGLECASE_REC:
20233 /* todo */
20234 break;
20235
20236 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20237 NEXT_RULEPOS (rule_pos);
20238 NEXT_RPTOI (rule, rule_pos, ulen);
20239 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
20240 break;
20241
20242 case RULE_OP_MANGLE_DUPECHAR_LAST:
20243 NEXT_RULEPOS (rule_pos);
20244 NEXT_RPTOI (rule, rule_pos, ulen);
20245 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
20246 break;
20247
20248 case RULE_OP_MANGLE_DUPECHAR_ALL:
20249 out_len = mangle_dupechar (out, out_len);
20250 break;
20251
20252 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20253 NEXT_RULEPOS (rule_pos);
20254 NEXT_RPTOI (rule, rule_pos, ulen);
20255 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20256 break;
20257
20258 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20259 NEXT_RULEPOS (rule_pos);
20260 NEXT_RPTOI (rule, rule_pos, ulen);
20261 out_len = mangle_dupeblock_append (out, out_len, ulen);
20262 break;
20263
20264 case RULE_OP_MANGLE_SWITCH_FIRST:
20265 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20266 break;
20267
20268 case RULE_OP_MANGLE_SWITCH_LAST:
20269 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20270 break;
20271
20272 case RULE_OP_MANGLE_SWITCH_AT:
20273 NEXT_RULEPOS (rule_pos);
20274 NEXT_RPTOI (rule, rule_pos, upos);
20275 NEXT_RULEPOS (rule_pos);
20276 NEXT_RPTOI (rule, rule_pos, upos2);
20277 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20278 break;
20279
20280 case RULE_OP_MANGLE_CHR_SHIFTL:
20281 NEXT_RULEPOS (rule_pos);
20282 NEXT_RPTOI (rule, rule_pos, upos);
20283 mangle_chr_shiftl ((uint8_t *) out, out_len, upos);
20284 break;
20285
20286 case RULE_OP_MANGLE_CHR_SHIFTR:
20287 NEXT_RULEPOS (rule_pos);
20288 NEXT_RPTOI (rule, rule_pos, upos);
20289 mangle_chr_shiftr ((uint8_t *) out, out_len, upos);
20290 break;
20291
20292 case RULE_OP_MANGLE_CHR_INCR:
20293 NEXT_RULEPOS (rule_pos);
20294 NEXT_RPTOI (rule, rule_pos, upos);
20295 mangle_chr_incr ((uint8_t *) out, out_len, upos);
20296 break;
20297
20298 case RULE_OP_MANGLE_CHR_DECR:
20299 NEXT_RULEPOS (rule_pos);
20300 NEXT_RPTOI (rule, rule_pos, upos);
20301 mangle_chr_decr ((uint8_t *) out, out_len, upos);
20302 break;
20303
20304 case RULE_OP_MANGLE_REPLACE_NP1:
20305 NEXT_RULEPOS (rule_pos);
20306 NEXT_RPTOI (rule, rule_pos, upos);
20307 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20308 break;
20309
20310 case RULE_OP_MANGLE_REPLACE_NM1:
20311 NEXT_RULEPOS (rule_pos);
20312 NEXT_RPTOI (rule, rule_pos, upos);
20313 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20314 break;
20315
20316 case RULE_OP_MANGLE_TITLE:
20317 out_len = mangle_title (out, out_len);
20318 break;
20319
20320 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20321 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20322 NEXT_RULEPOS (rule_pos);
20323 NEXT_RPTOI (rule, rule_pos, upos);
20324 NEXT_RULEPOS (rule_pos);
20325 NEXT_RPTOI (rule, rule_pos, ulen);
20326 NEXT_RULEPOS (rule_pos);
20327 NEXT_RPTOI (rule, rule_pos, upos2);
20328 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20329 break;
20330
20331 case RULE_OP_MANGLE_APPEND_MEMORY:
20332 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20333 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20334 memcpy (out + out_len, mem, mem_len);
20335 out_len += mem_len;
20336 break;
20337
20338 case RULE_OP_MANGLE_PREPEND_MEMORY:
20339 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20340 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20341 memcpy (mem + mem_len, out, out_len);
20342 out_len += mem_len;
20343 memcpy (out, mem, out_len);
20344 break;
20345
20346 case RULE_OP_MEMORIZE_WORD:
20347 memcpy (mem, out, out_len);
20348 mem_len = out_len;
20349 break;
20350
20351 case RULE_OP_REJECT_LESS:
20352 NEXT_RULEPOS (rule_pos);
20353 NEXT_RPTOI (rule, rule_pos, upos);
20354 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20355 break;
20356
20357 case RULE_OP_REJECT_GREATER:
20358 NEXT_RULEPOS (rule_pos);
20359 NEXT_RPTOI (rule, rule_pos, upos);
20360 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20361 break;
20362
20363 case RULE_OP_REJECT_CONTAIN:
20364 NEXT_RULEPOS (rule_pos);
20365 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20366 break;
20367
20368 case RULE_OP_REJECT_NOT_CONTAIN:
20369 NEXT_RULEPOS (rule_pos);
20370 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20371 break;
20372
20373 case RULE_OP_REJECT_EQUAL_FIRST:
20374 NEXT_RULEPOS (rule_pos);
20375 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20376 break;
20377
20378 case RULE_OP_REJECT_EQUAL_LAST:
20379 NEXT_RULEPOS (rule_pos);
20380 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20381 break;
20382
20383 case RULE_OP_REJECT_EQUAL_AT:
20384 NEXT_RULEPOS (rule_pos);
20385 NEXT_RPTOI (rule, rule_pos, upos);
20386 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20387 NEXT_RULEPOS (rule_pos);
20388 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20389 break;
20390
20391 case RULE_OP_REJECT_CONTAINS:
20392 NEXT_RULEPOS (rule_pos);
20393 NEXT_RPTOI (rule, rule_pos, upos);
20394 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20395 NEXT_RULEPOS (rule_pos);
20396 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20397 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20398 break;
20399
20400 case RULE_OP_REJECT_MEMORY:
20401 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20402 break;
20403
20404 default:
20405 return (RULE_RC_SYNTAX_ERROR);
20406 break;
20407 }
20408 }
20409
20410 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20411
20412 return (out_len);
20413 }