- Dropped all vector code since new GPU's are all scalar, makes the code much easier
[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) GPU_ACCEL_AMD_ ## x
17 #define GET_LOOPS(x) GPU_LOOPS_AMD_ ## 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 /*
2637 #ifdef _WIN
2638 int hm_get_adapter_index (HM_ADAPTER nvGPUHandle[DEVICES_MAX])
2639 {
2640 NvU32 pGpuCount;
2641
2642 if (hc_NvAPI_EnumPhysicalGPUs (nvGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2643
2644 if (pGpuCount == 0)
2645 {
2646 log_info ("WARN: No NvAPI adapters found");
2647
2648 return (0);
2649 }
2650
2651 return (pGpuCount);
2652 }
2653 #endif
2654
2655 #ifdef LINUX
2656 int hm_get_adapter_index (HM_ADAPTER nvGPUHandle[DEVICES_MAX])
2657 {
2658 int pGpuCount = 0;
2659
2660 for (uint i = 0; i < DEVICES_MAX; i++)
2661 {
2662 // do not use wrapper function to omit warning message
2663 if (nvmlDeviceGetHandleByIndex (i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2664
2665 //can be used to determine if the device by index matches the cuda device by index
2666 //char name[100]; memset (name, 0, sizeof (name));
2667 //hc_NVML_nvmlDeviceGetName (nvGPUHandle[i], name, sizeof (name) - 1);
2668
2669 pGpuCount++;
2670 }
2671
2672 if (pGpuCount == 0)
2673 {
2674 log_info ("WARN: No NVML adapters found");
2675
2676 return (0);
2677 }
2678
2679 return (pGpuCount);
2680 }
2681 #endif
2682
2683 void hm_close (HM_LIB hm_dll)
2684 {
2685 #ifdef _POSIX
2686 dlclose (hm_dll);
2687
2688 #elif _WIN
2689 FreeLibrary (hm_dll);
2690
2691 #endif
2692 }
2693
2694 HM_LIB hm_init ()
2695 {
2696 #ifdef _POSIX
2697 HM_LIB hm_dll = dlopen ("libatiadlxx.so", RTLD_LAZY | RTLD_GLOBAL);
2698
2699 #elif _WIN
2700 HM_LIB hm_dll = LoadLibrary ("atiadlxx.dll");
2701
2702 if (hm_dll == NULL)
2703 hm_dll = LoadLibrary ("atiadlxy.dll");
2704
2705 #endif
2706
2707 return hm_dll;
2708 }
2709
2710 int get_adapters_num (HM_LIB hm_dll, int *iNumberAdapters)
2711 {
2712 if (hc_ADL_Adapter_NumberOfAdapters_Get (hm_dll, iNumberAdapters) != ADL_OK) return -1;
2713
2714 if (iNumberAdapters == 0)
2715 {
2716 log_info ("WARN: No ADL adapters found.");
2717
2718 return -1;
2719 }
2720
2721 return 0;
2722 }
2723
2724 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2725 {
2726 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2727 ADLODParameters lpOdParameters;
2728
2729 lpOdParameters.iSize = sizeof (ADLODParameters);
2730 size_t plevels_size = 0;
2731
2732 if (hc_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2733
2734 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2735 __func__, iAdapterIndex,
2736 lpOdParameters.iNumberOfPerformanceLevels,
2737 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2738 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2739
2740 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2741
2742 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2743
2744 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2745
2746 if (hc_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2747
2748 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2749 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2750 __func__, iAdapterIndex, j,
2751 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2752
2753 myfree (lpOdPerformanceLevels);
2754
2755 return 0;
2756 }
2757
2758 LPAdapterInfo hm_get_adapter_info (HM_LIB hm_dll, int iNumberAdapters)
2759 {
2760 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2761
2762 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2763
2764 if (hc_ADL_Adapter_AdapterInfo_Get (hm_dll, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2765
2766 return lpAdapterInfo;
2767 }
2768
2769 //
2770 // does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2771 //
2772
2773 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2774 {
2775 uint32_t idx = -1;
2776
2777 for (uint i = 0; i < num_adl_adapters; i++)
2778 {
2779 int opencl_bus_num = hm_device[i].busid;
2780 int opencl_dev_num = hm_device[i].devid;
2781
2782 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2783 {
2784 idx = i;
2785
2786 break;
2787 }
2788 }
2789
2790 if (idx >= DEVICES_MAX) return -1;
2791
2792 return idx;
2793 }
2794
2795 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2796 {
2797 for (uint i = 0; i < opencl_num_devices; i++)
2798 {
2799 cl_device_topology_amd device_topology;
2800
2801 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2802
2803 hm_device[i].busid = device_topology.pcie.bus;
2804 hm_device[i].devid = device_topology.pcie.device;
2805 }
2806 }
2807
2808 void hm_sort_adl_adapters_by_busid_devid (uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2809 {
2810 // basically bubble sort
2811
2812 for (int i = 0; i < num_adl_adapters; i++)
2813 {
2814 for (int j = 0; j < num_adl_adapters - 1; j++)
2815 {
2816 // get info of adapter [x]
2817
2818 uint32_t adapter_index_x = valid_adl_device_list[j];
2819 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2820
2821 uint32_t bus_num_x = info_x.iBusNumber;
2822 uint32_t dev_num_x = info_x.iDeviceNumber;
2823
2824 // get info of adapter [y]
2825
2826 uint32_t adapter_index_y = valid_adl_device_list[j + 1];
2827 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2828
2829 uint32_t bus_num_y = info_y.iBusNumber;
2830 uint32_t dev_num_y = info_y.iDeviceNumber;
2831
2832 uint need_swap = 0;
2833
2834 if (bus_num_y < bus_num_x)
2835 {
2836 need_swap = 1;
2837 }
2838 else if (bus_num_y == bus_num_x)
2839 {
2840 if (dev_num_y < dev_num_x)
2841 {
2842 need_swap = 1;
2843 }
2844 }
2845
2846 if (need_swap == 1)
2847 {
2848 uint32_t temp = valid_adl_device_list[j + 1];
2849
2850 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2851 valid_adl_device_list[j + 0] = temp;
2852 }
2853 }
2854 }
2855 }
2856
2857 uint32_t *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2858 {
2859 *num_adl_adapters = 0;
2860
2861 uint32_t *adl_adapters = NULL;
2862
2863 int *bus_numbers = NULL;
2864 int *device_numbers = NULL;
2865
2866 for (int i = 0; i < iNumberAdapters; i++)
2867 {
2868 AdapterInfo info = lpAdapterInfo[i];
2869
2870 if ((info.strUDID == NULL) || (strlen (info.strUDID) < 1)) continue;
2871
2872 #ifdef WIN
2873 if (info.iVendorID != 1002) continue;
2874 #else
2875 if (info.iVendorID != 0x1002) continue;
2876 #endif
2877
2878 if (info.iBusNumber < 0) continue;
2879 if (info.iDeviceNumber < 0) continue;
2880
2881 int found = 0;
2882
2883 for (int pos = 0; pos < *num_adl_adapters; pos++)
2884 {
2885 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2886 {
2887 found = 1;
2888 break;
2889 }
2890 }
2891
2892 if (found) continue;
2893
2894 // add it to the list
2895
2896 adl_adapters = (uint32_t *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2897
2898 adl_adapters[*num_adl_adapters] = i;
2899
2900 // rest is just bookkeeping
2901
2902 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2903 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2904
2905 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2906 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2907
2908 (*num_adl_adapters)++;
2909 }
2910
2911 myfree (bus_numbers);
2912 myfree (device_numbers);
2913
2914 // sort the list by increasing bus id, device id number
2915
2916 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2917
2918 return adl_adapters;
2919 }
2920
2921 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)
2922 {
2923 // loop through all valid devices
2924
2925 for (int i = 0; i < num_adl_adapters; i++)
2926 {
2927 uint32_t adapter_index = valid_adl_device_list[i];
2928
2929 // get AdapterInfo
2930
2931 AdapterInfo info = lpAdapterInfo[adapter_index];
2932
2933 // unfortunately this doesn't work since bus id and dev id are not unique
2934 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2935 // if (opencl_device_index == -1) continue;
2936
2937 int opencl_device_index = i;
2938
2939 // if (hm_show_performance_level (hm_dll, info.iAdapterIndex) != 0) return -1;
2940
2941 // get fanspeed info
2942
2943 if (hm_device[opencl_device_index].od_version == 5)
2944 {
2945 ADLFanSpeedInfo FanSpeedInfo;
2946
2947 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2948
2949 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2950
2951 if (hc_ADL_Overdrive5_FanSpeedInfo_Get (hm_dll, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2952
2953 // check read and write capability in fanspeedinfo
2954
2955 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2956 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2957 {
2958 hm_device[opencl_device_index].fan_supported = 1;
2959 }
2960 else
2961 {
2962 hm_device[opencl_device_index].fan_supported = 0;
2963 }
2964 }
2965 else // od_version == 6
2966 {
2967 ADLOD6FanSpeedInfo faninfo;
2968
2969 memset (&faninfo, 0, sizeof (faninfo));
2970
2971 if (hc_ADL_Overdrive6_FanSpeed_Get (hm_dll, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
2972
2973 // check read capability in fanspeedinfo
2974
2975 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
2976 {
2977 hm_device[opencl_device_index].fan_supported = 1;
2978 }
2979 else
2980 {
2981 hm_device[opencl_device_index].fan_supported = 0;
2982 }
2983 }
2984 }
2985
2986 return 0;
2987 }
2988
2989 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)
2990 {
2991 for (int i = 0; i < num_adl_adapters; i++)
2992 {
2993 uint32_t adapter_index = valid_adl_device_list[i];
2994
2995 // get AdapterInfo
2996
2997 AdapterInfo info = lpAdapterInfo[adapter_index];
2998
2999 // get overdrive version
3000
3001 int od_supported = 0;
3002 int od_enabled = 0;
3003 int od_version = 0;
3004
3005 if (hc_ADL_Overdrive_Caps (hm_dll, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3006
3007 // store the overdrive version in hm_device
3008
3009 // unfortunately this doesn't work since bus id and dev id are not unique
3010 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3011 // if (opencl_device_index == -1) continue;
3012
3013 int opencl_device_index = i;
3014
3015 hm_device[opencl_device_index].od_version = od_version;
3016 }
3017
3018 return 0;
3019 }
3020
3021 int hm_get_adapter_index (hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3022 {
3023 for (int i = 0; i < num_adl_adapters; i++)
3024 {
3025 uint32_t adapter_index = valid_adl_device_list[i];
3026
3027 // get AdapterInfo
3028
3029 AdapterInfo info = lpAdapterInfo[adapter_index];
3030
3031 // store the iAdapterIndex in hm_device
3032
3033 // unfortunately this doesn't work since bus id and dev id are not unique
3034 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3035 // if (opencl_device_index == -1) continue;
3036
3037 int opencl_device_index = i;
3038
3039 hm_device[opencl_device_index].adapter_index = info.iAdapterIndex;
3040 }
3041
3042 return num_adl_adapters;
3043 }
3044
3045 int hm_get_temperature_with_device_id (const uint device_id)
3046 {
3047 if (data.vendor_id == VENDOR_ID_AMD)
3048 {
3049 if (data.hm_dll)
3050 {
3051 if (data.hm_device[device_id].od_version == 5)
3052 {
3053 ADLTemperature Temperature;
3054
3055 Temperature.iSize = sizeof (ADLTemperature);
3056
3057 if (hc_ADL_Overdrive5_Temperature_Get (data.hm_dll, data.hm_device[device_id].adapter_index, 0, &Temperature) != ADL_OK) return -1;
3058
3059 return Temperature.iTemperature / 1000;
3060 }
3061 else if (data.hm_device[device_id].od_version == 6)
3062 {
3063 int Temperature = 0;
3064
3065 if (hc_ADL_Overdrive6_Temperature_Get (data.hm_dll, data.hm_device[device_id].adapter_index, &Temperature) != ADL_OK) return -1;
3066
3067 return Temperature / 1000;
3068 }
3069 }
3070 }
3071
3072 if (data.vendor_id == VENDOR_ID_NV)
3073 {
3074 #ifdef LINUX
3075 int temperature = 0;
3076
3077 hc_NVML_nvmlDeviceGetTemperature (data.hm_device[device_id].adapter_index, NVML_TEMPERATURE_GPU, (unsigned int *) &temperature);
3078
3079 return temperature;
3080 #endif
3081
3082 #ifdef WIN
3083 NV_GPU_THERMAL_SETTINGS pThermalSettings;
3084
3085 pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER;
3086 pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU;
3087 pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN;
3088 pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
3089
3090 if (hc_NvAPI_GPU_GetThermalSettings (data.hm_device[device_id].adapter_index, 0, &pThermalSettings) != NVAPI_OK) return -1;
3091
3092 return pThermalSettings.sensor[0].currentTemp;
3093 #endif
3094 }
3095
3096 return -1;
3097 }
3098
3099 int hm_get_fanspeed_with_device_id (const uint device_id)
3100 {
3101 if (data.hm_device[device_id].fan_supported == 1)
3102 {
3103 if (data.vendor_id == VENDOR_ID_AMD)
3104 {
3105 if (data.hm_dll)
3106 {
3107 if (data.hm_device[device_id].od_version == 5)
3108 {
3109 ADLFanSpeedValue lpFanSpeedValue;
3110
3111 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3112
3113 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3114 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3115 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3116
3117 if (hc_ADL_Overdrive5_FanSpeed_Get (data.hm_dll, data.hm_device[device_id].adapter_index, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3118
3119 return lpFanSpeedValue.iFanSpeed;
3120 }
3121 else // od_version == 6
3122 {
3123 ADLOD6FanSpeedInfo faninfo;
3124
3125 memset (&faninfo, 0, sizeof (faninfo));
3126
3127 if (hc_ADL_Overdrive6_FanSpeed_Get (data.hm_dll, data.hm_device[device_id].adapter_index, &faninfo) != ADL_OK) return -1;
3128
3129 return faninfo.iFanSpeedPercent;
3130 }
3131 }
3132 }
3133
3134 if (data.vendor_id == VENDOR_ID_NV)
3135 {
3136 #ifdef LINUX
3137 int speed = 0;
3138
3139 hc_NVML_nvmlDeviceGetFanSpeed (data.hm_device[device_id].adapter_index, (unsigned int *) &speed);
3140
3141 return speed;
3142 #endif
3143
3144 #ifdef WIN
3145 NvU32 speed = 0;
3146
3147 hc_NvAPI_GPU_GetTachReading (data.hm_device[device_id].adapter_index, &speed);
3148
3149 return speed;
3150 #endif
3151 }
3152 }
3153
3154 return -1;
3155 }
3156
3157 int hm_get_utilization_with_device_id (const uint device_id)
3158 {
3159 if (data.vendor_id == VENDOR_ID_AMD)
3160 {
3161 if (data.hm_dll)
3162 {
3163 ADLPMActivity PMActivity;
3164
3165 PMActivity.iSize = sizeof (ADLPMActivity);
3166
3167 if (hc_ADL_Overdrive_CurrentActivity_Get (data.hm_dll, data.hm_device[device_id].adapter_index, &PMActivity) != ADL_OK) return -1;
3168
3169 return PMActivity.iActivityPercent;
3170 }
3171 }
3172
3173 if (data.vendor_id == VENDOR_ID_AMD)
3174 {
3175 #ifdef LINUX
3176 nvmlUtilization_t utilization;
3177
3178 hc_NVML_nvmlDeviceGetUtilizationRates (data.hm_device[device_id].adapter_index, &utilization);
3179
3180 return utilization.gpu;
3181 #endif
3182
3183 #ifdef WIN
3184 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3185
3186 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3187
3188 if (hc_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_device[device_id].adapter_index, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3189
3190 return pDynamicPstatesInfoEx.utilization[0].percentage;
3191 #endif
3192 }
3193
3194 return -1;
3195 }
3196
3197 int hm_set_fanspeed_with_device_id (const uint device_id, const int fanspeed)
3198 {
3199 if (data.hm_device[device_id].fan_supported == 1)
3200 {
3201 if (data.hm_dll)
3202 {
3203 if (data.hm_device[device_id].od_version == 5)
3204 {
3205 ADLFanSpeedValue lpFanSpeedValue;
3206
3207 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3208
3209 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3210 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3211 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3212 lpFanSpeedValue.iFanSpeed = fanspeed;
3213
3214 if (hc_ADL_Overdrive5_FanSpeed_Set (data.hm_dll, data.hm_device[device_id].adapter_index, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3215
3216 return 0;
3217 }
3218 else // od_version == 6
3219 {
3220 ADLOD6FanSpeedValue fan_speed_value;
3221
3222 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3223
3224 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3225 fan_speed_value.iFanSpeed = fanspeed;
3226
3227 if (hc_ADL_Overdrive6_FanSpeed_Set (data.hm_dll, data.hm_device[device_id].adapter_index, &fan_speed_value) != ADL_OK) return -1;
3228
3229 return 0;
3230 }
3231 }
3232 }
3233
3234 return -1;
3235 }
3236 */
3237
3238 /**
3239 * maskprocessor
3240 */
3241
3242 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3243 {
3244 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3245
3246 if (css_cnt > SP_PW_MAX)
3247 {
3248 log_error ("ERROR: mask length is too long");
3249
3250 exit (-1);
3251 }
3252
3253 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3254 {
3255 uint *uniq_tbl = uniq_tbls[css_pos];
3256
3257 uint *cs_buf = css[css_pos].cs_buf;
3258 uint cs_len = css[css_pos].cs_len;
3259
3260 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3261 {
3262 uint c = cs_buf[cs_pos] & 0xff;
3263
3264 uniq_tbl[c] = 1;
3265 }
3266 }
3267 }
3268
3269 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3270 {
3271 cs_t *cs = &css[css_cnt];
3272
3273 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3274
3275 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3276
3277 memset (css_uniq, 0, css_uniq_sz);
3278
3279 size_t i;
3280
3281 for (i = 0; i < cs->cs_len; i++)
3282 {
3283 const uint u = cs->cs_buf[i];
3284
3285 css_uniq[u] = 1;
3286 }
3287
3288 for (i = 0; i < in_len; i++)
3289 {
3290 uint u = in_buf[i] & 0xff;
3291
3292 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3293
3294 if (css_uniq[u] == 1) continue;
3295
3296 css_uniq[u] = 1;
3297
3298 cs->cs_buf[cs->cs_len] = u;
3299
3300 cs->cs_len++;
3301 }
3302
3303 myfree (css_uniq);
3304 }
3305
3306 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3307 {
3308 size_t in_pos;
3309
3310 for (in_pos = 0; in_pos < in_len; in_pos++)
3311 {
3312 uint p0 = in_buf[in_pos] & 0xff;
3313
3314 if (interpret == 1 && p0 == '?')
3315 {
3316 in_pos++;
3317
3318 if (in_pos == in_len) break;
3319
3320 uint p1 = in_buf[in_pos] & 0xff;
3321
3322 switch (p1)
3323 {
3324 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3325 break;
3326 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3327 break;
3328 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3329 break;
3330 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3331 break;
3332 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3333 break;
3334 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3335 break;
3336 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3337 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3338 break;
3339 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3340 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3341 break;
3342 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3343 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3344 break;
3345 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3346 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3347 break;
3348 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3349 break;
3350 default: log_error ("Syntax error: %s", in_buf);
3351 exit (-1);
3352 }
3353 }
3354 else
3355 {
3356 if (data.hex_charset)
3357 {
3358 in_pos++;
3359
3360 if (in_pos == in_len)
3361 {
3362 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3363
3364 exit (-1);
3365 }
3366
3367 uint p1 = in_buf[in_pos] & 0xff;
3368
3369 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3370 {
3371 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3372
3373 exit (-1);
3374 }
3375
3376 uint chr = 0;
3377
3378 chr = hex_convert (p1) << 0;
3379 chr |= hex_convert (p0) << 4;
3380
3381 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3382 }
3383 else
3384 {
3385 uint chr = p0;
3386
3387 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3388 }
3389 }
3390 }
3391 }
3392
3393 uint64_t mp_get_sum (uint css_cnt, cs_t *css)
3394 {
3395 uint64_t sum = 1;
3396
3397 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3398 {
3399 sum *= css[css_pos].cs_len;
3400 }
3401
3402 return (sum);
3403 }
3404
3405 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3406 {
3407 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3408
3409 uint mask_pos;
3410 uint css_pos;
3411
3412 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3413 {
3414 char p0 = mask_buf[mask_pos];
3415
3416 if (p0 == '?')
3417 {
3418 mask_pos++;
3419
3420 if (mask_pos == mask_len) break;
3421
3422 char p1 = mask_buf[mask_pos];
3423
3424 uint chr = p1;
3425
3426 switch (p1)
3427 {
3428 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3429 break;
3430 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3431 break;
3432 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3433 break;
3434 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3435 break;
3436 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3437 break;
3438 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3439 break;
3440 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3441 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3442 break;
3443 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3444 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3445 break;
3446 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3447 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3448 break;
3449 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3450 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3451 break;
3452 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3453 break;
3454 default: log_error ("ERROR: syntax error: %s", mask_buf);
3455 exit (-1);
3456 }
3457 }
3458 else
3459 {
3460 if (data.hex_charset)
3461 {
3462 mask_pos++;
3463
3464 // if there is no 2nd hex character, show an error:
3465
3466 if (mask_pos == mask_len)
3467 {
3468 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3469
3470 exit (-1);
3471 }
3472
3473 char p1 = mask_buf[mask_pos];
3474
3475 // if they are not valid hex character, show an error:
3476
3477 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3478 {
3479 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3480
3481 exit (-1);
3482 }
3483
3484 uint chr = 0;
3485
3486 chr |= hex_convert (p1) << 0;
3487 chr |= hex_convert (p0) << 4;
3488
3489 mp_add_cs_buf (&chr, 1, css, css_pos);
3490 }
3491 else
3492 {
3493 uint chr = p0;
3494
3495 mp_add_cs_buf (&chr, 1, css, css_pos);
3496 }
3497 }
3498 }
3499
3500 if (css_pos == 0)
3501 {
3502 log_error ("ERROR: invalid mask length (0)");
3503
3504 exit (-1);
3505 }
3506
3507 *css_cnt = css_pos;
3508
3509 return (css);
3510 }
3511
3512 void mp_exec (uint64_t val, char *buf, cs_t *css, int css_cnt)
3513 {
3514 for (int i = 0; i < css_cnt; i++)
3515 {
3516 uint len = css[i].cs_len;
3517 uint64_t next = val / len;
3518 uint pos = val % len;
3519 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3520 val = next;
3521 }
3522 }
3523
3524 void mp_cut_at (char *mask, uint max)
3525 {
3526 uint i;
3527 uint j;
3528 uint mask_len = strlen (mask);
3529
3530 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3531 {
3532 if (mask[i] == '?') i++;
3533 }
3534
3535 mask[i] = 0;
3536 }
3537
3538 void mp_setup_sys (cs_t *mp_sys)
3539 {
3540 uint pos;
3541 uint chr;
3542 uint donec[CHARSIZ];
3543
3544 memset (donec, 0, sizeof (donec));
3545
3546 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3547 mp_sys[0].cs_buf[pos++] = chr;
3548 mp_sys[0].cs_len = pos; }
3549
3550 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3551 mp_sys[1].cs_buf[pos++] = chr;
3552 mp_sys[1].cs_len = pos; }
3553
3554 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3555 mp_sys[2].cs_buf[pos++] = chr;
3556 mp_sys[2].cs_len = pos; }
3557
3558 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3559 mp_sys[3].cs_buf[pos++] = chr;
3560 mp_sys[3].cs_len = pos; }
3561
3562 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3563 mp_sys[4].cs_len = pos; }
3564
3565 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3566 mp_sys[5].cs_len = pos; }
3567 }
3568
3569 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3570 {
3571 FILE *fp = fopen (buf, "rb");
3572
3573 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3574 {
3575 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3576 }
3577 else
3578 {
3579 char mp_file[1024];
3580
3581 memset (mp_file, 0, sizeof (mp_file));
3582
3583 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3584
3585 fclose (fp);
3586
3587 len = in_superchop (mp_file);
3588
3589 if (len == 0)
3590 {
3591 log_info ("WARNING: charset file corrupted");
3592
3593 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3594 }
3595 else
3596 {
3597 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3598 }
3599 }
3600 }
3601
3602 void mp_reset_usr (cs_t *mp_usr, uint index)
3603 {
3604 mp_usr[index].cs_len = 0;
3605
3606 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3607 }
3608
3609 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3610 {
3611 char *new_mask_buf = (char *) mymalloc (256);
3612
3613 uint mask_pos;
3614
3615 uint css_pos;
3616
3617 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3618 {
3619 if (css_pos == len) break;
3620
3621 char p0 = mask_buf[mask_pos];
3622
3623 new_mask_buf[mask_pos] = p0;
3624
3625 if (p0 == '?')
3626 {
3627 mask_pos++;
3628
3629 if (mask_pos == mask_len) break;
3630
3631 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3632 }
3633 else
3634 {
3635 if (data.hex_charset)
3636 {
3637 mask_pos++;
3638
3639 if (mask_pos == mask_len)
3640 {
3641 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3642
3643 exit (-1);
3644 }
3645
3646 char p1 = mask_buf[mask_pos];
3647
3648 // if they are not valid hex character, show an error:
3649
3650 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3651 {
3652 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3653
3654 exit (-1);
3655 }
3656
3657 new_mask_buf[mask_pos] = p1;
3658 }
3659 }
3660 }
3661
3662 if (css_pos == len) return (new_mask_buf);
3663
3664 myfree (new_mask_buf);
3665
3666 return (NULL);
3667 }
3668
3669 /**
3670 * statprocessor
3671 */
3672
3673 uint64_t sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3674 {
3675 uint64_t sum = 1;
3676
3677 uint i;
3678
3679 for (i = start; i < stop; i++)
3680 {
3681 sum *= root_css_buf[i].cs_len;
3682 }
3683
3684 return (sum);
3685 }
3686
3687 void sp_exec (uint64_t ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3688 {
3689 uint64_t v = ctx;
3690
3691 cs_t *cs = &root_css_buf[start];
3692
3693 uint i;
3694
3695 for (i = start; i < stop; i++)
3696 {
3697 const uint64_t m = v % cs->cs_len;
3698 const uint64_t d = v / cs->cs_len;
3699
3700 v = d;
3701
3702 const uint k = cs->cs_buf[m];
3703
3704 pw_buf[i - start] = (char) k;
3705
3706 cs = &markov_css_buf[(i * CHARSIZ) + k];
3707 }
3708 }
3709
3710 int sp_comp_val (const void *p1, const void *p2)
3711 {
3712 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3713 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3714
3715 return b2->val - b1->val;
3716 }
3717
3718 void sp_setup_tbl (const char *install_dir, char *hcstat, uint disable, uint classic, hcstat_table_t *root_table_buf, hcstat_table_t *markov_table_buf)
3719 {
3720 uint i;
3721 uint j;
3722 uint k;
3723
3724 /**
3725 * Initialize hcstats
3726 */
3727
3728 uint64_t *root_stats_buf = (uint64_t *) mycalloc (SP_ROOT_CNT, sizeof (uint64_t));
3729
3730 uint64_t *root_stats_ptr = root_stats_buf;
3731
3732 uint64_t *root_stats_buf_by_pos[SP_PW_MAX];
3733
3734 for (i = 0; i < SP_PW_MAX; i++)
3735 {
3736 root_stats_buf_by_pos[i] = root_stats_ptr;
3737
3738 root_stats_ptr += CHARSIZ;
3739 }
3740
3741 uint64_t *markov_stats_buf = (uint64_t *) mycalloc (SP_MARKOV_CNT, sizeof (uint64_t));
3742
3743 uint64_t *markov_stats_ptr = markov_stats_buf;
3744
3745 uint64_t *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3746
3747 for (i = 0; i < SP_PW_MAX; i++)
3748 {
3749 for (j = 0; j < CHARSIZ; j++)
3750 {
3751 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3752
3753 markov_stats_ptr += CHARSIZ;
3754 }
3755 }
3756
3757 /**
3758 * Load hcstats File
3759 */
3760
3761 if (hcstat == NULL)
3762 {
3763 char hcstat_tmp[256];
3764
3765 memset (hcstat_tmp, 0, sizeof (hcstat_tmp));
3766
3767 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", install_dir, SP_HCSTAT);
3768
3769 hcstat = hcstat_tmp;
3770 }
3771
3772 FILE *fd = fopen (hcstat, "rb");
3773
3774 if (fd == NULL)
3775 {
3776 log_error ("%s: %s", hcstat, strerror (errno));
3777
3778 exit (-1);
3779 }
3780
3781 if (fread (root_stats_buf, sizeof (uint64_t), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3782 {
3783 log_error ("%s: Could not load data", hcstat);
3784
3785 exit (-1);
3786 }
3787
3788 if (fread (markov_stats_buf, sizeof (uint64_t), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3789 {
3790 log_error ("%s: Could not load data", hcstat);
3791
3792 exit (-1);
3793 }
3794
3795 fclose (fd);
3796
3797 /**
3798 * Markov modifier of hcstat_table on user request
3799 */
3800
3801 if (disable)
3802 {
3803 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (uint64_t));
3804 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (uint64_t));
3805 }
3806
3807 if (classic)
3808 {
3809 /* Add all stats to first position */
3810
3811 for (i = 1; i < SP_PW_MAX; i++)
3812 {
3813 uint64_t *out = root_stats_buf_by_pos[0];
3814 uint64_t *in = root_stats_buf_by_pos[i];
3815
3816 for (j = 0; j < CHARSIZ; j++)
3817 {
3818 *out++ += *in++;
3819 }
3820 }
3821
3822 for (i = 1; i < SP_PW_MAX; i++)
3823 {
3824 uint64_t *out = markov_stats_buf_by_key[0][0];
3825 uint64_t *in = markov_stats_buf_by_key[i][0];
3826
3827 for (j = 0; j < CHARSIZ; j++)
3828 {
3829 for (k = 0; k < CHARSIZ; k++)
3830 {
3831 *out++ += *in++;
3832 }
3833 }
3834 }
3835
3836 /* copy them to all pw_positions */
3837
3838 for (i = 1; i < SP_PW_MAX; i++)
3839 {
3840 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (uint64_t));
3841 }
3842
3843 for (i = 1; i < SP_PW_MAX; i++)
3844 {
3845 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (uint64_t));
3846 }
3847 }
3848
3849 /**
3850 * Initialize tables
3851 */
3852
3853 hcstat_table_t *root_table_ptr = root_table_buf;
3854
3855 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
3856
3857 for (i = 0; i < SP_PW_MAX; i++)
3858 {
3859 root_table_buf_by_pos[i] = root_table_ptr;
3860
3861 root_table_ptr += CHARSIZ;
3862 }
3863
3864 hcstat_table_t *markov_table_ptr = markov_table_buf;
3865
3866 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
3867
3868 for (i = 0; i < SP_PW_MAX; i++)
3869 {
3870 for (j = 0; j < CHARSIZ; j++)
3871 {
3872 markov_table_buf_by_key[i][j] = markov_table_ptr;
3873
3874 markov_table_ptr += CHARSIZ;
3875 }
3876 }
3877
3878 /**
3879 * Convert hcstat to tables
3880 */
3881
3882 for (i = 0; i < SP_ROOT_CNT; i++)
3883 {
3884 uint key = i % CHARSIZ;
3885
3886 root_table_buf[i].key = key;
3887 root_table_buf[i].val = root_stats_buf[i];
3888 }
3889
3890 for (i = 0; i < SP_MARKOV_CNT; i++)
3891 {
3892 uint key = i % CHARSIZ;
3893
3894 markov_table_buf[i].key = key;
3895 markov_table_buf[i].val = markov_stats_buf[i];
3896 }
3897
3898 myfree (root_stats_buf);
3899 myfree (markov_stats_buf);
3900
3901 /**
3902 * Finally sort them
3903 */
3904
3905 for (i = 0; i < SP_PW_MAX; i++)
3906 {
3907 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3908 }
3909
3910 for (i = 0; i < SP_PW_MAX; i++)
3911 {
3912 for (j = 0; j < CHARSIZ; j++)
3913 {
3914 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3915 }
3916 }
3917 }
3918
3919 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])
3920 {
3921 /**
3922 * Convert tables to css
3923 */
3924
3925 for (uint i = 0; i < SP_ROOT_CNT; i++)
3926 {
3927 uint pw_pos = i / CHARSIZ;
3928
3929 cs_t *cs = &root_css_buf[pw_pos];
3930
3931 if (cs->cs_len == threshold) continue;
3932
3933 uint key = root_table_buf[i].key;
3934
3935 if (uniq_tbls[pw_pos][key] == 0) continue;
3936
3937 cs->cs_buf[cs->cs_len] = key;
3938
3939 cs->cs_len++;
3940 }
3941
3942 /**
3943 * Convert table to css
3944 */
3945
3946 for (uint i = 0; i < SP_MARKOV_CNT; i++)
3947 {
3948 uint c = i / CHARSIZ;
3949
3950 cs_t *cs = &markov_css_buf[c];
3951
3952 if (cs->cs_len == threshold) continue;
3953
3954 uint pw_pos = c / CHARSIZ;
3955
3956 uint key = markov_table_buf[i].key;
3957
3958 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
3959
3960 cs->cs_buf[cs->cs_len] = key;
3961
3962 cs->cs_len++;
3963 }
3964
3965 /*
3966 for (uint i = 0; i < 8; i++)
3967 {
3968 for (uint j = 0x20; j < 0x80; j++)
3969 {
3970 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
3971
3972 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
3973
3974 for (uint k = 0; k < 10; k++)
3975 {
3976 printf (" %u\n", ptr->cs_buf[k]);
3977 }
3978 }
3979 }
3980 */
3981 }
3982
3983 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
3984 {
3985 for (uint i = 0; i < SP_PW_MAX; i += 2)
3986 {
3987 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
3988
3989 out += CHARSIZ;
3990 in += CHARSIZ;
3991
3992 out->key = 0;
3993 out->val = 1;
3994
3995 out++;
3996
3997 for (uint j = 1; j < CHARSIZ; j++)
3998 {
3999 out->key = j;
4000 out->val = 0;
4001
4002 out++;
4003 }
4004 }
4005 }
4006
4007 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4008 {
4009 for (uint i = 0; i < SP_PW_MAX; i += 2)
4010 {
4011 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4012
4013 out += CHARSIZ * CHARSIZ;
4014 in += CHARSIZ * CHARSIZ;
4015
4016 for (uint j = 0; j < CHARSIZ; j++)
4017 {
4018 out->key = 0;
4019 out->val = 1;
4020
4021 out++;
4022
4023 for (uint k = 1; k < CHARSIZ; k++)
4024 {
4025 out->key = k;
4026 out->val = 0;
4027
4028 out++;
4029 }
4030 }
4031 }
4032 }
4033
4034 /**
4035 * mixed shared functions
4036 */
4037
4038 void dump_hex (const char *s, size_t size)
4039 {
4040 size_t i;
4041
4042 for (i = 0; i < size; i++)
4043 {
4044 log_info_nn ("%02x ", (unsigned char) s[i]);
4045 }
4046
4047 log_info ("");
4048 }
4049
4050 void usage_mini_print (const char *progname)
4051 {
4052 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4053 }
4054
4055 void usage_big_print (const char *progname)
4056 {
4057 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4058 }
4059
4060 char *get_install_dir (const char *progname)
4061 {
4062 char *install_dir = mystrdup (progname);
4063 char *last_slash = NULL;
4064
4065 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4066 {
4067 *last_slash = 0;
4068 }
4069 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4070 {
4071 *last_slash = 0;
4072 }
4073 else
4074 {
4075 install_dir[0] = '.';
4076 install_dir[1] = 0;
4077 }
4078
4079 return (install_dir);
4080 }
4081
4082 char *get_profile_dir (const char *homedir)
4083 {
4084 #define DOT_HASHCAT ".hashcat"
4085
4086 char *profile_dir = (char *) mymalloc (strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1);
4087
4088 sprintf (profile_dir, "%s/%s", homedir, DOT_HASHCAT);
4089
4090 return profile_dir;
4091 }
4092
4093 char *get_session_dir (const char *profile_dir, const char *session)
4094 {
4095 char *session_dir = (char *) mymalloc (strlen (profile_dir) + 1 + strlen (session) + 1);
4096
4097 sprintf (session_dir, "%s/%s", profile_dir, session);
4098
4099 return session_dir;
4100 }
4101
4102 void truecrypt_crc32 (char *file, unsigned char keytab[64])
4103 {
4104 uint crc = ~0;
4105
4106 FILE *fd = fopen (file, "rb");
4107
4108 if (fd == NULL)
4109 {
4110 log_error ("%s: %s", file, strerror (errno));
4111
4112 exit (-1);
4113 }
4114
4115 #define MAX_KEY_SIZE (1024 * 1024)
4116
4117 char *buf = (char *) mymalloc (MAX_KEY_SIZE);
4118
4119 int nread = fread (buf, 1, MAX_KEY_SIZE, fd);
4120
4121 int kpos = 0;
4122
4123 for (int fpos = 0; fpos < nread; fpos++)
4124 {
4125 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4126
4127 keytab[kpos++] += (crc >> 24) & 0xff;
4128 keytab[kpos++] += (crc >> 16) & 0xff;
4129 keytab[kpos++] += (crc >> 8) & 0xff;
4130 keytab[kpos++] += (crc >> 0) & 0xff;
4131
4132 if (kpos >= 64) kpos = 0;
4133 }
4134
4135 myfree (buf);
4136
4137 fclose(fd);
4138 }
4139
4140 void set_cpu_affinity (char *cpu_affinity)
4141 {
4142 #ifdef WIN
4143 DWORD_PTR aff_mask = 0;
4144 #endif
4145
4146 #ifdef LINUX
4147 cpu_set_t cpuset;
4148
4149 CPU_ZERO (&cpuset);
4150 #endif
4151
4152 if (cpu_affinity)
4153 {
4154 char *devices = strdup (cpu_affinity);
4155
4156 char *next = strtok (devices, ",");
4157
4158 do
4159 {
4160 uint cpu_id = atoi (next);
4161
4162 if (cpu_id == 0)
4163 {
4164 #ifdef WIN
4165 aff_mask = 0;
4166 #endif
4167
4168 #ifdef LINUX
4169 CPU_ZERO (&cpuset);
4170 #endif
4171
4172 break;
4173 }
4174
4175 if (cpu_id > 32)
4176 {
4177 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4178
4179 exit (-1);
4180 }
4181
4182 #ifdef WIN
4183 aff_mask |= 1 << (cpu_id - 1);
4184 #endif
4185
4186 #ifdef LINUX
4187 CPU_SET ((cpu_id - 1), &cpuset);
4188 #endif
4189
4190 } while ((next = strtok (NULL, ",")) != NULL);
4191
4192 free (devices);
4193 }
4194
4195 #ifdef WIN
4196 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4197 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4198 #endif
4199
4200 #ifdef LINUX
4201 pthread_t thread = pthread_self ();
4202 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4203 #endif
4204 }
4205
4206 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4207 {
4208 char *element, *end;
4209
4210 end = (char *) base + nmemb * size;
4211
4212 for (element = (char *) base; element < end; element += size)
4213 if (!compar (element, key))
4214 return element;
4215
4216 return NULL;
4217 }
4218
4219 int sort_by_salt (const void *v1, const void *v2)
4220 {
4221 const salt_t *s1 = (const salt_t *) v1;
4222 const salt_t *s2 = (const salt_t *) v2;
4223
4224 const int res1 = s1->salt_len - s2->salt_len;
4225
4226 if (res1 != 0) return (res1);
4227
4228 const int res2 = s1->salt_iter - s2->salt_iter;
4229
4230 if (res2 != 0) return (res2);
4231
4232 uint n;
4233
4234 n = 12;
4235
4236 while (n--)
4237 {
4238 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4239 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4240 }
4241
4242 n = 8;
4243
4244 while (n--)
4245 {
4246 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4247 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4248 }
4249
4250 return (0);
4251 }
4252
4253 int sort_by_salt_buf (const void *v1, const void *v2)
4254 {
4255 const pot_t *p1 = (const pot_t *) v1;
4256 const pot_t *p2 = (const pot_t *) v2;
4257
4258 const hash_t *h1 = &p1->hash;
4259 const hash_t *h2 = &p2->hash;
4260
4261 const salt_t *s1 = h1->salt;
4262 const salt_t *s2 = h2->salt;
4263
4264 uint n = 12;
4265
4266 while (n--)
4267 {
4268 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4269 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4270 }
4271
4272 return 0;
4273 }
4274
4275 int sort_by_hash_t_salt (const void *v1, const void *v2)
4276 {
4277 const hash_t *h1 = (const hash_t *) v1;
4278 const hash_t *h2 = (const hash_t *) v2;
4279
4280 const salt_t *s1 = h1->salt;
4281 const salt_t *s2 = h2->salt;
4282
4283 // testphase: this should work
4284 uint n = 12;
4285
4286 while (n--)
4287 {
4288 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4289 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4290 }
4291
4292 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4293 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4294 if (s1->salt_len > s2->salt_len) return ( 1);
4295 if (s1->salt_len < s2->salt_len) return (-1);
4296
4297 uint n = s1->salt_len;
4298
4299 while (n--)
4300 {
4301 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4302 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4303 }
4304 */
4305
4306 return 0;
4307 }
4308
4309 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4310 {
4311 const hash_t *h1 = (const hash_t *) v1;
4312 const hash_t *h2 = (const hash_t *) v2;
4313
4314 const salt_t *s1 = h1->salt;
4315 const salt_t *s2 = h2->salt;
4316
4317 // 12 - 2 (since last 2 uints contain the digest)
4318 uint n = 10;
4319
4320 while (n--)
4321 {
4322 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4323 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4324 }
4325
4326 return 0;
4327 }
4328
4329 int sort_by_hash_no_salt (const void *v1, const void *v2)
4330 {
4331 const hash_t *h1 = (const hash_t *) v1;
4332 const hash_t *h2 = (const hash_t *) v2;
4333
4334 const void *d1 = h1->digest;
4335 const void *d2 = h2->digest;
4336
4337 return data.sort_by_digest (d1, d2);
4338 }
4339
4340 int sort_by_hash (const void *v1, const void *v2)
4341 {
4342 const hash_t *h1 = (const hash_t *) v1;
4343 const hash_t *h2 = (const hash_t *) v2;
4344
4345 if (data.isSalted)
4346 {
4347 const salt_t *s1 = h1->salt;
4348 const salt_t *s2 = h2->salt;
4349
4350 int res = sort_by_salt (s1, s2);
4351
4352 if (res != 0) return (res);
4353 }
4354
4355 const void *d1 = h1->digest;
4356 const void *d2 = h2->digest;
4357
4358 return data.sort_by_digest (d1, d2);
4359 }
4360
4361 int sort_by_pot (const void *v1, const void *v2)
4362 {
4363 const pot_t *p1 = (const pot_t *) v1;
4364 const pot_t *p2 = (const pot_t *) v2;
4365
4366 const hash_t *h1 = &p1->hash;
4367 const hash_t *h2 = &p2->hash;
4368
4369 return sort_by_hash (h1, h2);
4370 }
4371
4372 int sort_by_mtime (const void *p1, const void *p2)
4373 {
4374 const char **f1 = (const char **) p1;
4375 const char **f2 = (const char **) p2;
4376
4377 struct stat s1; stat (*f1, &s1);
4378 struct stat s2; stat (*f2, &s2);
4379
4380 return s2.st_mtime - s1.st_mtime;
4381 }
4382
4383 int sort_by_cpu_rule (const void *p1, const void *p2)
4384 {
4385 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4386 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4387
4388 return memcmp (r1, r2, sizeof (cpu_rule_t));
4389 }
4390
4391 int sort_by_gpu_rule (const void *p1, const void *p2)
4392 {
4393 const gpu_rule_t *r1 = (const gpu_rule_t *) p1;
4394 const gpu_rule_t *r2 = (const gpu_rule_t *) p2;
4395
4396 return memcmp (r1, r2, sizeof (gpu_rule_t));
4397 }
4398
4399 int sort_by_stringptr (const void *p1, const void *p2)
4400 {
4401 const char **s1 = (const char **) p1;
4402 const char **s2 = (const char **) p2;
4403
4404 return strcmp (*s1, *s2);
4405 }
4406
4407 int sort_by_dictstat (const void *s1, const void *s2)
4408 {
4409 dictstat_t *d1 = (dictstat_t *) s1;
4410 dictstat_t *d2 = (dictstat_t *) s2;
4411
4412 #ifdef _POSIX
4413 d2->stat.st_atim = d1->stat.st_atim;
4414 #else
4415 d2->stat.st_atime = d1->stat.st_atime;
4416 #endif
4417
4418 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4419 }
4420
4421 int sort_by_bitmap (const void *p1, const void *p2)
4422 {
4423 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4424 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4425
4426 return b1->collisions - b2->collisions;
4427 }
4428
4429 int sort_by_digest_4_2 (const void *v1, const void *v2)
4430 {
4431 const uint32_t *d1 = (const uint32_t *) v1;
4432 const uint32_t *d2 = (const uint32_t *) v2;
4433
4434 uint n = 2;
4435
4436 while (n--)
4437 {
4438 if (d1[n] > d2[n]) return ( 1);
4439 if (d1[n] < d2[n]) return (-1);
4440 }
4441
4442 return (0);
4443 }
4444
4445 int sort_by_digest_4_4 (const void *v1, const void *v2)
4446 {
4447 const uint32_t *d1 = (const uint32_t *) v1;
4448 const uint32_t *d2 = (const uint32_t *) v2;
4449
4450 uint n = 4;
4451
4452 while (n--)
4453 {
4454 if (d1[n] > d2[n]) return ( 1);
4455 if (d1[n] < d2[n]) return (-1);
4456 }
4457
4458 return (0);
4459 }
4460
4461 int sort_by_digest_4_5 (const void *v1, const void *v2)
4462 {
4463 const uint32_t *d1 = (const uint32_t *) v1;
4464 const uint32_t *d2 = (const uint32_t *) v2;
4465
4466 uint n = 5;
4467
4468 while (n--)
4469 {
4470 if (d1[n] > d2[n]) return ( 1);
4471 if (d1[n] < d2[n]) return (-1);
4472 }
4473
4474 return (0);
4475 }
4476
4477 int sort_by_digest_4_6 (const void *v1, const void *v2)
4478 {
4479 const uint32_t *d1 = (const uint32_t *) v1;
4480 const uint32_t *d2 = (const uint32_t *) v2;
4481
4482 uint n = 6;
4483
4484 while (n--)
4485 {
4486 if (d1[n] > d2[n]) return ( 1);
4487 if (d1[n] < d2[n]) return (-1);
4488 }
4489
4490 return (0);
4491 }
4492
4493 int sort_by_digest_4_8 (const void *v1, const void *v2)
4494 {
4495 const uint32_t *d1 = (const uint32_t *) v1;
4496 const uint32_t *d2 = (const uint32_t *) v2;
4497
4498 uint n = 8;
4499
4500 while (n--)
4501 {
4502 if (d1[n] > d2[n]) return ( 1);
4503 if (d1[n] < d2[n]) return (-1);
4504 }
4505
4506 return (0);
4507 }
4508
4509 int sort_by_digest_4_16 (const void *v1, const void *v2)
4510 {
4511 const uint32_t *d1 = (const uint32_t *) v1;
4512 const uint32_t *d2 = (const uint32_t *) v2;
4513
4514 uint n = 16;
4515
4516 while (n--)
4517 {
4518 if (d1[n] > d2[n]) return ( 1);
4519 if (d1[n] < d2[n]) return (-1);
4520 }
4521
4522 return (0);
4523 }
4524
4525 int sort_by_digest_4_32 (const void *v1, const void *v2)
4526 {
4527 const uint32_t *d1 = (const uint32_t *) v1;
4528 const uint32_t *d2 = (const uint32_t *) v2;
4529
4530 uint n = 32;
4531
4532 while (n--)
4533 {
4534 if (d1[n] > d2[n]) return ( 1);
4535 if (d1[n] < d2[n]) return (-1);
4536 }
4537
4538 return (0);
4539 }
4540
4541 int sort_by_digest_4_64 (const void *v1, const void *v2)
4542 {
4543 const uint32_t *d1 = (const uint32_t *) v1;
4544 const uint32_t *d2 = (const uint32_t *) v2;
4545
4546 uint n = 64;
4547
4548 while (n--)
4549 {
4550 if (d1[n] > d2[n]) return ( 1);
4551 if (d1[n] < d2[n]) return (-1);
4552 }
4553
4554 return (0);
4555 }
4556
4557 int sort_by_digest_8_8 (const void *v1, const void *v2)
4558 {
4559 const uint64_t *d1 = (const uint64_t *) v1;
4560 const uint64_t *d2 = (const uint64_t *) v2;
4561
4562 uint n = 8;
4563
4564 while (n--)
4565 {
4566 if (d1[n] > d2[n]) return ( 1);
4567 if (d1[n] < d2[n]) return (-1);
4568 }
4569
4570 return (0);
4571 }
4572
4573 int sort_by_digest_8_16 (const void *v1, const void *v2)
4574 {
4575 const uint64_t *d1 = (const uint64_t *) v1;
4576 const uint64_t *d2 = (const uint64_t *) v2;
4577
4578 uint n = 16;
4579
4580 while (n--)
4581 {
4582 if (d1[n] > d2[n]) return ( 1);
4583 if (d1[n] < d2[n]) return (-1);
4584 }
4585
4586 return (0);
4587 }
4588
4589 int sort_by_digest_8_25 (const void *v1, const void *v2)
4590 {
4591 const uint64_t *d1 = (const uint64_t *) v1;
4592 const uint64_t *d2 = (const uint64_t *) v2;
4593
4594 uint n = 25;
4595
4596 while (n--)
4597 {
4598 if (d1[n] > d2[n]) return ( 1);
4599 if (d1[n] < d2[n]) return (-1);
4600 }
4601
4602 return (0);
4603 }
4604
4605 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4606 {
4607 const uint32_t *d1 = (const uint32_t *) v1;
4608 const uint32_t *d2 = (const uint32_t *) v2;
4609
4610 const uint dgst_pos0 = data.dgst_pos0;
4611 const uint dgst_pos1 = data.dgst_pos1;
4612 const uint dgst_pos2 = data.dgst_pos2;
4613 const uint dgst_pos3 = data.dgst_pos3;
4614
4615 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4616 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4617 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4618 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4619 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4620 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4621 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4622 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4623
4624 return (0);
4625 }
4626
4627 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)
4628 {
4629 uint outfile_autohex = data.outfile_autohex;
4630
4631 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4632
4633 FILE *debug_fp = NULL;
4634
4635 if (debug_file != NULL)
4636 {
4637 debug_fp = fopen (debug_file, "ab");
4638 }
4639 else
4640 {
4641 debug_fp = stderr;
4642 }
4643
4644 if (debug_fp == NULL)
4645 {
4646 log_info ("WARNING: Could not open debug-file for writing");
4647 }
4648 else
4649 {
4650 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4651 {
4652 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4653
4654 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4655 }
4656
4657 fwrite (rule_ptr, rule_len, 1, debug_fp);
4658
4659 if (debug_mode == 4)
4660 {
4661 fputc (':', debug_fp);
4662
4663 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4664 }
4665
4666 fputc ('\n', debug_fp);
4667
4668 if (debug_file != NULL) fclose (debug_fp);
4669 }
4670 }
4671
4672 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4673 {
4674 int needs_hexify = 0;
4675
4676 if (outfile_autohex == 1)
4677 {
4678 for (uint i = 0; i < plain_len; i++)
4679 {
4680 if (plain_ptr[i] < 0x20)
4681 {
4682 needs_hexify = 1;
4683
4684 break;
4685 }
4686
4687 if (plain_ptr[i] > 0x7f)
4688 {
4689 needs_hexify = 1;
4690
4691 break;
4692 }
4693 }
4694 }
4695
4696 if (needs_hexify == 1)
4697 {
4698 fprintf (fp, "$HEX[");
4699
4700 for (uint i = 0; i < plain_len; i++)
4701 {
4702 fprintf (fp, "%02x", plain_ptr[i]);
4703 }
4704
4705 fprintf (fp, "]");
4706 }
4707 else
4708 {
4709 fwrite (plain_ptr, plain_len, 1, fp);
4710 }
4711 }
4712
4713 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)
4714 {
4715 uint outfile_format = data.outfile_format;
4716
4717 char separator = data.separator;
4718
4719 if (outfile_format & OUTFILE_FMT_HASH)
4720 {
4721 fprintf (out_fp, "%s", out_buf);
4722
4723 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4724 {
4725 fputc (separator, out_fp);
4726 }
4727 }
4728 else if (data.username)
4729 {
4730 if (username != NULL)
4731 {
4732 for (uint i = 0; i < user_len; i++)
4733 {
4734 fprintf (out_fp, "%c", username[i]);
4735 }
4736
4737 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4738 {
4739 fputc (separator, out_fp);
4740 }
4741 }
4742 }
4743
4744 if (outfile_format & OUTFILE_FMT_PLAIN)
4745 {
4746 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4747
4748 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4749 {
4750 fputc (separator, out_fp);
4751 }
4752 }
4753
4754 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4755 {
4756 for (uint i = 0; i < plain_len; i++)
4757 {
4758 fprintf (out_fp, "%02x", plain_ptr[i]);
4759 }
4760
4761 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4762 {
4763 fputc (separator, out_fp);
4764 }
4765 }
4766
4767 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4768 {
4769 #ifdef _WIN
4770 __mingw_fprintf (out_fp, "%llu", crackpos);
4771 #endif
4772
4773 #ifdef _POSIX
4774 #ifdef __x86_64__
4775 fprintf (out_fp, "%lu", crackpos);
4776 #else
4777 fprintf (out_fp, "%llu", crackpos);
4778 #endif
4779 #endif
4780 }
4781
4782 fputc ('\n', out_fp);
4783 }
4784
4785 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)
4786 {
4787 pot_t pot_key;
4788
4789 pot_key.hash.salt = hashes_buf->salt;
4790 pot_key.hash.digest = hashes_buf->digest;
4791
4792 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4793
4794 if (pot_ptr)
4795 {
4796 log_info_nn ("");
4797
4798 input_buf[input_len] = 0;
4799
4800 // user
4801 unsigned char *username = NULL;
4802 uint user_len = 0;
4803
4804 if (data.username)
4805 {
4806 user_t *user = hashes_buf->hash_info->user;
4807
4808 if (user)
4809 {
4810 username = (unsigned char *) (user->user_name);
4811
4812 user_len = user->user_len;
4813 }
4814 }
4815
4816 // do output the line
4817 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
4818 }
4819 }
4820
4821 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
4822 #define LM_MASKED_PLAIN "[notfound]"
4823
4824 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)
4825 {
4826 // left
4827
4828 pot_t pot_left_key;
4829
4830 pot_left_key.hash.salt = hash_left->salt;
4831 pot_left_key.hash.digest = hash_left->digest;
4832
4833 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4834
4835 // right
4836
4837 uint weak_hash_found = 0;
4838
4839 pot_t pot_right_key;
4840
4841 pot_right_key.hash.salt = hash_right->salt;
4842 pot_right_key.hash.digest = hash_right->digest;
4843
4844 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4845
4846 if (pot_right_ptr == NULL)
4847 {
4848 // special case, if "weak hash"
4849
4850 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
4851 {
4852 weak_hash_found = 1;
4853
4854 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4855
4856 // in theory this is not needed, but we are paranoia:
4857
4858 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4859 pot_right_ptr->plain_len = 0;
4860 }
4861 }
4862
4863 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
4864 {
4865 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
4866
4867 return;
4868 }
4869
4870 // at least one half was found:
4871
4872 log_info_nn ("");
4873
4874 input_buf[input_len] = 0;
4875
4876 // user
4877
4878 unsigned char *username = NULL;
4879 uint user_len = 0;
4880
4881 if (data.username)
4882 {
4883 user_t *user = hash_left->hash_info->user;
4884
4885 if (user)
4886 {
4887 username = (unsigned char *) (user->user_name);
4888
4889 user_len = user->user_len;
4890 }
4891 }
4892
4893 // mask the part which was not found
4894
4895 uint left_part_masked = 0;
4896 uint right_part_masked = 0;
4897
4898 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
4899
4900 if (pot_left_ptr == NULL)
4901 {
4902 left_part_masked = 1;
4903
4904 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4905
4906 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
4907
4908 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
4909 pot_left_ptr->plain_len = mask_plain_len;
4910 }
4911
4912 if (pot_right_ptr == NULL)
4913 {
4914 right_part_masked = 1;
4915
4916 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4917
4918 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4919
4920 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
4921 pot_right_ptr->plain_len = mask_plain_len;
4922 }
4923
4924 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
4925
4926 pot_t pot_ptr;
4927
4928 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
4929
4930 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
4931
4932 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
4933
4934 // do output the line
4935
4936 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
4937
4938 if (weak_hash_found == 1) myfree (pot_right_ptr);
4939
4940 if (left_part_masked == 1) myfree (pot_left_ptr);
4941 if (right_part_masked == 1) myfree (pot_right_ptr);
4942 }
4943
4944 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)
4945 {
4946 pot_t pot_key;
4947
4948 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
4949
4950 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4951
4952 if (pot_ptr == NULL)
4953 {
4954 log_info_nn ("");
4955
4956 input_buf[input_len] = 0;
4957
4958 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
4959 }
4960 }
4961
4962 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)
4963 {
4964 // left
4965
4966 pot_t pot_left_key;
4967
4968 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
4969
4970 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4971
4972 // right
4973
4974 pot_t pot_right_key;
4975
4976 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
4977
4978 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4979
4980 uint weak_hash_found = 0;
4981
4982 if (pot_right_ptr == NULL)
4983 {
4984 // special case, if "weak hash"
4985
4986 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
4987 {
4988 weak_hash_found = 1;
4989
4990 // we just need that pot_right_ptr is not a NULL pointer
4991
4992 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4993 }
4994 }
4995
4996 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
4997 {
4998 if (weak_hash_found == 1) myfree (pot_right_ptr);
4999
5000 return;
5001 }
5002
5003 // ... at least one part was not cracked
5004
5005 log_info_nn ("");
5006
5007 input_buf[input_len] = 0;
5008
5009 // only show the hash part which is still not cracked
5010
5011 uint user_len = input_len - 32;
5012
5013 char hash_output[user_len + 33];
5014
5015 memset (hash_output, 0, sizeof (hash_output));
5016
5017 memcpy (hash_output, input_buf, input_len);
5018
5019 if (pot_left_ptr != NULL)
5020 {
5021 // only show right part (because left part was already found)
5022
5023 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5024
5025 hash_output[user_len + 16] = 0;
5026 }
5027
5028 if (pot_right_ptr != NULL)
5029 {
5030 // only show left part (because right part was already found)
5031
5032 memcpy (hash_output + user_len, input_buf + user_len, 16);
5033
5034 hash_output[user_len + 16] = 0;
5035 }
5036
5037 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5038
5039 if (weak_hash_found == 1) myfree (pot_right_ptr);
5040 }
5041
5042 uint devices_to_devicemask (char *gpu_devices)
5043 {
5044 uint gpu_devicemask = 0;
5045
5046 if (gpu_devices)
5047 {
5048 char *devices = strdup (gpu_devices);
5049
5050 char *next = strtok (devices, ",");
5051
5052 do
5053 {
5054 uint gpu_id = atoi (next);
5055
5056 if (gpu_id < 1 || gpu_id > 8)
5057 {
5058 log_error ("ERROR: invalid gpu_id %u specified", gpu_id);
5059
5060 exit (-1);
5061 }
5062
5063 gpu_devicemask |= 1 << (gpu_id - 1);
5064
5065 } while ((next = strtok (NULL, ",")) != NULL);
5066
5067 free (devices);
5068 }
5069
5070 return gpu_devicemask;
5071 }
5072
5073 uint get_random_num (uint min, uint max)
5074 {
5075 if (min == max) return (min);
5076
5077 return (uint) ((rand () % (max - min)) + min);
5078 }
5079
5080 uint32_t mydivc32 (const uint32_t dividend, const uint32_t divisor)
5081 {
5082 uint32_t quotient = dividend / divisor;
5083
5084 if (dividend % divisor) quotient++;
5085
5086 return quotient;
5087 }
5088
5089 uint64_t mydivc64 (const uint64_t dividend, const uint64_t divisor)
5090 {
5091 uint64_t quotient = dividend / divisor;
5092
5093 if (dividend % divisor) quotient++;
5094
5095 return quotient;
5096 }
5097
5098 void format_timer_display (struct tm *tm, char *buf, size_t len)
5099 {
5100 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5101 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5102
5103 if (tm->tm_year - 70)
5104 {
5105 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5106 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5107
5108 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5109 }
5110 else if (tm->tm_yday)
5111 {
5112 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5113 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5114
5115 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5116 }
5117 else if (tm->tm_hour)
5118 {
5119 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5120 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5121
5122 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5123 }
5124 else if (tm->tm_min)
5125 {
5126 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5127 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5128
5129 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5130 }
5131 else
5132 {
5133 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5134
5135 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5136 }
5137 }
5138
5139 void format_speed_display (float val, char *buf, size_t len)
5140 {
5141 if (val <= 0)
5142 {
5143 buf[0] = '0';
5144 buf[1] = ' ';
5145 buf[2] = 0;
5146
5147 return;
5148 }
5149
5150 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5151
5152 uint level = 0;
5153
5154 while (val > 99999)
5155 {
5156 val /= 1000;
5157
5158 level++;
5159 }
5160
5161 /* generate output */
5162
5163 if (level == 0)
5164 {
5165 snprintf (buf, len - 1, "%.0f ", val);
5166 }
5167 else
5168 {
5169 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5170 }
5171 }
5172
5173 void lowercase (char *buf, int len)
5174 {
5175 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5176 }
5177
5178 void uppercase (char *buf, int len)
5179 {
5180 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5181 }
5182
5183 int fgetl (FILE *fp, char *line_buf)
5184 {
5185 int line_len = 0;
5186
5187 while (!feof (fp))
5188 {
5189 const int c = fgetc (fp);
5190
5191 if (c == EOF) break;
5192
5193 line_buf[line_len] = (char) c;
5194
5195 line_len++;
5196
5197 if (line_len == BUFSIZ) line_len--;
5198
5199 if (c == '\n') break;
5200 }
5201
5202 if (line_len == 0) return 0;
5203
5204 if (line_buf[line_len - 1] == '\n')
5205 {
5206 line_len--;
5207
5208 line_buf[line_len] = 0;
5209 }
5210
5211 if (line_len == 0) return 0;
5212
5213 if (line_buf[line_len - 1] == '\r')
5214 {
5215 line_len--;
5216
5217 line_buf[line_len] = 0;
5218 }
5219
5220 return (line_len);
5221 }
5222
5223 int in_superchop (char *buf)
5224 {
5225 int len = strlen (buf);
5226
5227 while (len)
5228 {
5229 if (buf[len - 1] == '\n')
5230 {
5231 len--;
5232
5233 continue;
5234 }
5235
5236 if (buf[len - 1] == '\r')
5237 {
5238 len--;
5239
5240 continue;
5241 }
5242
5243 break;
5244 }
5245
5246 buf[len] = 0;
5247
5248 return len;
5249 }
5250
5251 char **scan_directory (const char *path)
5252 {
5253 char *tmp_path = mystrdup (path);
5254
5255 size_t tmp_path_len = strlen (tmp_path);
5256
5257 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5258 {
5259 tmp_path[tmp_path_len - 1] = 0;
5260
5261 tmp_path_len = strlen (tmp_path);
5262 }
5263
5264 char **files = NULL;
5265
5266 int num_files = 0;
5267
5268 DIR *d;
5269
5270 if ((d = opendir (tmp_path)) != NULL)
5271 {
5272 struct dirent *de;
5273
5274 while ((de = readdir (d)) != NULL)
5275 {
5276 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5277
5278 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5279
5280 char *path_file = (char *) mymalloc (path_size + 1);
5281
5282 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5283
5284 path_file[path_size] = 0;
5285
5286 DIR *d_test;
5287
5288 if ((d_test = opendir (path_file)) != NULL)
5289 {
5290 closedir (d_test);
5291
5292 myfree (path_file);
5293 }
5294 else
5295 {
5296 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5297
5298 num_files++;
5299
5300 files[num_files - 1] = path_file;
5301 }
5302 }
5303
5304 closedir (d);
5305 }
5306 else if (errno == ENOTDIR)
5307 {
5308 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5309
5310 num_files++;
5311
5312 files[num_files - 1] = mystrdup (path);
5313 }
5314
5315 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5316
5317 num_files++;
5318
5319 files[num_files - 1] = NULL;
5320
5321 myfree (tmp_path);
5322
5323 return (files);
5324 }
5325
5326 int count_dictionaries (char **dictionary_files)
5327 {
5328 if (dictionary_files == NULL) return 0;
5329
5330 int cnt = 0;
5331
5332 for (int d = 0; dictionary_files[d] != NULL; d++)
5333 {
5334 cnt++;
5335 }
5336
5337 return (cnt);
5338 }
5339
5340 char *stroptitype (const uint opti_type)
5341 {
5342 switch (opti_type)
5343 {
5344 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5345 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5346 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5347 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5348 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5349 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5350 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5351 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5352 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5353 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5354 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5355 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5356 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5357 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5358 }
5359
5360 return (NULL);
5361 }
5362
5363 char *strparser (const uint parser_status)
5364 {
5365 switch (parser_status)
5366 {
5367 case PARSER_OK: return ((char *) PA_000); break;
5368 case PARSER_COMMENT: return ((char *) PA_001); break;
5369 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5370 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5371 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5372 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5373 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5374 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5375 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5376 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5377 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5378 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5379 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5380 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5381 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5382 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5383 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5384 }
5385
5386 return ((char *) PA_255);
5387 }
5388
5389 char *strhashtype (const uint hash_mode)
5390 {
5391 switch (hash_mode)
5392 {
5393 case 0: return ((char *) HT_00000); break;
5394 case 10: return ((char *) HT_00010); break;
5395 case 11: return ((char *) HT_00011); break;
5396 case 12: return ((char *) HT_00012); break;
5397 case 20: return ((char *) HT_00020); break;
5398 case 21: return ((char *) HT_00021); break;
5399 case 22: return ((char *) HT_00022); break;
5400 case 23: return ((char *) HT_00023); break;
5401 case 30: return ((char *) HT_00030); break;
5402 case 40: return ((char *) HT_00040); break;
5403 case 50: return ((char *) HT_00050); break;
5404 case 60: return ((char *) HT_00060); break;
5405 case 100: return ((char *) HT_00100); break;
5406 case 101: return ((char *) HT_00101); break;
5407 case 110: return ((char *) HT_00110); break;
5408 case 111: return ((char *) HT_00111); break;
5409 case 112: return ((char *) HT_00112); break;
5410 case 120: return ((char *) HT_00120); break;
5411 case 121: return ((char *) HT_00121); break;
5412 case 122: return ((char *) HT_00122); break;
5413 case 124: return ((char *) HT_00124); break;
5414 case 130: return ((char *) HT_00130); break;
5415 case 131: return ((char *) HT_00131); break;
5416 case 132: return ((char *) HT_00132); break;
5417 case 133: return ((char *) HT_00133); break;
5418 case 140: return ((char *) HT_00140); break;
5419 case 141: return ((char *) HT_00141); break;
5420 case 150: return ((char *) HT_00150); break;
5421 case 160: return ((char *) HT_00160); break;
5422 case 190: return ((char *) HT_00190); break;
5423 case 200: return ((char *) HT_00200); break;
5424 case 300: return ((char *) HT_00300); break;
5425 case 400: return ((char *) HT_00400); break;
5426 case 500: return ((char *) HT_00500); break;
5427 case 501: return ((char *) HT_00501); break;
5428 case 900: return ((char *) HT_00900); break;
5429 case 910: return ((char *) HT_00910); break;
5430 case 1000: return ((char *) HT_01000); break;
5431 case 1100: return ((char *) HT_01100); break;
5432 case 1400: return ((char *) HT_01400); break;
5433 case 1410: return ((char *) HT_01410); break;
5434 case 1420: return ((char *) HT_01420); break;
5435 case 1421: return ((char *) HT_01421); break;
5436 case 1430: return ((char *) HT_01430); break;
5437 case 1440: return ((char *) HT_01440); break;
5438 case 1441: return ((char *) HT_01441); break;
5439 case 1450: return ((char *) HT_01450); break;
5440 case 1460: return ((char *) HT_01460); break;
5441 case 1500: return ((char *) HT_01500); break;
5442 case 1600: return ((char *) HT_01600); break;
5443 case 1700: return ((char *) HT_01700); break;
5444 case 1710: return ((char *) HT_01710); break;
5445 case 1711: return ((char *) HT_01711); break;
5446 case 1720: return ((char *) HT_01720); break;
5447 case 1722: return ((char *) HT_01722); break;
5448 case 1730: return ((char *) HT_01730); break;
5449 case 1731: return ((char *) HT_01731); break;
5450 case 1740: return ((char *) HT_01740); break;
5451 case 1750: return ((char *) HT_01750); break;
5452 case 1760: return ((char *) HT_01760); break;
5453 case 1800: return ((char *) HT_01800); break;
5454 case 2100: return ((char *) HT_02100); break;
5455 case 2400: return ((char *) HT_02400); break;
5456 case 2410: return ((char *) HT_02410); break;
5457 case 2500: return ((char *) HT_02500); break;
5458 case 2600: return ((char *) HT_02600); break;
5459 case 2611: return ((char *) HT_02611); break;
5460 case 2612: return ((char *) HT_02612); break;
5461 case 2711: return ((char *) HT_02711); break;
5462 case 2811: return ((char *) HT_02811); break;
5463 case 3000: return ((char *) HT_03000); break;
5464 case 3100: return ((char *) HT_03100); break;
5465 case 3200: return ((char *) HT_03200); break;
5466 case 3710: return ((char *) HT_03710); break;
5467 case 3711: return ((char *) HT_03711); break;
5468 case 3800: return ((char *) HT_03800); break;
5469 case 4300: return ((char *) HT_04300); break;
5470 case 4400: return ((char *) HT_04400); break;
5471 case 4500: return ((char *) HT_04500); break;
5472 case 4700: return ((char *) HT_04700); break;
5473 case 4800: return ((char *) HT_04800); break;
5474 case 4900: return ((char *) HT_04900); break;
5475 case 5000: return ((char *) HT_05000); break;
5476 case 5100: return ((char *) HT_05100); break;
5477 case 5200: return ((char *) HT_05200); break;
5478 case 5300: return ((char *) HT_05300); break;
5479 case 5400: return ((char *) HT_05400); break;
5480 case 5500: return ((char *) HT_05500); break;
5481 case 5600: return ((char *) HT_05600); break;
5482 case 5700: return ((char *) HT_05700); break;
5483 case 5800: return ((char *) HT_05800); break;
5484 case 6000: return ((char *) HT_06000); break;
5485 case 6100: return ((char *) HT_06100); break;
5486 case 6211: return ((char *) HT_06211); break;
5487 case 6212: return ((char *) HT_06212); break;
5488 case 6213: return ((char *) HT_06213); break;
5489 case 6221: return ((char *) HT_06221); break;
5490 case 6222: return ((char *) HT_06222); break;
5491 case 6223: return ((char *) HT_06223); break;
5492 case 6231: return ((char *) HT_06231); break;
5493 case 6232: return ((char *) HT_06232); break;
5494 case 6233: return ((char *) HT_06233); break;
5495 case 6241: return ((char *) HT_06241); break;
5496 case 6242: return ((char *) HT_06242); break;
5497 case 6243: return ((char *) HT_06243); break;
5498 case 6300: return ((char *) HT_06300); break;
5499 case 6400: return ((char *) HT_06400); break;
5500 case 6500: return ((char *) HT_06500); break;
5501 case 6600: return ((char *) HT_06600); break;
5502 case 6700: return ((char *) HT_06700); break;
5503 case 6800: return ((char *) HT_06800); break;
5504 case 6900: return ((char *) HT_06900); break;
5505 case 7100: return ((char *) HT_07100); break;
5506 case 7200: return ((char *) HT_07200); break;
5507 case 7300: return ((char *) HT_07300); break;
5508 case 7400: return ((char *) HT_07400); break;
5509 case 7500: return ((char *) HT_07500); break;
5510 case 7600: return ((char *) HT_07600); break;
5511 case 7700: return ((char *) HT_07700); break;
5512 case 7800: return ((char *) HT_07800); break;
5513 case 7900: return ((char *) HT_07900); break;
5514 case 8000: return ((char *) HT_08000); break;
5515 case 8100: return ((char *) HT_08100); break;
5516 case 8200: return ((char *) HT_08200); break;
5517 case 8300: return ((char *) HT_08300); break;
5518 case 8400: return ((char *) HT_08400); break;
5519 case 8500: return ((char *) HT_08500); break;
5520 case 8600: return ((char *) HT_08600); break;
5521 case 8700: return ((char *) HT_08700); break;
5522 case 8800: return ((char *) HT_08800); break;
5523 case 8900: return ((char *) HT_08900); break;
5524 case 9000: return ((char *) HT_09000); break;
5525 case 9100: return ((char *) HT_09100); break;
5526 case 9200: return ((char *) HT_09200); break;
5527 case 9300: return ((char *) HT_09300); break;
5528 case 9400: return ((char *) HT_09400); break;
5529 case 9500: return ((char *) HT_09500); break;
5530 case 9600: return ((char *) HT_09600); break;
5531 case 9700: return ((char *) HT_09700); break;
5532 case 9710: return ((char *) HT_09710); break;
5533 case 9720: return ((char *) HT_09720); break;
5534 case 9800: return ((char *) HT_09800); break;
5535 case 9810: return ((char *) HT_09810); break;
5536 case 9820: return ((char *) HT_09820); break;
5537 case 9900: return ((char *) HT_09900); break;
5538 case 10000: return ((char *) HT_10000); break;
5539 case 10100: return ((char *) HT_10100); break;
5540 case 10200: return ((char *) HT_10200); break;
5541 case 10300: return ((char *) HT_10300); break;
5542 case 10400: return ((char *) HT_10400); break;
5543 case 10410: return ((char *) HT_10410); break;
5544 case 10420: return ((char *) HT_10420); break;
5545 case 10500: return ((char *) HT_10500); break;
5546 case 10600: return ((char *) HT_10600); break;
5547 case 10700: return ((char *) HT_10700); break;
5548 case 10800: return ((char *) HT_10800); break;
5549 case 10900: return ((char *) HT_10900); break;
5550 case 11000: return ((char *) HT_11000); break;
5551 case 11100: return ((char *) HT_11100); break;
5552 case 11200: return ((char *) HT_11200); break;
5553 case 11300: return ((char *) HT_11300); break;
5554 case 11400: return ((char *) HT_11400); break;
5555 case 11500: return ((char *) HT_11500); break;
5556 case 11600: return ((char *) HT_11600); break;
5557 case 11700: return ((char *) HT_11700); break;
5558 case 11800: return ((char *) HT_11800); break;
5559 case 11900: return ((char *) HT_11900); break;
5560 case 12000: return ((char *) HT_12000); break;
5561 case 12100: return ((char *) HT_12100); break;
5562 case 12200: return ((char *) HT_12200); break;
5563 case 12300: return ((char *) HT_12300); break;
5564 case 12400: return ((char *) HT_12400); break;
5565 case 12500: return ((char *) HT_12500); break;
5566 case 12600: return ((char *) HT_12600); break;
5567 case 12700: return ((char *) HT_12700); break;
5568 case 12800: return ((char *) HT_12800); break;
5569 }
5570
5571 return ((char *) "Unknown");
5572 }
5573
5574 char *strstatus (const uint devices_status)
5575 {
5576 switch (devices_status)
5577 {
5578 case STATUS_INIT: return ((char *) ST_0000); break;
5579 case STATUS_STARTING: return ((char *) ST_0001); break;
5580 case STATUS_RUNNING: return ((char *) ST_0002); break;
5581 case STATUS_PAUSED: return ((char *) ST_0003); break;
5582 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5583 case STATUS_CRACKED: return ((char *) ST_0005); break;
5584 case STATUS_ABORTED: return ((char *) ST_0006); break;
5585 case STATUS_QUIT: return ((char *) ST_0007); break;
5586 case STATUS_BYPASS: return ((char *) ST_0008); break;
5587 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5588 }
5589
5590 return ((char *) "Unknown");
5591 }
5592
5593 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5594 {
5595 uint hash_type = data.hash_type;
5596 uint hash_mode = data.hash_mode;
5597 uint salt_type = data.salt_type;
5598 uint opts_type = data.opts_type;
5599 uint opti_type = data.opti_type;
5600 uint dgst_size = data.dgst_size;
5601
5602 char *hashfile = data.hashfile;
5603
5604 uint len = 4096;
5605
5606 uint digest_buf[64];
5607
5608 uint64_t *digest_buf64 = (uint64_t *) digest_buf;
5609
5610 char *digests_buf_ptr = (char *) data.digests_buf;
5611
5612 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5613
5614 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5615 {
5616 uint tt;
5617
5618 switch (hash_type)
5619 {
5620 case HASH_TYPE_DESCRYPT:
5621 FP (digest_buf[1], digest_buf[0], tt);
5622 break;
5623
5624 case HASH_TYPE_DESRACF:
5625 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 29);
5626 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 29);
5627
5628 FP (digest_buf[1], digest_buf[0], tt);
5629 break;
5630
5631 case HASH_TYPE_LM:
5632 FP (digest_buf[1], digest_buf[0], tt);
5633 break;
5634
5635 case HASH_TYPE_NETNTLM:
5636 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 29);
5637 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 29);
5638 digest_buf[2] = ROTATE_LEFT (digest_buf[2], 29);
5639 digest_buf[3] = ROTATE_LEFT (digest_buf[3], 29);
5640
5641 FP (digest_buf[1], digest_buf[0], tt);
5642 FP (digest_buf[3], digest_buf[2], tt);
5643 break;
5644
5645 case HASH_TYPE_BSDICRYPT:
5646 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 31);
5647 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 31);
5648
5649 FP (digest_buf[1], digest_buf[0], tt);
5650 break;
5651 }
5652 }
5653
5654 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5655 {
5656 switch (hash_type)
5657 {
5658 case HASH_TYPE_MD4:
5659 digest_buf[0] += MD4M_A;
5660 digest_buf[1] += MD4M_B;
5661 digest_buf[2] += MD4M_C;
5662 digest_buf[3] += MD4M_D;
5663 break;
5664
5665 case HASH_TYPE_MD5:
5666 digest_buf[0] += MD5M_A;
5667 digest_buf[1] += MD5M_B;
5668 digest_buf[2] += MD5M_C;
5669 digest_buf[3] += MD5M_D;
5670 break;
5671
5672 case HASH_TYPE_SHA1:
5673 digest_buf[0] += SHA1M_A;
5674 digest_buf[1] += SHA1M_B;
5675 digest_buf[2] += SHA1M_C;
5676 digest_buf[3] += SHA1M_D;
5677 digest_buf[4] += SHA1M_E;
5678 break;
5679
5680 case HASH_TYPE_SHA256:
5681 digest_buf[0] += SHA256M_A;
5682 digest_buf[1] += SHA256M_B;
5683 digest_buf[2] += SHA256M_C;
5684 digest_buf[3] += SHA256M_D;
5685 digest_buf[4] += SHA256M_E;
5686 digest_buf[5] += SHA256M_F;
5687 digest_buf[6] += SHA256M_G;
5688 digest_buf[7] += SHA256M_H;
5689 break;
5690
5691 case HASH_TYPE_SHA384:
5692 digest_buf64[0] += SHA384M_A;
5693 digest_buf64[1] += SHA384M_B;
5694 digest_buf64[2] += SHA384M_C;
5695 digest_buf64[3] += SHA384M_D;
5696 digest_buf64[4] += SHA384M_E;
5697 digest_buf64[5] += SHA384M_F;
5698 digest_buf64[6] += 0;
5699 digest_buf64[7] += 0;
5700 break;
5701
5702 case HASH_TYPE_SHA512:
5703 digest_buf64[0] += SHA512M_A;
5704 digest_buf64[1] += SHA512M_B;
5705 digest_buf64[2] += SHA512M_C;
5706 digest_buf64[3] += SHA512M_D;
5707 digest_buf64[4] += SHA512M_E;
5708 digest_buf64[5] += SHA512M_F;
5709 digest_buf64[6] += SHA512M_G;
5710 digest_buf64[7] += SHA512M_H;
5711 break;
5712 }
5713 }
5714
5715 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
5716 {
5717 if (dgst_size == DGST_SIZE_4_2)
5718 {
5719 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5720 }
5721 else if (dgst_size == DGST_SIZE_4_4)
5722 {
5723 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5724 }
5725 else if (dgst_size == DGST_SIZE_4_5)
5726 {
5727 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5728 }
5729 else if (dgst_size == DGST_SIZE_4_6)
5730 {
5731 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5732 }
5733 else if (dgst_size == DGST_SIZE_4_8)
5734 {
5735 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5736 }
5737 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
5738 {
5739 if (hash_type == HASH_TYPE_WHIRLPOOL)
5740 {
5741 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5742 }
5743 else if (hash_type == HASH_TYPE_SHA384)
5744 {
5745 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5746 }
5747 else if (hash_type == HASH_TYPE_SHA512)
5748 {
5749 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5750 }
5751 else if (hash_type == HASH_TYPE_GOST)
5752 {
5753 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5754 }
5755 }
5756 else if (dgst_size == DGST_SIZE_4_64)
5757 {
5758 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5759 }
5760 else if (dgst_size == DGST_SIZE_8_25)
5761 {
5762 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5763 }
5764 }
5765
5766 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
5767 | (data.salt_type == SALT_TYPE_EXTERN)
5768 | (data.salt_type == SALT_TYPE_EMBEDDED));
5769
5770 salt_t salt;
5771
5772 if (isSalted)
5773 {
5774 memset (&salt, 0, sizeof (salt_t));
5775
5776 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
5777
5778 char *ptr = (char *) salt.salt_buf;
5779
5780 uint len = salt.salt_len;
5781
5782 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5783 {
5784 uint tt;
5785
5786 switch (hash_type)
5787 {
5788 case HASH_TYPE_NETNTLM:
5789
5790 salt.salt_buf[0] = ROTATE_RIGHT (salt.salt_buf[0], 3);
5791 salt.salt_buf[1] = ROTATE_RIGHT (salt.salt_buf[1], 3);
5792
5793 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
5794
5795 break;
5796 }
5797 }
5798
5799 if (opts_type & OPTS_TYPE_ST_UNICODE)
5800 {
5801 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5802 {
5803 ptr[i] = ptr[j];
5804 }
5805
5806 len = len / 2;
5807 }
5808
5809 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
5810 {
5811 uint max = salt.salt_len / 4;
5812
5813 if (len % 4) max++;
5814
5815 for (uint i = 0; i < max; i++)
5816 {
5817 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
5818 }
5819 }
5820
5821 if (opts_type & OPTS_TYPE_ST_HEX)
5822 {
5823 char tmp[64];
5824
5825 memset (tmp, 0, sizeof (tmp));
5826
5827 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5828 {
5829 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
5830 }
5831
5832 len = len * 2;
5833
5834 memcpy (ptr, tmp, len);
5835 }
5836
5837 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
5838
5839 memset (ptr + len, 0, memset_size);
5840
5841 salt.salt_len = len;
5842 }
5843
5844 //
5845 // some modes require special encoding
5846 //
5847
5848 uint out_buf_plain[256];
5849 uint out_buf_salt[256];
5850
5851 char tmp_buf[1024];
5852
5853 memset (out_buf_plain, 0, sizeof (out_buf_plain));
5854 memset (out_buf_salt, 0, sizeof (out_buf_salt));
5855
5856 memset (tmp_buf, 0, sizeof (tmp_buf));
5857
5858 char *ptr_plain = (char *) out_buf_plain;
5859 char *ptr_salt = (char *) out_buf_salt;
5860
5861 if (hash_mode == 22)
5862 {
5863 char username[30];
5864
5865 memset (username, 0, sizeof (username));
5866
5867 memcpy (username, salt.salt_buf, salt.salt_len - 22);
5868
5869 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
5870
5871 uint16_t *ptr = (uint16_t *) digest_buf;
5872
5873 tmp_buf[ 0] = sig[0];
5874 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
5875 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
5876 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
5877 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
5878 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
5879 tmp_buf[ 6] = sig[1];
5880 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
5881 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
5882 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
5883 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
5884 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
5885 tmp_buf[12] = sig[2];
5886 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
5887 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
5888 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
5889 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
5890 tmp_buf[17] = sig[3];
5891 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
5892 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
5893 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
5894 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
5895 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
5896 tmp_buf[23] = sig[4];
5897 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
5898 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
5899 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
5900 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
5901 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
5902 tmp_buf[29] = sig[5];
5903
5904 snprintf (out_buf, len-1, "%s:%s",
5905 tmp_buf,
5906 username);
5907 }
5908 else if (hash_mode == 23)
5909 {
5910 // do not show the \nskyper\n part in output
5911
5912 char *salt_buf_ptr = (char *) salt.salt_buf;
5913
5914 salt_buf_ptr[salt.salt_len - 8] = 0;
5915
5916 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
5917 digest_buf[0],
5918 digest_buf[1],
5919 digest_buf[2],
5920 digest_buf[3],
5921 salt_buf_ptr);
5922 }
5923 else if (hash_mode == 101)
5924 {
5925 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
5926
5927 digest_buf[0] = byte_swap_32 (digest_buf[0]);
5928 digest_buf[1] = byte_swap_32 (digest_buf[1]);
5929 digest_buf[2] = byte_swap_32 (digest_buf[2]);
5930 digest_buf[3] = byte_swap_32 (digest_buf[3]);
5931 digest_buf[4] = byte_swap_32 (digest_buf[4]);
5932
5933 memcpy (tmp_buf, digest_buf, 20);
5934
5935 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
5936
5937 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
5938 }
5939 else if (hash_mode == 111)
5940 {
5941 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
5942
5943 digest_buf[0] = byte_swap_32 (digest_buf[0]);
5944 digest_buf[1] = byte_swap_32 (digest_buf[1]);
5945 digest_buf[2] = byte_swap_32 (digest_buf[2]);
5946 digest_buf[3] = byte_swap_32 (digest_buf[3]);
5947 digest_buf[4] = byte_swap_32 (digest_buf[4]);
5948
5949 memcpy (tmp_buf, digest_buf, 20);
5950 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
5951
5952 base64_encode (int_to_base64, tmp_buf, 20 + salt.salt_len, ptr_plain);
5953
5954 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
5955 }
5956 else if (hash_mode == 122)
5957 {
5958 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
5959 (unsigned char *) salt.salt_buf,
5960 digest_buf[0],
5961 digest_buf[1],
5962 digest_buf[2],
5963 digest_buf[3],
5964 digest_buf[4]);
5965 }
5966 else if (hash_mode == 124)
5967 {
5968 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
5969 (unsigned char *) salt.salt_buf,
5970 digest_buf[0],
5971 digest_buf[1],
5972 digest_buf[2],
5973 digest_buf[3],
5974 digest_buf[4]);
5975 }
5976 else if (hash_mode == 131)
5977 {
5978 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
5979 (unsigned char *) salt.salt_buf,
5980 0, 0, 0, 0, 0,
5981 digest_buf[0],
5982 digest_buf[1],
5983 digest_buf[2],
5984 digest_buf[3],
5985 digest_buf[4]);
5986 }
5987 else if (hash_mode == 132)
5988 {
5989 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
5990 (unsigned char *) salt.salt_buf,
5991 digest_buf[0],
5992 digest_buf[1],
5993 digest_buf[2],
5994 digest_buf[3],
5995 digest_buf[4]);
5996 }
5997 else if (hash_mode == 133)
5998 {
5999 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6000
6001 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6002 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6003 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6004 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6005 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6006
6007 memcpy (tmp_buf, digest_buf, 20);
6008
6009 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
6010
6011 snprintf (out_buf, len-1, "%s", ptr_plain);
6012 }
6013 else if (hash_mode == 141)
6014 {
6015 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6016
6017 base64_encode (int_to_base64, tmp_buf, salt.salt_len, ptr_salt);
6018
6019 memset (tmp_buf, 0, sizeof (tmp_buf));
6020
6021 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6022
6023 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6024 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6025 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6026 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6027 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6028
6029 memcpy (tmp_buf, digest_buf, 20);
6030
6031 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
6032
6033 ptr_plain[27] = 0;
6034
6035 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6036 }
6037 else if (hash_mode == 400)
6038 {
6039 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6040
6041 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6042 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6043 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6044 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6045
6046 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6047
6048 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6049 }
6050 else if (hash_mode == 500)
6051 {
6052 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6053
6054 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6055 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6056 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6057 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6058
6059 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6060
6061 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6062 {
6063 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6064 }
6065 else
6066 {
6067 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6068 }
6069 }
6070 else if (hash_mode == 501)
6071 {
6072 uint digest_idx = salt.digests_offset + digest_pos;
6073
6074 hashinfo_t **hashinfo_ptr = data.hash_info;
6075 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6076
6077 snprintf (out_buf, len-1, "%s", hash_buf);
6078 }
6079 else if (hash_mode == 1421)
6080 {
6081 uint8_t *salt_ptr = (uint8_t *) salt.salt_buf;
6082
6083 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6084 salt_ptr[0],
6085 salt_ptr[1],
6086 salt_ptr[2],
6087 salt_ptr[3],
6088 salt_ptr[4],
6089 salt_ptr[5],
6090 digest_buf[0],
6091 digest_buf[1],
6092 digest_buf[2],
6093 digest_buf[3],
6094 digest_buf[4],
6095 digest_buf[5],
6096 digest_buf[6],
6097 digest_buf[7]);
6098 }
6099 else if (hash_mode == 1441)
6100 {
6101 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6102
6103 base64_encode (int_to_base64, tmp_buf, salt.salt_len, ptr_salt);
6104
6105 memset (tmp_buf, 0, sizeof (tmp_buf));
6106
6107 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6108
6109 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6110 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6111 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6112 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6113 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6114 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6115 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6116 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6117
6118 memcpy (tmp_buf, digest_buf, 32);
6119
6120 base64_encode (int_to_base64, tmp_buf, 32, ptr_plain);
6121
6122 ptr_plain[43] = 0;
6123
6124 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6125 }
6126 else if (hash_mode == 1500)
6127 {
6128 out_buf[0] = salt.salt_sign[0] & 0xff;
6129 out_buf[1] = salt.salt_sign[1] & 0xff;
6130 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6131 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6132 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6133
6134 memset (tmp_buf, 0, sizeof (tmp_buf));
6135
6136 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6137
6138 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6139 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6140
6141 memcpy (tmp_buf, digest_buf, 8);
6142
6143 base64_encode (int_to_itoa64, tmp_buf, 8, ptr_plain);
6144
6145 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6146
6147 out_buf[13] = 0;
6148 }
6149 else if (hash_mode == 1600)
6150 {
6151 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6152
6153 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6154 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6155 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6156 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6157
6158 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6159
6160 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6161 {
6162 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6163 }
6164 else
6165 {
6166 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6167 }
6168 }
6169 else if (hash_mode == 1711)
6170 {
6171 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6172
6173 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6174 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6175 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6176 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6177 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6178 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6179 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6180 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6181
6182 memcpy (tmp_buf, digest_buf, 64);
6183 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6184
6185 base64_encode (int_to_base64, tmp_buf, 64 + salt.salt_len, ptr_plain);
6186
6187 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6188 }
6189 else if (hash_mode == 1722)
6190 {
6191 uint *ptr = digest_buf;
6192
6193 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6194 (unsigned char *) salt.salt_buf,
6195 ptr[ 1], ptr[ 0],
6196 ptr[ 3], ptr[ 2],
6197 ptr[ 5], ptr[ 4],
6198 ptr[ 7], ptr[ 6],
6199 ptr[ 9], ptr[ 8],
6200 ptr[11], ptr[10],
6201 ptr[13], ptr[12],
6202 ptr[15], ptr[14]);
6203 }
6204 else if (hash_mode == 1731)
6205 {
6206 uint *ptr = digest_buf;
6207
6208 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6209 (unsigned char *) salt.salt_buf,
6210 ptr[ 1], ptr[ 0],
6211 ptr[ 3], ptr[ 2],
6212 ptr[ 5], ptr[ 4],
6213 ptr[ 7], ptr[ 6],
6214 ptr[ 9], ptr[ 8],
6215 ptr[11], ptr[10],
6216 ptr[13], ptr[12],
6217 ptr[15], ptr[14]);
6218 }
6219 else if (hash_mode == 1800)
6220 {
6221 // temp workaround
6222
6223 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6224 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6225 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6226 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6227 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6228 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6229 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6230 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6231
6232 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6233
6234 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6235 {
6236 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6237 }
6238 else
6239 {
6240 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6241 }
6242 }
6243 else if (hash_mode == 2100)
6244 {
6245 uint pos = 0;
6246
6247 snprintf (out_buf + pos, len-1, "%s%i#",
6248 SIGNATURE_DCC2,
6249 salt.salt_iter + 1);
6250
6251 uint signature_len = strlen (out_buf);
6252
6253 pos += signature_len;
6254 len -= signature_len;
6255
6256 char *salt_ptr = (char *) salt.salt_buf;
6257
6258 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6259
6260 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6261 byte_swap_32 (digest_buf[0]),
6262 byte_swap_32 (digest_buf[1]),
6263 byte_swap_32 (digest_buf[2]),
6264 byte_swap_32 (digest_buf[3]));
6265 }
6266 else if ((hash_mode == 2400) || (hash_mode == 2410))
6267 {
6268 memcpy (tmp_buf, digest_buf, 16);
6269
6270 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6271
6272 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6273 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6274 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6275 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6276
6277 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6278 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6279 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6280 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6281
6282 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6283 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6284 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6285 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6286
6287 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6288 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6289 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6290 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6291
6292 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6293 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6294 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6295 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6296
6297 out_buf[16] = 0;
6298 }
6299 else if (hash_mode == 2500)
6300 {
6301 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6302
6303 wpa_t *wpa = &wpas[salt_pos];
6304
6305 uint pke[25];
6306
6307 char *pke_ptr = (char *) pke;
6308
6309 for (uint i = 0; i < 25; i++)
6310 {
6311 pke[i] = byte_swap_32 (wpa->pke[i]);
6312 }
6313
6314 unsigned char mac1[6];
6315 unsigned char mac2[6];
6316
6317 memcpy (mac1, pke_ptr + 23, 6);
6318 memcpy (mac2, pke_ptr + 29, 6);
6319
6320 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6321 (char *) salt.salt_buf,
6322 mac1[0],
6323 mac1[1],
6324 mac1[2],
6325 mac1[3],
6326 mac1[4],
6327 mac1[5],
6328 mac2[0],
6329 mac2[1],
6330 mac2[2],
6331 mac2[3],
6332 mac2[4],
6333 mac2[5]);
6334 }
6335 else if (hash_mode == 4400)
6336 {
6337 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6338 byte_swap_32 (digest_buf[0]),
6339 byte_swap_32 (digest_buf[1]),
6340 byte_swap_32 (digest_buf[2]),
6341 byte_swap_32 (digest_buf[3]));
6342 }
6343 else if (hash_mode == 4700)
6344 {
6345 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6346 byte_swap_32 (digest_buf[0]),
6347 byte_swap_32 (digest_buf[1]),
6348 byte_swap_32 (digest_buf[2]),
6349 byte_swap_32 (digest_buf[3]),
6350 byte_swap_32 (digest_buf[4]));
6351 }
6352 else if (hash_mode == 4800)
6353 {
6354 uint8_t chap_id_byte = (uint8_t) salt.salt_buf[4];
6355
6356 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6357 digest_buf[0],
6358 digest_buf[1],
6359 digest_buf[2],
6360 digest_buf[3],
6361 byte_swap_32 (salt.salt_buf[0]),
6362 byte_swap_32 (salt.salt_buf[1]),
6363 byte_swap_32 (salt.salt_buf[2]),
6364 byte_swap_32 (salt.salt_buf[3]),
6365 chap_id_byte);
6366 }
6367 else if (hash_mode == 4900)
6368 {
6369 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6370 byte_swap_32 (digest_buf[0]),
6371 byte_swap_32 (digest_buf[1]),
6372 byte_swap_32 (digest_buf[2]),
6373 byte_swap_32 (digest_buf[3]),
6374 byte_swap_32 (digest_buf[4]));
6375 }
6376 else if (hash_mode == 5100)
6377 {
6378 snprintf (out_buf, len-1, "%08x%08x",
6379 digest_buf[0],
6380 digest_buf[1]);
6381 }
6382 else if (hash_mode == 5200)
6383 {
6384 snprintf (out_buf, len-1, "%s", hashfile);
6385 }
6386 else if (hash_mode == 5300)
6387 {
6388 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6389
6390 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6391
6392 int buf_len = len -1;
6393
6394 // msg_buf
6395
6396 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6397
6398 for (uint i = 0; i < ikepsk_msg_len; i++)
6399 {
6400 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6401 {
6402 snprintf (out_buf, buf_len, ":");
6403
6404 buf_len--;
6405 out_buf++;
6406 }
6407
6408 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6409
6410 buf_len -= 8;
6411 out_buf += 8;
6412 }
6413
6414 // nr_buf
6415
6416 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6417
6418 for (uint i = 0; i < ikepsk_nr_len; i++)
6419 {
6420 if ((i == 0) || (i == 5))
6421 {
6422 snprintf (out_buf, buf_len, ":");
6423
6424 buf_len--;
6425 out_buf++;
6426 }
6427
6428 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6429
6430 buf_len -= 8;
6431 out_buf += 8;
6432 }
6433
6434 // digest_buf
6435
6436 for (uint i = 0; i < 4; i++)
6437 {
6438 if (i == 0)
6439 {
6440 snprintf (out_buf, buf_len, ":");
6441
6442 buf_len--;
6443 out_buf++;
6444 }
6445
6446 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6447
6448 buf_len -= 8;
6449 out_buf += 8;
6450 }
6451 }
6452 else if (hash_mode == 5400)
6453 {
6454 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6455
6456 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6457
6458 int buf_len = len -1;
6459
6460 // msg_buf
6461
6462 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6463
6464 for (uint i = 0; i < ikepsk_msg_len; i++)
6465 {
6466 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
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->msg_buf[i]));
6475
6476 buf_len -= 8;
6477 out_buf += 8;
6478 }
6479
6480 // nr_buf
6481
6482 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6483
6484 for (uint i = 0; i < ikepsk_nr_len; i++)
6485 {
6486 if ((i == 0) || (i == 5))
6487 {
6488 snprintf (out_buf, buf_len, ":");
6489
6490 buf_len--;
6491 out_buf++;
6492 }
6493
6494 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6495
6496 buf_len -= 8;
6497 out_buf += 8;
6498 }
6499
6500 // digest_buf
6501
6502 for (uint i = 0; i < 5; i++)
6503 {
6504 if (i == 0)
6505 {
6506 snprintf (out_buf, buf_len, ":");
6507
6508 buf_len--;
6509 out_buf++;
6510 }
6511
6512 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6513
6514 buf_len -= 8;
6515 out_buf += 8;
6516 }
6517 }
6518 else if (hash_mode == 5500)
6519 {
6520 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6521
6522 netntlm_t *netntlm = &netntlms[salt_pos];
6523
6524 char user_buf[64];
6525 char domain_buf[64];
6526 char srvchall_buf[1024];
6527 char clichall_buf[1024];
6528
6529 memset (user_buf, 0, sizeof (user_buf));
6530 memset (domain_buf, 0, sizeof (domain_buf));
6531 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6532 memset (clichall_buf, 0, sizeof (clichall_buf));
6533
6534 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6535 {
6536 char *ptr = (char *) netntlm->userdomain_buf;
6537
6538 user_buf[i] = ptr[j];
6539 }
6540
6541 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6542 {
6543 char *ptr = (char *) netntlm->userdomain_buf;
6544
6545 domain_buf[i] = ptr[netntlm->user_len + j];
6546 }
6547
6548 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6549 {
6550 char *ptr = (char *) netntlm->chall_buf;
6551
6552 sprintf (srvchall_buf + j, "%02x", (uint8_t) ptr[i]);
6553 }
6554
6555 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6556 {
6557 char *ptr = (char *) netntlm->chall_buf;
6558
6559 sprintf (clichall_buf + j, "%02x", (uint8_t) ptr[netntlm->srvchall_len + i]);
6560 }
6561
6562 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6563 user_buf,
6564 domain_buf,
6565 srvchall_buf,
6566 digest_buf[0],
6567 digest_buf[1],
6568 digest_buf[2],
6569 digest_buf[3],
6570 byte_swap_32 (salt.salt_buf_pc[0]),
6571 byte_swap_32 (salt.salt_buf_pc[1]),
6572 clichall_buf);
6573 }
6574 else if (hash_mode == 5600)
6575 {
6576 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6577
6578 netntlm_t *netntlm = &netntlms[salt_pos];
6579
6580 char user_buf[64];
6581 char domain_buf[64];
6582 char srvchall_buf[1024];
6583 char clichall_buf[1024];
6584
6585 memset (user_buf, 0, sizeof (user_buf));
6586 memset (domain_buf, 0, sizeof (domain_buf));
6587 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6588 memset (clichall_buf, 0, sizeof (clichall_buf));
6589
6590 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6591 {
6592 char *ptr = (char *) netntlm->userdomain_buf;
6593
6594 user_buf[i] = ptr[j];
6595 }
6596
6597 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6598 {
6599 char *ptr = (char *) netntlm->userdomain_buf;
6600
6601 domain_buf[i] = ptr[netntlm->user_len + j];
6602 }
6603
6604 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6605 {
6606 char *ptr = (char *) netntlm->chall_buf;
6607
6608 sprintf (srvchall_buf + j, "%02x", (uint8_t) ptr[i]);
6609 }
6610
6611 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6612 {
6613 char *ptr = (char *) netntlm->chall_buf;
6614
6615 sprintf (clichall_buf + j, "%02x", (uint8_t) ptr[netntlm->srvchall_len + i]);
6616 }
6617
6618 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6619 user_buf,
6620 domain_buf,
6621 srvchall_buf,
6622 digest_buf[0],
6623 digest_buf[1],
6624 digest_buf[2],
6625 digest_buf[3],
6626 clichall_buf);
6627 }
6628 else if (hash_mode == 5700)
6629 {
6630 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6631
6632 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6633 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6634 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6635 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6636 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6637 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6638 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6639 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6640
6641 memcpy (tmp_buf, digest_buf, 32);
6642
6643 base64_encode (int_to_itoa64, tmp_buf, 32, ptr_plain);
6644
6645 ptr_plain[43] = 0;
6646
6647 snprintf (out_buf, len-1, "%s", ptr_plain);
6648 }
6649 else if (hash_mode == 5800)
6650 {
6651 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6652 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6653 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6654 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6655 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6656
6657 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6658 digest_buf[0],
6659 digest_buf[1],
6660 digest_buf[2],
6661 digest_buf[3],
6662 digest_buf[4]);
6663 }
6664 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6665 {
6666 snprintf (out_buf, len-1, "%s", hashfile);
6667 }
6668 else if (hash_mode == 6300)
6669 {
6670 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6671
6672 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6673 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6674 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6675 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6676
6677 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6678
6679 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6680 }
6681 else if (hash_mode == 6400)
6682 {
6683 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6684
6685 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6686 }
6687 else if (hash_mode == 6500)
6688 {
6689 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6690
6691 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6692 }
6693 else if (hash_mode == 6600)
6694 {
6695 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6696
6697 agilekey_t *agilekey = &agilekeys[salt_pos];
6698
6699 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6700 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6701
6702 uint buf_len = len - 1;
6703
6704 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6705 buf_len -= 22;
6706
6707 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6708 {
6709 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6710
6711 buf_len -= 2;
6712 }
6713 }
6714 else if (hash_mode == 6700)
6715 {
6716 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6717
6718 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6719 }
6720 else if (hash_mode == 6800)
6721 {
6722 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6723 }
6724 else if (hash_mode == 7100)
6725 {
6726 uint *ptr = digest_buf;
6727
6728 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6729
6730 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6731
6732 uint esalt[16];
6733
6734 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6735 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6736 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6737 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6738 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6739 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6740 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6741 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6742
6743 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",
6744 SIGNATURE_SHA512OSX,
6745 salt.salt_iter + 1,
6746 esalt[ 0], esalt[ 1],
6747 esalt[ 2], esalt[ 3],
6748 esalt[ 4], esalt[ 5],
6749 esalt[ 6], esalt[ 7],
6750 ptr [ 1], ptr [ 0],
6751 ptr [ 3], ptr [ 2],
6752 ptr [ 5], ptr [ 4],
6753 ptr [ 7], ptr [ 6],
6754 ptr [ 9], ptr [ 8],
6755 ptr [11], ptr [10],
6756 ptr [13], ptr [12],
6757 ptr [15], ptr [14]);
6758 }
6759 else if (hash_mode == 7200)
6760 {
6761 uint *ptr = digest_buf;
6762
6763 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6764
6765 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6766
6767 uint len_used = 0;
6768
6769 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
6770
6771 len_used = strlen (out_buf);
6772
6773 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
6774
6775 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
6776 {
6777 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
6778 }
6779
6780 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",
6781 ptr [ 1], ptr [ 0],
6782 ptr [ 3], ptr [ 2],
6783 ptr [ 5], ptr [ 4],
6784 ptr [ 7], ptr [ 6],
6785 ptr [ 9], ptr [ 8],
6786 ptr [11], ptr [10],
6787 ptr [13], ptr [12],
6788 ptr [15], ptr [14]);
6789 }
6790 else if (hash_mode == 7300)
6791 {
6792 rakp_t *rakps = (rakp_t *) data.esalts_buf;
6793
6794 rakp_t *rakp = &rakps[salt_pos];
6795
6796 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
6797 {
6798 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
6799 }
6800
6801 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
6802 digest_buf[0],
6803 digest_buf[1],
6804 digest_buf[2],
6805 digest_buf[3],
6806 digest_buf[4]);
6807 }
6808 else if (hash_mode == 7400)
6809 {
6810 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6811
6812 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6813 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6814 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6815 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6816 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6817 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6818 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6819 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6820
6821 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6822
6823 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
6824 {
6825 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6826 }
6827 else
6828 {
6829 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6830 }
6831 }
6832 else if (hash_mode == 7500)
6833 {
6834 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
6835
6836 krb5pa_t *krb5pa = &krb5pas[salt_pos];
6837
6838 uint8_t *ptr_timestamp = (uint8_t *) krb5pa->timestamp;
6839 uint8_t *ptr_checksum = (uint8_t *) krb5pa->checksum;
6840
6841 char data[128];
6842
6843 char *ptr_data = data;
6844
6845 for (uint i = 0; i < 36; i++, ptr_data += 2)
6846 {
6847 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
6848 }
6849
6850 for (uint i = 0; i < 16; i++, ptr_data += 2)
6851 {
6852 sprintf (ptr_data, "%02x", ptr_checksum[i]);
6853 }
6854
6855 *ptr_data = 0;
6856
6857 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
6858 SIGNATURE_KRB5PA,
6859 (char *) krb5pa->user,
6860 (char *) krb5pa->realm,
6861 (char *) krb5pa->salt,
6862 data);
6863 }
6864 else if (hash_mode == 7700)
6865 {
6866 snprintf (out_buf, len-1, "%s$%08X%08X",
6867 (char *) salt.salt_buf,
6868 digest_buf[0],
6869 digest_buf[1]);
6870 }
6871 else if (hash_mode == 7800)
6872 {
6873 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
6874 (char *) salt.salt_buf,
6875 digest_buf[0],
6876 digest_buf[1],
6877 digest_buf[2],
6878 digest_buf[3],
6879 digest_buf[4]);
6880 }
6881 else if (hash_mode == 7900)
6882 {
6883 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6884
6885 // ugly hack start
6886
6887 char *tmp = (char *) salt.salt_buf_pc;
6888
6889 ptr_plain[42] = tmp[0];
6890
6891 // ugly hack end
6892
6893 ptr_plain[43] = 0;
6894
6895 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6896 }
6897 else if (hash_mode == 8000)
6898 {
6899 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
6900 (unsigned char *) salt.salt_buf,
6901 digest_buf[0],
6902 digest_buf[1],
6903 digest_buf[2],
6904 digest_buf[3],
6905 digest_buf[4],
6906 digest_buf[5],
6907 digest_buf[6],
6908 digest_buf[7]);
6909 }
6910 else if (hash_mode == 8100)
6911 {
6912 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6913 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6914
6915 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
6916 (unsigned char *) salt.salt_buf,
6917 digest_buf[0],
6918 digest_buf[1],
6919 digest_buf[2],
6920 digest_buf[3],
6921 digest_buf[4]);
6922 }
6923 else if (hash_mode == 8200)
6924 {
6925 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
6926
6927 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
6928
6929 char data_buf[4096];
6930
6931 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
6932 {
6933 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
6934 }
6935
6936 data_buf[cloudkey->data_len * 2] = 0;
6937
6938 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6939 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6940 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6941 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6942 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6943 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6944 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6945 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6946
6947 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6948 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6949 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
6950 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
6951
6952 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
6953 digest_buf[0],
6954 digest_buf[1],
6955 digest_buf[2],
6956 digest_buf[3],
6957 digest_buf[4],
6958 digest_buf[5],
6959 digest_buf[6],
6960 digest_buf[7],
6961 salt.salt_buf[0],
6962 salt.salt_buf[1],
6963 salt.salt_buf[2],
6964 salt.salt_buf[3],
6965 salt.salt_iter + 1,
6966 data_buf);
6967 }
6968 else if (hash_mode == 8300)
6969 {
6970 // todo
6971
6972 char digest_buf_c[33];
6973
6974 base32_encode (int_to_itoa32, (char *) digest_buf, 32, digest_buf_c);
6975
6976 digest_buf_c[32] = 0;
6977
6978 // domain
6979
6980 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
6981
6982 char domain_buf_c[33];
6983
6984 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
6985
6986 for (uint i = 0; i < salt_pc_len; i++)
6987 {
6988 const char next = domain_buf_c[i];
6989
6990 domain_buf_c[i] = '.';
6991
6992 i += next;
6993 }
6994
6995 domain_buf_c[salt_pc_len] = 0;
6996
6997 // final
6998
6999 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7000 }
7001 else if (hash_mode == 8500)
7002 {
7003 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7004 }
7005 else if (hash_mode == 2612)
7006 {
7007 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7008 SIGNATURE_PHPS,
7009 (char *) salt.salt_buf,
7010 digest_buf[0],
7011 digest_buf[1],
7012 digest_buf[2],
7013 digest_buf[3]);
7014 }
7015 else if (hash_mode == 3711)
7016 {
7017 char *salt_ptr = (char *) salt.salt_buf;
7018
7019 salt_ptr[salt.salt_len - 1] = 0;
7020
7021 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7022 SIGNATURE_MEDIAWIKI_B,
7023 salt_ptr,
7024 digest_buf[0],
7025 digest_buf[1],
7026 digest_buf[2],
7027 digest_buf[3]);
7028 }
7029 else if (hash_mode == 8800)
7030 {
7031 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7032
7033 androidfde_t *androidfde = &androidfdes[salt_pos];
7034
7035 char tmp[3073];
7036
7037 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7038 {
7039 sprintf (tmp + j, "%08x", androidfde->data[i]);
7040 }
7041
7042 tmp[3072] = 0;
7043
7044 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7045 SIGNATURE_ANDROIDFDE,
7046 byte_swap_32 (salt.salt_buf[0]),
7047 byte_swap_32 (salt.salt_buf[1]),
7048 byte_swap_32 (salt.salt_buf[2]),
7049 byte_swap_32 (salt.salt_buf[3]),
7050 byte_swap_32 (digest_buf[0]),
7051 byte_swap_32 (digest_buf[1]),
7052 byte_swap_32 (digest_buf[2]),
7053 byte_swap_32 (digest_buf[3]),
7054 tmp);
7055 }
7056 else if (hash_mode == 8900)
7057 {
7058 uint N = salt.scrypt_N;
7059 uint r = salt.scrypt_r;
7060 uint p = salt.scrypt_p;
7061
7062 char base64_salt[32];
7063
7064 memset (base64_salt, 0, 32);
7065
7066 base64_encode (int_to_base64, (char *) salt.salt_buf, salt.salt_len, base64_salt + 0);
7067
7068 memset (tmp_buf, 0, 46);
7069
7070 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7071 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7072 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7073 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7074 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7075 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7076 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7077 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7078 digest_buf[8] = 0; // needed for base64_encode ()
7079
7080 base64_encode (int_to_base64, (char *) digest_buf, 32, tmp_buf + 0);
7081
7082 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7083 SIGNATURE_SCRYPT,
7084 N,
7085 r,
7086 p,
7087 base64_salt,
7088 tmp_buf);
7089 }
7090 else if (hash_mode == 9000)
7091 {
7092 snprintf (out_buf, len-1, "%s", hashfile);
7093 }
7094 else if (hash_mode == 9200)
7095 {
7096 // salt
7097
7098 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7099
7100 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7101
7102 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7103
7104 // hash
7105
7106 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7107 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7108 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7109 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7110 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7111 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7112 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7113 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7114 digest_buf[8] = 0; // needed for base64_encode ()
7115
7116 char tmp_buf[64];
7117 memset (tmp_buf, 0, sizeof (tmp_buf));
7118
7119 base64_encode (int_to_itoa64, (char *) digest_buf, 32, tmp_buf);
7120 tmp_buf[43] = 0; // cut it here
7121
7122 // output
7123
7124 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7125 }
7126 else if (hash_mode == 9300)
7127 {
7128 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7129 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7130 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7131 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7132 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7133 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7134 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7135 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7136 digest_buf[8] = 0; // needed for base64_encode ()
7137
7138 char tmp_buf[64];
7139 memset (tmp_buf, 0, sizeof (tmp_buf));
7140
7141 base64_encode (int_to_itoa64, (char *) digest_buf, 32, tmp_buf);
7142 tmp_buf[43] = 0; // cut it here
7143
7144 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7145
7146 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7147 }
7148 else if (hash_mode == 9400)
7149 {
7150 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7151
7152 office2007_t *office2007 = &office2007s[salt_pos];
7153
7154 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7155 SIGNATURE_OFFICE2007,
7156 2007,
7157 20,
7158 office2007->keySize,
7159 16,
7160 salt.salt_buf[0],
7161 salt.salt_buf[1],
7162 salt.salt_buf[2],
7163 salt.salt_buf[3],
7164 office2007->encryptedVerifier[0],
7165 office2007->encryptedVerifier[1],
7166 office2007->encryptedVerifier[2],
7167 office2007->encryptedVerifier[3],
7168 office2007->encryptedVerifierHash[0],
7169 office2007->encryptedVerifierHash[1],
7170 office2007->encryptedVerifierHash[2],
7171 office2007->encryptedVerifierHash[3],
7172 office2007->encryptedVerifierHash[4]);
7173 }
7174 else if (hash_mode == 9500)
7175 {
7176 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7177
7178 office2010_t *office2010 = &office2010s[salt_pos];
7179
7180 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,
7181
7182 salt.salt_buf[0],
7183 salt.salt_buf[1],
7184 salt.salt_buf[2],
7185 salt.salt_buf[3],
7186 office2010->encryptedVerifier[0],
7187 office2010->encryptedVerifier[1],
7188 office2010->encryptedVerifier[2],
7189 office2010->encryptedVerifier[3],
7190 office2010->encryptedVerifierHash[0],
7191 office2010->encryptedVerifierHash[1],
7192 office2010->encryptedVerifierHash[2],
7193 office2010->encryptedVerifierHash[3],
7194 office2010->encryptedVerifierHash[4],
7195 office2010->encryptedVerifierHash[5],
7196 office2010->encryptedVerifierHash[6],
7197 office2010->encryptedVerifierHash[7]);
7198 }
7199 else if (hash_mode == 9600)
7200 {
7201 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7202
7203 office2013_t *office2013 = &office2013s[salt_pos];
7204
7205 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,
7206
7207 salt.salt_buf[0],
7208 salt.salt_buf[1],
7209 salt.salt_buf[2],
7210 salt.salt_buf[3],
7211 office2013->encryptedVerifier[0],
7212 office2013->encryptedVerifier[1],
7213 office2013->encryptedVerifier[2],
7214 office2013->encryptedVerifier[3],
7215 office2013->encryptedVerifierHash[0],
7216 office2013->encryptedVerifierHash[1],
7217 office2013->encryptedVerifierHash[2],
7218 office2013->encryptedVerifierHash[3],
7219 office2013->encryptedVerifierHash[4],
7220 office2013->encryptedVerifierHash[5],
7221 office2013->encryptedVerifierHash[6],
7222 office2013->encryptedVerifierHash[7]);
7223 }
7224 else if (hash_mode == 9700)
7225 {
7226 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7227
7228 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7229
7230 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7231 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7232 byte_swap_32 (salt.salt_buf[0]),
7233 byte_swap_32 (salt.salt_buf[1]),
7234 byte_swap_32 (salt.salt_buf[2]),
7235 byte_swap_32 (salt.salt_buf[3]),
7236 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7237 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7238 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7239 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7240 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7241 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7242 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7243 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7244 }
7245 else if (hash_mode == 9710)
7246 {
7247 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7248
7249 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7250
7251 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7252 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7253 byte_swap_32 (salt.salt_buf[0]),
7254 byte_swap_32 (salt.salt_buf[1]),
7255 byte_swap_32 (salt.salt_buf[2]),
7256 byte_swap_32 (salt.salt_buf[3]),
7257 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7258 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7259 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7260 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7261 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7262 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7263 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7264 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7265 }
7266 else if (hash_mode == 9720)
7267 {
7268 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7269
7270 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7271
7272 uint8_t *rc4key = (uint8_t *) oldoffice01->rc4key;
7273
7274 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7275 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7276 byte_swap_32 (salt.salt_buf[0]),
7277 byte_swap_32 (salt.salt_buf[1]),
7278 byte_swap_32 (salt.salt_buf[2]),
7279 byte_swap_32 (salt.salt_buf[3]),
7280 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7281 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7282 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7283 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7284 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7285 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7286 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7287 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7288 rc4key[0],
7289 rc4key[1],
7290 rc4key[2],
7291 rc4key[3],
7292 rc4key[4]);
7293 }
7294 else if (hash_mode == 9800)
7295 {
7296 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7297
7298 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7299
7300 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7301 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7302 salt.salt_buf[0],
7303 salt.salt_buf[1],
7304 salt.salt_buf[2],
7305 salt.salt_buf[3],
7306 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7307 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7308 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7309 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7310 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7311 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7312 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7313 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7314 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7315 }
7316 else if (hash_mode == 9810)
7317 {
7318 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7319
7320 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7321
7322 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7323 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7324 salt.salt_buf[0],
7325 salt.salt_buf[1],
7326 salt.salt_buf[2],
7327 salt.salt_buf[3],
7328 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7329 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7330 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7331 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7332 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7333 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7334 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7335 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7336 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7337 }
7338 else if (hash_mode == 9820)
7339 {
7340 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7341
7342 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7343
7344 uint8_t *rc4key = (uint8_t *) oldoffice34->rc4key;
7345
7346 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
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 rc4key[0],
7362 rc4key[1],
7363 rc4key[2],
7364 rc4key[3],
7365 rc4key[4]);
7366 }
7367 else if (hash_mode == 10000)
7368 {
7369 // salt
7370
7371 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7372
7373 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7374
7375 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7376
7377 // hash
7378
7379 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7380 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7381 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7382 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7383 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7384 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7385 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7386 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7387 digest_buf[8] = 0; // needed for base64_encode ()
7388
7389 char tmp_buf[64];
7390 memset (tmp_buf, 0, sizeof (tmp_buf));
7391
7392 base64_encode (int_to_base64, (char *) digest_buf, 32, tmp_buf);
7393
7394 // output
7395
7396 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7397 }
7398 else if (hash_mode == 10100)
7399 {
7400 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7401 digest_buf[0],
7402 digest_buf[1],
7403 2,
7404 4,
7405 byte_swap_32 (salt.salt_buf[0]),
7406 byte_swap_32 (salt.salt_buf[1]),
7407 byte_swap_32 (salt.salt_buf[2]),
7408 byte_swap_32 (salt.salt_buf[3]));
7409 }
7410 else if (hash_mode == 10200)
7411 {
7412 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7413
7414 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7415
7416 // challenge
7417
7418 char challenge[100];
7419
7420 memset (challenge, 0, sizeof (challenge));
7421
7422 base64_encode (int_to_base64, (char *) salt.salt_buf, salt.salt_len, challenge);
7423
7424 // response
7425
7426 char tmp_buf[100];
7427
7428 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7429 (char *) cram_md5->user,
7430 digest_buf[0],
7431 digest_buf[1],
7432 digest_buf[2],
7433 digest_buf[3]);
7434
7435 char response[100];
7436
7437 memset (response, 0, sizeof (response));
7438
7439 base64_encode (int_to_base64, (char *) tmp_buf, tmp_len, response);
7440
7441 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7442 }
7443 else if (hash_mode == 10300)
7444 {
7445 char tmp_buf[100];
7446
7447 memset (tmp_buf, 0, sizeof (tmp_buf));
7448
7449 memcpy (tmp_buf + 0, digest_buf, 20);
7450 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7451
7452 uint tmp_len = 20 + salt.salt_len;
7453
7454 // base64 encode it
7455
7456 char base64_encoded[100];
7457
7458 memset (base64_encoded, 0, sizeof (base64_encoded));
7459
7460 base64_encode (int_to_base64, (char *) tmp_buf, tmp_len, base64_encoded);
7461
7462 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7463 }
7464 else if (hash_mode == 10400)
7465 {
7466 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7467
7468 pdf_t *pdf = &pdfs[salt_pos];
7469
7470 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",
7471
7472 pdf->V,
7473 pdf->R,
7474 40,
7475 pdf->P,
7476 pdf->enc_md,
7477 pdf->id_len,
7478 byte_swap_32 (pdf->id_buf[0]),
7479 byte_swap_32 (pdf->id_buf[1]),
7480 byte_swap_32 (pdf->id_buf[2]),
7481 byte_swap_32 (pdf->id_buf[3]),
7482 pdf->u_len,
7483 byte_swap_32 (pdf->u_buf[0]),
7484 byte_swap_32 (pdf->u_buf[1]),
7485 byte_swap_32 (pdf->u_buf[2]),
7486 byte_swap_32 (pdf->u_buf[3]),
7487 byte_swap_32 (pdf->u_buf[4]),
7488 byte_swap_32 (pdf->u_buf[5]),
7489 byte_swap_32 (pdf->u_buf[6]),
7490 byte_swap_32 (pdf->u_buf[7]),
7491 pdf->o_len,
7492 byte_swap_32 (pdf->o_buf[0]),
7493 byte_swap_32 (pdf->o_buf[1]),
7494 byte_swap_32 (pdf->o_buf[2]),
7495 byte_swap_32 (pdf->o_buf[3]),
7496 byte_swap_32 (pdf->o_buf[4]),
7497 byte_swap_32 (pdf->o_buf[5]),
7498 byte_swap_32 (pdf->o_buf[6]),
7499 byte_swap_32 (pdf->o_buf[7])
7500 );
7501 }
7502 else if (hash_mode == 10410)
7503 {
7504 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7505
7506 pdf_t *pdf = &pdfs[salt_pos];
7507
7508 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",
7509
7510 pdf->V,
7511 pdf->R,
7512 40,
7513 pdf->P,
7514 pdf->enc_md,
7515 pdf->id_len,
7516 byte_swap_32 (pdf->id_buf[0]),
7517 byte_swap_32 (pdf->id_buf[1]),
7518 byte_swap_32 (pdf->id_buf[2]),
7519 byte_swap_32 (pdf->id_buf[3]),
7520 pdf->u_len,
7521 byte_swap_32 (pdf->u_buf[0]),
7522 byte_swap_32 (pdf->u_buf[1]),
7523 byte_swap_32 (pdf->u_buf[2]),
7524 byte_swap_32 (pdf->u_buf[3]),
7525 byte_swap_32 (pdf->u_buf[4]),
7526 byte_swap_32 (pdf->u_buf[5]),
7527 byte_swap_32 (pdf->u_buf[6]),
7528 byte_swap_32 (pdf->u_buf[7]),
7529 pdf->o_len,
7530 byte_swap_32 (pdf->o_buf[0]),
7531 byte_swap_32 (pdf->o_buf[1]),
7532 byte_swap_32 (pdf->o_buf[2]),
7533 byte_swap_32 (pdf->o_buf[3]),
7534 byte_swap_32 (pdf->o_buf[4]),
7535 byte_swap_32 (pdf->o_buf[5]),
7536 byte_swap_32 (pdf->o_buf[6]),
7537 byte_swap_32 (pdf->o_buf[7])
7538 );
7539 }
7540 else if (hash_mode == 10420)
7541 {
7542 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7543
7544 pdf_t *pdf = &pdfs[salt_pos];
7545
7546 uint8_t *rc4key = (uint8_t *) pdf->rc4key;
7547
7548 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",
7549
7550 pdf->V,
7551 pdf->R,
7552 40,
7553 pdf->P,
7554 pdf->enc_md,
7555 pdf->id_len,
7556 byte_swap_32 (pdf->id_buf[0]),
7557 byte_swap_32 (pdf->id_buf[1]),
7558 byte_swap_32 (pdf->id_buf[2]),
7559 byte_swap_32 (pdf->id_buf[3]),
7560 pdf->u_len,
7561 byte_swap_32 (pdf->u_buf[0]),
7562 byte_swap_32 (pdf->u_buf[1]),
7563 byte_swap_32 (pdf->u_buf[2]),
7564 byte_swap_32 (pdf->u_buf[3]),
7565 byte_swap_32 (pdf->u_buf[4]),
7566 byte_swap_32 (pdf->u_buf[5]),
7567 byte_swap_32 (pdf->u_buf[6]),
7568 byte_swap_32 (pdf->u_buf[7]),
7569 pdf->o_len,
7570 byte_swap_32 (pdf->o_buf[0]),
7571 byte_swap_32 (pdf->o_buf[1]),
7572 byte_swap_32 (pdf->o_buf[2]),
7573 byte_swap_32 (pdf->o_buf[3]),
7574 byte_swap_32 (pdf->o_buf[4]),
7575 byte_swap_32 (pdf->o_buf[5]),
7576 byte_swap_32 (pdf->o_buf[6]),
7577 byte_swap_32 (pdf->o_buf[7]),
7578 rc4key[0],
7579 rc4key[1],
7580 rc4key[2],
7581 rc4key[3],
7582 rc4key[4]
7583 );
7584 }
7585 else if (hash_mode == 10500)
7586 {
7587 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7588
7589 pdf_t *pdf = &pdfs[salt_pos];
7590
7591 if (pdf->id_len == 32)
7592 {
7593 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",
7594
7595 pdf->V,
7596 pdf->R,
7597 128,
7598 pdf->P,
7599 pdf->enc_md,
7600 pdf->id_len,
7601 byte_swap_32 (pdf->id_buf[0]),
7602 byte_swap_32 (pdf->id_buf[1]),
7603 byte_swap_32 (pdf->id_buf[2]),
7604 byte_swap_32 (pdf->id_buf[3]),
7605 byte_swap_32 (pdf->id_buf[4]),
7606 byte_swap_32 (pdf->id_buf[5]),
7607 byte_swap_32 (pdf->id_buf[6]),
7608 byte_swap_32 (pdf->id_buf[7]),
7609 pdf->u_len,
7610 byte_swap_32 (pdf->u_buf[0]),
7611 byte_swap_32 (pdf->u_buf[1]),
7612 byte_swap_32 (pdf->u_buf[2]),
7613 byte_swap_32 (pdf->u_buf[3]),
7614 byte_swap_32 (pdf->u_buf[4]),
7615 byte_swap_32 (pdf->u_buf[5]),
7616 byte_swap_32 (pdf->u_buf[6]),
7617 byte_swap_32 (pdf->u_buf[7]),
7618 pdf->o_len,
7619 byte_swap_32 (pdf->o_buf[0]),
7620 byte_swap_32 (pdf->o_buf[1]),
7621 byte_swap_32 (pdf->o_buf[2]),
7622 byte_swap_32 (pdf->o_buf[3]),
7623 byte_swap_32 (pdf->o_buf[4]),
7624 byte_swap_32 (pdf->o_buf[5]),
7625 byte_swap_32 (pdf->o_buf[6]),
7626 byte_swap_32 (pdf->o_buf[7])
7627 );
7628 }
7629 else
7630 {
7631 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",
7632
7633 pdf->V,
7634 pdf->R,
7635 128,
7636 pdf->P,
7637 pdf->enc_md,
7638 pdf->id_len,
7639 byte_swap_32 (pdf->id_buf[0]),
7640 byte_swap_32 (pdf->id_buf[1]),
7641 byte_swap_32 (pdf->id_buf[2]),
7642 byte_swap_32 (pdf->id_buf[3]),
7643 pdf->u_len,
7644 byte_swap_32 (pdf->u_buf[0]),
7645 byte_swap_32 (pdf->u_buf[1]),
7646 byte_swap_32 (pdf->u_buf[2]),
7647 byte_swap_32 (pdf->u_buf[3]),
7648 byte_swap_32 (pdf->u_buf[4]),
7649 byte_swap_32 (pdf->u_buf[5]),
7650 byte_swap_32 (pdf->u_buf[6]),
7651 byte_swap_32 (pdf->u_buf[7]),
7652 pdf->o_len,
7653 byte_swap_32 (pdf->o_buf[0]),
7654 byte_swap_32 (pdf->o_buf[1]),
7655 byte_swap_32 (pdf->o_buf[2]),
7656 byte_swap_32 (pdf->o_buf[3]),
7657 byte_swap_32 (pdf->o_buf[4]),
7658 byte_swap_32 (pdf->o_buf[5]),
7659 byte_swap_32 (pdf->o_buf[6]),
7660 byte_swap_32 (pdf->o_buf[7])
7661 );
7662 }
7663 }
7664 else if (hash_mode == 10600)
7665 {
7666 uint digest_idx = salt.digests_offset + digest_pos;
7667
7668 hashinfo_t **hashinfo_ptr = data.hash_info;
7669 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7670
7671 snprintf (out_buf, len-1, "%s", hash_buf);
7672 }
7673 else if (hash_mode == 10700)
7674 {
7675 uint digest_idx = salt.digests_offset + digest_pos;
7676
7677 hashinfo_t **hashinfo_ptr = data.hash_info;
7678 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7679
7680 snprintf (out_buf, len-1, "%s", hash_buf);
7681 }
7682 else if (hash_mode == 10900)
7683 {
7684 uint digest_idx = salt.digests_offset + digest_pos;
7685
7686 hashinfo_t **hashinfo_ptr = data.hash_info;
7687 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7688
7689 snprintf (out_buf, len-1, "%s", hash_buf);
7690 }
7691 else if (hash_mode == 11100)
7692 {
7693 uint32_t salt_challenge = salt.salt_buf[0];
7694
7695 salt_challenge = byte_swap_32 (salt_challenge);
7696
7697 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7698
7699 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7700 SIGNATURE_POSTGRESQL_AUTH,
7701 user_name,
7702 salt_challenge,
7703 digest_buf[0],
7704 digest_buf[1],
7705 digest_buf[2],
7706 digest_buf[3]);
7707 }
7708 else if (hash_mode == 11200)
7709 {
7710 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7711 SIGNATURE_MYSQL_AUTH,
7712 (unsigned char *) salt.salt_buf,
7713 digest_buf[0],
7714 digest_buf[1],
7715 digest_buf[2],
7716 digest_buf[3],
7717 digest_buf[4]);
7718 }
7719 else if (hash_mode == 11300)
7720 {
7721 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7722
7723 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7724
7725 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7726 const uint ckey_len = bitcoin_wallet->ckey_len;
7727 const uint public_key_len = bitcoin_wallet->public_key_len;
7728
7729 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7730 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7731 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7732
7733 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7734 {
7735 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->cry_master_buf;
7736
7737 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7738 }
7739
7740 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7741 {
7742 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->ckey_buf;
7743
7744 sprintf (ckey_buf + j, "%02x", ptr[i]);
7745 }
7746
7747 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7748 {
7749 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->public_key_buf;
7750
7751 sprintf (public_key_buf + j, "%02x", ptr[i]);
7752 }
7753
7754 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
7755 SIGNATURE_BITCOIN_WALLET,
7756 cry_master_len * 2,
7757 cry_master_buf,
7758 salt.salt_len,
7759 (unsigned char *) salt.salt_buf,
7760 salt.salt_iter + 1,
7761 ckey_len * 2,
7762 ckey_buf,
7763 public_key_len * 2,
7764 public_key_buf
7765 );
7766
7767 free (cry_master_buf);
7768 free (ckey_buf);
7769 free (public_key_buf);
7770 }
7771 else if (hash_mode == 11400)
7772 {
7773 uint digest_idx = salt.digests_offset + digest_pos;
7774
7775 hashinfo_t **hashinfo_ptr = data.hash_info;
7776 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7777
7778 snprintf (out_buf, len-1, "%s", hash_buf);
7779 }
7780 else if (hash_mode == 11600)
7781 {
7782 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
7783
7784 seven_zip_t *seven_zip = &seven_zips[salt_pos];
7785
7786 const uint data_len = seven_zip->data_len;
7787
7788 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
7789
7790 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
7791 {
7792 const uint8_t *ptr = (const uint8_t *) seven_zip->data_buf;
7793
7794 sprintf (data_buf + j, "%02x", ptr[i]);
7795 }
7796
7797 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
7798 SIGNATURE_SEVEN_ZIP,
7799 0,
7800 salt.salt_sign[0],
7801 0,
7802 (char *) seven_zip->salt_buf,
7803 seven_zip->iv_len,
7804 seven_zip->iv_buf[0],
7805 seven_zip->iv_buf[1],
7806 seven_zip->iv_buf[2],
7807 seven_zip->iv_buf[3],
7808 seven_zip->crc,
7809 seven_zip->data_len,
7810 seven_zip->unpack_size,
7811 data_buf);
7812
7813 free (data_buf);
7814 }
7815 else if (hash_mode == 11700)
7816 {
7817 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7818 digest_buf[0],
7819 digest_buf[1],
7820 digest_buf[2],
7821 digest_buf[3],
7822 digest_buf[4],
7823 digest_buf[5],
7824 digest_buf[6],
7825 digest_buf[7]);
7826 }
7827 else if (hash_mode == 11800)
7828 {
7829 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
7830 digest_buf[ 0],
7831 digest_buf[ 1],
7832 digest_buf[ 2],
7833 digest_buf[ 3],
7834 digest_buf[ 4],
7835 digest_buf[ 5],
7836 digest_buf[ 6],
7837 digest_buf[ 7],
7838 digest_buf[ 8],
7839 digest_buf[ 9],
7840 digest_buf[10],
7841 digest_buf[11],
7842 digest_buf[12],
7843 digest_buf[13],
7844 digest_buf[14],
7845 digest_buf[15]);
7846 }
7847 else if (hash_mode == 11900)
7848 {
7849 uint digest_idx = salt.digests_offset + digest_pos;
7850
7851 hashinfo_t **hashinfo_ptr = data.hash_info;
7852 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7853
7854 snprintf (out_buf, len-1, "%s", hash_buf);
7855 }
7856 else if (hash_mode == 12000)
7857 {
7858 uint digest_idx = salt.digests_offset + digest_pos;
7859
7860 hashinfo_t **hashinfo_ptr = data.hash_info;
7861 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7862
7863 snprintf (out_buf, len-1, "%s", hash_buf);
7864 }
7865 else if (hash_mode == 12100)
7866 {
7867 uint digest_idx = salt.digests_offset + digest_pos;
7868
7869 hashinfo_t **hashinfo_ptr = data.hash_info;
7870 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7871
7872 snprintf (out_buf, len-1, "%s", hash_buf);
7873 }
7874 else if (hash_mode == 12200)
7875 {
7876 uint *ptr_digest = digest_buf;
7877 uint *ptr_salt = salt.salt_buf;
7878
7879 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
7880 SIGNATURE_ECRYPTFS,
7881 ptr_salt[0],
7882 ptr_salt[1],
7883 ptr_digest[0],
7884 ptr_digest[1]);
7885 }
7886 else if (hash_mode == 12300)
7887 {
7888 uint *ptr_digest = digest_buf;
7889 uint *ptr_salt = salt.salt_buf;
7890
7891 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",
7892 ptr_digest[ 0], ptr_digest[ 1],
7893 ptr_digest[ 2], ptr_digest[ 3],
7894 ptr_digest[ 4], ptr_digest[ 5],
7895 ptr_digest[ 6], ptr_digest[ 7],
7896 ptr_digest[ 8], ptr_digest[ 9],
7897 ptr_digest[10], ptr_digest[11],
7898 ptr_digest[12], ptr_digest[13],
7899 ptr_digest[14], ptr_digest[15],
7900 ptr_salt[0],
7901 ptr_salt[1],
7902 ptr_salt[2],
7903 ptr_salt[3]);
7904 }
7905 else if (hash_mode == 12400)
7906 {
7907 // encode iteration count
7908
7909 char salt_iter[5];
7910
7911 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
7912 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
7913 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
7914 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
7915 salt_iter[4] = 0;
7916
7917 // encode salt
7918
7919 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
7920 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
7921 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
7922 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
7923 ptr_salt[4] = 0;
7924
7925 // encode digest
7926
7927 memset (tmp_buf, 0, sizeof (tmp_buf));
7928
7929 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7930 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7931
7932 memcpy (tmp_buf, digest_buf, 8);
7933
7934 base64_encode (int_to_itoa64, tmp_buf, 8, ptr_plain);
7935
7936 ptr_plain[11] = 0;
7937
7938 // fill the resulting buffer
7939
7940 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
7941 }
7942 else if (hash_mode == 12500)
7943 {
7944 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
7945 SIGNATURE_RAR3,
7946 byte_swap_32 (salt.salt_buf[0]),
7947 byte_swap_32 (salt.salt_buf[1]),
7948 salt.salt_buf[2],
7949 salt.salt_buf[3],
7950 salt.salt_buf[4],
7951 salt.salt_buf[5]);
7952 }
7953 else if (hash_mode == 12600)
7954 {
7955 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7956 digest_buf[0] + salt.salt_buf_pc[0],
7957 digest_buf[1] + salt.salt_buf_pc[1],
7958 digest_buf[2] + salt.salt_buf_pc[2],
7959 digest_buf[3] + salt.salt_buf_pc[3],
7960 digest_buf[4] + salt.salt_buf_pc[4],
7961 digest_buf[5] + salt.salt_buf_pc[5],
7962 digest_buf[6] + salt.salt_buf_pc[6],
7963 digest_buf[7] + salt.salt_buf_pc[7]);
7964 }
7965 else if (hash_mode == 12700)
7966 {
7967 uint digest_idx = salt.digests_offset + digest_pos;
7968
7969 hashinfo_t **hashinfo_ptr = data.hash_info;
7970 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7971
7972 snprintf (out_buf, len-1, "%s", hash_buf);
7973 }
7974 else if (hash_mode == 12800)
7975 {
7976 const uint8_t *ptr = (const uint8_t *) salt.salt_buf;
7977
7978 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",
7979 SIGNATURE_MS_DRSR,
7980 ptr[0],
7981 ptr[1],
7982 ptr[2],
7983 ptr[3],
7984 ptr[4],
7985 ptr[5],
7986 ptr[6],
7987 ptr[7],
7988 ptr[8],
7989 ptr[9],
7990 salt.salt_iter + 1,
7991 byte_swap_32 (digest_buf[0]),
7992 byte_swap_32 (digest_buf[1]),
7993 byte_swap_32 (digest_buf[2]),
7994 byte_swap_32 (digest_buf[3]),
7995 byte_swap_32 (digest_buf[4]),
7996 byte_swap_32 (digest_buf[5]),
7997 byte_swap_32 (digest_buf[6]),
7998 byte_swap_32 (digest_buf[7])
7999 );
8000 }
8001 else
8002 {
8003 if (hash_type == HASH_TYPE_MD4)
8004 {
8005 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8006 digest_buf[0],
8007 digest_buf[1],
8008 digest_buf[2],
8009 digest_buf[3]);
8010 }
8011 else if (hash_type == HASH_TYPE_MD5)
8012 {
8013 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8014 digest_buf[0],
8015 digest_buf[1],
8016 digest_buf[2],
8017 digest_buf[3]);
8018 }
8019 else if (hash_type == HASH_TYPE_SHA1)
8020 {
8021 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8022 digest_buf[0],
8023 digest_buf[1],
8024 digest_buf[2],
8025 digest_buf[3],
8026 digest_buf[4]);
8027 }
8028 else if (hash_type == HASH_TYPE_SHA256)
8029 {
8030 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8031 digest_buf[0],
8032 digest_buf[1],
8033 digest_buf[2],
8034 digest_buf[3],
8035 digest_buf[4],
8036 digest_buf[5],
8037 digest_buf[6],
8038 digest_buf[7]);
8039 }
8040 else if (hash_type == HASH_TYPE_SHA384)
8041 {
8042 uint *ptr = digest_buf;
8043
8044 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8045 ptr[ 1], ptr[ 0],
8046 ptr[ 3], ptr[ 2],
8047 ptr[ 5], ptr[ 4],
8048 ptr[ 7], ptr[ 6],
8049 ptr[ 9], ptr[ 8],
8050 ptr[11], ptr[10]);
8051 }
8052 else if (hash_type == HASH_TYPE_SHA512)
8053 {
8054 uint *ptr = digest_buf;
8055
8056 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8057 ptr[ 1], ptr[ 0],
8058 ptr[ 3], ptr[ 2],
8059 ptr[ 5], ptr[ 4],
8060 ptr[ 7], ptr[ 6],
8061 ptr[ 9], ptr[ 8],
8062 ptr[11], ptr[10],
8063 ptr[13], ptr[12],
8064 ptr[15], ptr[14]);
8065 }
8066 else if (hash_type == HASH_TYPE_LM)
8067 {
8068 snprintf (out_buf, len-1, "%08x%08x",
8069 digest_buf[0],
8070 digest_buf[1]);
8071 }
8072 else if (hash_type == HASH_TYPE_ORACLEH)
8073 {
8074 snprintf (out_buf, len-1, "%08X%08X",
8075 digest_buf[0],
8076 digest_buf[1]);
8077 }
8078 else if (hash_type == HASH_TYPE_BCRYPT)
8079 {
8080 base64_encode (int_to_bf64, (char *) salt.salt_buf, 16, tmp_buf + 0);
8081 base64_encode (int_to_bf64, (char *) digest_buf, 23, tmp_buf + 22);
8082
8083 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8084
8085 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8086 }
8087 else if (hash_type == HASH_TYPE_KECCAK)
8088 {
8089 uint *ptr = digest_buf;
8090
8091 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",
8092 ptr[ 1], ptr[ 0],
8093 ptr[ 3], ptr[ 2],
8094 ptr[ 5], ptr[ 4],
8095 ptr[ 7], ptr[ 6],
8096 ptr[ 9], ptr[ 8],
8097 ptr[11], ptr[10],
8098 ptr[13], ptr[12],
8099 ptr[15], ptr[14],
8100 ptr[17], ptr[16],
8101 ptr[19], ptr[18],
8102 ptr[21], ptr[20],
8103 ptr[23], ptr[22],
8104 ptr[25], ptr[24],
8105 ptr[27], ptr[26],
8106 ptr[29], ptr[28],
8107 ptr[31], ptr[30],
8108 ptr[33], ptr[32],
8109 ptr[35], ptr[34],
8110 ptr[37], ptr[36],
8111 ptr[39], ptr[38],
8112 ptr[41], ptr[30],
8113 ptr[43], ptr[42],
8114 ptr[45], ptr[44],
8115 ptr[47], ptr[46],
8116 ptr[49], ptr[48]
8117 );
8118
8119 out_buf[salt.keccak_mdlen * 2] = 0;
8120 }
8121 else if (hash_type == HASH_TYPE_RIPEMD160)
8122 {
8123 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8124 digest_buf[0],
8125 digest_buf[1],
8126 digest_buf[2],
8127 digest_buf[3],
8128 digest_buf[4]);
8129 }
8130 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8131 {
8132 digest_buf[ 0] = digest_buf[ 0];
8133 digest_buf[ 1] = digest_buf[ 1];
8134 digest_buf[ 2] = digest_buf[ 2];
8135 digest_buf[ 3] = digest_buf[ 3];
8136 digest_buf[ 4] = digest_buf[ 4];
8137 digest_buf[ 5] = digest_buf[ 5];
8138 digest_buf[ 6] = digest_buf[ 6];
8139 digest_buf[ 7] = digest_buf[ 7];
8140 digest_buf[ 8] = digest_buf[ 8];
8141 digest_buf[ 9] = digest_buf[ 9];
8142 digest_buf[10] = digest_buf[10];
8143 digest_buf[11] = digest_buf[11];
8144 digest_buf[12] = digest_buf[12];
8145 digest_buf[13] = digest_buf[13];
8146 digest_buf[14] = digest_buf[14];
8147 digest_buf[15] = digest_buf[15];
8148
8149 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8150 digest_buf[ 0],
8151 digest_buf[ 1],
8152 digest_buf[ 2],
8153 digest_buf[ 3],
8154 digest_buf[ 4],
8155 digest_buf[ 5],
8156 digest_buf[ 6],
8157 digest_buf[ 7],
8158 digest_buf[ 8],
8159 digest_buf[ 9],
8160 digest_buf[10],
8161 digest_buf[11],
8162 digest_buf[12],
8163 digest_buf[13],
8164 digest_buf[14],
8165 digest_buf[15]);
8166 }
8167 else if (hash_type == HASH_TYPE_GOST)
8168 {
8169 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8170 digest_buf[0],
8171 digest_buf[1],
8172 digest_buf[2],
8173 digest_buf[3],
8174 digest_buf[4],
8175 digest_buf[5],
8176 digest_buf[6],
8177 digest_buf[7]);
8178 }
8179 else if (hash_type == HASH_TYPE_MYSQL)
8180 {
8181 snprintf (out_buf, len-1, "%08x%08x",
8182 digest_buf[0],
8183 digest_buf[1]);
8184 }
8185 else if (hash_type == HASH_TYPE_LOTUS5)
8186 {
8187 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8188 digest_buf[0],
8189 digest_buf[1],
8190 digest_buf[2],
8191 digest_buf[3]);
8192 }
8193 else if (hash_type == HASH_TYPE_LOTUS6)
8194 {
8195 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8196 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8197 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8198 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8199
8200 char buf[16];
8201
8202 memcpy (buf + 0, salt.salt_buf, 5);
8203 memcpy (buf + 5, digest_buf, 9);
8204
8205 buf[3] -= -4;
8206
8207 base64_encode (int_to_lotus64, buf, 14, tmp_buf);
8208
8209 tmp_buf[18] = salt.salt_buf_pc[7];
8210 tmp_buf[19] = 0;
8211
8212 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8213 }
8214 else if (hash_type == HASH_TYPE_LOTUS8)
8215 {
8216 char buf[52];
8217
8218 memset (buf, 0, sizeof (buf));
8219
8220 // salt
8221
8222 memcpy (buf + 0, salt.salt_buf, 16);
8223
8224 buf[3] -= -4;
8225
8226 // iteration
8227
8228 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8229
8230 // chars
8231
8232 buf[26] = salt.salt_buf_pc[0];
8233 buf[27] = salt.salt_buf_pc[1];
8234
8235 // digest
8236
8237 memcpy (buf + 28, digest_buf, 8);
8238
8239 base64_encode (int_to_lotus64, buf, 36, tmp_buf);
8240
8241 tmp_buf[49] = 0;
8242
8243 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8244 }
8245 else if (hash_type == HASH_TYPE_CRC32)
8246 {
8247 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8248 }
8249 }
8250
8251 if (salt_type == SALT_TYPE_INTERN)
8252 {
8253 size_t pos = strlen (out_buf);
8254
8255 out_buf[pos] = data.separator;
8256
8257 char *ptr = (char *) salt.salt_buf;
8258
8259 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8260
8261 out_buf[pos + 1 + salt.salt_len] = 0;
8262 }
8263 }
8264
8265 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8266 {
8267 memset (hccap, 0, sizeof (hccap_t));
8268
8269 salt_t *salt = &data.salts_buf[salt_pos];
8270
8271 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8272
8273 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8274 wpa_t *wpa = &wpas[salt_pos];
8275
8276 hccap->keyver = wpa->keyver;
8277
8278 hccap->eapol_size = wpa->eapol_size;
8279
8280 if (wpa->keyver != 1)
8281 {
8282 uint eapol_tmp[64];
8283
8284 for (uint i = 0; i < 64; i++)
8285 {
8286 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8287 }
8288
8289 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8290 }
8291 else
8292 {
8293 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8294 }
8295
8296 uint pke_tmp[25];
8297
8298 for (int i = 5; i < 25; i++)
8299 {
8300 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8301 }
8302
8303 char *pke_ptr = (char *) pke_tmp;
8304
8305 memcpy (hccap->mac1, pke_ptr + 23, 6);
8306 memcpy (hccap->mac2, pke_ptr + 29, 6);
8307 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8308 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8309
8310 char *digests_buf_ptr = (char *) data.digests_buf;
8311
8312 uint dgst_size = data.dgst_size;
8313
8314 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8315
8316 if (wpa->keyver != 1)
8317 {
8318 uint digest_tmp[4];
8319
8320 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8321 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8322 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8323 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8324
8325 memcpy (hccap->keymic, digest_tmp, 16);
8326 }
8327 else
8328 {
8329 memcpy (hccap->keymic, digest_ptr, 16);
8330 }
8331 }
8332
8333 void SuspendThreads ()
8334 {
8335 if (data.devices_status == STATUS_RUNNING)
8336 {
8337 hc_timer_set (&data.timer_paused);
8338
8339 data.devices_status = STATUS_PAUSED;
8340
8341 log_info ("Paused");
8342 }
8343 }
8344
8345 void ResumeThreads ()
8346 {
8347 if (data.devices_status == STATUS_PAUSED)
8348 {
8349 float ms_paused;
8350
8351 hc_timer_get (data.timer_paused, ms_paused);
8352
8353 data.ms_paused += ms_paused;
8354
8355 data.devices_status = STATUS_RUNNING;
8356
8357 log_info ("Resumed");
8358 }
8359 }
8360
8361 void bypass ()
8362 {
8363 if (data.devices_status != STATUS_RUNNING) return;
8364
8365 data.devices_status = STATUS_BYPASS;
8366
8367 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8368 }
8369
8370 void stop_at_checkpoint ()
8371 {
8372 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8373 {
8374 if (data.devices_status != STATUS_RUNNING) return;
8375 }
8376
8377 // this feature only makes sense if --restore-disable was not specified
8378
8379 if (data.restore_disable == 1)
8380 {
8381 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8382
8383 return;
8384 }
8385
8386 // check if monitoring of Restore Point updates should be enabled or disabled
8387
8388 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8389 {
8390 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8391
8392 // save the current restore point value
8393
8394 data.checkpoint_cur_words = get_lowest_words_done ();
8395
8396 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8397 }
8398 else
8399 {
8400 data.devices_status = STATUS_RUNNING;
8401
8402 // reset the global value for checkpoint checks
8403
8404 data.checkpoint_cur_words = 0;
8405
8406 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8407 }
8408 }
8409
8410 void myabort ()
8411 {
8412 if (data.devices_status == STATUS_INIT) return;
8413 if (data.devices_status == STATUS_STARTING) return;
8414
8415 data.devices_status = STATUS_ABORTED;
8416 }
8417
8418 void myquit ()
8419 {
8420 if (data.devices_status == STATUS_INIT) return;
8421 if (data.devices_status == STATUS_STARTING) return;
8422
8423 data.devices_status = STATUS_QUIT;
8424 }
8425
8426 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const unsigned char **kernel_sources)
8427 {
8428 FILE *fp;
8429
8430 if ((fp = fopen (kernel_file, "rb")) != NULL)
8431 {
8432 struct stat st;
8433
8434 memset (&st, 0, sizeof (st));
8435
8436 stat (kernel_file, &st);
8437
8438 unsigned char *buf = (unsigned char *) mymalloc (st.st_size + 1);
8439
8440 size_t num_read = fread (buf, sizeof (unsigned char), st.st_size, fp);
8441
8442 if (num_read != (size_t) st.st_size)
8443 {
8444 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8445
8446 exit (-1);
8447 }
8448
8449 fclose (fp);
8450
8451 buf[st.st_size] = 0;
8452
8453 for (int i = 0; i < num_devices; i++)
8454 {
8455 kernel_lengths[i] = (size_t) st.st_size;
8456
8457 kernel_sources[i] = buf;
8458 }
8459 }
8460 else
8461 {
8462 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8463
8464 exit (-1);
8465 }
8466
8467 return;
8468 }
8469
8470 void writeProgramBin (char *dst, unsigned char *binary, size_t binary_size)
8471 {
8472 FILE *fp = fopen (dst, "wb");
8473
8474 fwrite (binary, sizeof (unsigned char), binary_size, fp);
8475
8476 fflush (fp);
8477 fclose (fp);
8478 }
8479
8480 /**
8481 * restore
8482 */
8483
8484 restore_data_t *init_restore (int argc, char **argv)
8485 {
8486 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8487
8488 if (data.restore_disable == 0)
8489 {
8490 FILE *fp = fopen (data.eff_restore_file, "rb");
8491
8492 if (fp)
8493 {
8494 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8495
8496 if (nread != 1)
8497 {
8498 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8499
8500 exit (-1);
8501 }
8502
8503 fclose (fp);
8504
8505 if (rd->pid)
8506 {
8507 char pidbin[BUFSIZ];
8508
8509 int pidbin_len;
8510
8511 #ifdef _POSIX
8512 memset (pidbin, 0, sizeof (pidbin));
8513
8514 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8515
8516 FILE *fd = fopen (pidbin, "rb");
8517
8518 if (fd)
8519 {
8520 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8521
8522 pidbin[pidbin_len] = 0;
8523
8524 fclose (fd);
8525
8526 char *argv0_r = strrchr (argv[0], '/');
8527
8528 char *pidbin_r = strrchr (pidbin, '/');
8529
8530 if (argv0_r == NULL) argv0_r = argv[0];
8531
8532 if (pidbin_r == NULL) pidbin_r = pidbin;
8533
8534 if (strcmp (argv0_r, pidbin_r) == 0)
8535 {
8536 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8537
8538 exit (-1);
8539 }
8540 }
8541
8542 #elif _WIN
8543 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8544
8545 char pidbin2[BUFSIZ];
8546
8547 int pidbin2_len;
8548
8549 memset (pidbin2, 0, sizeof (pidbin2));
8550
8551 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8552 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8553
8554 pidbin[pidbin_len] = 0;
8555 pidbin2[pidbin2_len] = 0;
8556
8557 if (pidbin2_len)
8558 {
8559 if (strcmp (pidbin, pidbin2) == 0)
8560 {
8561 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8562
8563 exit (-1);
8564 }
8565 }
8566 #endif
8567 }
8568
8569 if (rd->version_bin < RESTORE_MIN)
8570 {
8571 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8572
8573 exit (-1);
8574 }
8575 }
8576 }
8577
8578 memset (rd, 0, sizeof (restore_data_t));
8579
8580 rd->version_bin = VERSION_BIN;
8581
8582 #ifdef _POSIX
8583 rd->pid = getpid ();
8584 #elif _WIN
8585 rd->pid = GetCurrentProcessId ();
8586 #endif
8587
8588 if (getcwd (rd->cwd, 255) == NULL)
8589 {
8590 myfree (rd);
8591
8592 return (NULL);
8593 }
8594
8595 rd->argc = argc;
8596 rd->argv = argv;
8597
8598 return (rd);
8599 }
8600
8601 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8602 {
8603 FILE *fp = fopen (eff_restore_file, "rb");
8604
8605 if (fp == NULL)
8606 {
8607 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8608
8609 exit (-1);
8610 }
8611
8612 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8613 {
8614 log_error ("ERROR: cannot read %s", eff_restore_file);
8615
8616 exit (-1);
8617 }
8618
8619 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8620
8621 for (uint i = 0; i < rd->argc; i++)
8622 {
8623 char buf[BUFSIZ];
8624
8625 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8626 {
8627 log_error ("ERROR: cannot read %s", eff_restore_file);
8628
8629 exit (-1);
8630 }
8631
8632 size_t len = strlen (buf);
8633
8634 if (len) buf[len - 1] = 0;
8635
8636 rd->argv[i] = mystrdup (buf);
8637 }
8638
8639 fclose (fp);
8640
8641 char new_cwd[256];
8642
8643 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8644
8645 if (nwd == NULL)
8646 {
8647 log_error ("Restore file is corrupted");
8648 }
8649
8650 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8651 {
8652 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8653 {
8654 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8655
8656 exit (-1);
8657 }
8658
8659 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8660 }
8661
8662
8663 if (chdir (rd->cwd))
8664 {
8665 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8666
8667 exit (-1);
8668 }
8669 }
8670
8671 uint64_t get_lowest_words_done ()
8672 {
8673 uint64_t words_cur = -1;
8674
8675 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8676 {
8677 hc_device_param_t *device_param = &data.devices_param[device_id];
8678
8679 const uint64_t words_done = device_param->words_done;
8680
8681 if (words_done < words_cur) words_cur = words_done;
8682 }
8683
8684 // It's possible that a GPU's workload isn't finished right after a restore-case.
8685 // In that case, this function would return 0 and overwrite the real restore point
8686 // There's also data.words_cur which is set to rd->words_cur but it changes while
8687 // the attack is running therefore we should stick to rd->words_cur.
8688 // Note that -s influences rd->words_cur we should keep a close look on that.
8689
8690 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
8691
8692 return words_cur;
8693 }
8694
8695 void write_restore (const char *new_restore_file, restore_data_t *rd)
8696 {
8697 uint64_t words_cur = get_lowest_words_done ();
8698
8699 rd->words_cur = words_cur;
8700
8701 FILE *fp = fopen (new_restore_file, "wb");
8702
8703 if (fp == NULL)
8704 {
8705 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
8706
8707 exit (-1);
8708 }
8709
8710 if (setvbuf (fp, NULL, _IONBF, 0))
8711 {
8712 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
8713
8714 exit (-1);
8715 }
8716
8717 fwrite (rd, sizeof (restore_data_t), 1, fp);
8718
8719 for (uint i = 0; i < rd->argc; i++)
8720 {
8721 fprintf (fp, "%s", rd->argv[i]);
8722 fputc ('\n', fp);
8723 }
8724
8725 fflush (fp);
8726
8727 fsync (fileno (fp));
8728
8729 fclose (fp);
8730 }
8731
8732 void cycle_restore ()
8733 {
8734 const char *eff_restore_file = data.eff_restore_file;
8735 const char *new_restore_file = data.new_restore_file;
8736
8737 restore_data_t *rd = data.rd;
8738
8739 write_restore (new_restore_file, rd);
8740
8741 struct stat st;
8742
8743 memset (&st, 0, sizeof(st));
8744
8745 if (stat (eff_restore_file, &st) == 0)
8746 {
8747 if (unlink (eff_restore_file))
8748 {
8749 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
8750 }
8751 }
8752
8753 if (rename (new_restore_file, eff_restore_file))
8754 {
8755 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
8756 }
8757 }
8758
8759 void check_checkpoint ()
8760 {
8761 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
8762
8763 uint64_t words_cur = get_lowest_words_done ();
8764
8765 if (words_cur != data.checkpoint_cur_words)
8766 {
8767 myabort ();
8768 }
8769 }
8770
8771 /**
8772 * adjustments
8773 */
8774
8775 uint set_gpu_accel (uint hash_mode)
8776 {
8777 switch (hash_mode)
8778 {
8779 case 0: return GET_ACCEL (0);
8780 case 10: return GET_ACCEL (10);
8781 case 11: return GET_ACCEL (11);
8782 case 12: return GET_ACCEL (12);
8783 case 20: return GET_ACCEL (20);
8784 case 21: return GET_ACCEL (21);
8785 case 22: return GET_ACCEL (22);
8786 case 23: return GET_ACCEL (23);
8787 case 30: return GET_ACCEL (30);
8788 case 40: return GET_ACCEL (40);
8789 case 50: return GET_ACCEL (50);
8790 case 60: return GET_ACCEL (60);
8791 case 100: return GET_ACCEL (100);
8792 case 101: return GET_ACCEL (101);
8793 case 110: return GET_ACCEL (110);
8794 case 111: return GET_ACCEL (111);
8795 case 112: return GET_ACCEL (112);
8796 case 120: return GET_ACCEL (120);
8797 case 121: return GET_ACCEL (121);
8798 case 122: return GET_ACCEL (122);
8799 case 124: return GET_ACCEL (124);
8800 case 130: return GET_ACCEL (130);
8801 case 131: return GET_ACCEL (131);
8802 case 132: return GET_ACCEL (132);
8803 case 133: return GET_ACCEL (133);
8804 case 140: return GET_ACCEL (140);
8805 case 141: return GET_ACCEL (141);
8806 case 150: return GET_ACCEL (150);
8807 case 160: return GET_ACCEL (160);
8808 case 190: return GET_ACCEL (190);
8809 case 200: return GET_ACCEL (200);
8810 case 300: return GET_ACCEL (300);
8811 case 400: return GET_ACCEL (400);
8812 case 500: return GET_ACCEL (500);
8813 case 501: return GET_ACCEL (501);
8814 case 900: return GET_ACCEL (900);
8815 case 910: return GET_ACCEL (910);
8816 case 1000: return GET_ACCEL (1000);
8817 case 1100: return GET_ACCEL (1100);
8818 case 1400: return GET_ACCEL (1400);
8819 case 1410: return GET_ACCEL (1410);
8820 case 1420: return GET_ACCEL (1420);
8821 case 1421: return GET_ACCEL (1421);
8822 case 1430: return GET_ACCEL (1430);
8823 case 1440: return GET_ACCEL (1440);
8824 case 1441: return GET_ACCEL (1441);
8825 case 1450: return GET_ACCEL (1450);
8826 case 1460: return GET_ACCEL (1460);
8827 case 1500: return GET_ACCEL (1500);
8828 case 1600: return GET_ACCEL (1600);
8829 case 1700: return GET_ACCEL (1700);
8830 case 1710: return GET_ACCEL (1710);
8831 case 1711: return GET_ACCEL (1711);
8832 case 1720: return GET_ACCEL (1720);
8833 case 1722: return GET_ACCEL (1722);
8834 case 1730: return GET_ACCEL (1730);
8835 case 1731: return GET_ACCEL (1731);
8836 case 1740: return GET_ACCEL (1740);
8837 case 1750: return GET_ACCEL (1750);
8838 case 1760: return GET_ACCEL (1760);
8839 case 1800: return GET_ACCEL (1800);
8840 case 2100: return GET_ACCEL (2100);
8841 case 2400: return GET_ACCEL (2400);
8842 case 2410: return GET_ACCEL (2410);
8843 case 2500: return GET_ACCEL (2500);
8844 case 2600: return GET_ACCEL (2600);
8845 case 2611: return GET_ACCEL (2611);
8846 case 2612: return GET_ACCEL (2612);
8847 case 2711: return GET_ACCEL (2711);
8848 case 2811: return GET_ACCEL (2811);
8849 case 3000: return GET_ACCEL (3000);
8850 case 3100: return GET_ACCEL (3100);
8851 case 3200: return GET_ACCEL (3200);
8852 case 3710: return GET_ACCEL (3710);
8853 case 3711: return GET_ACCEL (3711);
8854 case 3800: return GET_ACCEL (3800);
8855 case 4300: return GET_ACCEL (4300);
8856 case 4400: return GET_ACCEL (4400);
8857 case 4500: return GET_ACCEL (4500);
8858 case 4700: return GET_ACCEL (4700);
8859 case 4800: return GET_ACCEL (4800);
8860 case 4900: return GET_ACCEL (4900);
8861 case 5000: return GET_ACCEL (5000);
8862 case 5100: return GET_ACCEL (5100);
8863 case 5200: return GET_ACCEL (5200);
8864 case 5300: return GET_ACCEL (5300);
8865 case 5400: return GET_ACCEL (5400);
8866 case 5500: return GET_ACCEL (5500);
8867 case 5600: return GET_ACCEL (5600);
8868 case 5700: return GET_ACCEL (5700);
8869 case 5800: return GET_ACCEL (5800);
8870 case 6000: return GET_ACCEL (6000);
8871 case 6100: return GET_ACCEL (6100);
8872 case 6211: return GET_ACCEL (6211);
8873 case 6212: return GET_ACCEL (6212);
8874 case 6213: return GET_ACCEL (6213);
8875 case 6221: return GET_ACCEL (6221);
8876 case 6222: return GET_ACCEL (6222);
8877 case 6223: return GET_ACCEL (6223);
8878 case 6231: return GET_ACCEL (6231);
8879 case 6232: return GET_ACCEL (6232);
8880 case 6233: return GET_ACCEL (6233);
8881 case 6241: return GET_ACCEL (6241);
8882 case 6242: return GET_ACCEL (6242);
8883 case 6243: return GET_ACCEL (6243);
8884 case 6300: return GET_ACCEL (6300);
8885 case 6400: return GET_ACCEL (6400);
8886 case 6500: return GET_ACCEL (6500);
8887 case 6600: return GET_ACCEL (6600);
8888 case 6700: return GET_ACCEL (6700);
8889 case 6800: return GET_ACCEL (6800);
8890 case 6900: return GET_ACCEL (6900);
8891 case 7100: return GET_ACCEL (7100);
8892 case 7200: return GET_ACCEL (7200);
8893 case 7300: return GET_ACCEL (7300);
8894 case 7400: return GET_ACCEL (7400);
8895 case 7500: return GET_ACCEL (7500);
8896 case 7600: return GET_ACCEL (7600);
8897 case 7700: return GET_ACCEL (7700);
8898 case 7800: return GET_ACCEL (7800);
8899 case 7900: return GET_ACCEL (7900);
8900 case 8000: return GET_ACCEL (8000);
8901 case 8100: return GET_ACCEL (8100);
8902 case 8200: return GET_ACCEL (8200);
8903 case 8300: return GET_ACCEL (8300);
8904 case 8400: return GET_ACCEL (8400);
8905 case 8500: return GET_ACCEL (8500);
8906 case 8600: return GET_ACCEL (8600);
8907 case 8700: return GET_ACCEL (8700);
8908 case 8800: return GET_ACCEL (8800);
8909 case 8900: return GET_ACCEL (8900);
8910 case 9000: return GET_ACCEL (9000);
8911 case 9100: return GET_ACCEL (9100);
8912 case 9200: return GET_ACCEL (9200);
8913 case 9300: return GET_ACCEL (9300);
8914 case 9400: return GET_ACCEL (9400);
8915 case 9500: return GET_ACCEL (9500);
8916 case 9600: return GET_ACCEL (9600);
8917 case 9700: return GET_ACCEL (9700);
8918 case 9710: return GET_ACCEL (9710);
8919 case 9720: return GET_ACCEL (9720);
8920 case 9800: return GET_ACCEL (9800);
8921 case 9810: return GET_ACCEL (9810);
8922 case 9820: return GET_ACCEL (9820);
8923 case 9900: return GET_ACCEL (9900);
8924 case 10000: return GET_ACCEL (10000);
8925 case 10100: return GET_ACCEL (10100);
8926 case 10200: return GET_ACCEL (10200);
8927 case 10300: return GET_ACCEL (10300);
8928 case 10400: return GET_ACCEL (10400);
8929 case 10410: return GET_ACCEL (10410);
8930 case 10420: return GET_ACCEL (10420);
8931 case 10500: return GET_ACCEL (10500);
8932 case 10600: return GET_ACCEL (10600);
8933 case 10700: return GET_ACCEL (10700);
8934 case 10800: return GET_ACCEL (10800);
8935 case 10900: return GET_ACCEL (10900);
8936 case 11000: return GET_ACCEL (11000);
8937 case 11100: return GET_ACCEL (11100);
8938 case 11200: return GET_ACCEL (11200);
8939 case 11300: return GET_ACCEL (11300);
8940 case 11400: return GET_ACCEL (11400);
8941 case 11500: return GET_ACCEL (11500);
8942 case 11600: return GET_ACCEL (11600);
8943 case 11700: return GET_ACCEL (11700);
8944 case 11800: return GET_ACCEL (11800);
8945 case 11900: return GET_ACCEL (11900);
8946 case 12000: return GET_ACCEL (12000);
8947 case 12100: return GET_ACCEL (12100);
8948 case 12200: return GET_ACCEL (12200);
8949 case 12300: return GET_ACCEL (12300);
8950 case 12400: return GET_ACCEL (12400);
8951 case 12500: return GET_ACCEL (12500);
8952 case 12600: return GET_ACCEL (12600);
8953 case 12700: return GET_ACCEL (12700);
8954 case 12800: return GET_ACCEL (12800);
8955 }
8956
8957 return 0;
8958 }
8959
8960 uint set_gpu_loops (uint hash_mode)
8961 {
8962 switch (hash_mode)
8963 {
8964 case 0: return GET_LOOPS (0);
8965 case 10: return GET_LOOPS (10);
8966 case 11: return GET_LOOPS (11);
8967 case 12: return GET_LOOPS (12);
8968 case 20: return GET_LOOPS (20);
8969 case 21: return GET_LOOPS (21);
8970 case 22: return GET_LOOPS (22);
8971 case 23: return GET_LOOPS (23);
8972 case 30: return GET_LOOPS (30);
8973 case 40: return GET_LOOPS (40);
8974 case 50: return GET_LOOPS (50);
8975 case 60: return GET_LOOPS (60);
8976 case 100: return GET_LOOPS (100);
8977 case 101: return GET_LOOPS (101);
8978 case 110: return GET_LOOPS (110);
8979 case 111: return GET_LOOPS (111);
8980 case 112: return GET_LOOPS (112);
8981 case 120: return GET_LOOPS (120);
8982 case 121: return GET_LOOPS (121);
8983 case 122: return GET_LOOPS (122);
8984 case 124: return GET_LOOPS (124);
8985 case 130: return GET_LOOPS (130);
8986 case 131: return GET_LOOPS (131);
8987 case 132: return GET_LOOPS (132);
8988 case 133: return GET_LOOPS (133);
8989 case 140: return GET_LOOPS (140);
8990 case 141: return GET_LOOPS (141);
8991 case 150: return GET_LOOPS (150);
8992 case 160: return GET_LOOPS (160);
8993 case 190: return GET_LOOPS (190);
8994 case 200: return GET_LOOPS (200);
8995 case 300: return GET_LOOPS (300);
8996 case 400: return GET_LOOPS (400);
8997 case 500: return GET_LOOPS (500);
8998 case 501: return GET_LOOPS (501);
8999 case 900: return GET_LOOPS (900);
9000 case 910: return GET_LOOPS (910);
9001 case 1000: return GET_LOOPS (1000);
9002 case 1100: return GET_LOOPS (1100);
9003 case 1400: return GET_LOOPS (1400);
9004 case 1410: return GET_LOOPS (1410);
9005 case 1420: return GET_LOOPS (1420);
9006 case 1421: return GET_LOOPS (1421);
9007 case 1430: return GET_LOOPS (1430);
9008 case 1440: return GET_LOOPS (1440);
9009 case 1441: return GET_LOOPS (1441);
9010 case 1450: return GET_LOOPS (1450);
9011 case 1460: return GET_LOOPS (1460);
9012 case 1500: return GET_LOOPS (1500);
9013 case 1600: return GET_LOOPS (1600);
9014 case 1700: return GET_LOOPS (1700);
9015 case 1710: return GET_LOOPS (1710);
9016 case 1711: return GET_LOOPS (1711);
9017 case 1720: return GET_LOOPS (1720);
9018 case 1722: return GET_LOOPS (1722);
9019 case 1730: return GET_LOOPS (1730);
9020 case 1731: return GET_LOOPS (1731);
9021 case 1740: return GET_LOOPS (1740);
9022 case 1750: return GET_LOOPS (1750);
9023 case 1760: return GET_LOOPS (1760);
9024 case 1800: return GET_LOOPS (1800);
9025 case 2100: return GET_LOOPS (2100);
9026 case 2400: return GET_LOOPS (2400);
9027 case 2410: return GET_LOOPS (2410);
9028 case 2500: return GET_LOOPS (2500);
9029 case 2600: return GET_LOOPS (2600);
9030 case 2611: return GET_LOOPS (2611);
9031 case 2612: return GET_LOOPS (2612);
9032 case 2711: return GET_LOOPS (2711);
9033 case 2811: return GET_LOOPS (2811);
9034 case 3000: return GET_LOOPS (3000);
9035 case 3100: return GET_LOOPS (3100);
9036 case 3200: return GET_LOOPS (3200);
9037 case 3710: return GET_LOOPS (3710);
9038 case 3711: return GET_LOOPS (3711);
9039 case 3800: return GET_LOOPS (3800);
9040 case 4300: return GET_LOOPS (4300);
9041 case 4400: return GET_LOOPS (4400);
9042 case 4500: return GET_LOOPS (4500);
9043 case 4700: return GET_LOOPS (4700);
9044 case 4800: return GET_LOOPS (4800);
9045 case 4900: return GET_LOOPS (4900);
9046 case 5000: return GET_LOOPS (5000);
9047 case 5100: return GET_LOOPS (5100);
9048 case 5200: return GET_LOOPS (5200);
9049 case 5300: return GET_LOOPS (5300);
9050 case 5400: return GET_LOOPS (5400);
9051 case 5500: return GET_LOOPS (5500);
9052 case 5600: return GET_LOOPS (5600);
9053 case 5700: return GET_LOOPS (5700);
9054 case 5800: return GET_LOOPS (5800);
9055 case 6000: return GET_LOOPS (6000);
9056 case 6100: return GET_LOOPS (6100);
9057 case 6211: return GET_LOOPS (6211);
9058 case 6212: return GET_LOOPS (6212);
9059 case 6213: return GET_LOOPS (6213);
9060 case 6221: return GET_LOOPS (6221);
9061 case 6222: return GET_LOOPS (6222);
9062 case 6223: return GET_LOOPS (6223);
9063 case 6231: return GET_LOOPS (6231);
9064 case 6232: return GET_LOOPS (6232);
9065 case 6233: return GET_LOOPS (6233);
9066 case 6241: return GET_LOOPS (6241);
9067 case 6242: return GET_LOOPS (6242);
9068 case 6243: return GET_LOOPS (6243);
9069 case 6300: return GET_LOOPS (6300);
9070 case 6400: return GET_LOOPS (6400);
9071 case 6500: return GET_LOOPS (6500);
9072 case 6600: return GET_LOOPS (6600);
9073 case 6700: return GET_LOOPS (6700);
9074 case 6800: return GET_LOOPS (6800);
9075 case 6900: return GET_LOOPS (6900);
9076 case 7100: return GET_LOOPS (7100);
9077 case 7200: return GET_LOOPS (7200);
9078 case 7300: return GET_LOOPS (7300);
9079 case 7400: return GET_LOOPS (7400);
9080 case 7500: return GET_LOOPS (7500);
9081 case 7600: return GET_LOOPS (7600);
9082 case 7700: return GET_LOOPS (7700);
9083 case 7800: return GET_LOOPS (7800);
9084 case 7900: return GET_LOOPS (7900);
9085 case 8000: return GET_LOOPS (8000);
9086 case 8100: return GET_LOOPS (8100);
9087 case 8200: return GET_LOOPS (8200);
9088 case 8300: return GET_LOOPS (8300);
9089 case 8400: return GET_LOOPS (8400);
9090 case 8500: return GET_LOOPS (8500);
9091 case 8600: return GET_LOOPS (8600);
9092 case 8700: return GET_LOOPS (8700);
9093 case 8800: return GET_LOOPS (8800);
9094 case 8900: return GET_LOOPS (8900);
9095 case 9000: return GET_LOOPS (9000);
9096 case 9100: return GET_LOOPS (9100);
9097 case 9200: return GET_LOOPS (9200);
9098 case 9300: return GET_LOOPS (9300);
9099 case 9400: return GET_LOOPS (9400);
9100 case 9500: return GET_LOOPS (9500);
9101 case 9600: return GET_LOOPS (9600);
9102 case 9700: return GET_LOOPS (9700);
9103 case 9710: return GET_LOOPS (9710);
9104 case 9720: return GET_LOOPS (9720);
9105 case 9800: return GET_LOOPS (9800);
9106 case 9810: return GET_LOOPS (9810);
9107 case 9820: return GET_LOOPS (9820);
9108 case 9900: return GET_LOOPS (9900);
9109 case 10000: return GET_LOOPS (10000);
9110 case 10100: return GET_LOOPS (10100);
9111 case 10200: return GET_LOOPS (10200);
9112 case 10300: return GET_LOOPS (10300);
9113 case 10400: return GET_LOOPS (10400);
9114 case 10410: return GET_LOOPS (10410);
9115 case 10420: return GET_LOOPS (10420);
9116 case 10500: return GET_LOOPS (10500);
9117 case 10600: return GET_LOOPS (10600);
9118 case 10700: return GET_LOOPS (10700);
9119 case 10800: return GET_LOOPS (10800);
9120 case 10900: return GET_LOOPS (10900);
9121 case 11000: return GET_LOOPS (11000);
9122 case 11100: return GET_LOOPS (11100);
9123 case 11200: return GET_LOOPS (11200);
9124 case 11300: return GET_LOOPS (11300);
9125 case 11400: return GET_LOOPS (11400);
9126 case 11500: return GET_LOOPS (11500);
9127 case 11600: return GET_LOOPS (11600);
9128 case 11700: return GET_LOOPS (11700);
9129 case 11800: return GET_LOOPS (11800);
9130 case 11900: return GET_LOOPS (11900);
9131 case 12000: return GET_LOOPS (12000);
9132 case 12100: return GET_LOOPS (12100);
9133 case 12200: return GET_LOOPS (12200);
9134 case 12300: return GET_LOOPS (12300);
9135 case 12400: return GET_LOOPS (12400);
9136 case 12500: return GET_LOOPS (12500);
9137 case 12600: return GET_LOOPS (12600);
9138 case 12700: return GET_LOOPS (12700);
9139 case 12800: return GET_LOOPS (12800);
9140 }
9141
9142 return 0;
9143 }
9144
9145 /**
9146 * parser
9147 */
9148
9149 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9150 {
9151 char tmp[256];
9152
9153 if (salt_len > sizeof(tmp))
9154 {
9155 return UINT_MAX;
9156 }
9157
9158 memset (tmp, 0, sizeof (tmp));
9159 memcpy (tmp, in, salt_len);
9160
9161 if (data.opts_type & OPTS_TYPE_ST_HEX)
9162 {
9163 if ((salt_len % 2) == 0)
9164 {
9165 uint new_salt_len = salt_len / 2;
9166
9167 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9168 {
9169 char p0 = tmp[j + 0];
9170 char p1 = tmp[j + 1];
9171
9172 tmp[i] = hex_convert (p1) << 0;
9173 tmp[i] |= hex_convert (p0) << 4;
9174 }
9175
9176 salt_len = new_salt_len;
9177 }
9178 else
9179 {
9180 return UINT_MAX;
9181 }
9182 }
9183 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9184 {
9185 salt_len = base64_decode (base64_to_int, in, salt_len, tmp);
9186 }
9187
9188 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9189
9190 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9191 {
9192 if (salt_len < 20)
9193 {
9194 uint *tmp_uint = (uint *) tmp;
9195
9196 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9197 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9198 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9199 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9200 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9201 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9202 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9203 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9204 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9205 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9206
9207 salt_len = salt_len * 2;
9208 }
9209 else
9210 {
9211 return UINT_MAX;
9212 }
9213 }
9214
9215 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9216 {
9217 lowercase (tmp, salt_len);
9218 }
9219
9220 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9221 {
9222 uppercase (tmp, salt_len);
9223 }
9224
9225 uint len = salt_len;
9226
9227 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9228 {
9229 tmp[len++] = 0x80;
9230 }
9231
9232 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9233 {
9234 tmp[len++] = 0x01;
9235 }
9236
9237 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9238 {
9239 uint *tmp_uint = (uint *) tmp;
9240
9241 uint max = len / 4;
9242
9243 if (len % 4) max++;
9244
9245 for (uint i = 0; i < max; i++)
9246 {
9247 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9248 }
9249
9250 // Important: we may need to increase the length of memcpy since
9251 // we don't want to "loose" some swapped bytes (could happen if
9252 // they do not perfectly fit in the 4-byte blocks)
9253 // Memcpy does always copy the bytes in the BE order, but since
9254 // we swapped them, some important bytes could be in positions
9255 // we normally skip with the original len
9256
9257 if (len % 4) len += 4 - (len % 4);
9258 }
9259
9260 memcpy (out, tmp, len);
9261
9262 return (salt_len);
9263 }
9264
9265 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9266 {
9267 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9268
9269 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9270
9271 uint32_t *digest = (uint32_t *) hash_buf->digest;
9272
9273 salt_t *salt = hash_buf->salt;
9274
9275 memcpy ((char *) salt->salt_sign, input_buf, 6);
9276
9277 char *iter_pos = input_buf + 4;
9278
9279 salt->salt_iter = 1 << atoi (iter_pos);
9280
9281 char *salt_pos = strchr (iter_pos, '$');
9282
9283 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9284
9285 salt_pos++;
9286
9287 uint salt_len = 16;
9288
9289 salt->salt_len = salt_len;
9290
9291 char tmp_buf[100];
9292
9293 memset (tmp_buf, 0, sizeof (tmp_buf));
9294
9295 base64_decode (bf64_to_int, salt_pos, 22, tmp_buf);
9296
9297 char *salt_buf_ptr = (char *) salt->salt_buf;
9298
9299 memcpy (salt_buf_ptr, tmp_buf, 16);
9300
9301 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9302 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9303 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9304 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9305
9306 char *hash_pos = salt_pos + 22;
9307
9308 memset (tmp_buf, 0, sizeof (tmp_buf));
9309
9310 base64_decode (bf64_to_int, hash_pos, 31, tmp_buf);
9311
9312 memcpy (digest, tmp_buf, 24);
9313
9314 digest[0] = byte_swap_32 (digest[0]);
9315 digest[1] = byte_swap_32 (digest[1]);
9316 digest[2] = byte_swap_32 (digest[2]);
9317 digest[3] = byte_swap_32 (digest[3]);
9318 digest[4] = byte_swap_32 (digest[4]);
9319 digest[5] = byte_swap_32 (digest[5]);
9320
9321 digest[5] &= ~0xff; // its just 23 not 24 !
9322
9323 return (PARSER_OK);
9324 }
9325
9326 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9327 {
9328 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9329
9330 uint32_t *digest = (uint32_t *) hash_buf->digest;
9331
9332 char tmp_buf[100];
9333
9334 memset (tmp_buf, 0, sizeof (tmp_buf));
9335
9336 base64_decode (itoa64_to_int, input_buf, 43, tmp_buf);
9337
9338 memcpy (digest, tmp_buf, 32);
9339
9340 digest[0] = byte_swap_32 (digest[0]);
9341 digest[1] = byte_swap_32 (digest[1]);
9342 digest[2] = byte_swap_32 (digest[2]);
9343 digest[3] = byte_swap_32 (digest[3]);
9344 digest[4] = byte_swap_32 (digest[4]);
9345 digest[5] = byte_swap_32 (digest[5]);
9346 digest[6] = byte_swap_32 (digest[6]);
9347 digest[7] = byte_swap_32 (digest[7]);
9348
9349 digest[0] -= SHA256M_A;
9350 digest[1] -= SHA256M_B;
9351 digest[2] -= SHA256M_C;
9352 digest[3] -= SHA256M_D;
9353 digest[4] -= SHA256M_E;
9354 digest[5] -= SHA256M_F;
9355 digest[6] -= SHA256M_G;
9356 digest[7] -= SHA256M_H;
9357
9358 return (PARSER_OK);
9359 }
9360
9361 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9362 {
9363 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9364
9365 uint32_t *digest = (uint32_t *) hash_buf->digest;
9366
9367 digest[0] = hex_to_uint (&input_buf[ 0]);
9368 digest[1] = hex_to_uint (&input_buf[ 8]);
9369
9370 digest[0] = byte_swap_32 (digest[0]);
9371 digest[1] = byte_swap_32 (digest[1]);
9372
9373 uint tt;
9374
9375 IP (digest[0], digest[1], tt);
9376
9377 digest[0] = digest[0];
9378 digest[1] = digest[1];
9379 digest[2] = 0;
9380 digest[3] = 0;
9381
9382 return (PARSER_OK);
9383 }
9384
9385 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9386 {
9387 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9388
9389 uint32_t *digest = (uint32_t *) hash_buf->digest;
9390
9391 salt_t *salt = hash_buf->salt;
9392
9393 char *hash_pos = input_buf + 8;
9394
9395 digest[0] = hex_to_uint (&hash_pos[ 0]);
9396 digest[1] = hex_to_uint (&hash_pos[ 8]);
9397 digest[2] = hex_to_uint (&hash_pos[16]);
9398 digest[3] = hex_to_uint (&hash_pos[24]);
9399 digest[4] = hex_to_uint (&hash_pos[32]);
9400
9401 digest[0] -= SHA1M_A;
9402 digest[1] -= SHA1M_B;
9403 digest[2] -= SHA1M_C;
9404 digest[3] -= SHA1M_D;
9405 digest[4] -= SHA1M_E;
9406
9407 uint salt_len = 8;
9408
9409 char *salt_buf_ptr = (char *) salt->salt_buf;
9410
9411 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9412
9413 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9414
9415 salt->salt_len = salt_len;
9416
9417 return (PARSER_OK);
9418 }
9419
9420 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9421 {
9422 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9423
9424 uint64_t *digest = (uint64_t *) hash_buf->digest;
9425
9426 salt_t *salt = hash_buf->salt;
9427
9428 char *hash_pos = input_buf + 8;
9429
9430 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
9431 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
9432 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
9433 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
9434 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
9435 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
9436 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
9437 digest[7] = hex_to_uint64_t (&hash_pos[112]);
9438
9439 digest[0] -= SHA512M_A;
9440 digest[1] -= SHA512M_B;
9441 digest[2] -= SHA512M_C;
9442 digest[3] -= SHA512M_D;
9443 digest[4] -= SHA512M_E;
9444 digest[5] -= SHA512M_F;
9445 digest[6] -= SHA512M_G;
9446 digest[7] -= SHA512M_H;
9447
9448 uint salt_len = 8;
9449
9450 char *salt_buf_ptr = (char *) salt->salt_buf;
9451
9452 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9453
9454 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9455
9456 salt->salt_len = salt_len;
9457
9458 return (PARSER_OK);
9459 }
9460
9461 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9462 {
9463 if (data.opts_type & OPTS_TYPE_ST_HEX)
9464 {
9465 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9466 }
9467 else
9468 {
9469 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9470 }
9471
9472 uint32_t *digest = (uint32_t *) hash_buf->digest;
9473
9474 salt_t *salt = hash_buf->salt;
9475
9476 digest[0] = hex_to_uint (&input_buf[ 0]);
9477 digest[1] = hex_to_uint (&input_buf[ 8]);
9478 digest[2] = hex_to_uint (&input_buf[16]);
9479 digest[3] = hex_to_uint (&input_buf[24]);
9480
9481 digest[0] = byte_swap_32 (digest[0]);
9482 digest[1] = byte_swap_32 (digest[1]);
9483 digest[2] = byte_swap_32 (digest[2]);
9484 digest[3] = byte_swap_32 (digest[3]);
9485
9486 digest[0] -= MD5M_A;
9487 digest[1] -= MD5M_B;
9488 digest[2] -= MD5M_C;
9489 digest[3] -= MD5M_D;
9490
9491 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9492
9493 uint salt_len = input_len - 32 - 1;
9494
9495 char *salt_buf = input_buf + 32 + 1;
9496
9497 char *salt_buf_ptr = (char *) salt->salt_buf;
9498
9499 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9500
9501 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9502
9503 salt->salt_len = salt_len;
9504
9505 return (PARSER_OK);
9506 }
9507
9508 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9509 {
9510 if (data.opts_type & OPTS_TYPE_ST_HEX)
9511 {
9512 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9513 }
9514 else
9515 {
9516 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9517 }
9518
9519 // unscramble
9520
9521 char clean_input_buf[32];
9522
9523 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9524 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9525
9526 for (int i = 0, j = 0, k = 0; i < 30; i++)
9527 {
9528 if (i == pos[j])
9529 {
9530 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9531
9532 j++;
9533 }
9534 else
9535 {
9536 clean_input_buf[k] = input_buf[i];
9537
9538 k++;
9539 }
9540 }
9541
9542 // base64 decode
9543
9544 uint32_t *digest = (uint32_t *) hash_buf->digest;
9545
9546 salt_t *salt = hash_buf->salt;
9547
9548 char a, b, c, d, e, f;
9549
9550 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9551 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9552 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9553 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9554 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9555 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9556
9557 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9558 | (((d << 12) | (e << 6) | (f)) << 0);
9559
9560 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9561 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9562 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9563 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9564 e = base64_to_int (clean_input_buf[10] & 0x7f);
9565 f = base64_to_int (clean_input_buf[11] & 0x7f);
9566
9567 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9568 | (((d << 12) | (e << 6) | (f)) << 0);
9569
9570 a = base64_to_int (clean_input_buf[12] & 0x7f);
9571 b = base64_to_int (clean_input_buf[13] & 0x7f);
9572 c = base64_to_int (clean_input_buf[14] & 0x7f);
9573 d = base64_to_int (clean_input_buf[15] & 0x7f);
9574 e = base64_to_int (clean_input_buf[16] & 0x7f);
9575 f = base64_to_int (clean_input_buf[17] & 0x7f);
9576
9577 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9578 | (((d << 12) | (e << 6) | (f)) << 0);
9579
9580 a = base64_to_int (clean_input_buf[18] & 0x7f);
9581 b = base64_to_int (clean_input_buf[19] & 0x7f);
9582 c = base64_to_int (clean_input_buf[20] & 0x7f);
9583 d = base64_to_int (clean_input_buf[21] & 0x7f);
9584 e = base64_to_int (clean_input_buf[22] & 0x7f);
9585 f = base64_to_int (clean_input_buf[23] & 0x7f);
9586
9587 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
9588 | (((d << 12) | (e << 6) | (f)) << 0);
9589
9590 digest[0] = byte_swap_32 (digest[0]);
9591 digest[1] = byte_swap_32 (digest[1]);
9592 digest[2] = byte_swap_32 (digest[2]);
9593 digest[3] = byte_swap_32 (digest[3]);
9594
9595 digest[0] -= MD5M_A;
9596 digest[1] -= MD5M_B;
9597 digest[2] -= MD5M_C;
9598 digest[3] -= MD5M_D;
9599
9600 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
9601
9602 uint salt_len = input_len - 30 - 1;
9603
9604 char *salt_buf = input_buf + 30 + 1;
9605
9606 char *salt_buf_ptr = (char *) salt->salt_buf;
9607
9608 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9609
9610 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9611
9612 salt->salt_len = salt_len;
9613
9614 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9615
9616 salt->salt_len += 22;
9617
9618 return (PARSER_OK);
9619 }
9620
9621 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9622 {
9623 if (data.opts_type & OPTS_TYPE_ST_HEX)
9624 {
9625 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9626 }
9627 else
9628 {
9629 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9630 }
9631
9632 uint32_t *digest = (uint32_t *) hash_buf->digest;
9633
9634 salt_t *salt = hash_buf->salt;
9635
9636 digest[0] = hex_to_uint (&input_buf[ 0]);
9637 digest[1] = hex_to_uint (&input_buf[ 8]);
9638 digest[2] = hex_to_uint (&input_buf[16]);
9639 digest[3] = hex_to_uint (&input_buf[24]);
9640 digest[4] = hex_to_uint (&input_buf[32]);
9641
9642 digest[0] -= SHA1M_A;
9643 digest[1] -= SHA1M_B;
9644 digest[2] -= SHA1M_C;
9645 digest[3] -= SHA1M_D;
9646 digest[4] -= SHA1M_E;
9647
9648 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9649
9650 uint salt_len = input_len - 40 - 1;
9651
9652 char *salt_buf = input_buf + 40 + 1;
9653
9654 char *salt_buf_ptr = (char *) salt->salt_buf;
9655
9656 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9657
9658 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9659
9660 salt->salt_len = salt_len;
9661
9662 return (PARSER_OK);
9663 }
9664
9665 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9666 {
9667 if (data.opts_type & OPTS_TYPE_ST_HEX)
9668 {
9669 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9670 }
9671 else
9672 {
9673 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9674 }
9675
9676 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9677
9678 char *iter_pos = input_buf + 6;
9679
9680 salt_t *salt = hash_buf->salt;
9681
9682 salt->salt_iter = atoi (iter_pos) - 1;
9683
9684 char *salt_pos = strchr (iter_pos, '#');
9685
9686 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9687
9688 salt_pos++;
9689
9690 char *digest_pos = strchr (salt_pos, '#');
9691
9692 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9693
9694 digest_pos++;
9695
9696 uint salt_len = digest_pos - salt_pos - 1;
9697
9698 uint32_t *digest = (uint32_t *) hash_buf->digest;
9699
9700 digest[0] = hex_to_uint (&digest_pos[ 0]);
9701 digest[1] = hex_to_uint (&digest_pos[ 8]);
9702 digest[2] = hex_to_uint (&digest_pos[16]);
9703 digest[3] = hex_to_uint (&digest_pos[24]);
9704
9705 char *salt_buf_ptr = (char *) salt->salt_buf;
9706
9707 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9708
9709 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9710
9711 salt->salt_len = salt_len;
9712
9713 return (PARSER_OK);
9714 }
9715
9716 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9717 {
9718 uint32_t *digest = (uint32_t *) hash_buf->digest;
9719
9720 salt_t *salt = hash_buf->salt;
9721
9722 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9723
9724 hccap_t in;
9725
9726 memcpy (&in, input_buf, input_len);
9727
9728 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9729
9730 memcpy (digest, in.keymic, 16);
9731
9732 /*
9733 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9734 The phrase "Pairwise key expansion"
9735 Access Point Address (Referred to as Authenticator Address AA)
9736 Supplicant Address (referred to as Supplicant Address SA)
9737 Access Point Nonce (referred to as Authenticator Anonce)
9738 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9739 */
9740
9741 uint salt_len = strlen (in.essid);
9742
9743 memcpy (salt->salt_buf, in.essid, salt_len);
9744
9745 salt->salt_len = salt_len;
9746
9747 salt->salt_iter = ROUNDS_WPA2 - 1;
9748
9749 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
9750
9751 memcpy (pke_ptr, "Pairwise key expansion", 23);
9752
9753 if (memcmp (in.mac1, in.mac2, 6) < 0)
9754 {
9755 memcpy (pke_ptr + 23, in.mac1, 6);
9756 memcpy (pke_ptr + 29, in.mac2, 6);
9757 }
9758 else
9759 {
9760 memcpy (pke_ptr + 23, in.mac2, 6);
9761 memcpy (pke_ptr + 29, in.mac1, 6);
9762 }
9763
9764 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
9765 {
9766 memcpy (pke_ptr + 35, in.nonce1, 32);
9767 memcpy (pke_ptr + 67, in.nonce2, 32);
9768 }
9769 else
9770 {
9771 memcpy (pke_ptr + 35, in.nonce2, 32);
9772 memcpy (pke_ptr + 67, in.nonce1, 32);
9773 }
9774
9775 for (int i = 0; i < 25; i++)
9776 {
9777 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
9778 }
9779
9780 wpa->keyver = in.keyver;
9781
9782 if (wpa->keyver > 255)
9783 {
9784 log_info ("ATTENTION!");
9785 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
9786 log_info (" This could be due to a recent aircrack-ng bug.");
9787 log_info (" The key version was automatically reset to a reasonable value.");
9788 log_info ("");
9789
9790 wpa->keyver &= 0xff;
9791 }
9792
9793 wpa->eapol_size = in.eapol_size;
9794
9795 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
9796
9797 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
9798
9799 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
9800
9801 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
9802
9803 if (wpa->keyver == 1)
9804 {
9805 // nothing to do
9806 }
9807 else
9808 {
9809 digest[0] = byte_swap_32 (digest[0]);
9810 digest[1] = byte_swap_32 (digest[1]);
9811 digest[2] = byte_swap_32 (digest[2]);
9812 digest[3] = byte_swap_32 (digest[3]);
9813
9814 for (int i = 0; i < 64; i++)
9815 {
9816 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
9817 }
9818 }
9819
9820 salt->salt_buf[10] = digest[1];
9821 salt->salt_buf[11] = digest[2];
9822
9823 return (PARSER_OK);
9824 }
9825
9826 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9827 {
9828 uint32_t *digest = (uint32_t *) hash_buf->digest;
9829
9830 salt_t *salt = hash_buf->salt;
9831
9832 if (input_len == 0)
9833 {
9834 log_error ("Password Safe v2 container not specified");
9835
9836 exit (-1);
9837 }
9838
9839 FILE *fp = fopen (input_buf, "rb");
9840
9841 if (fp == NULL)
9842 {
9843 log_error ("%s: %s", input_buf, strerror (errno));
9844
9845 exit (-1);
9846 }
9847
9848 typedef struct
9849 {
9850 uint32_t random[2];
9851 uint32_t hash[5];
9852 uint32_t salt[5]; // unused, but makes better valid check
9853 uint32_t iv[2]; // unused, but makes better valid check
9854
9855 } psafe2_hdr;
9856
9857 psafe2_hdr buf;
9858
9859 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
9860
9861 fclose (fp);
9862
9863 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
9864
9865 salt->salt_buf[0] = buf.random[0];
9866 salt->salt_buf[1] = buf.random[1];
9867
9868 salt->salt_len = 8;
9869 salt->salt_iter = 1000;
9870
9871 digest[0] = byte_swap_32 (buf.hash[0]);
9872 digest[1] = byte_swap_32 (buf.hash[1]);
9873 digest[2] = byte_swap_32 (buf.hash[2]);
9874 digest[3] = byte_swap_32 (buf.hash[3]);
9875 digest[4] = byte_swap_32 (buf.hash[4]);
9876
9877 return (PARSER_OK);
9878 }
9879
9880 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9881 {
9882 uint32_t *digest = (uint32_t *) hash_buf->digest;
9883
9884 salt_t *salt = hash_buf->salt;
9885
9886 if (input_len == 0)
9887 {
9888 log_error (".psafe3 not specified");
9889
9890 exit (-1);
9891 }
9892
9893 FILE *fp = fopen (input_buf, "rb");
9894
9895 if (fp == NULL)
9896 {
9897 log_error ("%s: %s", input_buf, strerror (errno));
9898
9899 exit (-1);
9900 }
9901
9902 psafe3_t in;
9903
9904 int n = fread (&in, sizeof (psafe3_t), 1, fp);
9905
9906 fclose (fp);
9907
9908 data.hashfile = input_buf; // we will need this in case it gets cracked
9909
9910 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
9911
9912 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
9913
9914 salt->salt_iter = in.iterations + 1;
9915
9916 salt->salt_buf[0] = in.salt_buf[0];
9917 salt->salt_buf[1] = in.salt_buf[1];
9918 salt->salt_buf[2] = in.salt_buf[2];
9919 salt->salt_buf[3] = in.salt_buf[3];
9920 salt->salt_buf[4] = in.salt_buf[4];
9921 salt->salt_buf[5] = in.salt_buf[5];
9922 salt->salt_buf[6] = in.salt_buf[6];
9923 salt->salt_buf[7] = in.salt_buf[7];
9924
9925 salt->salt_len = 32;
9926
9927 digest[0] = in.hash_buf[0];
9928 digest[1] = in.hash_buf[1];
9929 digest[2] = in.hash_buf[2];
9930 digest[3] = in.hash_buf[3];
9931 digest[4] = in.hash_buf[4];
9932 digest[5] = in.hash_buf[5];
9933 digest[6] = in.hash_buf[6];
9934 digest[7] = in.hash_buf[7];
9935
9936 digest[0] = byte_swap_32 (digest[0]);
9937 digest[1] = byte_swap_32 (digest[1]);
9938 digest[2] = byte_swap_32 (digest[2]);
9939 digest[3] = byte_swap_32 (digest[3]);
9940 digest[4] = byte_swap_32 (digest[4]);
9941 digest[5] = byte_swap_32 (digest[5]);
9942 digest[6] = byte_swap_32 (digest[6]);
9943 digest[7] = byte_swap_32 (digest[7]);
9944
9945 return (PARSER_OK);
9946 }
9947
9948 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9949 {
9950 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
9951
9952 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
9953
9954 uint32_t *digest = (uint32_t *) hash_buf->digest;
9955
9956 salt_t *salt = hash_buf->salt;
9957
9958 char *iter_pos = input_buf + 3;
9959
9960 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
9961
9962 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
9963
9964 memcpy ((char *) salt->salt_sign, input_buf, 4);
9965
9966 salt->salt_iter = salt_iter;
9967
9968 char *salt_pos = iter_pos + 1;
9969
9970 uint salt_len = 8;
9971
9972 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
9973
9974 salt->salt_len = salt_len;
9975
9976 char *hash_pos = salt_pos + salt_len;
9977
9978 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
9979
9980 return (PARSER_OK);
9981 }
9982
9983 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9984 {
9985 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
9986
9987 uint32_t *digest = (uint32_t *) hash_buf->digest;
9988
9989 salt_t *salt = hash_buf->salt;
9990
9991 char *salt_pos = input_buf + 3;
9992
9993 uint iterations_len = 0;
9994
9995 if (memcmp (salt_pos, "rounds=", 7) == 0)
9996 {
9997 salt_pos += 7;
9998
9999 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10000
10001 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10002 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10003
10004 salt_pos[0] = 0x0;
10005
10006 salt->salt_iter = atoi (salt_pos - iterations_len);
10007
10008 salt_pos += 1;
10009
10010 iterations_len += 8;
10011 }
10012 else
10013 {
10014 salt->salt_iter = ROUNDS_MD5CRYPT;
10015 }
10016
10017 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10018
10019 char *hash_pos = strchr (salt_pos, '$');
10020
10021 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10022
10023 uint salt_len = hash_pos - salt_pos;
10024
10025 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10026
10027 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10028
10029 salt->salt_len = salt_len;
10030
10031 hash_pos++;
10032
10033 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10034
10035 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10036
10037 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10038
10039 return (PARSER_OK);
10040 }
10041
10042 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10043 {
10044 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10045
10046 uint32_t *digest = (uint32_t *) hash_buf->digest;
10047
10048 salt_t *salt = hash_buf->salt;
10049
10050 char *salt_pos = input_buf + 6;
10051
10052 uint iterations_len = 0;
10053
10054 if (memcmp (salt_pos, "rounds=", 7) == 0)
10055 {
10056 salt_pos += 7;
10057
10058 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10059
10060 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10061 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10062
10063 salt_pos[0] = 0x0;
10064
10065 salt->salt_iter = atoi (salt_pos - iterations_len);
10066
10067 salt_pos += 1;
10068
10069 iterations_len += 8;
10070 }
10071 else
10072 {
10073 salt->salt_iter = ROUNDS_MD5CRYPT;
10074 }
10075
10076 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10077
10078 char *hash_pos = strchr (salt_pos, '$');
10079
10080 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10081
10082 uint salt_len = hash_pos - salt_pos;
10083
10084 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10085
10086 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10087
10088 salt->salt_len = salt_len;
10089
10090 hash_pos++;
10091
10092 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10093
10094 return (PARSER_OK);
10095 }
10096
10097 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10098 {
10099 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10100
10101 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10102
10103 uint32_t *digest = (uint32_t *) hash_buf->digest;
10104
10105 salt_t *salt = hash_buf->salt;
10106
10107 char *salt_pos = input_buf + 14;
10108
10109 char *hash_pos = strchr (salt_pos, '*');
10110
10111 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10112
10113 hash_pos++;
10114
10115 uint salt_len = hash_pos - salt_pos - 1;
10116
10117 char *salt_buf_ptr = (char *) salt->salt_buf;
10118
10119 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10120
10121 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10122
10123 salt->salt_len = salt_len;
10124
10125 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
10126
10127 base64_decode (base64_to_int, hash_pos, 27, tmp_buf);
10128
10129 memcpy (digest, tmp_buf, 20);
10130
10131 digest[0] = byte_swap_32 (digest[0]);
10132 digest[1] = byte_swap_32 (digest[1]);
10133 digest[2] = byte_swap_32 (digest[2]);
10134 digest[3] = byte_swap_32 (digest[3]);
10135 digest[4] = byte_swap_32 (digest[4]);
10136
10137 digest[0] -= SHA1M_A;
10138 digest[1] -= SHA1M_B;
10139 digest[2] -= SHA1M_C;
10140 digest[3] -= SHA1M_D;
10141 digest[4] -= SHA1M_E;
10142
10143 return (PARSER_OK);
10144 }
10145
10146 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10147 {
10148 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10149
10150 unsigned char c12 = itoa64_to_int (input_buf[12]);
10151
10152 if (c12 & 3) return (PARSER_HASH_VALUE);
10153
10154 uint32_t *digest = (uint32_t *) hash_buf->digest;
10155
10156 salt_t *salt = hash_buf->salt;
10157
10158 // for ascii_digest
10159 salt->salt_sign[0] = input_buf[0];
10160 salt->salt_sign[1] = input_buf[1];
10161
10162 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10163 | itoa64_to_int (input_buf[1]) << 6;
10164
10165 salt->salt_len = 2;
10166
10167 char tmp_buf[100];
10168
10169 memset (tmp_buf, 0, sizeof (tmp_buf));
10170
10171 base64_decode (itoa64_to_int, input_buf + 2, 11, tmp_buf);
10172
10173 memcpy (digest, tmp_buf, 8);
10174
10175 uint tt;
10176
10177 IP (digest[0], digest[1], tt);
10178
10179 digest[2] = 0;
10180 digest[3] = 0;
10181
10182 return (PARSER_OK);
10183 }
10184
10185 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10186 {
10187 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10188
10189 uint32_t *digest = (uint32_t *) hash_buf->digest;
10190
10191 digest[0] = hex_to_uint (&input_buf[ 0]);
10192 digest[1] = hex_to_uint (&input_buf[ 8]);
10193 digest[2] = hex_to_uint (&input_buf[16]);
10194 digest[3] = hex_to_uint (&input_buf[24]);
10195
10196 digest[0] = byte_swap_32 (digest[0]);
10197 digest[1] = byte_swap_32 (digest[1]);
10198 digest[2] = byte_swap_32 (digest[2]);
10199 digest[3] = byte_swap_32 (digest[3]);
10200
10201 digest[0] -= MD4M_A;
10202 digest[1] -= MD4M_B;
10203 digest[2] -= MD4M_C;
10204 digest[3] -= MD4M_D;
10205
10206 return (PARSER_OK);
10207 }
10208
10209 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10210 {
10211 if (data.opts_type & OPTS_TYPE_ST_HEX)
10212 {
10213 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10214 }
10215 else
10216 {
10217 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10218 }
10219
10220 uint32_t *digest = (uint32_t *) hash_buf->digest;
10221
10222 salt_t *salt = hash_buf->salt;
10223
10224 digest[0] = hex_to_uint (&input_buf[ 0]);
10225 digest[1] = hex_to_uint (&input_buf[ 8]);
10226 digest[2] = hex_to_uint (&input_buf[16]);
10227 digest[3] = hex_to_uint (&input_buf[24]);
10228
10229 digest[0] = byte_swap_32 (digest[0]);
10230 digest[1] = byte_swap_32 (digest[1]);
10231 digest[2] = byte_swap_32 (digest[2]);
10232 digest[3] = byte_swap_32 (digest[3]);
10233
10234 digest[0] -= MD4M_A;
10235 digest[1] -= MD4M_B;
10236 digest[2] -= MD4M_C;
10237 digest[3] -= MD4M_D;
10238
10239 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10240
10241 uint salt_len = input_len - 32 - 1;
10242
10243 char *salt_buf = input_buf + 32 + 1;
10244
10245 char *salt_buf_ptr = (char *) salt->salt_buf;
10246
10247 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10248
10249 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10250
10251 salt->salt_len = salt_len;
10252
10253 return (PARSER_OK);
10254 }
10255
10256 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10257 {
10258 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10259
10260 uint32_t *digest = (uint32_t *) hash_buf->digest;
10261
10262 digest[0] = hex_to_uint (&input_buf[ 0]);
10263 digest[1] = hex_to_uint (&input_buf[ 8]);
10264 digest[2] = hex_to_uint (&input_buf[16]);
10265 digest[3] = hex_to_uint (&input_buf[24]);
10266
10267 digest[0] = byte_swap_32 (digest[0]);
10268 digest[1] = byte_swap_32 (digest[1]);
10269 digest[2] = byte_swap_32 (digest[2]);
10270 digest[3] = byte_swap_32 (digest[3]);
10271
10272 digest[0] -= MD5M_A;
10273 digest[1] -= MD5M_B;
10274 digest[2] -= MD5M_C;
10275 digest[3] -= MD5M_D;
10276
10277 return (PARSER_OK);
10278 }
10279
10280 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10281 {
10282 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10283
10284 uint32_t *digest = (uint32_t *) hash_buf->digest;
10285
10286 digest[0] = hex_to_uint (&input_buf[0]);
10287 digest[1] = hex_to_uint (&input_buf[8]);
10288 digest[2] = 0;
10289 digest[3] = 0;
10290
10291 digest[0] = byte_swap_32 (digest[0]);
10292 digest[1] = byte_swap_32 (digest[1]);
10293
10294 return (PARSER_OK);
10295 }
10296
10297 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10298 {
10299 if (data.opts_type & OPTS_TYPE_ST_HEX)
10300 {
10301 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10302 }
10303 else
10304 {
10305 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10306 }
10307
10308 uint32_t *digest = (uint32_t *) hash_buf->digest;
10309
10310 salt_t *salt = hash_buf->salt;
10311
10312 digest[0] = hex_to_uint (&input_buf[ 0]);
10313 digest[1] = hex_to_uint (&input_buf[ 8]);
10314 digest[2] = hex_to_uint (&input_buf[16]);
10315 digest[3] = hex_to_uint (&input_buf[24]);
10316
10317 digest[0] = byte_swap_32 (digest[0]);
10318 digest[1] = byte_swap_32 (digest[1]);
10319 digest[2] = byte_swap_32 (digest[2]);
10320 digest[3] = byte_swap_32 (digest[3]);
10321
10322 digest[0] -= MD5M_A;
10323 digest[1] -= MD5M_B;
10324 digest[2] -= MD5M_C;
10325 digest[3] -= MD5M_D;
10326
10327 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10328
10329 uint salt_len = input_len - 32 - 1;
10330
10331 char *salt_buf = input_buf + 32 + 1;
10332
10333 char *salt_buf_ptr = (char *) salt->salt_buf;
10334
10335 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10336
10337 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10338
10339 salt->salt_len = salt_len;
10340
10341 return (PARSER_OK);
10342 }
10343
10344 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10345 {
10346 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10347
10348 uint32_t *digest = (uint32_t *) hash_buf->digest;
10349
10350 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10351 | itoa64_to_int (input_buf[ 1]) << 6
10352 | itoa64_to_int (input_buf[ 2]) << 12
10353 | itoa64_to_int (input_buf[ 3]) << 18;
10354 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10355 | itoa64_to_int (input_buf[ 5]) << 6
10356 | itoa64_to_int (input_buf[ 6]) << 12
10357 | itoa64_to_int (input_buf[ 7]) << 18;
10358 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10359 | itoa64_to_int (input_buf[ 9]) << 6
10360 | itoa64_to_int (input_buf[10]) << 12
10361 | itoa64_to_int (input_buf[11]) << 18;
10362 digest[3] = itoa64_to_int (input_buf[12]) << 0
10363 | itoa64_to_int (input_buf[13]) << 6
10364 | itoa64_to_int (input_buf[14]) << 12
10365 | itoa64_to_int (input_buf[15]) << 18;
10366
10367 digest[0] -= MD5M_A;
10368 digest[1] -= MD5M_B;
10369 digest[2] -= MD5M_C;
10370 digest[3] -= MD5M_D;
10371
10372 digest[0] &= 0x00ffffff;
10373 digest[1] &= 0x00ffffff;
10374 digest[2] &= 0x00ffffff;
10375 digest[3] &= 0x00ffffff;
10376
10377 return (PARSER_OK);
10378 }
10379
10380 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10381 {
10382 if (data.opts_type & OPTS_TYPE_ST_HEX)
10383 {
10384 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10385 }
10386 else
10387 {
10388 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10389 }
10390
10391 uint32_t *digest = (uint32_t *) hash_buf->digest;
10392
10393 salt_t *salt = hash_buf->salt;
10394
10395 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10396 | itoa64_to_int (input_buf[ 1]) << 6
10397 | itoa64_to_int (input_buf[ 2]) << 12
10398 | itoa64_to_int (input_buf[ 3]) << 18;
10399 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10400 | itoa64_to_int (input_buf[ 5]) << 6
10401 | itoa64_to_int (input_buf[ 6]) << 12
10402 | itoa64_to_int (input_buf[ 7]) << 18;
10403 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10404 | itoa64_to_int (input_buf[ 9]) << 6
10405 | itoa64_to_int (input_buf[10]) << 12
10406 | itoa64_to_int (input_buf[11]) << 18;
10407 digest[3] = itoa64_to_int (input_buf[12]) << 0
10408 | itoa64_to_int (input_buf[13]) << 6
10409 | itoa64_to_int (input_buf[14]) << 12
10410 | itoa64_to_int (input_buf[15]) << 18;
10411
10412 digest[0] -= MD5M_A;
10413 digest[1] -= MD5M_B;
10414 digest[2] -= MD5M_C;
10415 digest[3] -= MD5M_D;
10416
10417 digest[0] &= 0x00ffffff;
10418 digest[1] &= 0x00ffffff;
10419 digest[2] &= 0x00ffffff;
10420 digest[3] &= 0x00ffffff;
10421
10422 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10423
10424 uint salt_len = input_len - 16 - 1;
10425
10426 char *salt_buf = input_buf + 16 + 1;
10427
10428 char *salt_buf_ptr = (char *) salt->salt_buf;
10429
10430 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10431
10432 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10433
10434 salt->salt_len = salt_len;
10435
10436 return (PARSER_OK);
10437 }
10438
10439 void transform_netntlmv1_key (const uint8_t *nthash, uint8_t *key)
10440 {
10441 key[0] = (nthash[0] >> 0);
10442 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10443 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10444 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10445 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10446 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10447 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10448 key[7] = (nthash[6] << 1);
10449
10450 key[0] |= 0x01;
10451 key[1] |= 0x01;
10452 key[2] |= 0x01;
10453 key[3] |= 0x01;
10454 key[4] |= 0x01;
10455 key[5] |= 0x01;
10456 key[6] |= 0x01;
10457 key[7] |= 0x01;
10458 }
10459
10460 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10461 {
10462 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10463
10464 uint32_t *digest = (uint32_t *) hash_buf->digest;
10465
10466 salt_t *salt = hash_buf->salt;
10467
10468 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10469
10470 /**
10471 * parse line
10472 */
10473
10474 char *user_pos = input_buf;
10475
10476 char *unused_pos = strchr (user_pos, ':');
10477
10478 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10479
10480 uint user_len = unused_pos - user_pos;
10481
10482 if (user_len > 60) return (PARSER_SALT_LENGTH);
10483
10484 unused_pos++;
10485
10486 char *domain_pos = strchr (unused_pos, ':');
10487
10488 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10489
10490 uint unused_len = domain_pos - unused_pos;
10491
10492 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10493
10494 domain_pos++;
10495
10496 char *srvchall_pos = strchr (domain_pos, ':');
10497
10498 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10499
10500 uint domain_len = srvchall_pos - domain_pos;
10501
10502 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10503
10504 srvchall_pos++;
10505
10506 char *hash_pos = strchr (srvchall_pos, ':');
10507
10508 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10509
10510 uint srvchall_len = hash_pos - srvchall_pos;
10511
10512 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10513
10514 hash_pos++;
10515
10516 char *clichall_pos = strchr (hash_pos, ':');
10517
10518 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10519
10520 uint hash_len = clichall_pos - hash_pos;
10521
10522 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10523
10524 clichall_pos++;
10525
10526 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10527
10528 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10529
10530 /**
10531 * store some data for later use
10532 */
10533
10534 netntlm->user_len = user_len * 2;
10535 netntlm->domain_len = domain_len * 2;
10536 netntlm->srvchall_len = srvchall_len / 2;
10537 netntlm->clichall_len = clichall_len / 2;
10538
10539 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10540 char *chall_ptr = (char *) netntlm->chall_buf;
10541
10542 /**
10543 * handle username and domainname
10544 */
10545
10546 for (uint i = 0; i < user_len; i++)
10547 {
10548 *userdomain_ptr++ = user_pos[i];
10549 *userdomain_ptr++ = 0;
10550 }
10551
10552 for (uint i = 0; i < domain_len; i++)
10553 {
10554 *userdomain_ptr++ = domain_pos[i];
10555 *userdomain_ptr++ = 0;
10556 }
10557
10558 /**
10559 * handle server challenge encoding
10560 */
10561
10562 for (uint i = 0; i < srvchall_len; i += 2)
10563 {
10564 const char p0 = srvchall_pos[i + 0];
10565 const char p1 = srvchall_pos[i + 1];
10566
10567 *chall_ptr++ = hex_convert (p1) << 0
10568 | hex_convert (p0) << 4;
10569 }
10570
10571 /**
10572 * handle client challenge encoding
10573 */
10574
10575 for (uint i = 0; i < clichall_len; i += 2)
10576 {
10577 const char p0 = clichall_pos[i + 0];
10578 const char p1 = clichall_pos[i + 1];
10579
10580 *chall_ptr++ = hex_convert (p1) << 0
10581 | hex_convert (p0) << 4;
10582 }
10583
10584 /**
10585 * store data
10586 */
10587
10588 char *salt_buf_ptr = (char *) salt->salt_buf;
10589
10590 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10591
10592 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10593
10594 salt->salt_len = salt_len;
10595
10596 digest[0] = hex_to_uint (&hash_pos[ 0]);
10597 digest[1] = hex_to_uint (&hash_pos[ 8]);
10598 digest[2] = hex_to_uint (&hash_pos[16]);
10599 digest[3] = hex_to_uint (&hash_pos[24]);
10600
10601 digest[0] = byte_swap_32 (digest[0]);
10602 digest[1] = byte_swap_32 (digest[1]);
10603 digest[2] = byte_swap_32 (digest[2]);
10604 digest[3] = byte_swap_32 (digest[3]);
10605
10606 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10607
10608 uint digest_tmp[2];
10609
10610 digest_tmp[0] = hex_to_uint (&hash_pos[32]);
10611 digest_tmp[1] = hex_to_uint (&hash_pos[40]);
10612
10613 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10614 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10615
10616 /* special case 2: ESS */
10617
10618 if (srvchall_len == 48)
10619 {
10620 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10621 {
10622 uint w[16];
10623
10624 w[ 0] = netntlm->chall_buf[6];
10625 w[ 1] = netntlm->chall_buf[7];
10626 w[ 2] = netntlm->chall_buf[0];
10627 w[ 3] = netntlm->chall_buf[1];
10628 w[ 4] = 0x80;
10629 w[ 5] = 0;
10630 w[ 6] = 0;
10631 w[ 7] = 0;
10632 w[ 8] = 0;
10633 w[ 9] = 0;
10634 w[10] = 0;
10635 w[11] = 0;
10636 w[12] = 0;
10637 w[13] = 0;
10638 w[14] = 16 * 8;
10639 w[15] = 0;
10640
10641 uint dgst[4];
10642
10643 dgst[0] = MAGIC_A;
10644 dgst[1] = MAGIC_B;
10645 dgst[2] = MAGIC_C;
10646 dgst[3] = MAGIC_D;
10647
10648 md5_64 (w, dgst);
10649
10650 salt->salt_buf[0] = dgst[0];
10651 salt->salt_buf[1] = dgst[1];
10652 }
10653 }
10654
10655 /* precompute netntlmv1 exploit start */
10656
10657 for (uint i = 0; i < 0x10000; i++)
10658 {
10659 uint key_md4[2] = { i, 0 };
10660 uint key_des[2] = { 0, 0 };
10661
10662 transform_netntlmv1_key ((uint8_t *) key_md4, (uint8_t *) key_des);
10663
10664 uint Kc[16];
10665 uint Kd[16];
10666
10667 _des_keysetup (key_des, Kc, Kd, c_skb);
10668
10669 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10670
10671 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10672
10673 if (data3[0] != digest_tmp[0]) continue;
10674 if (data3[1] != digest_tmp[1]) continue;
10675
10676 salt->salt_buf[2] = i;
10677
10678 salt->salt_len = 24;
10679
10680 break;
10681 }
10682
10683 salt->salt_buf_pc[0] = digest_tmp[0];
10684 salt->salt_buf_pc[1] = digest_tmp[1];
10685
10686 /* precompute netntlmv1 exploit stop */
10687
10688 uint32_t tt;
10689
10690 IP (digest[0], digest[1], tt);
10691 IP (digest[2], digest[3], tt);
10692
10693 digest[0] = ROTATE_RIGHT (digest[0], 29);
10694 digest[1] = ROTATE_RIGHT (digest[1], 29);
10695 digest[2] = ROTATE_RIGHT (digest[2], 29);
10696 digest[3] = ROTATE_RIGHT (digest[3], 29);
10697
10698 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10699
10700 salt->salt_buf[0] = ROTATE_LEFT (salt->salt_buf[0], 3);
10701 salt->salt_buf[1] = ROTATE_LEFT (salt->salt_buf[1], 3);
10702
10703 return (PARSER_OK);
10704 }
10705
10706 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10707 {
10708 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10709
10710 uint32_t *digest = (uint32_t *) hash_buf->digest;
10711
10712 salt_t *salt = hash_buf->salt;
10713
10714 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10715
10716 /**
10717 * parse line
10718 */
10719
10720 char *user_pos = input_buf;
10721
10722 char *unused_pos = strchr (user_pos, ':');
10723
10724 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10725
10726 uint user_len = unused_pos - user_pos;
10727
10728 if (user_len > 60) return (PARSER_SALT_LENGTH);
10729
10730 unused_pos++;
10731
10732 char *domain_pos = strchr (unused_pos, ':');
10733
10734 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10735
10736 uint unused_len = domain_pos - unused_pos;
10737
10738 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10739
10740 domain_pos++;
10741
10742 char *srvchall_pos = strchr (domain_pos, ':');
10743
10744 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10745
10746 uint domain_len = srvchall_pos - domain_pos;
10747
10748 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10749
10750 srvchall_pos++;
10751
10752 char *hash_pos = strchr (srvchall_pos, ':');
10753
10754 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10755
10756 uint srvchall_len = hash_pos - srvchall_pos;
10757
10758 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
10759
10760 hash_pos++;
10761
10762 char *clichall_pos = strchr (hash_pos, ':');
10763
10764 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10765
10766 uint hash_len = clichall_pos - hash_pos;
10767
10768 if (hash_len != 32) return (PARSER_HASH_LENGTH);
10769
10770 clichall_pos++;
10771
10772 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10773
10774 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
10775
10776 if (clichall_len % 2) return (PARSER_SALT_VALUE);
10777
10778 /**
10779 * store some data for later use
10780 */
10781
10782 netntlm->user_len = user_len * 2;
10783 netntlm->domain_len = domain_len * 2;
10784 netntlm->srvchall_len = srvchall_len / 2;
10785 netntlm->clichall_len = clichall_len / 2;
10786
10787 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10788 char *chall_ptr = (char *) netntlm->chall_buf;
10789
10790 /**
10791 * handle username and domainname
10792 */
10793
10794 for (uint i = 0; i < user_len; i++)
10795 {
10796 *userdomain_ptr++ = toupper (user_pos[i]);
10797 *userdomain_ptr++ = 0;
10798 }
10799
10800 for (uint i = 0; i < domain_len; i++)
10801 {
10802 *userdomain_ptr++ = domain_pos[i];
10803 *userdomain_ptr++ = 0;
10804 }
10805
10806 *userdomain_ptr++ = 0x80;
10807
10808 /**
10809 * handle server challenge encoding
10810 */
10811
10812 for (uint i = 0; i < srvchall_len; i += 2)
10813 {
10814 const char p0 = srvchall_pos[i + 0];
10815 const char p1 = srvchall_pos[i + 1];
10816
10817 *chall_ptr++ = hex_convert (p1) << 0
10818 | hex_convert (p0) << 4;
10819 }
10820
10821 /**
10822 * handle client challenge encoding
10823 */
10824
10825 for (uint i = 0; i < clichall_len; i += 2)
10826 {
10827 const char p0 = clichall_pos[i + 0];
10828 const char p1 = clichall_pos[i + 1];
10829
10830 *chall_ptr++ = hex_convert (p1) << 0
10831 | hex_convert (p0) << 4;
10832 }
10833
10834 *chall_ptr++ = 0x80;
10835
10836 /**
10837 * handle hash itself
10838 */
10839
10840 digest[0] = hex_to_uint (&hash_pos[ 0]);
10841 digest[1] = hex_to_uint (&hash_pos[ 8]);
10842 digest[2] = hex_to_uint (&hash_pos[16]);
10843 digest[3] = hex_to_uint (&hash_pos[24]);
10844
10845 digest[0] = byte_swap_32 (digest[0]);
10846 digest[1] = byte_swap_32 (digest[1]);
10847 digest[2] = byte_swap_32 (digest[2]);
10848 digest[3] = byte_swap_32 (digest[3]);
10849
10850 /**
10851 * reuse challange data as salt_buf, its the buffer that is most likely unique
10852 */
10853
10854 salt->salt_buf[0] = 0;
10855 salt->salt_buf[1] = 0;
10856 salt->salt_buf[2] = 0;
10857 salt->salt_buf[3] = 0;
10858 salt->salt_buf[4] = 0;
10859 salt->salt_buf[5] = 0;
10860 salt->salt_buf[6] = 0;
10861 salt->salt_buf[7] = 0;
10862
10863 uint *uptr;
10864
10865 uptr = (uint *) netntlm->userdomain_buf;
10866
10867 for (uint i = 0; i < 16; i += 16)
10868 {
10869 md5_64 (uptr, salt->salt_buf);
10870 }
10871
10872 uptr = (uint *) netntlm->chall_buf;
10873
10874 for (uint i = 0; i < 256; i += 16)
10875 {
10876 md5_64 (uptr, salt->salt_buf);
10877 }
10878
10879 salt->salt_len = 16;
10880
10881 return (PARSER_OK);
10882 }
10883
10884 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10885 {
10886 if (data.opts_type & OPTS_TYPE_ST_HEX)
10887 {
10888 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
10889 }
10890 else
10891 {
10892 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
10893 }
10894
10895 uint32_t *digest = (uint32_t *) hash_buf->digest;
10896
10897 salt_t *salt = hash_buf->salt;
10898
10899 digest[0] = hex_to_uint (&input_buf[ 0]);
10900 digest[1] = hex_to_uint (&input_buf[ 8]);
10901 digest[2] = hex_to_uint (&input_buf[16]);
10902 digest[3] = hex_to_uint (&input_buf[24]);
10903
10904 digest[0] = byte_swap_32 (digest[0]);
10905 digest[1] = byte_swap_32 (digest[1]);
10906 digest[2] = byte_swap_32 (digest[2]);
10907 digest[3] = byte_swap_32 (digest[3]);
10908
10909 digest[0] -= MD5M_A;
10910 digest[1] -= MD5M_B;
10911 digest[2] -= MD5M_C;
10912 digest[3] -= MD5M_D;
10913
10914 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10915
10916 uint salt_len = input_len - 32 - 1;
10917
10918 char *salt_buf = input_buf + 32 + 1;
10919
10920 char *salt_buf_ptr = (char *) salt->salt_buf;
10921
10922 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10923
10924 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10925
10926 salt->salt_len = salt_len;
10927
10928 return (PARSER_OK);
10929 }
10930
10931 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10932 {
10933 if (data.opts_type & OPTS_TYPE_ST_HEX)
10934 {
10935 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
10936 }
10937 else
10938 {
10939 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
10940 }
10941
10942 uint32_t *digest = (uint32_t *) hash_buf->digest;
10943
10944 salt_t *salt = hash_buf->salt;
10945
10946 digest[0] = hex_to_uint (&input_buf[ 0]);
10947 digest[1] = hex_to_uint (&input_buf[ 8]);
10948 digest[2] = hex_to_uint (&input_buf[16]);
10949 digest[3] = hex_to_uint (&input_buf[24]);
10950
10951 digest[0] = byte_swap_32 (digest[0]);
10952 digest[1] = byte_swap_32 (digest[1]);
10953 digest[2] = byte_swap_32 (digest[2]);
10954 digest[3] = byte_swap_32 (digest[3]);
10955
10956 digest[0] -= MD5M_A;
10957 digest[1] -= MD5M_B;
10958 digest[2] -= MD5M_C;
10959 digest[3] -= MD5M_D;
10960
10961 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10962
10963 uint salt_len = input_len - 32 - 1;
10964
10965 char *salt_buf = input_buf + 32 + 1;
10966
10967 char *salt_buf_ptr = (char *) salt->salt_buf;
10968
10969 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10970
10971 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10972
10973 salt->salt_len = salt_len;
10974
10975 return (PARSER_OK);
10976 }
10977
10978 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10979 {
10980 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
10981
10982 uint32_t *digest = (uint32_t *) hash_buf->digest;
10983
10984 salt_t *salt = hash_buf->salt;
10985
10986 digest[0] = hex_to_uint (&input_buf[ 0]);
10987 digest[1] = hex_to_uint (&input_buf[ 8]);
10988 digest[2] = hex_to_uint (&input_buf[16]);
10989 digest[3] = hex_to_uint (&input_buf[24]);
10990
10991 digest[0] = byte_swap_32 (digest[0]);
10992 digest[1] = byte_swap_32 (digest[1]);
10993 digest[2] = byte_swap_32 (digest[2]);
10994 digest[3] = byte_swap_32 (digest[3]);
10995
10996 digest[0] -= MD5M_A;
10997 digest[1] -= MD5M_B;
10998 digest[2] -= MD5M_C;
10999 digest[3] -= MD5M_D;
11000
11001 /**
11002 * This is a virtual salt. While the algorithm is basically not salted
11003 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11004 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11005 */
11006
11007 char *salt_buf_ptr = (char *) salt->salt_buf;
11008
11009 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11010
11011 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11012
11013 salt->salt_len = salt_len;
11014
11015 return (PARSER_OK);
11016 }
11017
11018 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11019 {
11020 if (data.opts_type & OPTS_TYPE_ST_HEX)
11021 {
11022 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11023 }
11024 else
11025 {
11026 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11027 }
11028
11029 uint32_t *digest = (uint32_t *) hash_buf->digest;
11030
11031 salt_t *salt = hash_buf->salt;
11032
11033 digest[0] = hex_to_uint (&input_buf[ 0]);
11034 digest[1] = hex_to_uint (&input_buf[ 8]);
11035 digest[2] = hex_to_uint (&input_buf[16]);
11036 digest[3] = hex_to_uint (&input_buf[24]);
11037
11038 digest[0] = byte_swap_32 (digest[0]);
11039 digest[1] = byte_swap_32 (digest[1]);
11040 digest[2] = byte_swap_32 (digest[2]);
11041 digest[3] = byte_swap_32 (digest[3]);
11042
11043 digest[0] -= MD5M_A;
11044 digest[1] -= MD5M_B;
11045 digest[2] -= MD5M_C;
11046 digest[3] -= MD5M_D;
11047
11048 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11049
11050 uint salt_len = input_len - 32 - 1;
11051
11052 char *salt_buf = input_buf + 32 + 1;
11053
11054 char *salt_buf_ptr = (char *) salt->salt_buf;
11055
11056 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11057
11058 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11059
11060 salt->salt_len = salt_len;
11061
11062 return (PARSER_OK);
11063 }
11064
11065 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11066 {
11067 if (data.opts_type & OPTS_TYPE_ST_HEX)
11068 {
11069 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11070 }
11071 else
11072 {
11073 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11074 }
11075
11076 uint32_t *digest = (uint32_t *) hash_buf->digest;
11077
11078 salt_t *salt = hash_buf->salt;
11079
11080 digest[0] = hex_to_uint (&input_buf[ 0]);
11081 digest[1] = hex_to_uint (&input_buf[ 8]);
11082 digest[2] = hex_to_uint (&input_buf[16]);
11083 digest[3] = hex_to_uint (&input_buf[24]);
11084
11085 digest[0] = byte_swap_32 (digest[0]);
11086 digest[1] = byte_swap_32 (digest[1]);
11087 digest[2] = byte_swap_32 (digest[2]);
11088 digest[3] = byte_swap_32 (digest[3]);
11089
11090 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11091
11092 uint salt_len = input_len - 32 - 1;
11093
11094 char *salt_buf = input_buf + 32 + 1;
11095
11096 char *salt_buf_ptr = (char *) salt->salt_buf;
11097
11098 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11099
11100 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11101
11102 salt->salt_len = salt_len;
11103
11104 return (PARSER_OK);
11105 }
11106
11107 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11108 {
11109 if (data.opts_type & OPTS_TYPE_ST_HEX)
11110 {
11111 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11112 }
11113 else
11114 {
11115 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11116 }
11117
11118 uint32_t *digest = (uint32_t *) hash_buf->digest;
11119
11120 salt_t *salt = hash_buf->salt;
11121
11122 digest[0] = hex_to_uint (&input_buf[ 0]);
11123 digest[1] = hex_to_uint (&input_buf[ 8]);
11124 digest[2] = hex_to_uint (&input_buf[16]);
11125 digest[3] = hex_to_uint (&input_buf[24]);
11126
11127 digest[0] = byte_swap_32 (digest[0]);
11128 digest[1] = byte_swap_32 (digest[1]);
11129 digest[2] = byte_swap_32 (digest[2]);
11130 digest[3] = byte_swap_32 (digest[3]);
11131
11132 digest[0] -= MD4M_A;
11133 digest[1] -= MD4M_B;
11134 digest[2] -= MD4M_C;
11135 digest[3] -= MD4M_D;
11136
11137 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11138
11139 uint salt_len = input_len - 32 - 1;
11140
11141 char *salt_buf = input_buf + 32 + 1;
11142
11143 char *salt_buf_ptr = (char *) salt->salt_buf;
11144
11145 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11146
11147 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11148
11149 salt->salt_len = salt_len;
11150
11151 return (PARSER_OK);
11152 }
11153
11154 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11155 {
11156 if (data.opts_type & OPTS_TYPE_ST_HEX)
11157 {
11158 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11159 }
11160 else
11161 {
11162 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11163 }
11164
11165 uint32_t *digest = (uint32_t *) hash_buf->digest;
11166
11167 salt_t *salt = hash_buf->salt;
11168
11169 digest[0] = hex_to_uint (&input_buf[ 0]);
11170 digest[1] = hex_to_uint (&input_buf[ 8]);
11171 digest[2] = hex_to_uint (&input_buf[16]);
11172 digest[3] = hex_to_uint (&input_buf[24]);
11173
11174 digest[0] = byte_swap_32 (digest[0]);
11175 digest[1] = byte_swap_32 (digest[1]);
11176 digest[2] = byte_swap_32 (digest[2]);
11177 digest[3] = byte_swap_32 (digest[3]);
11178
11179 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11180
11181 uint salt_len = input_len - 32 - 1;
11182
11183 char *salt_buf = input_buf + 32 + 1;
11184
11185 uint salt_pc_block[16];
11186
11187 memset (salt_pc_block, 0, sizeof (salt_pc_block));
11188
11189 char *salt_pc_block_ptr = (char *) salt_pc_block;
11190
11191 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11192
11193 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11194
11195 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11196
11197 salt_pc_block[14] = salt_len * 8;
11198
11199 uint salt_pc_digest[4];
11200
11201 salt_pc_digest[0] = MAGIC_A;
11202 salt_pc_digest[1] = MAGIC_B;
11203 salt_pc_digest[2] = MAGIC_C;
11204 salt_pc_digest[3] = MAGIC_D;
11205
11206 md5_64 (salt_pc_block, salt_pc_digest);
11207
11208 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11209 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11210 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11211 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11212
11213 char *salt_buf_ptr = (char *) salt->salt_buf;
11214
11215 memcpy (salt_buf_ptr, salt_buf, salt_len);
11216
11217 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
11218
11219 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11220 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11221 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11222 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11223
11224 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11225
11226 return (PARSER_OK);
11227 }
11228
11229 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11230 {
11231 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11232
11233 uint32_t *digest = (uint32_t *) hash_buf->digest;
11234
11235 digest[0] = hex_to_uint (&input_buf[ 0]);
11236 digest[1] = hex_to_uint (&input_buf[ 8]);
11237 digest[2] = hex_to_uint (&input_buf[16]);
11238 digest[3] = hex_to_uint (&input_buf[24]);
11239 digest[4] = hex_to_uint (&input_buf[32]);
11240
11241 digest[0] -= SHA1M_A;
11242 digest[1] -= SHA1M_B;
11243 digest[2] -= SHA1M_C;
11244 digest[3] -= SHA1M_D;
11245 digest[4] -= SHA1M_E;
11246
11247 return (PARSER_OK);
11248 }
11249
11250 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11251 {
11252 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11253
11254 uint32_t *digest = (uint32_t *) hash_buf->digest;
11255
11256 digest[0] = hex_to_uint (&input_buf[ 0]);
11257 digest[1] = hex_to_uint (&input_buf[ 8]);
11258 digest[2] = hex_to_uint (&input_buf[16]);
11259 digest[3] = hex_to_uint (&input_buf[24]);
11260 digest[4] = hex_to_uint (&input_buf[32]);
11261
11262 return (PARSER_OK);
11263 }
11264
11265 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11266 {
11267 if (data.opts_type & OPTS_TYPE_ST_HEX)
11268 {
11269 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11270 }
11271 else
11272 {
11273 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11274 }
11275
11276 uint32_t *digest = (uint32_t *) hash_buf->digest;
11277
11278 salt_t *salt = hash_buf->salt;
11279
11280 digest[0] = hex_to_uint (&input_buf[ 0]);
11281 digest[1] = hex_to_uint (&input_buf[ 8]);
11282 digest[2] = hex_to_uint (&input_buf[16]);
11283 digest[3] = hex_to_uint (&input_buf[24]);
11284 digest[4] = hex_to_uint (&input_buf[32]);
11285
11286 digest[0] -= SHA1M_A;
11287 digest[1] -= SHA1M_B;
11288 digest[2] -= SHA1M_C;
11289 digest[3] -= SHA1M_D;
11290 digest[4] -= SHA1M_E;
11291
11292 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11293
11294 uint salt_len = input_len - 40 - 1;
11295
11296 char *salt_buf = input_buf + 40 + 1;
11297
11298 char *salt_buf_ptr = (char *) salt->salt_buf;
11299
11300 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11301
11302 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11303
11304 salt->salt_len = salt_len;
11305
11306 return (PARSER_OK);
11307 }
11308
11309 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11310 {
11311 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11312
11313 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11314
11315 uint32_t *digest = (uint32_t *) hash_buf->digest;
11316
11317 char tmp_buf[100];
11318
11319 memset (tmp_buf, 0, sizeof (tmp_buf));
11320
11321 base64_decode (base64_to_int, input_buf + 5, input_len - 5, tmp_buf);
11322
11323 memcpy (digest, tmp_buf, 20);
11324
11325 digest[0] = byte_swap_32 (digest[0]);
11326 digest[1] = byte_swap_32 (digest[1]);
11327 digest[2] = byte_swap_32 (digest[2]);
11328 digest[3] = byte_swap_32 (digest[3]);
11329 digest[4] = byte_swap_32 (digest[4]);
11330
11331 digest[0] -= SHA1M_A;
11332 digest[1] -= SHA1M_B;
11333 digest[2] -= SHA1M_C;
11334 digest[3] -= SHA1M_D;
11335 digest[4] -= SHA1M_E;
11336
11337 return (PARSER_OK);
11338 }
11339
11340 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11341 {
11342 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11343
11344 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11345
11346 uint32_t *digest = (uint32_t *) hash_buf->digest;
11347
11348 salt_t *salt = hash_buf->salt;
11349
11350 char tmp_buf[100];
11351
11352 memset (tmp_buf, 0, sizeof (tmp_buf));
11353
11354 int tmp_len = base64_decode (base64_to_int, input_buf + 6, input_len - 6, tmp_buf);
11355
11356 memcpy (digest, tmp_buf, 20);
11357
11358 salt->salt_len = tmp_len - 20;
11359
11360 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11361
11362 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11363 {
11364 char *ptr = (char *) salt->salt_buf;
11365
11366 ptr[salt->salt_len] = 0x80;
11367 }
11368
11369 digest[0] = byte_swap_32 (digest[0]);
11370 digest[1] = byte_swap_32 (digest[1]);
11371 digest[2] = byte_swap_32 (digest[2]);
11372 digest[3] = byte_swap_32 (digest[3]);
11373 digest[4] = byte_swap_32 (digest[4]);
11374
11375 digest[0] -= SHA1M_A;
11376 digest[1] -= SHA1M_B;
11377 digest[2] -= SHA1M_C;
11378 digest[3] -= SHA1M_D;
11379 digest[4] -= SHA1M_E;
11380
11381 return (PARSER_OK);
11382 }
11383
11384 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11385 {
11386 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11387
11388 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11389
11390 uint32_t *digest = (uint32_t *) hash_buf->digest;
11391
11392 salt_t *salt = hash_buf->salt;
11393
11394 char *salt_buf = input_buf + 6;
11395
11396 uint salt_len = 8;
11397
11398 char *salt_buf_ptr = (char *) salt->salt_buf;
11399
11400 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11401
11402 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11403
11404 salt->salt_len = salt_len;
11405
11406 char *hash_pos = input_buf + 6 + 8 + 40;
11407
11408 digest[0] = hex_to_uint (&hash_pos[ 0]);
11409 digest[1] = hex_to_uint (&hash_pos[ 8]);
11410 digest[2] = hex_to_uint (&hash_pos[16]);
11411 digest[3] = hex_to_uint (&hash_pos[24]);
11412 digest[4] = hex_to_uint (&hash_pos[32]);
11413
11414 digest[0] -= SHA1M_A;
11415 digest[1] -= SHA1M_B;
11416 digest[2] -= SHA1M_C;
11417 digest[3] -= SHA1M_D;
11418 digest[4] -= SHA1M_E;
11419
11420 return (PARSER_OK);
11421 }
11422
11423 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11424 {
11425 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11426
11427 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11428
11429 uint32_t *digest = (uint32_t *) hash_buf->digest;
11430
11431 salt_t *salt = hash_buf->salt;
11432
11433 char *salt_buf = input_buf + 6;
11434
11435 uint salt_len = 8;
11436
11437 char *salt_buf_ptr = (char *) salt->salt_buf;
11438
11439 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11440
11441 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11442
11443 salt->salt_len = salt_len;
11444
11445 char *hash_pos = input_buf + 6 + 8;
11446
11447 digest[0] = hex_to_uint (&hash_pos[ 0]);
11448 digest[1] = hex_to_uint (&hash_pos[ 8]);
11449 digest[2] = hex_to_uint (&hash_pos[16]);
11450 digest[3] = hex_to_uint (&hash_pos[24]);
11451 digest[4] = hex_to_uint (&hash_pos[32]);
11452
11453 digest[0] -= SHA1M_A;
11454 digest[1] -= SHA1M_B;
11455 digest[2] -= SHA1M_C;
11456 digest[3] -= SHA1M_D;
11457 digest[4] -= SHA1M_E;
11458
11459 return (PARSER_OK);
11460 }
11461
11462 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11463 {
11464 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11465
11466 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11467
11468 uint64_t *digest = (uint64_t *) hash_buf->digest;
11469
11470 salt_t *salt = hash_buf->salt;
11471
11472 char *salt_buf = input_buf + 6;
11473
11474 uint salt_len = 8;
11475
11476 char *salt_buf_ptr = (char *) salt->salt_buf;
11477
11478 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11479
11480 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11481
11482 salt->salt_len = salt_len;
11483
11484 char *hash_pos = input_buf + 6 + 8;
11485
11486 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
11487 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
11488 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
11489 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
11490 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
11491 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
11492 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
11493 digest[7] = hex_to_uint64_t (&hash_pos[112]);
11494
11495 digest[0] -= SHA512M_A;
11496 digest[1] -= SHA512M_B;
11497 digest[2] -= SHA512M_C;
11498 digest[3] -= SHA512M_D;
11499 digest[4] -= SHA512M_E;
11500 digest[5] -= SHA512M_F;
11501 digest[6] -= SHA512M_G;
11502 digest[7] -= SHA512M_H;
11503
11504 return (PARSER_OK);
11505 }
11506
11507 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11508 {
11509 if (data.opts_type & OPTS_TYPE_ST_HEX)
11510 {
11511 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11512 }
11513 else
11514 {
11515 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11516 }
11517
11518 uint32_t *digest = (uint32_t *) hash_buf->digest;
11519
11520 salt_t *salt = hash_buf->salt;
11521
11522 digest[0] = hex_to_uint (&input_buf[ 0]);
11523 digest[1] = hex_to_uint (&input_buf[ 8]);
11524 digest[2] = 0;
11525 digest[3] = 0;
11526
11527 digest[0] = byte_swap_32 (digest[0]);
11528 digest[1] = byte_swap_32 (digest[1]);
11529
11530 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11531
11532 uint salt_len = input_len - 16 - 1;
11533
11534 char *salt_buf = input_buf + 16 + 1;
11535
11536 char *salt_buf_ptr = (char *) salt->salt_buf;
11537
11538 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11539
11540 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11541
11542 salt->salt_len = salt_len;
11543
11544 return (PARSER_OK);
11545 }
11546
11547 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11548 {
11549 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11550
11551 uint32_t *digest = (uint32_t *) hash_buf->digest;
11552
11553 salt_t *salt = hash_buf->salt;
11554
11555 digest[0] = hex_to_uint (&input_buf[ 0]);
11556 digest[1] = hex_to_uint (&input_buf[ 8]);
11557 digest[2] = hex_to_uint (&input_buf[16]);
11558 digest[3] = hex_to_uint (&input_buf[24]);
11559 digest[4] = hex_to_uint (&input_buf[32]);
11560
11561 digest[0] -= SHA1M_A;
11562 digest[1] -= SHA1M_B;
11563 digest[2] -= SHA1M_C;
11564 digest[3] -= SHA1M_D;
11565 digest[4] -= SHA1M_E;
11566
11567 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11568
11569 uint salt_len = input_len - 40 - 1;
11570
11571 char *salt_buf = input_buf + 40 + 1;
11572
11573 char *salt_buf_ptr = (char *) salt->salt_buf;
11574
11575 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11576
11577 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11578
11579 salt->salt_len = salt_len;
11580
11581 return (PARSER_OK);
11582 }
11583
11584 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11585 {
11586 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11587
11588 uint32_t *digest = (uint32_t *) hash_buf->digest;
11589
11590 salt_t *salt = hash_buf->salt;
11591
11592 char *hash_pos = input_buf;
11593
11594 digest[ 0] = hex_to_uint (&hash_pos[ 0]);
11595 digest[ 1] = hex_to_uint (&hash_pos[ 8]);
11596 digest[ 2] = hex_to_uint (&hash_pos[ 16]);
11597 digest[ 3] = hex_to_uint (&hash_pos[ 24]);
11598 digest[ 4] = hex_to_uint (&hash_pos[ 32]);
11599 digest[ 5] = hex_to_uint (&hash_pos[ 40]);
11600 digest[ 6] = hex_to_uint (&hash_pos[ 48]);
11601 digest[ 7] = hex_to_uint (&hash_pos[ 56]);
11602 digest[ 8] = hex_to_uint (&hash_pos[ 64]);
11603 digest[ 9] = hex_to_uint (&hash_pos[ 72]);
11604 digest[10] = hex_to_uint (&hash_pos[ 80]);
11605 digest[11] = hex_to_uint (&hash_pos[ 88]);
11606 digest[12] = hex_to_uint (&hash_pos[ 96]);
11607 digest[13] = hex_to_uint (&hash_pos[104]);
11608 digest[14] = hex_to_uint (&hash_pos[112]);
11609 digest[15] = hex_to_uint (&hash_pos[120]);
11610
11611 char *salt_pos = input_buf + 128;
11612
11613 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
11614 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
11615 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]);
11616 salt->salt_buf[3] = hex_to_uint (&salt_pos[24]);
11617
11618 salt->salt_iter = ROUNDS_ORACLET - 1;
11619 salt->salt_len = 16;
11620
11621 return (PARSER_OK);
11622 }
11623
11624 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11625 {
11626 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11627
11628 uint32_t *digest = (uint32_t *) hash_buf->digest;
11629
11630 digest[0] = hex_to_uint (&input_buf[ 0]);
11631 digest[1] = hex_to_uint (&input_buf[ 8]);
11632 digest[2] = hex_to_uint (&input_buf[16]);
11633 digest[3] = hex_to_uint (&input_buf[24]);
11634 digest[4] = hex_to_uint (&input_buf[32]);
11635 digest[5] = hex_to_uint (&input_buf[40]);
11636 digest[6] = hex_to_uint (&input_buf[48]);
11637 digest[7] = hex_to_uint (&input_buf[56]);
11638
11639 digest[0] -= SHA256M_A;
11640 digest[1] -= SHA256M_B;
11641 digest[2] -= SHA256M_C;
11642 digest[3] -= SHA256M_D;
11643 digest[4] -= SHA256M_E;
11644 digest[5] -= SHA256M_F;
11645 digest[6] -= SHA256M_G;
11646 digest[7] -= SHA256M_H;
11647
11648 return (PARSER_OK);
11649 }
11650
11651 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11652 {
11653 if (data.opts_type & OPTS_TYPE_ST_HEX)
11654 {
11655 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11656 }
11657 else
11658 {
11659 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11660 }
11661
11662 uint32_t *digest = (uint32_t *) hash_buf->digest;
11663
11664 salt_t *salt = hash_buf->salt;
11665
11666 digest[0] = hex_to_uint (&input_buf[ 0]);
11667 digest[1] = hex_to_uint (&input_buf[ 8]);
11668 digest[2] = hex_to_uint (&input_buf[16]);
11669 digest[3] = hex_to_uint (&input_buf[24]);
11670 digest[4] = hex_to_uint (&input_buf[32]);
11671 digest[5] = hex_to_uint (&input_buf[40]);
11672 digest[6] = hex_to_uint (&input_buf[48]);
11673 digest[7] = hex_to_uint (&input_buf[56]);
11674
11675 digest[0] -= SHA256M_A;
11676 digest[1] -= SHA256M_B;
11677 digest[2] -= SHA256M_C;
11678 digest[3] -= SHA256M_D;
11679 digest[4] -= SHA256M_E;
11680 digest[5] -= SHA256M_F;
11681 digest[6] -= SHA256M_G;
11682 digest[7] -= SHA256M_H;
11683
11684 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11685
11686 uint salt_len = input_len - 64 - 1;
11687
11688 char *salt_buf = input_buf + 64 + 1;
11689
11690 char *salt_buf_ptr = (char *) salt->salt_buf;
11691
11692 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11693
11694 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11695
11696 salt->salt_len = salt_len;
11697
11698 return (PARSER_OK);
11699 }
11700
11701 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11702 {
11703 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11704
11705 uint64_t *digest = (uint64_t *) hash_buf->digest;
11706
11707 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11708 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11709 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11710 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11711 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11712 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11713 digest[6] = 0;
11714 digest[7] = 0;
11715
11716 digest[0] -= SHA384M_A;
11717 digest[1] -= SHA384M_B;
11718 digest[2] -= SHA384M_C;
11719 digest[3] -= SHA384M_D;
11720 digest[4] -= SHA384M_E;
11721 digest[5] -= SHA384M_F;
11722 digest[6] -= 0;
11723 digest[7] -= 0;
11724
11725 return (PARSER_OK);
11726 }
11727
11728 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11729 {
11730 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
11731
11732 uint64_t *digest = (uint64_t *) hash_buf->digest;
11733
11734 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11735 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11736 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11737 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11738 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11739 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11740 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
11741 digest[7] = hex_to_uint64_t (&input_buf[112]);
11742
11743 digest[0] -= SHA512M_A;
11744 digest[1] -= SHA512M_B;
11745 digest[2] -= SHA512M_C;
11746 digest[3] -= SHA512M_D;
11747 digest[4] -= SHA512M_E;
11748 digest[5] -= SHA512M_F;
11749 digest[6] -= SHA512M_G;
11750 digest[7] -= SHA512M_H;
11751
11752 return (PARSER_OK);
11753 }
11754
11755 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11756 {
11757 if (data.opts_type & OPTS_TYPE_ST_HEX)
11758 {
11759 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
11760 }
11761 else
11762 {
11763 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
11764 }
11765
11766 uint64_t *digest = (uint64_t *) hash_buf->digest;
11767
11768 salt_t *salt = hash_buf->salt;
11769
11770 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11771 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11772 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11773 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11774 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11775 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11776 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
11777 digest[7] = hex_to_uint64_t (&input_buf[112]);
11778
11779 digest[0] -= SHA512M_A;
11780 digest[1] -= SHA512M_B;
11781 digest[2] -= SHA512M_C;
11782 digest[3] -= SHA512M_D;
11783 digest[4] -= SHA512M_E;
11784 digest[5] -= SHA512M_F;
11785 digest[6] -= SHA512M_G;
11786 digest[7] -= SHA512M_H;
11787
11788 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11789
11790 uint salt_len = input_len - 128 - 1;
11791
11792 char *salt_buf = input_buf + 128 + 1;
11793
11794 char *salt_buf_ptr = (char *) salt->salt_buf;
11795
11796 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11797
11798 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11799
11800 salt->salt_len = salt_len;
11801
11802 return (PARSER_OK);
11803 }
11804
11805 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11806 {
11807 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
11808
11809 uint64_t *digest = (uint64_t *) hash_buf->digest;
11810
11811 salt_t *salt = hash_buf->salt;
11812
11813 char *salt_pos = input_buf + 3;
11814
11815 uint iterations_len = 0;
11816
11817 if (memcmp (salt_pos, "rounds=", 7) == 0)
11818 {
11819 salt_pos += 7;
11820
11821 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
11822
11823 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
11824 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
11825
11826 salt_pos[0] = 0x0;
11827
11828 salt->salt_iter = atoi (salt_pos - iterations_len);
11829
11830 salt_pos += 1;
11831
11832 iterations_len += 8;
11833 }
11834 else
11835 {
11836 salt->salt_iter = ROUNDS_SHA512CRYPT;
11837 }
11838
11839 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
11840
11841 char *hash_pos = strchr (salt_pos, '$');
11842
11843 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11844
11845 uint salt_len = hash_pos - salt_pos;
11846
11847 if (salt_len > 16) return (PARSER_SALT_LENGTH);
11848
11849 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
11850
11851 salt->salt_len = salt_len;
11852
11853 hash_pos++;
11854
11855 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
11856
11857 return (PARSER_OK);
11858 }
11859
11860 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11861 {
11862 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
11863
11864 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
11865
11866 uint64_t *digest = (uint64_t *) hash_buf->digest;
11867
11868 salt_t *salt = hash_buf->salt;
11869
11870 uint keccak_mdlen = input_len / 2;
11871
11872 for (uint i = 0; i < keccak_mdlen / 8; i++)
11873 {
11874 digest[i] = hex_to_uint64_t (&input_buf[i * 16]);
11875
11876 digest[i] = byte_swap_64 (digest[i]);
11877 }
11878
11879 salt->keccak_mdlen = keccak_mdlen;
11880
11881 return (PARSER_OK);
11882 }
11883
11884 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11885 {
11886 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
11887
11888 uint32_t *digest = (uint32_t *) hash_buf->digest;
11889
11890 salt_t *salt = hash_buf->salt;
11891
11892 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
11893
11894 /**
11895 * Parse that strange long line
11896 */
11897
11898 char *in_off[9];
11899
11900 size_t in_len[9];
11901
11902 in_off[0] = strtok (input_buf, ":");
11903
11904 in_len[0] = strlen (in_off[0]);
11905
11906 size_t i;
11907
11908 for (i = 1; i < 9; i++)
11909 {
11910 in_off[i] = strtok (NULL, ":");
11911
11912 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11913
11914 in_len[i] = strlen (in_off[i]);
11915 }
11916
11917 char *ptr;
11918
11919 ptr = (char *) ikepsk->msg_buf;
11920
11921 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_char (in_off[0] + i);
11922 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_char (in_off[1] + i);
11923 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_char (in_off[2] + i);
11924 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_char (in_off[3] + i);
11925 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_char (in_off[4] + i);
11926 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_char (in_off[5] + i);
11927
11928 *ptr = 0x80;
11929
11930 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
11931
11932 ptr = (char *) ikepsk->nr_buf;
11933
11934 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_char (in_off[6] + i);
11935 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_char (in_off[7] + i);
11936
11937 *ptr = 0x80;
11938
11939 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
11940
11941 /**
11942 * Store to database
11943 */
11944
11945 ptr = in_off[8];
11946
11947 digest[0] = hex_to_uint (&ptr[ 0]);
11948 digest[1] = hex_to_uint (&ptr[ 8]);
11949 digest[2] = hex_to_uint (&ptr[16]);
11950 digest[3] = hex_to_uint (&ptr[24]);
11951
11952 digest[0] = byte_swap_32 (digest[0]);
11953 digest[1] = byte_swap_32 (digest[1]);
11954 digest[2] = byte_swap_32 (digest[2]);
11955 digest[3] = byte_swap_32 (digest[3]);
11956
11957 salt->salt_len = 32;
11958
11959 salt->salt_buf[0] = ikepsk->nr_buf[0];
11960 salt->salt_buf[1] = ikepsk->nr_buf[1];
11961 salt->salt_buf[2] = ikepsk->nr_buf[2];
11962 salt->salt_buf[3] = ikepsk->nr_buf[3];
11963 salt->salt_buf[4] = ikepsk->nr_buf[4];
11964 salt->salt_buf[5] = ikepsk->nr_buf[5];
11965 salt->salt_buf[6] = ikepsk->nr_buf[6];
11966 salt->salt_buf[7] = ikepsk->nr_buf[7];
11967
11968 return (PARSER_OK);
11969 }
11970
11971 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11972 {
11973 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
11974
11975 uint32_t *digest = (uint32_t *) hash_buf->digest;
11976
11977 salt_t *salt = hash_buf->salt;
11978
11979 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
11980
11981 /**
11982 * Parse that strange long line
11983 */
11984
11985 char *in_off[9];
11986
11987 size_t in_len[9];
11988
11989 in_off[0] = strtok (input_buf, ":");
11990
11991 in_len[0] = strlen (in_off[0]);
11992
11993 size_t i;
11994
11995 for (i = 1; i < 9; i++)
11996 {
11997 in_off[i] = strtok (NULL, ":");
11998
11999 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12000
12001 in_len[i] = strlen (in_off[i]);
12002 }
12003
12004 char *ptr;
12005
12006 ptr = (char *) ikepsk->msg_buf;
12007
12008 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_char (in_off[0] + i);
12009 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_char (in_off[1] + i);
12010 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_char (in_off[2] + i);
12011 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_char (in_off[3] + i);
12012 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_char (in_off[4] + i);
12013 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_char (in_off[5] + i);
12014
12015 *ptr = 0x80;
12016
12017 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12018
12019 ptr = (char *) ikepsk->nr_buf;
12020
12021 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_char (in_off[6] + i);
12022 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_char (in_off[7] + i);
12023
12024 *ptr = 0x80;
12025
12026 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12027
12028 /**
12029 * Store to database
12030 */
12031
12032 ptr = in_off[8];
12033
12034 digest[0] = hex_to_uint (&ptr[ 0]);
12035 digest[1] = hex_to_uint (&ptr[ 8]);
12036 digest[2] = hex_to_uint (&ptr[16]);
12037 digest[3] = hex_to_uint (&ptr[24]);
12038 digest[4] = hex_to_uint (&ptr[32]);
12039
12040 salt->salt_len = 32;
12041
12042 salt->salt_buf[0] = ikepsk->nr_buf[0];
12043 salt->salt_buf[1] = ikepsk->nr_buf[1];
12044 salt->salt_buf[2] = ikepsk->nr_buf[2];
12045 salt->salt_buf[3] = ikepsk->nr_buf[3];
12046 salt->salt_buf[4] = ikepsk->nr_buf[4];
12047 salt->salt_buf[5] = ikepsk->nr_buf[5];
12048 salt->salt_buf[6] = ikepsk->nr_buf[6];
12049 salt->salt_buf[7] = ikepsk->nr_buf[7];
12050
12051 return (PARSER_OK);
12052 }
12053
12054 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12055 {
12056 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12057
12058 uint32_t *digest = (uint32_t *) hash_buf->digest;
12059
12060 digest[0] = hex_to_uint (&input_buf[ 0]);
12061 digest[1] = hex_to_uint (&input_buf[ 8]);
12062 digest[2] = hex_to_uint (&input_buf[16]);
12063 digest[3] = hex_to_uint (&input_buf[24]);
12064 digest[4] = hex_to_uint (&input_buf[32]);
12065
12066 digest[0] = byte_swap_32 (digest[0]);
12067 digest[1] = byte_swap_32 (digest[1]);
12068 digest[2] = byte_swap_32 (digest[2]);
12069 digest[3] = byte_swap_32 (digest[3]);
12070 digest[4] = byte_swap_32 (digest[4]);
12071
12072 return (PARSER_OK);
12073 }
12074
12075 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12076 {
12077 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12078
12079 uint32_t *digest = (uint32_t *) hash_buf->digest;
12080
12081 digest[ 0] = hex_to_uint (&input_buf[ 0]);
12082 digest[ 1] = hex_to_uint (&input_buf[ 8]);
12083 digest[ 2] = hex_to_uint (&input_buf[ 16]);
12084 digest[ 3] = hex_to_uint (&input_buf[ 24]);
12085 digest[ 4] = hex_to_uint (&input_buf[ 32]);
12086 digest[ 5] = hex_to_uint (&input_buf[ 40]);
12087 digest[ 6] = hex_to_uint (&input_buf[ 48]);
12088 digest[ 7] = hex_to_uint (&input_buf[ 56]);
12089 digest[ 8] = hex_to_uint (&input_buf[ 64]);
12090 digest[ 9] = hex_to_uint (&input_buf[ 72]);
12091 digest[10] = hex_to_uint (&input_buf[ 80]);
12092 digest[11] = hex_to_uint (&input_buf[ 88]);
12093 digest[12] = hex_to_uint (&input_buf[ 96]);
12094 digest[13] = hex_to_uint (&input_buf[104]);
12095 digest[14] = hex_to_uint (&input_buf[112]);
12096 digest[15] = hex_to_uint (&input_buf[120]);
12097
12098 return (PARSER_OK);
12099 }
12100
12101 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12102 {
12103 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12104
12105 uint32_t *digest = (uint32_t *) hash_buf->digest;
12106
12107 salt_t *salt = hash_buf->salt;
12108
12109 digest[0] = hex_to_uint (&input_buf[ 0]);
12110 digest[1] = hex_to_uint (&input_buf[ 8]);
12111 digest[2] = hex_to_uint (&input_buf[16]);
12112 digest[3] = hex_to_uint (&input_buf[24]);
12113 digest[4] = hex_to_uint (&input_buf[32]);
12114
12115 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12116
12117 uint salt_len = input_len - 40 - 1;
12118
12119 char *salt_buf = input_buf + 40 + 1;
12120
12121 char *salt_buf_ptr = (char *) salt->salt_buf;
12122
12123 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12124
12125 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12126
12127 salt->salt_len = salt_len;
12128
12129 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12130
12131 return (PARSER_OK);
12132 }
12133
12134 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12135 {
12136 uint32_t *digest = (uint32_t *) hash_buf->digest;
12137
12138 salt_t *salt = hash_buf->salt;
12139
12140 tc_t *tc = (tc_t *) hash_buf->esalt;
12141
12142 if (input_len == 0)
12143 {
12144 log_error ("TrueCrypt container not specified");
12145
12146 exit (-1);
12147 }
12148
12149 FILE *fp = fopen (input_buf, "rb");
12150
12151 if (fp == NULL)
12152 {
12153 log_error ("%s: %s", input_buf, strerror (errno));
12154
12155 exit (-1);
12156 }
12157
12158 char buf[512];
12159
12160 int n = fread (buf, 1, sizeof (buf), fp);
12161
12162 fclose (fp);
12163
12164 if (n != 512) return (PARSER_TC_FILE_SIZE);
12165
12166 memcpy (tc->salt_buf, buf, 64);
12167
12168 memcpy (tc->data_buf, buf + 64, 512 - 64);
12169
12170 salt->salt_buf[0] = tc->salt_buf[0];
12171
12172 salt->salt_len = 4;
12173
12174 salt->salt_iter = 1000 - 1;
12175
12176 digest[0] = tc->data_buf[0];
12177
12178 return (PARSER_OK);
12179 }
12180
12181 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12182 {
12183 uint32_t *digest = (uint32_t *) hash_buf->digest;
12184
12185 salt_t *salt = hash_buf->salt;
12186
12187 tc_t *tc = (tc_t *) hash_buf->esalt;
12188
12189 if (input_len == 0)
12190 {
12191 log_error ("TrueCrypt container not specified");
12192
12193 exit (-1);
12194 }
12195
12196 FILE *fp = fopen (input_buf, "rb");
12197
12198 if (fp == NULL)
12199 {
12200 log_error ("%s: %s", input_buf, strerror (errno));
12201
12202 exit (-1);
12203 }
12204
12205 char buf[512];
12206
12207 int n = fread (buf, 1, sizeof (buf), fp);
12208
12209 fclose (fp);
12210
12211 if (n != 512) return (PARSER_TC_FILE_SIZE);
12212
12213 memcpy (tc->salt_buf, buf, 64);
12214
12215 memcpy (tc->data_buf, buf + 64, 512 - 64);
12216
12217 salt->salt_buf[0] = tc->salt_buf[0];
12218
12219 salt->salt_len = 4;
12220
12221 salt->salt_iter = 2000 - 1;
12222
12223 digest[0] = tc->data_buf[0];
12224
12225 return (PARSER_OK);
12226 }
12227
12228 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12229 {
12230 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12231
12232 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12233
12234 uint32_t *digest = (uint32_t *) hash_buf->digest;
12235
12236 salt_t *salt = hash_buf->salt;
12237
12238 char *salt_pos = input_buf + 6;
12239
12240 char *hash_pos = strchr (salt_pos, '$');
12241
12242 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12243
12244 uint salt_len = hash_pos - salt_pos;
12245
12246 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12247
12248 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12249
12250 salt->salt_len = salt_len;
12251
12252 salt->salt_iter = 1000;
12253
12254 hash_pos++;
12255
12256 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12257
12258 return (PARSER_OK);
12259 }
12260
12261 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12262 {
12263 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12264
12265 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12266
12267 uint32_t *digest = (uint32_t *) hash_buf->digest;
12268
12269 salt_t *salt = hash_buf->salt;
12270
12271 char *iter_pos = input_buf + 7;
12272
12273 char *salt_pos = strchr (iter_pos, '$');
12274
12275 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12276
12277 salt_pos++;
12278
12279 char *hash_pos = strchr (salt_pos, '$');
12280
12281 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12282
12283 uint salt_len = hash_pos - salt_pos;
12284
12285 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12286
12287 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12288
12289 salt->salt_len = salt_len;
12290
12291 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12292
12293 salt->salt_sign[0] = atoi (salt_iter);
12294
12295 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12296
12297 hash_pos++;
12298
12299 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12300
12301 digest[0] = byte_swap_32 (digest[0]);
12302 digest[1] = byte_swap_32 (digest[1]);
12303 digest[2] = byte_swap_32 (digest[2]);
12304 digest[3] = byte_swap_32 (digest[3]);
12305 digest[4] = byte_swap_32 (digest[4]);
12306
12307 return (PARSER_OK);
12308 }
12309
12310 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12311 {
12312 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12313
12314 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12315
12316 uint32_t *digest = (uint32_t *) hash_buf->digest;
12317
12318 salt_t *salt = hash_buf->salt;
12319
12320 char *iter_pos = input_buf + 9;
12321
12322 char *salt_pos = strchr (iter_pos, '$');
12323
12324 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12325
12326 salt_pos++;
12327
12328 char *hash_pos = strchr (salt_pos, '$');
12329
12330 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12331
12332 uint salt_len = hash_pos - salt_pos;
12333
12334 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12335
12336 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12337
12338 salt->salt_len = salt_len;
12339
12340 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12341
12342 salt->salt_sign[0] = atoi (salt_iter);
12343
12344 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12345
12346 hash_pos++;
12347
12348 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12349
12350 digest[0] = byte_swap_32 (digest[0]);
12351 digest[1] = byte_swap_32 (digest[1]);
12352 digest[2] = byte_swap_32 (digest[2]);
12353 digest[3] = byte_swap_32 (digest[3]);
12354 digest[4] = byte_swap_32 (digest[4]);
12355 digest[5] = byte_swap_32 (digest[5]);
12356 digest[6] = byte_swap_32 (digest[6]);
12357 digest[7] = byte_swap_32 (digest[7]);
12358
12359 return (PARSER_OK);
12360 }
12361
12362 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12363 {
12364 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12365
12366 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12367
12368 uint64_t *digest = (uint64_t *) hash_buf->digest;
12369
12370 salt_t *salt = hash_buf->salt;
12371
12372 char *iter_pos = input_buf + 9;
12373
12374 char *salt_pos = strchr (iter_pos, '$');
12375
12376 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12377
12378 salt_pos++;
12379
12380 char *hash_pos = strchr (salt_pos, '$');
12381
12382 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12383
12384 uint salt_len = hash_pos - salt_pos;
12385
12386 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12387
12388 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12389
12390 salt->salt_len = salt_len;
12391
12392 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12393
12394 salt->salt_sign[0] = atoi (salt_iter);
12395
12396 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12397
12398 hash_pos++;
12399
12400 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12401
12402 digest[0] = byte_swap_64 (digest[0]);
12403 digest[1] = byte_swap_64 (digest[1]);
12404 digest[2] = byte_swap_64 (digest[2]);
12405 digest[3] = byte_swap_64 (digest[3]);
12406 digest[4] = byte_swap_64 (digest[4]);
12407 digest[5] = byte_swap_64 (digest[5]);
12408 digest[6] = byte_swap_64 (digest[6]);
12409 digest[7] = byte_swap_64 (digest[7]);
12410
12411 return (PARSER_OK);
12412 }
12413
12414 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12415 {
12416 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12417
12418 uint32_t *digest = (uint32_t *) hash_buf->digest;
12419
12420 salt_t *salt = hash_buf->salt;
12421
12422 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12423
12424 /**
12425 * parse line
12426 */
12427
12428 char *iterations_pos = input_buf;
12429
12430 char *saltbuf_pos = strchr (iterations_pos, ':');
12431
12432 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12433
12434 uint iterations_len = saltbuf_pos - iterations_pos;
12435
12436 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12437
12438 saltbuf_pos++;
12439
12440 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12441
12442 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12443
12444 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12445
12446 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12447
12448 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12449
12450 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12451
12452 cipherbuf_pos++;
12453
12454 /**
12455 * pbkdf2 iterations
12456 */
12457
12458 salt->salt_iter = atoi (iterations_pos) - 1;
12459
12460 /**
12461 * handle salt encoding
12462 */
12463
12464 char *saltbuf_ptr = (char *) salt->salt_buf;
12465
12466 for (uint i = 0; i < saltbuf_len; i += 2)
12467 {
12468 const char p0 = saltbuf_pos[i + 0];
12469 const char p1 = saltbuf_pos[i + 1];
12470
12471 *saltbuf_ptr++ = hex_convert (p1) << 0
12472 | hex_convert (p0) << 4;
12473 }
12474
12475 salt->salt_len = saltbuf_len / 2;
12476
12477 /**
12478 * handle cipher encoding
12479 */
12480
12481 uint *tmp = (uint *) mymalloc (32);
12482
12483 char *cipherbuf_ptr = (char *) tmp;
12484
12485 for (uint i = 2016; i < cipherbuf_len; i += 2)
12486 {
12487 const char p0 = cipherbuf_pos[i + 0];
12488 const char p1 = cipherbuf_pos[i + 1];
12489
12490 *cipherbuf_ptr++ = hex_convert (p1) << 0
12491 | hex_convert (p0) << 4;
12492 }
12493
12494 // iv is stored at salt_buf 4 (length 16)
12495 // data is stored at salt_buf 8 (length 16)
12496
12497 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12498 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12499 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12500 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12501
12502 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12503 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12504 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12505 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12506
12507 free (tmp);
12508
12509 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12510 {
12511 const char p0 = cipherbuf_pos[j + 0];
12512 const char p1 = cipherbuf_pos[j + 1];
12513
12514 agilekey->cipher[i] = hex_convert (p1) << 0
12515 | hex_convert (p0) << 4;
12516 }
12517
12518 /**
12519 * digest buf
12520 */
12521
12522 digest[0] = 0x10101010;
12523 digest[1] = 0x10101010;
12524 digest[2] = 0x10101010;
12525 digest[3] = 0x10101010;
12526
12527 return (PARSER_OK);
12528 }
12529
12530 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12531 {
12532 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12533
12534 uint32_t *digest = (uint32_t *) hash_buf->digest;
12535
12536 salt_t *salt = hash_buf->salt;
12537
12538 char *hashbuf_pos = input_buf;
12539
12540 char *iterations_pos = strchr (hashbuf_pos, ':');
12541
12542 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12543
12544 uint hash_len = iterations_pos - hashbuf_pos;
12545
12546 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12547
12548 iterations_pos++;
12549
12550 char *saltbuf_pos = strchr (iterations_pos, ':');
12551
12552 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12553
12554 uint iterations_len = saltbuf_pos - iterations_pos;
12555
12556 saltbuf_pos++;
12557
12558 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12559
12560 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12561
12562 char *salt_buf_ptr = (char *) salt->salt_buf;
12563
12564 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12565
12566 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12567
12568 salt->salt_len = salt_len;
12569
12570 salt->salt_iter = atoi (iterations_pos) - 1;
12571
12572 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
12573 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
12574 digest[2] = hex_to_uint (&hashbuf_pos[16]);
12575 digest[3] = hex_to_uint (&hashbuf_pos[24]);
12576
12577 return (PARSER_OK);
12578 }
12579
12580 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12581 {
12582 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12583
12584 uint32_t *digest = (uint32_t *) hash_buf->digest;
12585
12586 digest[0] = hex_to_uint (&input_buf[ 0]);
12587 digest[1] = hex_to_uint (&input_buf[ 8]);
12588 digest[2] = hex_to_uint (&input_buf[16]);
12589 digest[3] = hex_to_uint (&input_buf[24]);
12590 digest[4] = hex_to_uint (&input_buf[32]);
12591 digest[5] = hex_to_uint (&input_buf[40]);
12592 digest[6] = hex_to_uint (&input_buf[48]);
12593 digest[7] = hex_to_uint (&input_buf[56]);
12594
12595 digest[0] = byte_swap_32 (digest[0]);
12596 digest[1] = byte_swap_32 (digest[1]);
12597 digest[2] = byte_swap_32 (digest[2]);
12598 digest[3] = byte_swap_32 (digest[3]);
12599 digest[4] = byte_swap_32 (digest[4]);
12600 digest[5] = byte_swap_32 (digest[5]);
12601 digest[6] = byte_swap_32 (digest[6]);
12602 digest[7] = byte_swap_32 (digest[7]);
12603
12604 return (PARSER_OK);
12605 }
12606
12607 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12608 {
12609 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12610
12611 uint32_t *digest = (uint32_t *) hash_buf->digest;
12612
12613 salt_t *salt = hash_buf->salt;
12614
12615 char *salt_pos = input_buf + 3;
12616
12617 uint iterations_len = 0;
12618
12619 if (memcmp (salt_pos, "rounds=", 7) == 0)
12620 {
12621 salt_pos += 7;
12622
12623 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12624
12625 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12626 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12627
12628 salt_pos[0] = 0x0;
12629
12630 salt->salt_iter = atoi (salt_pos - iterations_len);
12631
12632 salt_pos += 1;
12633
12634 iterations_len += 8;
12635 }
12636 else
12637 {
12638 salt->salt_iter = ROUNDS_SHA256CRYPT;
12639 }
12640
12641 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12642
12643 char *hash_pos = strchr (salt_pos, '$');
12644
12645 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12646
12647 uint salt_len = hash_pos - salt_pos;
12648
12649 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12650
12651 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12652
12653 salt->salt_len = salt_len;
12654
12655 hash_pos++;
12656
12657 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12658
12659 return (PARSER_OK);
12660 }
12661
12662 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12663 {
12664 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12665
12666 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12667
12668 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12669
12670 uint64_t *digest = (uint64_t *) hash_buf->digest;
12671
12672 salt_t *salt = hash_buf->salt;
12673
12674 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12675
12676 char *iter_pos = input_buf + 4;
12677
12678 char *salt_pos = strchr (iter_pos, '$');
12679
12680 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12681
12682 salt_pos++;
12683
12684 char *hash_pos = strchr (salt_pos, '$');
12685
12686 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12687
12688 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12689
12690 hash_pos++;
12691
12692 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
12693 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
12694 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
12695 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
12696 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
12697 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
12698 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
12699 digest[7] = hex_to_uint64_t (&hash_pos[112]);
12700
12701 uint salt_len = hash_pos - salt_pos - 1;
12702
12703 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12704
12705 salt->salt_len = salt_len / 2;
12706
12707 pbkdf2_sha512->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
12708 pbkdf2_sha512->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
12709 pbkdf2_sha512->salt_buf[2] = hex_to_uint (&salt_pos[16]);
12710 pbkdf2_sha512->salt_buf[3] = hex_to_uint (&salt_pos[24]);
12711 pbkdf2_sha512->salt_buf[4] = hex_to_uint (&salt_pos[32]);
12712 pbkdf2_sha512->salt_buf[5] = hex_to_uint (&salt_pos[40]);
12713 pbkdf2_sha512->salt_buf[6] = hex_to_uint (&salt_pos[48]);
12714 pbkdf2_sha512->salt_buf[7] = hex_to_uint (&salt_pos[56]);
12715
12716 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12717 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12718 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12719 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12720 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12721 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12722 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12723 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12724 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12725 pbkdf2_sha512->salt_buf[9] = 0x80;
12726
12727 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12728
12729 salt->salt_iter = atoi (iter_pos) - 1;
12730
12731 return (PARSER_OK);
12732 }
12733
12734 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12735 {
12736 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12737
12738 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12739
12740 uint32_t *digest = (uint32_t *) hash_buf->digest;
12741
12742 salt_t *salt = hash_buf->salt;
12743
12744 char *salt_pos = input_buf + 14;
12745
12746 char *hash_pos = strchr (salt_pos, '*');
12747
12748 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12749
12750 hash_pos++;
12751
12752 uint salt_len = hash_pos - salt_pos - 1;
12753
12754 char *salt_buf_ptr = (char *) salt->salt_buf;
12755
12756 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
12757
12758 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12759
12760 salt->salt_len = salt_len;
12761
12762 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
12763
12764 base64_decode (base64_to_int, hash_pos, 43, tmp_buf);
12765
12766 memcpy (digest, tmp_buf, 32);
12767
12768 digest[0] = byte_swap_32 (digest[0]);
12769 digest[1] = byte_swap_32 (digest[1]);
12770 digest[2] = byte_swap_32 (digest[2]);
12771 digest[3] = byte_swap_32 (digest[3]);
12772 digest[4] = byte_swap_32 (digest[4]);
12773 digest[5] = byte_swap_32 (digest[5]);
12774 digest[6] = byte_swap_32 (digest[6]);
12775 digest[7] = byte_swap_32 (digest[7]);
12776
12777 digest[0] -= SHA256M_A;
12778 digest[1] -= SHA256M_B;
12779 digest[2] -= SHA256M_C;
12780 digest[3] -= SHA256M_D;
12781 digest[4] -= SHA256M_E;
12782 digest[5] -= SHA256M_F;
12783 digest[6] -= SHA256M_G;
12784 digest[7] -= SHA256M_H;
12785
12786 return (PARSER_OK);
12787 }
12788
12789 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12790 {
12791 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
12792
12793 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12794
12795 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
12796
12797 uint64_t *digest = (uint64_t *) hash_buf->digest;
12798
12799 salt_t *salt = hash_buf->salt;
12800
12801 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12802
12803 char *iter_pos = input_buf + 19;
12804
12805 char *salt_pos = strchr (iter_pos, '.');
12806
12807 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12808
12809 salt_pos++;
12810
12811 char *hash_pos = strchr (salt_pos, '.');
12812
12813 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12814
12815 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12816
12817 hash_pos++;
12818
12819 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
12820 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
12821 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
12822 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
12823 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
12824 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
12825 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
12826 digest[7] = hex_to_uint64_t (&hash_pos[112]);
12827
12828 uint salt_len = hash_pos - salt_pos - 1;
12829
12830 salt_len /= 2;
12831
12832 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
12833
12834 uint i;
12835
12836 for (i = 0; i < salt_len; i++)
12837 {
12838 salt_buf_ptr[i] = hex_to_char (&salt_pos[i * 2]);
12839 }
12840
12841 salt_buf_ptr[salt_len + 3] = 0x01;
12842 salt_buf_ptr[salt_len + 4] = 0x80;
12843
12844 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12845
12846 salt->salt_len = salt_len;
12847
12848 salt->salt_iter = atoi (iter_pos) - 1;
12849
12850 return (PARSER_OK);
12851 }
12852
12853 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12854 {
12855 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
12856
12857 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12858
12859 uint64_t *digest = (uint64_t *) hash_buf->digest;
12860
12861 salt_t *salt = hash_buf->salt;
12862
12863 char tmp_buf[120];
12864
12865 memset (tmp_buf, 0, sizeof (tmp_buf));
12866
12867 int tmp_len = base64_decode (base64_to_int, input_buf + 9, input_len - 9, tmp_buf);
12868
12869 memcpy (digest, tmp_buf, 64);
12870
12871 digest[0] = byte_swap_64 (digest[0]);
12872 digest[1] = byte_swap_64 (digest[1]);
12873 digest[2] = byte_swap_64 (digest[2]);
12874 digest[3] = byte_swap_64 (digest[3]);
12875 digest[4] = byte_swap_64 (digest[4]);
12876 digest[5] = byte_swap_64 (digest[5]);
12877 digest[6] = byte_swap_64 (digest[6]);
12878 digest[7] = byte_swap_64 (digest[7]);
12879
12880 digest[0] -= SHA512M_A;
12881 digest[1] -= SHA512M_B;
12882 digest[2] -= SHA512M_C;
12883 digest[3] -= SHA512M_D;
12884 digest[4] -= SHA512M_E;
12885 digest[5] -= SHA512M_F;
12886 digest[6] -= SHA512M_G;
12887 digest[7] -= SHA512M_H;
12888
12889 salt->salt_len = tmp_len - 64;
12890
12891 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
12892
12893 if (data.opts_type & OPTS_TYPE_ST_ADD80)
12894 {
12895 char *ptr = (char *) salt->salt_buf;
12896
12897 ptr[salt->salt_len] = 0x80;
12898 }
12899
12900 return (PARSER_OK);
12901 }
12902
12903 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12904 {
12905 if (data.opts_type & OPTS_TYPE_ST_HEX)
12906 {
12907 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
12908 }
12909 else
12910 {
12911 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
12912 }
12913
12914 uint32_t *digest = (uint32_t *) hash_buf->digest;
12915
12916 salt_t *salt = hash_buf->salt;
12917
12918 digest[0] = hex_to_uint (&input_buf[ 0]);
12919 digest[1] = hex_to_uint (&input_buf[ 8]);
12920 digest[2] = hex_to_uint (&input_buf[16]);
12921 digest[3] = hex_to_uint (&input_buf[24]);
12922
12923 digest[0] = byte_swap_32 (digest[0]);
12924 digest[1] = byte_swap_32 (digest[1]);
12925 digest[2] = byte_swap_32 (digest[2]);
12926 digest[3] = byte_swap_32 (digest[3]);
12927
12928 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12929
12930 uint salt_len = input_len - 32 - 1;
12931
12932 char *salt_buf = input_buf + 32 + 1;
12933
12934 char *salt_buf_ptr = (char *) salt->salt_buf;
12935
12936 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12937
12938 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12939
12940 salt->salt_len = salt_len;
12941
12942 return (PARSER_OK);
12943 }
12944
12945 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12946 {
12947 if (data.opts_type & OPTS_TYPE_ST_HEX)
12948 {
12949 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
12950 }
12951 else
12952 {
12953 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
12954 }
12955
12956 uint32_t *digest = (uint32_t *) hash_buf->digest;
12957
12958 salt_t *salt = hash_buf->salt;
12959
12960 digest[0] = hex_to_uint (&input_buf[ 0]);
12961 digest[1] = hex_to_uint (&input_buf[ 8]);
12962 digest[2] = hex_to_uint (&input_buf[16]);
12963 digest[3] = hex_to_uint (&input_buf[24]);
12964 digest[4] = hex_to_uint (&input_buf[32]);
12965
12966 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12967
12968 uint salt_len = input_len - 40 - 1;
12969
12970 char *salt_buf = input_buf + 40 + 1;
12971
12972 char *salt_buf_ptr = (char *) salt->salt_buf;
12973
12974 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12975
12976 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12977
12978 salt->salt_len = salt_len;
12979
12980 return (PARSER_OK);
12981 }
12982
12983 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12984 {
12985 if (data.opts_type & OPTS_TYPE_ST_HEX)
12986 {
12987 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
12988 }
12989 else
12990 {
12991 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
12992 }
12993
12994 uint32_t *digest = (uint32_t *) hash_buf->digest;
12995
12996 salt_t *salt = hash_buf->salt;
12997
12998 digest[0] = hex_to_uint (&input_buf[ 0]);
12999 digest[1] = hex_to_uint (&input_buf[ 8]);
13000 digest[2] = hex_to_uint (&input_buf[16]);
13001 digest[3] = hex_to_uint (&input_buf[24]);
13002 digest[4] = hex_to_uint (&input_buf[32]);
13003 digest[5] = hex_to_uint (&input_buf[40]);
13004 digest[6] = hex_to_uint (&input_buf[48]);
13005 digest[7] = hex_to_uint (&input_buf[56]);
13006
13007 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13008
13009 uint salt_len = input_len - 64 - 1;
13010
13011 char *salt_buf = input_buf + 64 + 1;
13012
13013 char *salt_buf_ptr = (char *) salt->salt_buf;
13014
13015 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13016
13017 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13018
13019 salt->salt_len = salt_len;
13020
13021 return (PARSER_OK);
13022 }
13023
13024 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13025 {
13026 if (data.opts_type & OPTS_TYPE_ST_HEX)
13027 {
13028 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13029 }
13030 else
13031 {
13032 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13033 }
13034
13035 uint64_t *digest = (uint64_t *) hash_buf->digest;
13036
13037 salt_t *salt = hash_buf->salt;
13038
13039 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
13040 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
13041 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
13042 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
13043 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
13044 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
13045 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
13046 digest[7] = hex_to_uint64_t (&input_buf[112]);
13047
13048 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13049
13050 uint salt_len = input_len - 128 - 1;
13051
13052 char *salt_buf = input_buf + 128 + 1;
13053
13054 char *salt_buf_ptr = (char *) salt->salt_buf;
13055
13056 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13057
13058 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13059
13060 salt->salt_len = salt_len;
13061
13062 return (PARSER_OK);
13063 }
13064
13065 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13066 {
13067 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13068
13069 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13070
13071 uint32_t *digest = (uint32_t *) hash_buf->digest;
13072
13073 salt_t *salt = hash_buf->salt;
13074
13075 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13076
13077 /**
13078 * parse line
13079 */
13080
13081 char *user_pos = input_buf + 10 + 1;
13082
13083 char *realm_pos = strchr (user_pos, '$');
13084
13085 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13086
13087 uint user_len = realm_pos - user_pos;
13088
13089 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13090
13091 realm_pos++;
13092
13093 char *salt_pos = strchr (realm_pos, '$');
13094
13095 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13096
13097 uint realm_len = salt_pos - realm_pos;
13098
13099 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13100
13101 salt_pos++;
13102
13103 char *data_pos = strchr (salt_pos, '$');
13104
13105 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13106
13107 uint salt_len = data_pos - salt_pos;
13108
13109 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13110
13111 data_pos++;
13112
13113 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13114
13115 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13116
13117 /**
13118 * copy data
13119 */
13120
13121 memcpy (krb5pa->user, user_pos, user_len);
13122 memcpy (krb5pa->realm, realm_pos, realm_len);
13123 memcpy (krb5pa->salt, salt_pos, salt_len);
13124
13125 char *timestamp_ptr = (char *) krb5pa->timestamp;
13126
13127 for (uint i = 0; i < (36 * 2); i += 2)
13128 {
13129 const char p0 = data_pos[i + 0];
13130 const char p1 = data_pos[i + 1];
13131
13132 *timestamp_ptr++ = hex_convert (p1) << 0
13133 | hex_convert (p0) << 4;
13134 }
13135
13136 char *checksum_ptr = (char *) krb5pa->checksum;
13137
13138 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13139 {
13140 const char p0 = data_pos[i + 0];
13141 const char p1 = data_pos[i + 1];
13142
13143 *checksum_ptr++ = hex_convert (p1) << 0
13144 | hex_convert (p0) << 4;
13145 }
13146
13147 /**
13148 * copy some data to generic buffers to make sorting happy
13149 */
13150
13151 salt->salt_buf[0] = krb5pa->timestamp[0];
13152 salt->salt_buf[1] = krb5pa->timestamp[1];
13153 salt->salt_buf[2] = krb5pa->timestamp[2];
13154 salt->salt_buf[3] = krb5pa->timestamp[3];
13155 salt->salt_buf[4] = krb5pa->timestamp[4];
13156 salt->salt_buf[5] = krb5pa->timestamp[5];
13157 salt->salt_buf[6] = krb5pa->timestamp[6];
13158 salt->salt_buf[7] = krb5pa->timestamp[7];
13159 salt->salt_buf[8] = krb5pa->timestamp[8];
13160
13161 salt->salt_len = 36;
13162
13163 digest[0] = krb5pa->checksum[0];
13164 digest[1] = krb5pa->checksum[1];
13165 digest[2] = krb5pa->checksum[2];
13166 digest[3] = krb5pa->checksum[3];
13167
13168 return (PARSER_OK);
13169 }
13170
13171 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13172 {
13173 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13174
13175 uint32_t *digest = (uint32_t *) hash_buf->digest;
13176
13177 salt_t *salt = hash_buf->salt;
13178
13179 /**
13180 * parse line
13181 */
13182
13183 char *salt_pos = input_buf;
13184
13185 char *hash_pos = strchr (salt_pos, '$');
13186
13187 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13188
13189 uint salt_len = hash_pos - salt_pos;
13190
13191 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13192
13193 hash_pos++;
13194
13195 uint hash_len = input_len - 1 - salt_len;
13196
13197 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13198
13199 /**
13200 * valid some data
13201 */
13202
13203 uint user_len = 0;
13204
13205 for (uint i = 0; i < salt_len; i++)
13206 {
13207 if (salt_pos[i] == ' ') continue;
13208
13209 user_len++;
13210 }
13211
13212 // SAP user names cannot be longer than 12 characters
13213 if (user_len > 12) return (PARSER_SALT_LENGTH);
13214
13215 // SAP user name cannot start with ! or ?
13216 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13217
13218 /**
13219 * copy data
13220 */
13221
13222 char *salt_buf_ptr = (char *) salt->salt_buf;
13223
13224 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13225
13226 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13227
13228 salt->salt_len = salt_len;
13229
13230 digest[0] = hex_to_uint (&hash_pos[0]);
13231 digest[1] = hex_to_uint (&hash_pos[8]);
13232 digest[2] = 0;
13233 digest[3] = 0;
13234
13235 digest[0] = byte_swap_32 (digest[0]);
13236 digest[1] = byte_swap_32 (digest[1]);
13237
13238 return (PARSER_OK);
13239 }
13240
13241 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13242 {
13243 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13244
13245 uint32_t *digest = (uint32_t *) hash_buf->digest;
13246
13247 salt_t *salt = hash_buf->salt;
13248
13249 /**
13250 * parse line
13251 */
13252
13253 char *salt_pos = input_buf;
13254
13255 char *hash_pos = strchr (salt_pos, '$');
13256
13257 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13258
13259 uint salt_len = hash_pos - salt_pos;
13260
13261 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13262
13263 hash_pos++;
13264
13265 uint hash_len = input_len - 1 - salt_len;
13266
13267 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13268
13269 /**
13270 * valid some data
13271 */
13272
13273 uint user_len = 0;
13274
13275 for (uint i = 0; i < salt_len; i++)
13276 {
13277 if (salt_pos[i] == ' ') continue;
13278
13279 user_len++;
13280 }
13281
13282 // SAP user names cannot be longer than 12 characters
13283 if (user_len > 12) return (PARSER_SALT_LENGTH);
13284
13285 // SAP user name cannot start with ! or ?
13286 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13287
13288 /**
13289 * copy data
13290 */
13291
13292 char *salt_buf_ptr = (char *) salt->salt_buf;
13293
13294 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13295
13296 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13297
13298 salt->salt_len = salt_len;
13299
13300 digest[0] = hex_to_uint (&hash_pos[ 0]);
13301 digest[1] = hex_to_uint (&hash_pos[ 8]);
13302 digest[2] = hex_to_uint (&hash_pos[16]);
13303 digest[3] = hex_to_uint (&hash_pos[24]);
13304 digest[4] = hex_to_uint (&hash_pos[32]);
13305
13306 return (PARSER_OK);
13307 }
13308
13309 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13310 {
13311 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13312
13313 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13314
13315 uint64_t *digest = (uint64_t *) hash_buf->digest;
13316
13317 salt_t *salt = hash_buf->salt;
13318
13319 char *iter_pos = input_buf + 3;
13320
13321 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13322
13323 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13324
13325 memcpy ((char *) salt->salt_sign, input_buf, 4);
13326
13327 salt->salt_iter = salt_iter;
13328
13329 char *salt_pos = iter_pos + 1;
13330
13331 uint salt_len = 8;
13332
13333 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13334
13335 salt->salt_len = salt_len;
13336
13337 char *hash_pos = salt_pos + salt_len;
13338
13339 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13340
13341 // ugly hack start
13342
13343 char *tmp = (char *) salt->salt_buf_pc;
13344
13345 tmp[0] = hash_pos[42];
13346
13347 // ugly hack end
13348
13349 digest[ 0] = byte_swap_64 (digest[ 0]);
13350 digest[ 1] = byte_swap_64 (digest[ 1]);
13351 digest[ 2] = byte_swap_64 (digest[ 2]);
13352 digest[ 3] = byte_swap_64 (digest[ 3]);
13353 digest[ 4] = 0;
13354 digest[ 5] = 0;
13355 digest[ 6] = 0;
13356 digest[ 7] = 0;
13357
13358 return (PARSER_OK);
13359 }
13360
13361 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13362 {
13363 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13364
13365 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13366
13367 uint32_t *digest = (uint32_t *) hash_buf->digest;
13368
13369 salt_t *salt = hash_buf->salt;
13370
13371 char *salt_buf = input_buf + 6;
13372
13373 uint salt_len = 16;
13374
13375 char *salt_buf_ptr = (char *) salt->salt_buf;
13376
13377 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13378
13379 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13380
13381 salt->salt_len = salt_len;
13382
13383 char *hash_pos = input_buf + 6 + 16;
13384
13385 digest[0] = hex_to_uint (&hash_pos[ 0]);
13386 digest[1] = hex_to_uint (&hash_pos[ 8]);
13387 digest[2] = hex_to_uint (&hash_pos[16]);
13388 digest[3] = hex_to_uint (&hash_pos[24]);
13389 digest[4] = hex_to_uint (&hash_pos[32]);
13390 digest[5] = hex_to_uint (&hash_pos[40]);
13391 digest[6] = hex_to_uint (&hash_pos[48]);
13392 digest[7] = hex_to_uint (&hash_pos[56]);
13393
13394 return (PARSER_OK);
13395 }
13396
13397 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13398 {
13399 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13400
13401 uint32_t *digest = (uint32_t *) hash_buf->digest;
13402
13403 digest[0] = hex_to_uint (&input_buf[ 0]);
13404 digest[1] = hex_to_uint (&input_buf[ 8]);
13405 digest[2] = 0;
13406 digest[3] = 0;
13407
13408 return (PARSER_OK);
13409 }
13410
13411 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13412 {
13413 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13414
13415 uint32_t *digest = (uint32_t *) hash_buf->digest;
13416
13417 salt_t *salt = hash_buf->salt;
13418
13419 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13420
13421 char *saltbuf_pos = input_buf;
13422
13423 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13424
13425 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13426
13427 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13428
13429 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13430 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13431
13432 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13433
13434 hashbuf_pos++;
13435
13436 uint hashbuf_len = input_len - saltbuf_len - 1;
13437
13438 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13439
13440 char *salt_ptr = (char *) saltbuf_pos;
13441 char *rakp_ptr = (char *) rakp->salt_buf;
13442
13443 uint i;
13444 uint j;
13445
13446 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13447 {
13448 rakp_ptr[j] = hex_to_char (&salt_ptr[i]);
13449 }
13450
13451 rakp_ptr[j] = 0x80;
13452
13453 rakp->salt_len = j;
13454
13455 for (i = 0; i < 64; i++)
13456 {
13457 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13458 }
13459
13460 salt->salt_buf[0] = rakp->salt_buf[0];
13461 salt->salt_buf[1] = rakp->salt_buf[1];
13462 salt->salt_buf[2] = rakp->salt_buf[2];
13463 salt->salt_buf[3] = rakp->salt_buf[3];
13464 salt->salt_buf[4] = rakp->salt_buf[4];
13465 salt->salt_buf[5] = rakp->salt_buf[5];
13466 salt->salt_buf[6] = rakp->salt_buf[6];
13467 salt->salt_buf[7] = rakp->salt_buf[7];
13468
13469 salt->salt_len = 32; // muss min. 32 haben
13470
13471 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
13472 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
13473 digest[2] = hex_to_uint (&hashbuf_pos[16]);
13474 digest[3] = hex_to_uint (&hashbuf_pos[24]);
13475 digest[4] = hex_to_uint (&hashbuf_pos[32]);
13476
13477 return (PARSER_OK);
13478 }
13479
13480 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13481 {
13482 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13483
13484 uint32_t *digest = (uint32_t *) hash_buf->digest;
13485
13486 salt_t *salt = hash_buf->salt;
13487
13488 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13489
13490 char *salt_pos = input_buf + 1;
13491
13492 memcpy (salt->salt_buf, salt_pos, 8);
13493
13494 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13495 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13496
13497 salt->salt_len = 8;
13498
13499 char *hash_pos = salt_pos + 8;
13500
13501 digest[0] = hex_to_uint (&hash_pos[ 0]);
13502 digest[1] = hex_to_uint (&hash_pos[ 8]);
13503 digest[2] = hex_to_uint (&hash_pos[16]);
13504 digest[3] = hex_to_uint (&hash_pos[24]);
13505 digest[4] = hex_to_uint (&hash_pos[32]);
13506
13507 digest[0] -= SHA1M_A;
13508 digest[1] -= SHA1M_B;
13509 digest[2] -= SHA1M_C;
13510 digest[3] -= SHA1M_D;
13511 digest[4] -= SHA1M_E;
13512
13513 return (PARSER_OK);
13514 }
13515
13516 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13517 {
13518 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13519
13520 uint32_t *digest = (uint32_t *) hash_buf->digest;
13521
13522 salt_t *salt = hash_buf->salt;
13523
13524 digest[0] = hex_to_uint (&input_buf[ 0]);
13525 digest[1] = hex_to_uint (&input_buf[ 8]);
13526 digest[2] = hex_to_uint (&input_buf[16]);
13527 digest[3] = hex_to_uint (&input_buf[24]);
13528
13529 digest[0] = byte_swap_32 (digest[0]);
13530 digest[1] = byte_swap_32 (digest[1]);
13531 digest[2] = byte_swap_32 (digest[2]);
13532 digest[3] = byte_swap_32 (digest[3]);
13533
13534 digest[0] -= MD5M_A;
13535 digest[1] -= MD5M_B;
13536 digest[2] -= MD5M_C;
13537 digest[3] -= MD5M_D;
13538
13539 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13540
13541 char *salt_buf_ptr = input_buf + 32 + 1;
13542
13543 uint32_t *salt_buf = salt->salt_buf;
13544
13545 salt_buf[0] = hex_to_uint (&salt_buf_ptr[ 0]);
13546 salt_buf[1] = hex_to_uint (&salt_buf_ptr[ 8]);
13547 salt_buf[2] = hex_to_uint (&salt_buf_ptr[16]);
13548 salt_buf[3] = hex_to_uint (&salt_buf_ptr[24]);
13549
13550 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13551 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13552 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13553 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13554
13555 salt->salt_len = 16 + 1;
13556
13557 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13558
13559 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13560
13561 salt_buf[4] = hex_to_char (&idbyte_buf_ptr[0]) & 0xff;
13562
13563 return (PARSER_OK);
13564 }
13565
13566 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13567 {
13568 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13569
13570 uint32_t *digest = (uint32_t *) hash_buf->digest;
13571
13572 salt_t *salt = hash_buf->salt;
13573
13574 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13575
13576 /**
13577 * parse line
13578 */
13579
13580 char *hashbuf_pos = input_buf;
13581
13582 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13583
13584 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13585
13586 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13587
13588 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13589
13590 saltbuf_pos++;
13591
13592 char *iteration_pos = strchr (saltbuf_pos, ':');
13593
13594 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13595
13596 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13597
13598 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13599
13600 iteration_pos++;
13601
13602 char *databuf_pos = strchr (iteration_pos, ':');
13603
13604 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13605
13606 const uint iteration_len = databuf_pos - iteration_pos;
13607
13608 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13609 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13610
13611 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13612
13613 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13614 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13615
13616 databuf_pos++;
13617
13618 // digest
13619
13620 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
13621 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
13622 digest[2] = hex_to_uint (&hashbuf_pos[16]);
13623 digest[3] = hex_to_uint (&hashbuf_pos[24]);
13624 digest[4] = hex_to_uint (&hashbuf_pos[32]);
13625 digest[5] = hex_to_uint (&hashbuf_pos[40]);
13626 digest[6] = hex_to_uint (&hashbuf_pos[48]);
13627 digest[7] = hex_to_uint (&hashbuf_pos[56]);
13628
13629 // salt
13630
13631 char *saltbuf_ptr = (char *) salt->salt_buf;
13632
13633 for (uint i = 0; i < saltbuf_len; i += 2)
13634 {
13635 const char p0 = saltbuf_pos[i + 0];
13636 const char p1 = saltbuf_pos[i + 1];
13637
13638 *saltbuf_ptr++ = hex_convert (p1) << 0
13639 | hex_convert (p0) << 4;
13640 }
13641
13642 salt->salt_buf[4] = 0x01000000;
13643 salt->salt_buf[5] = 0x80;
13644
13645 salt->salt_len = saltbuf_len / 2;
13646
13647 // iteration
13648
13649 salt->salt_iter = atoi (iteration_pos) - 1;
13650
13651 // data
13652
13653 char *databuf_ptr = (char *) cloudkey->data_buf;
13654
13655 for (uint i = 0; i < databuf_len; i += 2)
13656 {
13657 const char p0 = databuf_pos[i + 0];
13658 const char p1 = databuf_pos[i + 1];
13659
13660 *databuf_ptr++ = hex_convert (p1) << 0
13661 | hex_convert (p0) << 4;
13662 }
13663
13664 *databuf_ptr++ = 0x80;
13665
13666 for (uint i = 0; i < 512; i++)
13667 {
13668 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13669 }
13670
13671 cloudkey->data_len = databuf_len / 2;
13672
13673 return (PARSER_OK);
13674 }
13675
13676 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13677 {
13678 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13679
13680 uint32_t *digest = (uint32_t *) hash_buf->digest;
13681
13682 salt_t *salt = hash_buf->salt;
13683
13684 /**
13685 * parse line
13686 */
13687
13688 char *hashbuf_pos = input_buf;
13689
13690 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13691
13692 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13693
13694 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13695
13696 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13697
13698 domainbuf_pos++;
13699
13700 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13701
13702 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13703
13704 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13705
13706 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13707
13708 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13709
13710 saltbuf_pos++;
13711
13712 char *iteration_pos = strchr (saltbuf_pos, ':');
13713
13714 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13715
13716 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13717
13718 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13719
13720 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13721
13722 iteration_pos++;
13723
13724 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13725
13726 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13727 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13728
13729 // ok, the plan for this algorithm is the following:
13730 // we have 2 salts here, the domain-name and a random salt
13731 // while both are used in the initial transformation,
13732 // only the random salt is used in the following iterations
13733 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13734 // and one that includes only the real salt (stored into salt_buf[]).
13735 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13736
13737 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
13738
13739 base32_decode (itoa32_to_int, hashbuf_pos, 32, tmp_buf);
13740
13741 memcpy (digest, tmp_buf, 20);
13742
13743 digest[0] = byte_swap_32 (digest[0]);
13744 digest[1] = byte_swap_32 (digest[1]);
13745 digest[2] = byte_swap_32 (digest[2]);
13746 digest[3] = byte_swap_32 (digest[3]);
13747 digest[4] = byte_swap_32 (digest[4]);
13748
13749 // domain
13750
13751 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13752
13753 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
13754
13755 char *len_ptr = NULL;
13756
13757 for (uint i = 0; i < domainbuf_len; i++)
13758 {
13759 if (salt_buf_pc_ptr[i] == '.')
13760 {
13761 len_ptr = &salt_buf_pc_ptr[i];
13762
13763 *len_ptr = 0;
13764 }
13765 else
13766 {
13767 *len_ptr += 1;
13768 }
13769 }
13770
13771 salt->salt_buf_pc[7] = domainbuf_len;
13772
13773 // "real" salt
13774
13775 char *salt_buf_ptr = (char *) salt->salt_buf;
13776
13777 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
13778
13779 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13780
13781 salt->salt_len = salt_len;
13782
13783 // iteration
13784
13785 salt->salt_iter = atoi (iteration_pos);
13786
13787 return (PARSER_OK);
13788 }
13789
13790 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13791 {
13792 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
13793
13794 uint32_t *digest = (uint32_t *) hash_buf->digest;
13795
13796 salt_t *salt = hash_buf->salt;
13797
13798 digest[0] = hex_to_uint (&input_buf[ 0]);
13799 digest[1] = hex_to_uint (&input_buf[ 8]);
13800 digest[2] = hex_to_uint (&input_buf[16]);
13801 digest[3] = hex_to_uint (&input_buf[24]);
13802 digest[4] = hex_to_uint (&input_buf[32]);
13803
13804 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13805
13806 uint salt_len = input_len - 40 - 1;
13807
13808 char *salt_buf = input_buf + 40 + 1;
13809
13810 char *salt_buf_ptr = (char *) salt->salt_buf;
13811
13812 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13813
13814 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13815
13816 salt->salt_len = salt_len;
13817
13818 return (PARSER_OK);
13819 }
13820
13821 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13822 {
13823 const uint8_t ascii_to_ebcdic[] =
13824 {
13825 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
13826 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
13827 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
13828 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
13829 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
13830 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
13831 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
13832 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
13833 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
13834 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
13835 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
13836 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
13837 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
13838 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
13839 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
13840 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
13841 };
13842
13843 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
13844
13845 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13846
13847 uint32_t *digest = (uint32_t *) hash_buf->digest;
13848
13849 salt_t *salt = hash_buf->salt;
13850
13851 char *salt_pos = input_buf + 6 + 1;
13852
13853 char *digest_pos = strchr (salt_pos, '*');
13854
13855 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13856
13857 uint salt_len = digest_pos - salt_pos;
13858
13859 if (salt_len > 8) return (PARSER_SALT_LENGTH);
13860
13861 uint hash_len = input_len - 1 - salt_len - 1 - 6;
13862
13863 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13864
13865 digest_pos++;
13866
13867 char *salt_buf_ptr = (char *) salt->salt_buf;
13868 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13869
13870 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13871
13872 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13873
13874 salt->salt_len = salt_len;
13875
13876 for (uint i = 0; i < salt_len; i++)
13877 {
13878 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
13879 }
13880 for (uint i = salt_len; i < 8; i++)
13881 {
13882 salt_buf_pc_ptr[i] = 0x40;
13883 }
13884
13885 uint tt;
13886
13887 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
13888
13889 salt->salt_buf_pc[0] = ROTATE_LEFT (salt->salt_buf_pc[0], 3u);
13890 salt->salt_buf_pc[1] = ROTATE_LEFT (salt->salt_buf_pc[1], 3u);
13891
13892 digest[0] = hex_to_uint (&digest_pos[ 0]);
13893 digest[1] = hex_to_uint (&digest_pos[ 8]);
13894
13895 digest[0] = byte_swap_32 (digest[0]);
13896 digest[1] = byte_swap_32 (digest[1]);
13897
13898 IP (digest[0], digest[1], tt);
13899
13900 digest[0] = ROTATE_RIGHT (digest[0], 29);
13901 digest[1] = ROTATE_RIGHT (digest[1], 29);
13902 digest[2] = 0;
13903 digest[3] = 0;
13904
13905 return (PARSER_OK);
13906 }
13907
13908 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13909 {
13910 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
13911
13912 uint32_t *digest = (uint32_t *) hash_buf->digest;
13913
13914 digest[0] = hex_to_uint (&input_buf[ 0]);
13915 digest[1] = hex_to_uint (&input_buf[ 8]);
13916 digest[2] = hex_to_uint (&input_buf[16]);
13917 digest[3] = hex_to_uint (&input_buf[24]);
13918
13919 digest[0] = byte_swap_32 (digest[0]);
13920 digest[1] = byte_swap_32 (digest[1]);
13921 digest[2] = byte_swap_32 (digest[2]);
13922 digest[3] = byte_swap_32 (digest[3]);
13923
13924 return (PARSER_OK);
13925 }
13926
13927 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13928 {
13929 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
13930
13931 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
13932
13933 uint32_t *digest = (uint32_t *) hash_buf->digest;
13934
13935 salt_t *salt = hash_buf->salt;
13936
13937 char tmp_buf[120];
13938
13939 memset (tmp_buf, 0, sizeof (tmp_buf));
13940
13941 base64_decode (lotus64_to_int, input_buf + 2, input_len - 3, tmp_buf);
13942
13943 tmp_buf[3] += -4; // dont ask!
13944
13945 memcpy (salt->salt_buf, tmp_buf, 5);
13946
13947 salt->salt_len = 5;
13948
13949 memcpy (digest, tmp_buf + 5, 9);
13950
13951 // yes, only 9 byte are needed to crack, but 10 to display
13952
13953 salt->salt_buf_pc[7] = input_buf[20];
13954
13955 return (PARSER_OK);
13956 }
13957
13958 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13959 {
13960 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
13961
13962 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
13963
13964 uint32_t *digest = (uint32_t *) hash_buf->digest;
13965
13966 salt_t *salt = hash_buf->salt;
13967
13968 char tmp_buf[120];
13969
13970 memset (tmp_buf, 0, sizeof (tmp_buf));
13971
13972 base64_decode (lotus64_to_int, input_buf + 2, input_len - 3, tmp_buf);
13973
13974 tmp_buf[3] += -4; // dont ask!
13975
13976 // salt
13977
13978 memcpy (salt->salt_buf, tmp_buf, 16);
13979
13980 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)
13981
13982 // iteration
13983
13984 char tmp_iter_buf[11];
13985
13986 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
13987
13988 tmp_iter_buf[10] = 0;
13989
13990 salt->salt_iter = atoi (tmp_iter_buf);
13991
13992 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
13993 {
13994 return (PARSER_SALT_ITERATION);
13995 }
13996
13997 salt->salt_iter--; // first round in init
13998
13999 // 2 additional bytes for display only
14000
14001 salt->salt_buf_pc[0] = tmp_buf[26];
14002 salt->salt_buf_pc[1] = tmp_buf[27];
14003
14004 // digest
14005
14006 memcpy (digest, tmp_buf + 28, 8);
14007
14008 digest[0] = byte_swap_32 (digest[0]);
14009 digest[1] = byte_swap_32 (digest[1]);
14010 digest[2] = 0;
14011 digest[3] = 0;
14012
14013 return (PARSER_OK);
14014 }
14015
14016 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14017 {
14018 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14019
14020 uint32_t *digest = (uint32_t *) hash_buf->digest;
14021
14022 salt_t *salt = hash_buf->salt;
14023
14024 char *salt_buf_pos = input_buf;
14025
14026 char *hash_buf_pos = salt_buf_pos + 6;
14027
14028 digest[0] = hex_to_uint (&hash_buf_pos[ 0]);
14029 digest[1] = hex_to_uint (&hash_buf_pos[ 8]);
14030 digest[2] = hex_to_uint (&hash_buf_pos[16]);
14031 digest[3] = hex_to_uint (&hash_buf_pos[24]);
14032 digest[4] = hex_to_uint (&hash_buf_pos[32]);
14033 digest[5] = hex_to_uint (&hash_buf_pos[40]);
14034 digest[6] = hex_to_uint (&hash_buf_pos[48]);
14035 digest[7] = hex_to_uint (&hash_buf_pos[56]);
14036
14037 digest[0] -= SHA256M_A;
14038 digest[1] -= SHA256M_B;
14039 digest[2] -= SHA256M_C;
14040 digest[3] -= SHA256M_D;
14041 digest[4] -= SHA256M_E;
14042 digest[5] -= SHA256M_F;
14043 digest[6] -= SHA256M_G;
14044 digest[7] -= SHA256M_H;
14045
14046 char *salt_buf_ptr = (char *) salt->salt_buf;
14047
14048 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14049
14050 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14051
14052 salt->salt_len = salt_len;
14053
14054 return (PARSER_OK);
14055 }
14056
14057 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14058 {
14059 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14060
14061 uint32_t *digest = (uint32_t *) hash_buf->digest;
14062
14063 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14064
14065 salt_t *salt = hash_buf->salt;
14066
14067 char *salt_buf = input_buf + 6;
14068
14069 char *digest_buf = strchr (salt_buf, '$');
14070
14071 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14072
14073 uint salt_len = digest_buf - salt_buf;
14074
14075 digest_buf++; // skip the '$' symbol
14076
14077 char *salt_buf_ptr = (char *) salt->salt_buf;
14078
14079 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14080
14081 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14082
14083 salt->salt_len = salt_len;
14084
14085 digest[0] = hex_to_uint (&digest_buf[ 0]);
14086 digest[1] = hex_to_uint (&digest_buf[ 8]);
14087 digest[2] = hex_to_uint (&digest_buf[16]);
14088 digest[3] = hex_to_uint (&digest_buf[24]);
14089
14090 digest[0] = byte_swap_32 (digest[0]);
14091 digest[1] = byte_swap_32 (digest[1]);
14092 digest[2] = byte_swap_32 (digest[2]);
14093 digest[3] = byte_swap_32 (digest[3]);
14094
14095 digest[0] -= MD5M_A;
14096 digest[1] -= MD5M_B;
14097 digest[2] -= MD5M_C;
14098 digest[3] -= MD5M_D;
14099
14100 return (PARSER_OK);
14101 }
14102
14103 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14104 {
14105 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14106
14107 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14108
14109 uint32_t *digest = (uint32_t *) hash_buf->digest;
14110
14111 salt_t *salt = hash_buf->salt;
14112
14113 char *salt_buf = input_buf + 3;
14114
14115 char *digest_buf = strchr (salt_buf, '$');
14116
14117 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14118
14119 uint salt_len = digest_buf - salt_buf;
14120
14121 digest_buf++; // skip the '$' symbol
14122
14123 char *salt_buf_ptr = (char *) salt->salt_buf;
14124
14125 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14126
14127 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14128
14129 salt_buf_ptr[salt_len] = 0x2d;
14130
14131 salt->salt_len = salt_len + 1;
14132
14133 digest[0] = hex_to_uint (&digest_buf[ 0]);
14134 digest[1] = hex_to_uint (&digest_buf[ 8]);
14135 digest[2] = hex_to_uint (&digest_buf[16]);
14136 digest[3] = hex_to_uint (&digest_buf[24]);
14137
14138 digest[0] = byte_swap_32 (digest[0]);
14139 digest[1] = byte_swap_32 (digest[1]);
14140 digest[2] = byte_swap_32 (digest[2]);
14141 digest[3] = byte_swap_32 (digest[3]);
14142
14143 digest[0] -= MD5M_A;
14144 digest[1] -= MD5M_B;
14145 digest[2] -= MD5M_C;
14146 digest[3] -= MD5M_D;
14147
14148 return (PARSER_OK);
14149 }
14150
14151 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14152 {
14153 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14154
14155 uint32_t *digest = (uint32_t *) hash_buf->digest;
14156
14157 char tmp_buf[100];
14158
14159 memset (tmp_buf, 0, sizeof (tmp_buf));
14160
14161 base64_decode (base64_to_int, input_buf, input_len, tmp_buf);
14162
14163 memcpy (digest, tmp_buf, 20);
14164
14165 digest[0] = byte_swap_32 (digest[0]);
14166 digest[1] = byte_swap_32 (digest[1]);
14167 digest[2] = byte_swap_32 (digest[2]);
14168 digest[3] = byte_swap_32 (digest[3]);
14169 digest[4] = byte_swap_32 (digest[4]);
14170
14171 digest[0] -= SHA1M_A;
14172 digest[1] -= SHA1M_B;
14173 digest[2] -= SHA1M_C;
14174 digest[3] -= SHA1M_D;
14175 digest[4] -= SHA1M_E;
14176
14177 return (PARSER_OK);
14178 }
14179
14180 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14181 {
14182 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14183
14184 uint32_t *digest = (uint32_t *) hash_buf->digest;
14185
14186 salt_t *salt = hash_buf->salt;
14187
14188 digest[0] = hex_to_uint (&input_buf[ 0]);
14189 digest[1] = hex_to_uint (&input_buf[ 8]);
14190 digest[2] = hex_to_uint (&input_buf[16]);
14191 digest[3] = hex_to_uint (&input_buf[24]);
14192
14193 digest[0] = byte_swap_32 (digest[0]);
14194 digest[1] = byte_swap_32 (digest[1]);
14195 digest[2] = byte_swap_32 (digest[2]);
14196 digest[3] = byte_swap_32 (digest[3]);
14197
14198 digest[0] -= MD5M_A;
14199 digest[1] -= MD5M_B;
14200 digest[2] -= MD5M_C;
14201 digest[3] -= MD5M_D;
14202
14203 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14204
14205 uint salt_len = input_len - 32 - 1;
14206
14207 char *salt_buf = input_buf + 32 + 1;
14208
14209 char *salt_buf_ptr = (char *) salt->salt_buf;
14210
14211 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14212
14213 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14214
14215 /*
14216 * add static "salt" part
14217 */
14218
14219 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14220
14221 salt_len += 8;
14222
14223 salt->salt_len = salt_len;
14224
14225 return (PARSER_OK);
14226 }
14227
14228 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14229 {
14230 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14231
14232 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14233
14234 uint32_t *digest = (uint32_t *) hash_buf->digest;
14235
14236 salt_t *salt = hash_buf->salt;
14237
14238 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14239
14240 /**
14241 * parse line
14242 */
14243
14244 char *saltlen_pos = input_buf + 1 + 3 + 1;
14245
14246 char *saltbuf_pos = strchr (saltlen_pos, '$');
14247
14248 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14249
14250 uint saltlen_len = saltbuf_pos - saltlen_pos;
14251
14252 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14253
14254 saltbuf_pos++;
14255
14256 char *keylen_pos = strchr (saltbuf_pos, '$');
14257
14258 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14259
14260 uint saltbuf_len = keylen_pos - saltbuf_pos;
14261
14262 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14263
14264 keylen_pos++;
14265
14266 char *keybuf_pos = strchr (keylen_pos, '$');
14267
14268 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14269
14270 uint keylen_len = keybuf_pos - keylen_pos;
14271
14272 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14273
14274 keybuf_pos++;
14275
14276 char *databuf_pos = strchr (keybuf_pos, '$');
14277
14278 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14279
14280 uint keybuf_len = databuf_pos - keybuf_pos;
14281
14282 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14283
14284 databuf_pos++;
14285
14286 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14287
14288 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14289
14290 /**
14291 * copy data
14292 */
14293
14294 digest[0] = hex_to_uint (&keybuf_pos[ 0]);
14295 digest[1] = hex_to_uint (&keybuf_pos[ 8]);
14296 digest[2] = hex_to_uint (&keybuf_pos[16]);
14297 digest[3] = hex_to_uint (&keybuf_pos[24]);
14298
14299 salt->salt_buf[0] = hex_to_uint (&saltbuf_pos[ 0]);
14300 salt->salt_buf[1] = hex_to_uint (&saltbuf_pos[ 8]);
14301 salt->salt_buf[2] = hex_to_uint (&saltbuf_pos[16]);
14302 salt->salt_buf[3] = hex_to_uint (&saltbuf_pos[24]);
14303
14304 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14305 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14306 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14307 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14308
14309 salt->salt_len = 16;
14310 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14311
14312 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14313 {
14314 androidfde->data[j] = hex_to_uint (&databuf_pos[i]);
14315 }
14316
14317 return (PARSER_OK);
14318 }
14319
14320 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14321 {
14322 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14323
14324 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14325
14326 uint32_t *digest = (uint32_t *) hash_buf->digest;
14327
14328 salt_t *salt = hash_buf->salt;
14329
14330 /**
14331 * parse line
14332 */
14333
14334 // first is the N salt parameter
14335
14336 char *N_pos = input_buf + 6;
14337
14338 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14339
14340 N_pos++;
14341
14342 salt->scrypt_N = atoi (N_pos);
14343
14344 // r
14345
14346 char *r_pos = strchr (N_pos, ':');
14347
14348 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14349
14350 r_pos++;
14351
14352 salt->scrypt_r = atoi (r_pos);
14353
14354 // p
14355
14356 char *p_pos = strchr (r_pos, ':');
14357
14358 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14359
14360 p_pos++;
14361
14362 salt->scrypt_p = atoi (p_pos);
14363
14364 // salt
14365
14366 char *saltbuf_pos = strchr (p_pos, ':');
14367
14368 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14369
14370 saltbuf_pos++;
14371
14372 char *hash_pos = strchr (saltbuf_pos, ':');
14373
14374 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14375
14376 hash_pos++;
14377
14378 // base64 decode
14379
14380 char tmp_buf[32];
14381
14382 memset (tmp_buf, 0, sizeof (tmp_buf));
14383
14384 int tmp_len = base64_decode (base64_to_int, saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14385
14386 char *salt_buf_ptr = (char *) salt->salt_buf;
14387
14388 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14389
14390 salt->salt_len = tmp_len;
14391 salt->salt_iter = 1;
14392
14393 // digest - base64 decode
14394
14395 memset (tmp_buf, 0, sizeof (tmp_buf));
14396
14397 tmp_len = input_len - (hash_pos - input_buf);
14398
14399 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14400
14401 base64_decode (base64_to_int, hash_pos, tmp_len, tmp_buf);
14402
14403 memcpy (digest, tmp_buf, 32);
14404
14405 return (PARSER_OK);
14406 }
14407
14408 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14409 {
14410 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14411
14412 uint32_t *digest = (uint32_t *) hash_buf->digest;
14413
14414 salt_t *salt = hash_buf->salt;
14415
14416 /**
14417 * parse line
14418 */
14419
14420 char decrypted[76]; // iv + hash
14421
14422 juniper_decrypt_hash (input_buf, decrypted);
14423
14424 char *md5crypt_hash = decrypted + 12;
14425
14426 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14427
14428 salt->salt_iter = ROUNDS_MD5CRYPT;
14429
14430 char *salt_pos = md5crypt_hash + 3;
14431
14432 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14433
14434 salt->salt_len = hash_pos - salt_pos; // should be 8
14435
14436 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14437
14438 hash_pos++;
14439
14440 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14441
14442 return (PARSER_OK);
14443 }
14444
14445 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14446 {
14447 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14448
14449 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14450
14451 uint32_t *digest = (uint32_t *) hash_buf->digest;
14452
14453 salt_t *salt = hash_buf->salt;
14454
14455 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14456
14457 /**
14458 * parse line
14459 */
14460
14461 // first is *raw* salt
14462
14463 char *salt_pos = input_buf + 3;
14464
14465 char *hash_pos = strchr (salt_pos, '$');
14466
14467 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14468
14469 uint salt_len = hash_pos - salt_pos;
14470
14471 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14472
14473 hash_pos++;
14474
14475 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14476
14477 memcpy (salt_buf_ptr, salt_pos, 14);
14478
14479 salt_buf_ptr[17] = 0x01;
14480 salt_buf_ptr[18] = 0x80;
14481
14482 // add some stuff to normal salt to make sorted happy
14483
14484 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14485 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14486 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14487 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14488
14489 salt->salt_len = salt_len;
14490 salt->salt_iter = ROUNDS_CISCO8 - 1;
14491
14492 // base64 decode hash
14493
14494 char tmp_buf[100];
14495
14496 memset (tmp_buf, 0, sizeof (tmp_buf));
14497
14498 uint hash_len = input_len - 3 - salt_len - 1;
14499
14500 int tmp_len = base64_decode (itoa64_to_int, hash_pos, hash_len, tmp_buf);
14501
14502 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14503
14504 memcpy (digest, tmp_buf, 32);
14505
14506 digest[0] = byte_swap_32 (digest[0]);
14507 digest[1] = byte_swap_32 (digest[1]);
14508 digest[2] = byte_swap_32 (digest[2]);
14509 digest[3] = byte_swap_32 (digest[3]);
14510 digest[4] = byte_swap_32 (digest[4]);
14511 digest[5] = byte_swap_32 (digest[5]);
14512 digest[6] = byte_swap_32 (digest[6]);
14513 digest[7] = byte_swap_32 (digest[7]);
14514
14515 return (PARSER_OK);
14516 }
14517
14518 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14519 {
14520 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14521
14522 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14523
14524 uint32_t *digest = (uint32_t *) hash_buf->digest;
14525
14526 salt_t *salt = hash_buf->salt;
14527
14528 /**
14529 * parse line
14530 */
14531
14532 // first is *raw* salt
14533
14534 char *salt_pos = input_buf + 3;
14535
14536 char *hash_pos = strchr (salt_pos, '$');
14537
14538 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14539
14540 uint salt_len = hash_pos - salt_pos;
14541
14542 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14543
14544 salt->salt_len = salt_len;
14545 hash_pos++;
14546
14547 char *salt_buf_ptr = (char *) salt->salt_buf;
14548
14549 memcpy (salt_buf_ptr, salt_pos, salt_len);
14550 salt_buf_ptr[salt_len] = 0;
14551
14552 // base64 decode hash
14553
14554 char tmp_buf[100];
14555
14556 memset (tmp_buf, 0, sizeof (tmp_buf));
14557
14558 uint hash_len = input_len - 3 - salt_len - 1;
14559
14560 int tmp_len = base64_decode (itoa64_to_int, hash_pos, hash_len, tmp_buf);
14561
14562 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14563
14564 memcpy (digest, tmp_buf, 32);
14565
14566 // fixed:
14567 salt->scrypt_N = 16384;
14568 salt->scrypt_r = 1;
14569 salt->scrypt_p = 1;
14570 salt->salt_iter = 1;
14571
14572 return (PARSER_OK);
14573 }
14574
14575 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14576 {
14577 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14578
14579 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14580
14581 uint32_t *digest = (uint32_t *) hash_buf->digest;
14582
14583 salt_t *salt = hash_buf->salt;
14584
14585 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14586
14587 /**
14588 * parse line
14589 */
14590
14591 char *version_pos = input_buf + 8 + 1;
14592
14593 char *verifierHashSize_pos = strchr (version_pos, '*');
14594
14595 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14596
14597 uint32_t version_len = verifierHashSize_pos - version_pos;
14598
14599 if (version_len != 4) return (PARSER_SALT_LENGTH);
14600
14601 verifierHashSize_pos++;
14602
14603 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14604
14605 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14606
14607 uint32_t verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14608
14609 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14610
14611 keySize_pos++;
14612
14613 char *saltSize_pos = strchr (keySize_pos, '*');
14614
14615 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14616
14617 uint32_t keySize_len = saltSize_pos - keySize_pos;
14618
14619 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14620
14621 saltSize_pos++;
14622
14623 char *osalt_pos = strchr (saltSize_pos, '*');
14624
14625 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14626
14627 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14628
14629 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14630
14631 osalt_pos++;
14632
14633 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14634
14635 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14636
14637 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14638
14639 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14640
14641 encryptedVerifier_pos++;
14642
14643 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14644
14645 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14646
14647 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14648
14649 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14650
14651 encryptedVerifierHash_pos++;
14652
14653 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;
14654
14655 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14656
14657 const uint version = atoi (version_pos);
14658
14659 if (version != 2007) return (PARSER_SALT_VALUE);
14660
14661 const uint verifierHashSize = atoi (verifierHashSize_pos);
14662
14663 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14664
14665 const uint keySize = atoi (keySize_pos);
14666
14667 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14668
14669 office2007->keySize = keySize;
14670
14671 const uint saltSize = atoi (saltSize_pos);
14672
14673 if (saltSize != 16) return (PARSER_SALT_VALUE);
14674
14675 /**
14676 * salt
14677 */
14678
14679 salt->salt_len = 16;
14680 salt->salt_iter = ROUNDS_OFFICE2007;
14681
14682 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14683 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14684 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14685 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14686
14687 /**
14688 * esalt
14689 */
14690
14691 office2007->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14692 office2007->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14693 office2007->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14694 office2007->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14695
14696 office2007->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14697 office2007->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14698 office2007->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14699 office2007->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14700 office2007->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14701
14702 /**
14703 * digest
14704 */
14705
14706 digest[0] = office2007->encryptedVerifierHash[0];
14707 digest[1] = office2007->encryptedVerifierHash[1];
14708 digest[2] = office2007->encryptedVerifierHash[2];
14709 digest[3] = office2007->encryptedVerifierHash[3];
14710
14711 return (PARSER_OK);
14712 }
14713
14714 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14715 {
14716 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14717
14718 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14719
14720 uint32_t *digest = (uint32_t *) hash_buf->digest;
14721
14722 salt_t *salt = hash_buf->salt;
14723
14724 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14725
14726 /**
14727 * parse line
14728 */
14729
14730 char *version_pos = input_buf + 8 + 1;
14731
14732 char *spinCount_pos = strchr (version_pos, '*');
14733
14734 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14735
14736 uint32_t version_len = spinCount_pos - version_pos;
14737
14738 if (version_len != 4) return (PARSER_SALT_LENGTH);
14739
14740 spinCount_pos++;
14741
14742 char *keySize_pos = strchr (spinCount_pos, '*');
14743
14744 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14745
14746 uint32_t spinCount_len = keySize_pos - spinCount_pos;
14747
14748 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14749
14750 keySize_pos++;
14751
14752 char *saltSize_pos = strchr (keySize_pos, '*');
14753
14754 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14755
14756 uint32_t keySize_len = saltSize_pos - keySize_pos;
14757
14758 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14759
14760 saltSize_pos++;
14761
14762 char *osalt_pos = strchr (saltSize_pos, '*');
14763
14764 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14765
14766 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14767
14768 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14769
14770 osalt_pos++;
14771
14772 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14773
14774 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14775
14776 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14777
14778 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14779
14780 encryptedVerifier_pos++;
14781
14782 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14783
14784 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14785
14786 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14787
14788 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14789
14790 encryptedVerifierHash_pos++;
14791
14792 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;
14793
14794 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14795
14796 const uint version = atoi (version_pos);
14797
14798 if (version != 2010) return (PARSER_SALT_VALUE);
14799
14800 const uint spinCount = atoi (spinCount_pos);
14801
14802 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14803
14804 const uint keySize = atoi (keySize_pos);
14805
14806 if (keySize != 128) return (PARSER_SALT_VALUE);
14807
14808 const uint saltSize = atoi (saltSize_pos);
14809
14810 if (saltSize != 16) return (PARSER_SALT_VALUE);
14811
14812 /**
14813 * salt
14814 */
14815
14816 salt->salt_len = 16;
14817 salt->salt_iter = spinCount;
14818
14819 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14820 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14821 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14822 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14823
14824 /**
14825 * esalt
14826 */
14827
14828 office2010->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14829 office2010->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14830 office2010->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14831 office2010->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14832
14833 office2010->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14834 office2010->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14835 office2010->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14836 office2010->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14837 office2010->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14838 office2010->encryptedVerifierHash[5] = hex_to_uint (&encryptedVerifierHash_pos[40]);
14839 office2010->encryptedVerifierHash[6] = hex_to_uint (&encryptedVerifierHash_pos[48]);
14840 office2010->encryptedVerifierHash[7] = hex_to_uint (&encryptedVerifierHash_pos[56]);
14841
14842 /**
14843 * digest
14844 */
14845
14846 digest[0] = office2010->encryptedVerifierHash[0];
14847 digest[1] = office2010->encryptedVerifierHash[1];
14848 digest[2] = office2010->encryptedVerifierHash[2];
14849 digest[3] = office2010->encryptedVerifierHash[3];
14850
14851 return (PARSER_OK);
14852 }
14853
14854 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14855 {
14856 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
14857
14858 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14859
14860 uint32_t *digest = (uint32_t *) hash_buf->digest;
14861
14862 salt_t *salt = hash_buf->salt;
14863
14864 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
14865
14866 /**
14867 * parse line
14868 */
14869
14870 char *version_pos = input_buf + 8 + 1;
14871
14872 char *spinCount_pos = strchr (version_pos, '*');
14873
14874 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14875
14876 uint32_t version_len = spinCount_pos - version_pos;
14877
14878 if (version_len != 4) return (PARSER_SALT_LENGTH);
14879
14880 spinCount_pos++;
14881
14882 char *keySize_pos = strchr (spinCount_pos, '*');
14883
14884 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14885
14886 uint32_t spinCount_len = keySize_pos - spinCount_pos;
14887
14888 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14889
14890 keySize_pos++;
14891
14892 char *saltSize_pos = strchr (keySize_pos, '*');
14893
14894 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14895
14896 uint32_t keySize_len = saltSize_pos - keySize_pos;
14897
14898 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14899
14900 saltSize_pos++;
14901
14902 char *osalt_pos = strchr (saltSize_pos, '*');
14903
14904 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14905
14906 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14907
14908 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14909
14910 osalt_pos++;
14911
14912 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14913
14914 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14915
14916 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14917
14918 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14919
14920 encryptedVerifier_pos++;
14921
14922 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14923
14924 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14925
14926 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14927
14928 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14929
14930 encryptedVerifierHash_pos++;
14931
14932 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;
14933
14934 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14935
14936 const uint version = atoi (version_pos);
14937
14938 if (version != 2013) return (PARSER_SALT_VALUE);
14939
14940 const uint spinCount = atoi (spinCount_pos);
14941
14942 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14943
14944 const uint keySize = atoi (keySize_pos);
14945
14946 if (keySize != 256) return (PARSER_SALT_VALUE);
14947
14948 const uint saltSize = atoi (saltSize_pos);
14949
14950 if (saltSize != 16) return (PARSER_SALT_VALUE);
14951
14952 /**
14953 * salt
14954 */
14955
14956 salt->salt_len = 16;
14957 salt->salt_iter = spinCount;
14958
14959 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14960 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14961 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14962 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14963
14964 /**
14965 * esalt
14966 */
14967
14968 office2013->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14969 office2013->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14970 office2013->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14971 office2013->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14972
14973 office2013->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14974 office2013->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14975 office2013->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14976 office2013->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14977 office2013->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14978 office2013->encryptedVerifierHash[5] = hex_to_uint (&encryptedVerifierHash_pos[40]);
14979 office2013->encryptedVerifierHash[6] = hex_to_uint (&encryptedVerifierHash_pos[48]);
14980 office2013->encryptedVerifierHash[7] = hex_to_uint (&encryptedVerifierHash_pos[56]);
14981
14982 /**
14983 * digest
14984 */
14985
14986 digest[0] = office2013->encryptedVerifierHash[0];
14987 digest[1] = office2013->encryptedVerifierHash[1];
14988 digest[2] = office2013->encryptedVerifierHash[2];
14989 digest[3] = office2013->encryptedVerifierHash[3];
14990
14991 return (PARSER_OK);
14992 }
14993
14994 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14995 {
14996 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
14997
14998 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
14999
15000 uint32_t *digest = (uint32_t *) hash_buf->digest;
15001
15002 salt_t *salt = hash_buf->salt;
15003
15004 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15005
15006 /**
15007 * parse line
15008 */
15009
15010 char *version_pos = input_buf + 11;
15011
15012 char *osalt_pos = strchr (version_pos, '*');
15013
15014 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15015
15016 uint32_t version_len = osalt_pos - version_pos;
15017
15018 if (version_len != 1) return (PARSER_SALT_LENGTH);
15019
15020 osalt_pos++;
15021
15022 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15023
15024 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15025
15026 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15027
15028 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15029
15030 encryptedVerifier_pos++;
15031
15032 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15033
15034 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15035
15036 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15037
15038 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15039
15040 encryptedVerifierHash_pos++;
15041
15042 uint32_t encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15043
15044 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15045
15046 const uint version = *version_pos - 0x30;
15047
15048 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15049
15050 /**
15051 * esalt
15052 */
15053
15054 oldoffice01->version = version;
15055
15056 oldoffice01->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15057 oldoffice01->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15058 oldoffice01->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15059 oldoffice01->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15060
15061 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15062 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15063 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15064 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15065
15066 oldoffice01->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15067 oldoffice01->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15068 oldoffice01->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15069 oldoffice01->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15070
15071 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15072 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15073 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15074 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15075
15076 /**
15077 * salt
15078 */
15079
15080 salt->salt_len = 16;
15081
15082 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15083 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15084 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15085 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15086
15087 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15088 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15089 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15090 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15091
15092 // this is a workaround as office produces multiple documents with the same salt
15093
15094 salt->salt_len += 32;
15095
15096 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15097 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15098 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15099 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15100 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15101 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15102 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15103 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15104
15105 /**
15106 * digest
15107 */
15108
15109 digest[0] = oldoffice01->encryptedVerifierHash[0];
15110 digest[1] = oldoffice01->encryptedVerifierHash[1];
15111 digest[2] = oldoffice01->encryptedVerifierHash[2];
15112 digest[3] = oldoffice01->encryptedVerifierHash[3];
15113
15114 return (PARSER_OK);
15115 }
15116
15117 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15118 {
15119 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15120 }
15121
15122 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15123 {
15124 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15125
15126 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15127
15128 uint32_t *digest = (uint32_t *) hash_buf->digest;
15129
15130 salt_t *salt = hash_buf->salt;
15131
15132 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15133
15134 /**
15135 * parse line
15136 */
15137
15138 char *version_pos = input_buf + 11;
15139
15140 char *osalt_pos = strchr (version_pos, '*');
15141
15142 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15143
15144 uint32_t version_len = osalt_pos - version_pos;
15145
15146 if (version_len != 1) return (PARSER_SALT_LENGTH);
15147
15148 osalt_pos++;
15149
15150 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15151
15152 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15153
15154 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15155
15156 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15157
15158 encryptedVerifier_pos++;
15159
15160 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15161
15162 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15163
15164 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15165
15166 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15167
15168 encryptedVerifierHash_pos++;
15169
15170 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15171
15172 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15173
15174 uint32_t encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15175
15176 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15177
15178 rc4key_pos++;
15179
15180 uint32_t rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15181
15182 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15183
15184 const uint version = *version_pos - 0x30;
15185
15186 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15187
15188 /**
15189 * esalt
15190 */
15191
15192 oldoffice01->version = version;
15193
15194 oldoffice01->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15195 oldoffice01->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15196 oldoffice01->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15197 oldoffice01->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15198
15199 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15200 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15201 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15202 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15203
15204 oldoffice01->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15205 oldoffice01->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15206 oldoffice01->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15207 oldoffice01->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15208
15209 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15210 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15211 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15212 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15213
15214 oldoffice01->rc4key[1] = 0;
15215 oldoffice01->rc4key[0] = 0;
15216
15217 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15218 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15219 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15220 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15221 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15222 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15223 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15224 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15225 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15226 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15227
15228 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15229 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15230
15231 /**
15232 * salt
15233 */
15234
15235 salt->salt_len = 16;
15236
15237 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15238 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15239 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15240 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15241
15242 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15243 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15244 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15245 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15246
15247 // this is a workaround as office produces multiple documents with the same salt
15248
15249 salt->salt_len += 32;
15250
15251 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15252 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15253 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15254 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15255 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15256 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15257 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15258 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15259
15260 /**
15261 * digest
15262 */
15263
15264 digest[0] = oldoffice01->rc4key[0];
15265 digest[1] = oldoffice01->rc4key[1];
15266 digest[2] = 0;
15267 digest[3] = 0;
15268
15269 return (PARSER_OK);
15270 }
15271
15272 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15273 {
15274 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15275
15276 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15277
15278 uint32_t *digest = (uint32_t *) hash_buf->digest;
15279
15280 salt_t *salt = hash_buf->salt;
15281
15282 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15283
15284 /**
15285 * parse line
15286 */
15287
15288 char *version_pos = input_buf + 11;
15289
15290 char *osalt_pos = strchr (version_pos, '*');
15291
15292 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15293
15294 uint32_t version_len = osalt_pos - version_pos;
15295
15296 if (version_len != 1) return (PARSER_SALT_LENGTH);
15297
15298 osalt_pos++;
15299
15300 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15301
15302 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15303
15304 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15305
15306 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15307
15308 encryptedVerifier_pos++;
15309
15310 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15311
15312 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15313
15314 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15315
15316 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15317
15318 encryptedVerifierHash_pos++;
15319
15320 uint32_t encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15321
15322 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15323
15324 const uint version = *version_pos - 0x30;
15325
15326 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15327
15328 /**
15329 * esalt
15330 */
15331
15332 oldoffice34->version = version;
15333
15334 oldoffice34->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15335 oldoffice34->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15336 oldoffice34->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15337 oldoffice34->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15338
15339 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15340 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15341 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15342 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15343
15344 oldoffice34->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15345 oldoffice34->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15346 oldoffice34->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15347 oldoffice34->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15348 oldoffice34->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15349
15350 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15351 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15352 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15353 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15354 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15355
15356 /**
15357 * salt
15358 */
15359
15360 salt->salt_len = 16;
15361
15362 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15363 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15364 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15365 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15366
15367 // this is a workaround as office produces multiple documents with the same salt
15368
15369 salt->salt_len += 32;
15370
15371 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15372 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15373 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15374 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15375 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15376 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15377 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15378 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15379
15380 /**
15381 * digest
15382 */
15383
15384 digest[0] = oldoffice34->encryptedVerifierHash[0];
15385 digest[1] = oldoffice34->encryptedVerifierHash[1];
15386 digest[2] = oldoffice34->encryptedVerifierHash[2];
15387 digest[3] = oldoffice34->encryptedVerifierHash[3];
15388
15389 return (PARSER_OK);
15390 }
15391
15392 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15393 {
15394 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15395
15396 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15397 }
15398
15399 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15400 {
15401 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15402
15403 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15404
15405 uint32_t *digest = (uint32_t *) hash_buf->digest;
15406
15407 salt_t *salt = hash_buf->salt;
15408
15409 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15410
15411 /**
15412 * parse line
15413 */
15414
15415 char *version_pos = input_buf + 11;
15416
15417 char *osalt_pos = strchr (version_pos, '*');
15418
15419 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15420
15421 uint32_t version_len = osalt_pos - version_pos;
15422
15423 if (version_len != 1) return (PARSER_SALT_LENGTH);
15424
15425 osalt_pos++;
15426
15427 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15428
15429 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15430
15431 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15432
15433 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15434
15435 encryptedVerifier_pos++;
15436
15437 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15438
15439 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15440
15441 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15442
15443 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15444
15445 encryptedVerifierHash_pos++;
15446
15447 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15448
15449 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15450
15451 uint32_t encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15452
15453 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15454
15455 rc4key_pos++;
15456
15457 uint32_t rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15458
15459 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15460
15461 const uint version = *version_pos - 0x30;
15462
15463 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15464
15465 /**
15466 * esalt
15467 */
15468
15469 oldoffice34->version = version;
15470
15471 oldoffice34->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15472 oldoffice34->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15473 oldoffice34->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15474 oldoffice34->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15475
15476 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15477 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15478 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15479 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15480
15481 oldoffice34->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15482 oldoffice34->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15483 oldoffice34->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15484 oldoffice34->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15485 oldoffice34->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15486
15487 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15488 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15489 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15490 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15491 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15492
15493 oldoffice34->rc4key[1] = 0;
15494 oldoffice34->rc4key[0] = 0;
15495
15496 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15497 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15498 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15499 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15500 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15501 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15502 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15503 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15504 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15505 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15506
15507 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15508 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15509
15510 /**
15511 * salt
15512 */
15513
15514 salt->salt_len = 16;
15515
15516 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15517 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15518 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15519 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15520
15521 // this is a workaround as office produces multiple documents with the same salt
15522
15523 salt->salt_len += 32;
15524
15525 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15526 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15527 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15528 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15529 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15530 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15531 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15532 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15533
15534 /**
15535 * digest
15536 */
15537
15538 digest[0] = oldoffice34->rc4key[0];
15539 digest[1] = oldoffice34->rc4key[1];
15540 digest[2] = 0;
15541 digest[3] = 0;
15542
15543 return (PARSER_OK);
15544 }
15545
15546 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15547 {
15548 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15549
15550 uint32_t *digest = (uint32_t *) hash_buf->digest;
15551
15552 digest[0] = hex_to_uint (&input_buf[ 0]);
15553 digest[1] = hex_to_uint (&input_buf[ 8]);
15554 digest[2] = hex_to_uint (&input_buf[16]);
15555 digest[3] = hex_to_uint (&input_buf[24]);
15556
15557 digest[0] = byte_swap_32 (digest[0]);
15558 digest[1] = byte_swap_32 (digest[1]);
15559 digest[2] = byte_swap_32 (digest[2]);
15560 digest[3] = byte_swap_32 (digest[3]);
15561
15562 return (PARSER_OK);
15563 }
15564
15565 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15566 {
15567 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15568
15569 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15570
15571 uint32_t *digest = (uint32_t *) hash_buf->digest;
15572
15573 salt_t *salt = hash_buf->salt;
15574
15575 char *signature_pos = input_buf;
15576
15577 char *salt_pos = strchr (signature_pos, '$');
15578
15579 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15580
15581 uint32_t signature_len = salt_pos - signature_pos;
15582
15583 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15584
15585 salt_pos++;
15586
15587 char *hash_pos = strchr (salt_pos, '$');
15588
15589 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15590
15591 uint32_t salt_len = hash_pos - salt_pos;
15592
15593 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15594
15595 hash_pos++;
15596
15597 uint32_t hash_len = input_len - signature_len - 1 - salt_len - 1;
15598
15599 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15600
15601 digest[0] = hex_to_uint (&hash_pos[ 0]);
15602 digest[1] = hex_to_uint (&hash_pos[ 8]);
15603 digest[2] = hex_to_uint (&hash_pos[16]);
15604 digest[3] = hex_to_uint (&hash_pos[24]);
15605 digest[4] = hex_to_uint (&hash_pos[32]);
15606
15607 digest[0] -= SHA1M_A;
15608 digest[1] -= SHA1M_B;
15609 digest[2] -= SHA1M_C;
15610 digest[3] -= SHA1M_D;
15611 digest[4] -= SHA1M_E;
15612
15613 char *salt_buf_ptr = (char *) salt->salt_buf;
15614
15615 memcpy (salt_buf_ptr, salt_pos, salt_len);
15616
15617 salt->salt_len = salt_len;
15618
15619 return (PARSER_OK);
15620 }
15621
15622 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15623 {
15624 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15625
15626 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15627
15628 uint32_t *digest = (uint32_t *) hash_buf->digest;
15629
15630 salt_t *salt = hash_buf->salt;
15631
15632 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15633
15634 /**
15635 * parse line
15636 */
15637
15638 char *iter_pos = input_buf + 14;
15639
15640 const int iter = atoi (iter_pos);
15641
15642 if (iter < 1) return (PARSER_SALT_ITERATION);
15643
15644 salt->salt_iter = iter - 1;
15645
15646 char *salt_pos = strchr (iter_pos, '$');
15647
15648 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15649
15650 salt_pos++;
15651
15652 char *hash_pos = strchr (salt_pos, '$');
15653
15654 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15655
15656 const uint salt_len = hash_pos - salt_pos;
15657
15658 hash_pos++;
15659
15660 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15661
15662 memcpy (salt_buf_ptr, salt_pos, salt_len);
15663
15664 salt->salt_len = salt_len;
15665
15666 salt_buf_ptr[salt_len + 3] = 0x01;
15667 salt_buf_ptr[salt_len + 4] = 0x80;
15668
15669 // add some stuff to normal salt to make sorted happy
15670
15671 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15672 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15673 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15674 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15675 salt->salt_buf[4] = salt->salt_iter;
15676
15677 // base64 decode hash
15678
15679 char tmp_buf[100];
15680
15681 memset (tmp_buf, 0, sizeof (tmp_buf));
15682
15683 uint hash_len = input_len - (hash_pos - input_buf);
15684
15685 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15686
15687 base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf);
15688
15689 memcpy (digest, tmp_buf, 32);
15690
15691 digest[0] = byte_swap_32 (digest[0]);
15692 digest[1] = byte_swap_32 (digest[1]);
15693 digest[2] = byte_swap_32 (digest[2]);
15694 digest[3] = byte_swap_32 (digest[3]);
15695 digest[4] = byte_swap_32 (digest[4]);
15696 digest[5] = byte_swap_32 (digest[5]);
15697 digest[6] = byte_swap_32 (digest[6]);
15698 digest[7] = byte_swap_32 (digest[7]);
15699
15700 return (PARSER_OK);
15701 }
15702
15703 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15704 {
15705 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15706
15707 uint32_t *digest = (uint32_t *) hash_buf->digest;
15708
15709 salt_t *salt = hash_buf->salt;
15710
15711 digest[0] = hex_to_uint (&input_buf[ 0]);
15712 digest[1] = hex_to_uint (&input_buf[ 8]);
15713 digest[2] = 0;
15714 digest[3] = 0;
15715
15716 digest[0] = byte_swap_32 (digest[0]);
15717 digest[1] = byte_swap_32 (digest[1]);
15718
15719 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15720 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15721 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15722
15723 char iter_c = input_buf[17];
15724 char iter_d = input_buf[19];
15725
15726 // atm only defaults, let's see if there's more request
15727 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15728 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15729
15730 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15731
15732 salt->salt_buf[0] = hex_to_uint (&salt_buf[ 0]);
15733 salt->salt_buf[1] = hex_to_uint (&salt_buf[ 8]);
15734 salt->salt_buf[2] = hex_to_uint (&salt_buf[16]);
15735 salt->salt_buf[3] = hex_to_uint (&salt_buf[24]);
15736
15737 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15738 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15739 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15740 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15741
15742 salt->salt_len = 16;
15743
15744 return (PARSER_OK);
15745 }
15746
15747 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15748 {
15749 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
15750
15751 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15752
15753 uint32_t *digest = (uint32_t *) hash_buf->digest;
15754
15755 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
15756
15757 salt_t *salt = hash_buf->salt;
15758
15759 char *salt_pos = input_buf + 10;
15760
15761 char *hash_pos = strchr (salt_pos, '$');
15762
15763 uint salt_len = hash_pos - salt_pos;
15764
15765 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15766
15767 hash_pos++;
15768
15769 uint hash_len = input_len - 10 - salt_len - 1;
15770
15771 // base64 decode salt
15772
15773 char tmp_buf[100];
15774
15775 memset (tmp_buf, 0, sizeof (tmp_buf));
15776
15777 salt_len = base64_decode (base64_to_int, salt_pos, salt_len, tmp_buf);
15778
15779 if (salt_len > 55) return (PARSER_SALT_LENGTH);
15780
15781 tmp_buf[salt_len] = 0x80;
15782
15783 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
15784
15785 salt->salt_len = salt_len;
15786
15787 // base64 decode salt
15788
15789 memset (tmp_buf, 0, sizeof (tmp_buf));
15790
15791 hash_len = base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf);
15792
15793 uint user_len = hash_len - 32;
15794
15795 char *tmp_hash = tmp_buf + user_len;
15796
15797 user_len--; // skip the trailing space
15798
15799 digest[0] = hex_to_uint (&tmp_hash[ 0]);
15800 digest[1] = hex_to_uint (&tmp_hash[ 8]);
15801 digest[2] = hex_to_uint (&tmp_hash[16]);
15802 digest[3] = hex_to_uint (&tmp_hash[24]);
15803
15804 digest[0] = byte_swap_32 (digest[0]);
15805 digest[1] = byte_swap_32 (digest[1]);
15806 digest[2] = byte_swap_32 (digest[2]);
15807 digest[3] = byte_swap_32 (digest[3]);
15808
15809 // store username for host only (output hash if cracked)
15810
15811 memset (cram_md5->user, 0, sizeof (cram_md5->user));
15812 memcpy (cram_md5->user, tmp_buf, user_len);
15813
15814 return (PARSER_OK);
15815 }
15816
15817 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15818 {
15819 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
15820
15821 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15822
15823 uint32_t *digest = (uint32_t *) hash_buf->digest;
15824
15825 salt_t *salt = hash_buf->salt;
15826
15827 char *iter_pos = input_buf + 10;
15828
15829 uint32_t iter = atoi (iter_pos);
15830
15831 if (iter < 1)
15832 {
15833 return (PARSER_SALT_ITERATION);
15834 }
15835
15836 iter--; // first iteration is special
15837
15838 salt->salt_iter = iter;
15839
15840 char *base64_pos = strchr (iter_pos, '}');
15841
15842 if (base64_pos == NULL)
15843 {
15844 return (PARSER_SIGNATURE_UNMATCHED);
15845 }
15846
15847 base64_pos++;
15848
15849 // base64 decode salt
15850
15851 uint32_t base64_len = input_len - (base64_pos - input_buf);
15852
15853 char tmp_buf[100];
15854
15855 memset (tmp_buf, 0, sizeof (tmp_buf));
15856
15857 uint32_t decoded_len = base64_decode (base64_to_int, base64_pos, base64_len, tmp_buf);
15858
15859 if (decoded_len < 24)
15860 {
15861 return (PARSER_SALT_LENGTH);
15862 }
15863
15864 // copy the salt
15865
15866 uint salt_len = decoded_len - 20;
15867
15868 if (salt_len < 4) return (PARSER_SALT_LENGTH);
15869 if (salt_len > 16) return (PARSER_SALT_LENGTH);
15870
15871 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
15872
15873 salt->salt_len = salt_len;
15874
15875 // set digest
15876
15877 uint32_t *digest_ptr = (uint32_t*) tmp_buf;
15878
15879 digest[0] = byte_swap_32 (digest_ptr[0]);
15880 digest[1] = byte_swap_32 (digest_ptr[1]);
15881 digest[2] = byte_swap_32 (digest_ptr[2]);
15882 digest[3] = byte_swap_32 (digest_ptr[3]);
15883 digest[4] = byte_swap_32 (digest_ptr[4]);
15884
15885 return (PARSER_OK);
15886 }
15887
15888 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15889 {
15890 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
15891
15892 uint32_t *digest = (uint32_t *) hash_buf->digest;
15893
15894 salt_t *salt = hash_buf->salt;
15895
15896 digest[0] = hex_to_uint (&input_buf[ 0]);
15897 digest[1] = hex_to_uint (&input_buf[ 8]);
15898 digest[2] = hex_to_uint (&input_buf[16]);
15899 digest[3] = hex_to_uint (&input_buf[24]);
15900 digest[4] = hex_to_uint (&input_buf[32]);
15901
15902 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15903
15904 uint salt_len = input_len - 40 - 1;
15905
15906 char *salt_buf = input_buf + 40 + 1;
15907
15908 char *salt_buf_ptr = (char *) salt->salt_buf;
15909
15910 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15911
15912 if (salt_len != 32) return (PARSER_SALT_LENGTH);
15913
15914 salt->salt_len = salt_len;
15915
15916 return (PARSER_OK);
15917 }
15918
15919 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15920 {
15921 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
15922
15923 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15924
15925 uint32_t *digest = (uint32_t *) hash_buf->digest;
15926
15927 salt_t *salt = hash_buf->salt;
15928
15929 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
15930
15931 /**
15932 * parse line
15933 */
15934
15935 char *V_pos = input_buf + 5;
15936
15937 char *R_pos = strchr (V_pos, '*');
15938
15939 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15940
15941 uint32_t V_len = R_pos - V_pos;
15942
15943 R_pos++;
15944
15945 char *bits_pos = strchr (R_pos, '*');
15946
15947 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15948
15949 uint32_t R_len = bits_pos - R_pos;
15950
15951 bits_pos++;
15952
15953 char *P_pos = strchr (bits_pos, '*');
15954
15955 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15956
15957 uint32_t bits_len = P_pos - bits_pos;
15958
15959 P_pos++;
15960
15961 char *enc_md_pos = strchr (P_pos, '*');
15962
15963 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15964
15965 uint32_t P_len = enc_md_pos - P_pos;
15966
15967 enc_md_pos++;
15968
15969 char *id_len_pos = strchr (enc_md_pos, '*');
15970
15971 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15972
15973 uint32_t enc_md_len = id_len_pos - enc_md_pos;
15974
15975 id_len_pos++;
15976
15977 char *id_buf_pos = strchr (id_len_pos, '*');
15978
15979 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15980
15981 uint32_t id_len_len = id_buf_pos - id_len_pos;
15982
15983 id_buf_pos++;
15984
15985 char *u_len_pos = strchr (id_buf_pos, '*');
15986
15987 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15988
15989 uint32_t id_buf_len = u_len_pos - id_buf_pos;
15990
15991 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
15992
15993 u_len_pos++;
15994
15995 char *u_buf_pos = strchr (u_len_pos, '*');
15996
15997 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15998
15999 uint32_t u_len_len = u_buf_pos - u_len_pos;
16000
16001 u_buf_pos++;
16002
16003 char *o_len_pos = strchr (u_buf_pos, '*');
16004
16005 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16006
16007 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16008
16009 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16010
16011 o_len_pos++;
16012
16013 char *o_buf_pos = strchr (o_len_pos, '*');
16014
16015 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16016
16017 uint32_t o_len_len = o_buf_pos - o_len_pos;
16018
16019 o_buf_pos++;
16020
16021 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;
16022
16023 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16024
16025 // validate data
16026
16027 const int V = atoi (V_pos);
16028 const int R = atoi (R_pos);
16029 const int P = atoi (P_pos);
16030
16031 if (V != 1) return (PARSER_SALT_VALUE);
16032 if (R != 2) return (PARSER_SALT_VALUE);
16033
16034 const int enc_md = atoi (enc_md_pos);
16035
16036 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16037
16038 const int id_len = atoi (id_len_pos);
16039 const int u_len = atoi (u_len_pos);
16040 const int o_len = atoi (o_len_pos);
16041
16042 if (id_len != 16) return (PARSER_SALT_VALUE);
16043 if (u_len != 32) return (PARSER_SALT_VALUE);
16044 if (o_len != 32) return (PARSER_SALT_VALUE);
16045
16046 const int bits = atoi (bits_pos);
16047
16048 if (bits != 40) return (PARSER_SALT_VALUE);
16049
16050 // copy data to esalt
16051
16052 pdf->V = V;
16053 pdf->R = R;
16054 pdf->P = P;
16055
16056 pdf->enc_md = enc_md;
16057
16058 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16059 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16060 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16061 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16062 pdf->id_len = id_len;
16063
16064 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16065 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16066 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16067 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16068 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16069 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16070 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16071 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16072 pdf->u_len = u_len;
16073
16074 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16075 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16076 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16077 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16078 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16079 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16080 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16081 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16082 pdf->o_len = o_len;
16083
16084 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16085 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16086 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16087 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16088
16089 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16090 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16091 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16092 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16093 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16094 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16095 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16096 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16097
16098 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16099 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16100 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16101 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16102 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16103 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16104 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16105 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16106
16107 // we use ID for salt, maybe needs to change, we will see...
16108
16109 salt->salt_buf[0] = pdf->id_buf[0];
16110 salt->salt_buf[1] = pdf->id_buf[1];
16111 salt->salt_buf[2] = pdf->id_buf[2];
16112 salt->salt_buf[3] = pdf->id_buf[3];
16113 salt->salt_len = pdf->id_len;
16114
16115 digest[0] = pdf->u_buf[0];
16116 digest[1] = pdf->u_buf[1];
16117 digest[2] = pdf->u_buf[2];
16118 digest[3] = pdf->u_buf[3];
16119
16120 return (PARSER_OK);
16121 }
16122
16123 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16124 {
16125 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16126 }
16127
16128 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16129 {
16130 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16131
16132 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16133
16134 uint32_t *digest = (uint32_t *) hash_buf->digest;
16135
16136 salt_t *salt = hash_buf->salt;
16137
16138 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16139
16140 /**
16141 * parse line
16142 */
16143
16144 char *V_pos = input_buf + 5;
16145
16146 char *R_pos = strchr (V_pos, '*');
16147
16148 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16149
16150 uint32_t V_len = R_pos - V_pos;
16151
16152 R_pos++;
16153
16154 char *bits_pos = strchr (R_pos, '*');
16155
16156 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16157
16158 uint32_t R_len = bits_pos - R_pos;
16159
16160 bits_pos++;
16161
16162 char *P_pos = strchr (bits_pos, '*');
16163
16164 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16165
16166 uint32_t bits_len = P_pos - bits_pos;
16167
16168 P_pos++;
16169
16170 char *enc_md_pos = strchr (P_pos, '*');
16171
16172 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16173
16174 uint32_t P_len = enc_md_pos - P_pos;
16175
16176 enc_md_pos++;
16177
16178 char *id_len_pos = strchr (enc_md_pos, '*');
16179
16180 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16181
16182 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16183
16184 id_len_pos++;
16185
16186 char *id_buf_pos = strchr (id_len_pos, '*');
16187
16188 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16189
16190 uint32_t id_len_len = id_buf_pos - id_len_pos;
16191
16192 id_buf_pos++;
16193
16194 char *u_len_pos = strchr (id_buf_pos, '*');
16195
16196 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16197
16198 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16199
16200 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16201
16202 u_len_pos++;
16203
16204 char *u_buf_pos = strchr (u_len_pos, '*');
16205
16206 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16207
16208 uint32_t u_len_len = u_buf_pos - u_len_pos;
16209
16210 u_buf_pos++;
16211
16212 char *o_len_pos = strchr (u_buf_pos, '*');
16213
16214 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16215
16216 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16217
16218 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16219
16220 o_len_pos++;
16221
16222 char *o_buf_pos = strchr (o_len_pos, '*');
16223
16224 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16225
16226 uint32_t o_len_len = o_buf_pos - o_len_pos;
16227
16228 o_buf_pos++;
16229
16230 char *rc4key_pos = strchr (o_buf_pos, ':');
16231
16232 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16233
16234 uint32_t o_buf_len = rc4key_pos - o_buf_pos;
16235
16236 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16237
16238 rc4key_pos++;
16239
16240 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;
16241
16242 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16243
16244 // validate data
16245
16246 const int V = atoi (V_pos);
16247 const int R = atoi (R_pos);
16248 const int P = atoi (P_pos);
16249
16250 if (V != 1) return (PARSER_SALT_VALUE);
16251 if (R != 2) return (PARSER_SALT_VALUE);
16252
16253 const int enc_md = atoi (enc_md_pos);
16254
16255 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16256
16257 const int id_len = atoi (id_len_pos);
16258 const int u_len = atoi (u_len_pos);
16259 const int o_len = atoi (o_len_pos);
16260
16261 if (id_len != 16) return (PARSER_SALT_VALUE);
16262 if (u_len != 32) return (PARSER_SALT_VALUE);
16263 if (o_len != 32) return (PARSER_SALT_VALUE);
16264
16265 const int bits = atoi (bits_pos);
16266
16267 if (bits != 40) return (PARSER_SALT_VALUE);
16268
16269 // copy data to esalt
16270
16271 pdf->V = V;
16272 pdf->R = R;
16273 pdf->P = P;
16274
16275 pdf->enc_md = enc_md;
16276
16277 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16278 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16279 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16280 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16281 pdf->id_len = id_len;
16282
16283 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16284 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16285 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16286 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16287 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16288 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16289 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16290 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16291 pdf->u_len = u_len;
16292
16293 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16294 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16295 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16296 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16297 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16298 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16299 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16300 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16301 pdf->o_len = o_len;
16302
16303 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16304 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16305 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16306 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16307
16308 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16309 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16310 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16311 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16312 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16313 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16314 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16315 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16316
16317 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16318 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16319 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16320 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16321 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16322 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16323 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16324 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16325
16326 pdf->rc4key[1] = 0;
16327 pdf->rc4key[0] = 0;
16328
16329 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16330 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16331 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16332 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16333 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16334 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16335 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16336 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16337 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16338 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16339
16340 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16341 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16342
16343 // we use ID for salt, maybe needs to change, we will see...
16344
16345 salt->salt_buf[0] = pdf->id_buf[0];
16346 salt->salt_buf[1] = pdf->id_buf[1];
16347 salt->salt_buf[2] = pdf->id_buf[2];
16348 salt->salt_buf[3] = pdf->id_buf[3];
16349 salt->salt_buf[4] = pdf->u_buf[0];
16350 salt->salt_buf[5] = pdf->u_buf[1];
16351 salt->salt_buf[6] = pdf->o_buf[0];
16352 salt->salt_buf[7] = pdf->o_buf[1];
16353 salt->salt_len = pdf->id_len + 16;
16354
16355 digest[0] = pdf->rc4key[0];
16356 digest[1] = pdf->rc4key[1];
16357 digest[2] = 0;
16358 digest[3] = 0;
16359
16360 return (PARSER_OK);
16361 }
16362
16363 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16364 {
16365 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16366
16367 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16368
16369 uint32_t *digest = (uint32_t *) hash_buf->digest;
16370
16371 salt_t *salt = hash_buf->salt;
16372
16373 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16374
16375 /**
16376 * parse line
16377 */
16378
16379 char *V_pos = input_buf + 5;
16380
16381 char *R_pos = strchr (V_pos, '*');
16382
16383 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16384
16385 uint32_t V_len = R_pos - V_pos;
16386
16387 R_pos++;
16388
16389 char *bits_pos = strchr (R_pos, '*');
16390
16391 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16392
16393 uint32_t R_len = bits_pos - R_pos;
16394
16395 bits_pos++;
16396
16397 char *P_pos = strchr (bits_pos, '*');
16398
16399 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16400
16401 uint32_t bits_len = P_pos - bits_pos;
16402
16403 P_pos++;
16404
16405 char *enc_md_pos = strchr (P_pos, '*');
16406
16407 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16408
16409 uint32_t P_len = enc_md_pos - P_pos;
16410
16411 enc_md_pos++;
16412
16413 char *id_len_pos = strchr (enc_md_pos, '*');
16414
16415 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16416
16417 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16418
16419 id_len_pos++;
16420
16421 char *id_buf_pos = strchr (id_len_pos, '*');
16422
16423 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16424
16425 uint32_t id_len_len = id_buf_pos - id_len_pos;
16426
16427 id_buf_pos++;
16428
16429 char *u_len_pos = strchr (id_buf_pos, '*');
16430
16431 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16432
16433 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16434
16435 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16436
16437 u_len_pos++;
16438
16439 char *u_buf_pos = strchr (u_len_pos, '*');
16440
16441 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16442
16443 uint32_t u_len_len = u_buf_pos - u_len_pos;
16444
16445 u_buf_pos++;
16446
16447 char *o_len_pos = strchr (u_buf_pos, '*');
16448
16449 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16450
16451 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16452
16453 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16454
16455 o_len_pos++;
16456
16457 char *o_buf_pos = strchr (o_len_pos, '*');
16458
16459 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16460
16461 uint32_t o_len_len = o_buf_pos - o_len_pos;
16462
16463 o_buf_pos++;
16464
16465 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;
16466
16467 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16468
16469 // validate data
16470
16471 const int V = atoi (V_pos);
16472 const int R = atoi (R_pos);
16473 const int P = atoi (P_pos);
16474
16475 int vr_ok = 0;
16476
16477 if ((V == 2) && (R == 3)) vr_ok = 1;
16478 if ((V == 4) && (R == 4)) vr_ok = 1;
16479
16480 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16481
16482 const int id_len = atoi (id_len_pos);
16483 const int u_len = atoi (u_len_pos);
16484 const int o_len = atoi (o_len_pos);
16485
16486 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16487
16488 if (u_len != 32) return (PARSER_SALT_VALUE);
16489 if (o_len != 32) return (PARSER_SALT_VALUE);
16490
16491 const int bits = atoi (bits_pos);
16492
16493 if (bits != 128) return (PARSER_SALT_VALUE);
16494
16495 int enc_md = 1;
16496
16497 if (R >= 4)
16498 {
16499 enc_md = atoi (enc_md_pos);
16500 }
16501
16502 // copy data to esalt
16503
16504 pdf->V = V;
16505 pdf->R = R;
16506 pdf->P = P;
16507
16508 pdf->enc_md = enc_md;
16509
16510 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16511 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16512 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16513 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16514
16515 if (id_len == 32)
16516 {
16517 pdf->id_buf[4] = hex_to_uint (&id_buf_pos[32]);
16518 pdf->id_buf[5] = hex_to_uint (&id_buf_pos[40]);
16519 pdf->id_buf[6] = hex_to_uint (&id_buf_pos[48]);
16520 pdf->id_buf[7] = hex_to_uint (&id_buf_pos[56]);
16521 }
16522
16523 pdf->id_len = id_len;
16524
16525 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16526 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16527 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16528 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16529 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16530 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16531 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16532 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16533 pdf->u_len = u_len;
16534
16535 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16536 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16537 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16538 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16539 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16540 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16541 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16542 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16543 pdf->o_len = o_len;
16544
16545 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16546 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16547 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16548 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16549
16550 if (id_len == 32)
16551 {
16552 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16553 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16554 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16555 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16556 }
16557
16558 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16559 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16560 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16561 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16562 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16563 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16564 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16565 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16566
16567 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16568 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16569 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16570 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16571 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16572 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16573 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16574 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16575
16576 // precompute rc4 data for later use
16577
16578 uint padding[8] =
16579 {
16580 0x5e4ebf28,
16581 0x418a754e,
16582 0x564e0064,
16583 0x0801faff,
16584 0xb6002e2e,
16585 0x803e68d0,
16586 0xfea90c2f,
16587 0x7a695364
16588 };
16589
16590 // md5
16591
16592 uint salt_pc_block[32];
16593
16594 char *salt_pc_ptr = (char *) salt_pc_block;
16595
16596 memcpy (salt_pc_ptr, padding, 32);
16597 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16598
16599 uint salt_pc_digest[4];
16600
16601 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16602
16603 pdf->rc4data[0] = salt_pc_digest[0];
16604 pdf->rc4data[1] = salt_pc_digest[1];
16605
16606 // we use ID for salt, maybe needs to change, we will see...
16607
16608 salt->salt_buf[0] = pdf->id_buf[0];
16609 salt->salt_buf[1] = pdf->id_buf[1];
16610 salt->salt_buf[2] = pdf->id_buf[2];
16611 salt->salt_buf[3] = pdf->id_buf[3];
16612 salt->salt_buf[4] = pdf->u_buf[0];
16613 salt->salt_buf[5] = pdf->u_buf[1];
16614 salt->salt_buf[6] = pdf->o_buf[0];
16615 salt->salt_buf[7] = pdf->o_buf[1];
16616 salt->salt_len = pdf->id_len + 16;
16617
16618 salt->salt_iter = ROUNDS_PDF14;
16619
16620 digest[0] = pdf->u_buf[0];
16621 digest[1] = pdf->u_buf[1];
16622 digest[2] = 0;
16623 digest[3] = 0;
16624
16625 return (PARSER_OK);
16626 }
16627
16628 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16629 {
16630 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16631
16632 if (ret != PARSER_OK)
16633 {
16634 return ret;
16635 }
16636
16637 uint32_t *digest = (uint32_t *) hash_buf->digest;
16638
16639 salt_t *salt = hash_buf->salt;
16640
16641 digest[0] -= SHA256M_A;
16642 digest[1] -= SHA256M_B;
16643 digest[2] -= SHA256M_C;
16644 digest[3] -= SHA256M_D;
16645 digest[4] -= SHA256M_E;
16646 digest[5] -= SHA256M_F;
16647 digest[6] -= SHA256M_G;
16648 digest[7] -= SHA256M_H;
16649
16650 salt->salt_buf[2] = 0x80;
16651
16652 return (PARSER_OK);
16653 }
16654
16655 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16656 {
16657 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16658
16659 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16660
16661 uint32_t *digest = (uint32_t *) hash_buf->digest;
16662
16663 salt_t *salt = hash_buf->salt;
16664
16665 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16666
16667 /**
16668 * parse line
16669 */
16670
16671 char *V_pos = input_buf + 5;
16672
16673 char *R_pos = strchr (V_pos, '*');
16674
16675 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16676
16677 uint32_t V_len = R_pos - V_pos;
16678
16679 R_pos++;
16680
16681 char *bits_pos = strchr (R_pos, '*');
16682
16683 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16684
16685 uint32_t R_len = bits_pos - R_pos;
16686
16687 bits_pos++;
16688
16689 char *P_pos = strchr (bits_pos, '*');
16690
16691 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16692
16693 uint32_t bits_len = P_pos - bits_pos;
16694
16695 P_pos++;
16696
16697 char *enc_md_pos = strchr (P_pos, '*');
16698
16699 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16700
16701 uint32_t P_len = enc_md_pos - P_pos;
16702
16703 enc_md_pos++;
16704
16705 char *id_len_pos = strchr (enc_md_pos, '*');
16706
16707 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16708
16709 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16710
16711 id_len_pos++;
16712
16713 char *id_buf_pos = strchr (id_len_pos, '*');
16714
16715 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16716
16717 uint32_t id_len_len = id_buf_pos - id_len_pos;
16718
16719 id_buf_pos++;
16720
16721 char *u_len_pos = strchr (id_buf_pos, '*');
16722
16723 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16724
16725 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16726
16727 u_len_pos++;
16728
16729 char *u_buf_pos = strchr (u_len_pos, '*');
16730
16731 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16732
16733 uint32_t u_len_len = u_buf_pos - u_len_pos;
16734
16735 u_buf_pos++;
16736
16737 char *o_len_pos = strchr (u_buf_pos, '*');
16738
16739 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16740
16741 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16742
16743 o_len_pos++;
16744
16745 char *o_buf_pos = strchr (o_len_pos, '*');
16746
16747 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16748
16749 uint32_t o_len_len = o_buf_pos - o_len_pos;
16750
16751 o_buf_pos++;
16752
16753 char *last = strchr (o_buf_pos, '*');
16754
16755 if (last == NULL) last = input_buf + input_len;
16756
16757 uint32_t o_buf_len = last - o_buf_pos;
16758
16759 // validate data
16760
16761 const int V = atoi (V_pos);
16762 const int R = atoi (R_pos);
16763
16764 int vr_ok = 0;
16765
16766 if ((V == 5) && (R == 5)) vr_ok = 1;
16767 if ((V == 5) && (R == 6)) vr_ok = 1;
16768
16769 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16770
16771 const int bits = atoi (bits_pos);
16772
16773 if (bits != 256) return (PARSER_SALT_VALUE);
16774
16775 int enc_md = atoi (enc_md_pos);
16776
16777 if (enc_md != 1) return (PARSER_SALT_VALUE);
16778
16779 const uint id_len = atoi (id_len_pos);
16780 const uint u_len = atoi (u_len_pos);
16781 const uint o_len = atoi (o_len_pos);
16782
16783 if (V_len > 6) return (PARSER_SALT_LENGTH);
16784 if (R_len > 6) return (PARSER_SALT_LENGTH);
16785 if (P_len > 6) return (PARSER_SALT_LENGTH);
16786 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
16787 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
16788 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
16789 if (bits_len > 6) return (PARSER_SALT_LENGTH);
16790 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
16791
16792 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
16793 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
16794 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
16795
16796 // copy data to esalt
16797
16798 if (u_len < 40) return (PARSER_SALT_VALUE);
16799
16800 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
16801 {
16802 pdf->u_buf[i] = hex_to_uint (&u_buf_pos[j]);
16803 }
16804
16805 salt->salt_buf[0] = pdf->u_buf[8];
16806 salt->salt_buf[1] = pdf->u_buf[9];
16807
16808 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16809 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16810
16811 salt->salt_len = 8;
16812 salt->salt_iter = ROUNDS_PDF17L8;
16813
16814 digest[0] = pdf->u_buf[0];
16815 digest[1] = pdf->u_buf[1];
16816 digest[2] = pdf->u_buf[2];
16817 digest[3] = pdf->u_buf[3];
16818 digest[4] = pdf->u_buf[4];
16819 digest[5] = pdf->u_buf[5];
16820 digest[6] = pdf->u_buf[6];
16821 digest[7] = pdf->u_buf[7];
16822
16823 return (PARSER_OK);
16824 }
16825
16826 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16827 {
16828 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
16829
16830 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
16831
16832 uint32_t *digest = (uint32_t *) hash_buf->digest;
16833
16834 salt_t *salt = hash_buf->salt;
16835
16836 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16837
16838 /**
16839 * parse line
16840 */
16841
16842 // iterations
16843
16844 char *iter_pos = input_buf + 7;
16845
16846 uint32_t iter = atoi (iter_pos);
16847
16848 if (iter < 1) return (PARSER_SALT_ITERATION);
16849 if (iter > 999999) return (PARSER_SALT_ITERATION);
16850
16851 // first is *raw* salt
16852
16853 char *salt_pos = strchr (iter_pos, ':');
16854
16855 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16856
16857 salt_pos++;
16858
16859 char *hash_pos = strchr (salt_pos, ':');
16860
16861 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16862
16863 uint32_t salt_len = hash_pos - salt_pos;
16864
16865 if (salt_len > 64) return (PARSER_SALT_LENGTH);
16866
16867 hash_pos++;
16868
16869 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
16870
16871 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
16872
16873 // decode salt
16874
16875 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16876
16877 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
16878
16879 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
16880
16881 salt_buf_ptr[salt_len + 3] = 0x01;
16882 salt_buf_ptr[salt_len + 4] = 0x80;
16883
16884 salt->salt_len = salt_len;
16885 salt->salt_iter = iter - 1;
16886
16887 // decode hash
16888
16889 char tmp_buf[100];
16890
16891 memset (tmp_buf, 0, sizeof (tmp_buf));
16892
16893 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
16894
16895 if (hash_len < 16) return (PARSER_HASH_LENGTH);
16896
16897 memcpy (digest, tmp_buf, 16);
16898
16899 digest[0] = byte_swap_32 (digest[0]);
16900 digest[1] = byte_swap_32 (digest[1]);
16901 digest[2] = byte_swap_32 (digest[2]);
16902 digest[3] = byte_swap_32 (digest[3]);
16903
16904 // add some stuff to normal salt to make sorted happy
16905
16906 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16907 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16908 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16909 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16910 salt->salt_buf[4] = salt->salt_iter;
16911
16912 return (PARSER_OK);
16913 }
16914
16915 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16916 {
16917 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
16918
16919 uint32_t *digest = (uint32_t *) hash_buf->digest;
16920
16921 salt_t *salt = hash_buf->salt;
16922
16923 digest[0] = hex_to_uint (&input_buf[ 0]);
16924 digest[1] = hex_to_uint (&input_buf[ 8]);
16925 digest[2] = hex_to_uint (&input_buf[16]);
16926 digest[3] = hex_to_uint (&input_buf[24]);
16927
16928 digest[0] = byte_swap_32 (digest[0]);
16929 digest[1] = byte_swap_32 (digest[1]);
16930 digest[2] = byte_swap_32 (digest[2]);
16931 digest[3] = byte_swap_32 (digest[3]);
16932
16933 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16934
16935 uint salt_len = input_len - 32 - 1;
16936
16937 char *salt_buf = input_buf + 32 + 1;
16938
16939 char *salt_buf_ptr = (char *) salt->salt_buf;
16940
16941 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16942
16943 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
16944
16945 salt->salt_len = salt_len;
16946
16947 return (PARSER_OK);
16948 }
16949
16950 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16951 {
16952 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
16953
16954 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16955
16956 uint32_t *digest = (uint32_t *) hash_buf->digest;
16957
16958 salt_t *salt = hash_buf->salt;
16959
16960 char *user_pos = input_buf + 10;
16961
16962 char *salt_pos = strchr (user_pos, '*');
16963
16964 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16965
16966 salt_pos++;
16967
16968 char *hash_pos = strchr (salt_pos, '*');
16969
16970 hash_pos++;
16971
16972 uint hash_len = input_len - (hash_pos - input_buf);
16973
16974 if (hash_len != 32) return (PARSER_HASH_LENGTH);
16975
16976 uint user_len = salt_pos - user_pos - 1;
16977
16978 uint salt_len = hash_pos - salt_pos - 1;
16979
16980 if (salt_len != 8) return (PARSER_SALT_LENGTH);
16981
16982 /*
16983 * store digest
16984 */
16985
16986 digest[0] = hex_to_uint (&hash_pos[ 0]);
16987 digest[1] = hex_to_uint (&hash_pos[ 8]);
16988 digest[2] = hex_to_uint (&hash_pos[16]);
16989 digest[3] = hex_to_uint (&hash_pos[24]);
16990
16991 digest[0] = byte_swap_32 (digest[0]);
16992 digest[1] = byte_swap_32 (digest[1]);
16993 digest[2] = byte_swap_32 (digest[2]);
16994 digest[3] = byte_swap_32 (digest[3]);
16995
16996 digest[0] -= MD5M_A;
16997 digest[1] -= MD5M_B;
16998 digest[2] -= MD5M_C;
16999 digest[3] -= MD5M_D;
17000
17001 /*
17002 * store salt
17003 */
17004
17005 char *salt_buf_ptr = (char *) salt->salt_buf;
17006
17007 // first 4 bytes are the "challenge"
17008
17009 salt_buf_ptr[0] = hex_to_char (&salt_pos[0]);
17010 salt_buf_ptr[1] = hex_to_char (&salt_pos[2]);
17011 salt_buf_ptr[2] = hex_to_char (&salt_pos[4]);
17012 salt_buf_ptr[3] = hex_to_char (&salt_pos[6]);
17013
17014 // append the user name
17015
17016 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17017
17018 salt->salt_len = 4 + user_len;
17019
17020 return (PARSER_OK);
17021 }
17022
17023 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17024 {
17025 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17026
17027 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17028
17029 uint32_t *digest = (uint32_t *) hash_buf->digest;
17030
17031 salt_t *salt = hash_buf->salt;
17032
17033 char *salt_pos = input_buf + 9;
17034
17035 char *hash_pos = strchr (salt_pos, '*');
17036
17037 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17038
17039 hash_pos++;
17040
17041 uint hash_len = input_len - (hash_pos - input_buf);
17042
17043 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17044
17045 uint salt_len = hash_pos - salt_pos - 1;
17046
17047 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17048
17049 /*
17050 * store digest
17051 */
17052
17053 digest[0] = hex_to_uint (&hash_pos[ 0]);
17054 digest[1] = hex_to_uint (&hash_pos[ 8]);
17055 digest[2] = hex_to_uint (&hash_pos[16]);
17056 digest[3] = hex_to_uint (&hash_pos[24]);
17057 digest[4] = hex_to_uint (&hash_pos[32]);
17058
17059 /*
17060 * store salt
17061 */
17062
17063 char *salt_buf_ptr = (char *) salt->salt_buf;
17064
17065 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17066
17067 salt->salt_len = salt_len;
17068
17069 return (PARSER_OK);
17070 }
17071
17072 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17073 {
17074 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17075
17076 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17077
17078 uint32_t *digest = (uint32_t *) hash_buf->digest;
17079
17080 salt_t *salt = hash_buf->salt;
17081
17082 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17083
17084 /**
17085 * parse line
17086 */
17087
17088 char *cry_master_len_pos = input_buf + 9;
17089
17090 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17091
17092 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17093
17094 uint32_t cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17095
17096 cry_master_buf_pos++;
17097
17098 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17099
17100 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17101
17102 uint32_t cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17103
17104 cry_salt_len_pos++;
17105
17106 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17107
17108 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17109
17110 uint32_t cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17111
17112 cry_salt_buf_pos++;
17113
17114 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17115
17116 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17117
17118 uint32_t cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17119
17120 cry_rounds_pos++;
17121
17122 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17123
17124 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17125
17126 uint32_t cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17127
17128 ckey_len_pos++;
17129
17130 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17131
17132 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17133
17134 uint32_t ckey_len_len = ckey_buf_pos - ckey_len_pos;
17135
17136 ckey_buf_pos++;
17137
17138 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17139
17140 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17141
17142 uint32_t ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17143
17144 public_key_len_pos++;
17145
17146 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17147
17148 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17149
17150 uint32_t public_key_len_len = public_key_buf_pos - public_key_len_pos;
17151
17152 public_key_buf_pos++;
17153
17154 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;
17155
17156 const uint cry_master_len = atoi (cry_master_len_pos);
17157 const uint cry_salt_len = atoi (cry_salt_len_pos);
17158 const uint ckey_len = atoi (ckey_len_pos);
17159 const uint public_key_len = atoi (public_key_len_pos);
17160
17161 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17162 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17163 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17164 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17165
17166 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 8)
17167 {
17168 bitcoin_wallet->cry_master_buf[i] = hex_to_uint (&cry_master_buf_pos[j]);
17169
17170 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17171 }
17172
17173 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 8)
17174 {
17175 bitcoin_wallet->ckey_buf[i] = hex_to_uint (&ckey_buf_pos[j]);
17176
17177 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17178 }
17179
17180 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 8)
17181 {
17182 bitcoin_wallet->public_key_buf[i] = hex_to_uint (&public_key_buf_pos[j]);
17183
17184 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17185 }
17186
17187 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17188 bitcoin_wallet->ckey_len = ckey_len / 2;
17189 bitcoin_wallet->public_key_len = public_key_len / 2;
17190
17191 /*
17192 * store digest (should be unique enought, hopefully)
17193 */
17194
17195 digest[0] = bitcoin_wallet->cry_master_buf[0];
17196 digest[1] = bitcoin_wallet->cry_master_buf[1];
17197 digest[2] = bitcoin_wallet->cry_master_buf[2];
17198 digest[3] = bitcoin_wallet->cry_master_buf[3];
17199
17200 /*
17201 * store salt
17202 */
17203
17204 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17205
17206 const uint cry_rounds = atoi (cry_rounds_pos);
17207
17208 salt->salt_iter = cry_rounds - 1;
17209
17210 char *salt_buf_ptr = (char *) salt->salt_buf;
17211
17212 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17213
17214 salt->salt_len = salt_len;
17215
17216 return (PARSER_OK);
17217 }
17218
17219 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17220 {
17221 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17222
17223 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17224
17225 uint32_t *digest = (uint32_t *) hash_buf->digest;
17226
17227 salt_t *salt = hash_buf->salt;
17228
17229 sip_t *sip = (sip_t *) hash_buf->esalt;
17230
17231 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17232
17233 char temp_input_buf[input_len + 1];
17234
17235 memset (temp_input_buf, 0, sizeof (temp_input_buf));
17236 memcpy (temp_input_buf, input_buf, input_len);
17237
17238 // URI_server:
17239
17240 char *URI_server_pos = temp_input_buf + 6;
17241
17242 char *URI_client_pos = strchr (URI_server_pos, '*');
17243
17244 if (URI_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17245
17246 URI_client_pos[0] = 0;
17247 URI_client_pos++;
17248
17249 uint URI_server_len = strlen (URI_server_pos);
17250
17251 if (URI_server_len > 512) return (PARSER_SALT_LENGTH);
17252
17253 // URI_client:
17254
17255 char *user_pos = strchr (URI_client_pos, '*');
17256
17257 if (user_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17258
17259 user_pos[0] = 0;
17260 user_pos++;
17261
17262 uint URI_client_len = strlen (URI_client_pos);
17263
17264 if (URI_client_len > 512) return (PARSER_SALT_LENGTH);
17265
17266 // user:
17267
17268 char *realm_pos = strchr (user_pos, '*');
17269
17270 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17271
17272 realm_pos[0] = 0;
17273 realm_pos++;
17274
17275 uint user_len = strlen (user_pos);
17276
17277 if (user_len > 116) return (PARSER_SALT_LENGTH);
17278
17279 // realm:
17280
17281 char *method_pos = strchr (realm_pos, '*');
17282
17283 if (method_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17284
17285 method_pos[0] = 0;
17286 method_pos++;
17287
17288 uint realm_len = strlen (realm_pos);
17289
17290 if (realm_len > 116) return (PARSER_SALT_LENGTH);
17291
17292 // method:
17293
17294 char *URI_prefix_pos = strchr (method_pos, '*');
17295
17296 if (URI_prefix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17297
17298 URI_prefix_pos[0] = 0;
17299 URI_prefix_pos++;
17300
17301 uint method_len = strlen (method_pos);
17302
17303 if (method_len > 246) return (PARSER_SALT_LENGTH);
17304
17305 // URI_prefix:
17306
17307 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17308
17309 if (URI_resource_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17310
17311 URI_resource_pos[0] = 0;
17312 URI_resource_pos++;
17313
17314 uint URI_prefix_len = strlen (URI_prefix_pos);
17315
17316 if (URI_prefix_len > 245) return (PARSER_SALT_LENGTH);
17317
17318 // URI_resource:
17319
17320 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17321
17322 if (URI_suffix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17323
17324 URI_suffix_pos[0] = 0;
17325 URI_suffix_pos++;
17326
17327 uint URI_resource_len = strlen (URI_resource_pos);
17328
17329 if (URI_resource_len < 1) return (PARSER_SALT_LENGTH);
17330 if (URI_resource_len > 246) return (PARSER_SALT_LENGTH);
17331
17332 // URI_suffix:
17333
17334 char *nonce_pos = strchr (URI_suffix_pos, '*');
17335
17336 if (nonce_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17337
17338 nonce_pos[0] = 0;
17339 nonce_pos++;
17340
17341 uint URI_suffix_len = strlen (URI_suffix_pos);
17342
17343 if (URI_suffix_len > 245) return (PARSER_SALT_LENGTH);
17344
17345 // nonce:
17346
17347 char *nonce_client_pos = strchr (nonce_pos, '*');
17348
17349 if (nonce_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17350
17351 nonce_client_pos[0] = 0;
17352 nonce_client_pos++;
17353
17354 uint nonce_len = strlen (nonce_pos);
17355
17356 if (nonce_len < 1) return (PARSER_SALT_LENGTH);
17357 if (nonce_len > 50) return (PARSER_SALT_LENGTH);
17358
17359 // nonce_client:
17360
17361 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17362
17363 if (nonce_count_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17364
17365 nonce_count_pos[0] = 0;
17366 nonce_count_pos++;
17367
17368 uint nonce_client_len = strlen (nonce_client_pos);
17369
17370 if (nonce_client_len > 50) return (PARSER_SALT_LENGTH);
17371
17372 // nonce_count:
17373
17374 char *qop_pos = strchr (nonce_count_pos, '*');
17375
17376 if (qop_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17377
17378 qop_pos[0] = 0;
17379 qop_pos++;
17380
17381 uint nonce_count_len = strlen (nonce_count_pos);
17382
17383 if (nonce_count_len > 50) return (PARSER_SALT_LENGTH);
17384
17385 // qop:
17386
17387 char *directive_pos = strchr (qop_pos, '*');
17388
17389 if (directive_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17390
17391 directive_pos[0] = 0;
17392 directive_pos++;
17393
17394 uint qop_len = strlen (qop_pos);
17395
17396 if (qop_len > 50) return (PARSER_SALT_LENGTH);
17397
17398 // directive
17399
17400 char *digest_pos = strchr (directive_pos, '*');
17401
17402 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17403
17404 digest_pos[0] = 0;
17405 digest_pos++;
17406
17407 uint directive_len = strlen (directive_pos);
17408
17409 if (directive_len != 3) return (PARSER_SALT_LENGTH);
17410
17411 if (memcmp (directive_pos, "MD5", 3))
17412 {
17413 log_info ("ERROR: only the MD5 directive is currently supported\n");
17414
17415 return (PARSER_SIP_AUTH_DIRECTIVE);
17416 }
17417
17418 /*
17419 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17420 */
17421
17422 uint md5_len = 0;
17423
17424 uint md5_max_len = 4 * 64;
17425
17426 uint md5_remaining_len = md5_max_len;
17427
17428 uint tmp_md5_buf[md5_max_len / 4];
17429
17430 memset (tmp_md5_buf, 0, sizeof (tmp_md5_buf));
17431
17432 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17433
17434 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17435
17436 md5_len += method_len + 1;
17437 tmp_md5_ptr += method_len + 1;
17438
17439 if (URI_prefix_len > 0)
17440 {
17441 md5_remaining_len = md5_max_len - md5_len;
17442
17443 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17444
17445 md5_len += URI_prefix_len + 1;
17446 tmp_md5_ptr += URI_prefix_len + 1;
17447 }
17448
17449 md5_remaining_len = md5_max_len - md5_len;
17450
17451 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17452
17453 md5_len += URI_resource_len;
17454 tmp_md5_ptr += URI_resource_len;
17455
17456 if (URI_suffix_len > 0)
17457 {
17458 md5_remaining_len = md5_max_len - md5_len;
17459
17460 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17461
17462 md5_len += 1 + URI_suffix_len;
17463 }
17464
17465 uint tmp_digest[4];
17466
17467 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17468
17469 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17470 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17471 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17472 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17473
17474 /*
17475 * esalt
17476 */
17477
17478 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17479
17480 uint esalt_len = 0;
17481
17482 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17483
17484 // there are 2 possibilities for the esalt:
17485
17486 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17487 {
17488 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17489
17490 if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH);
17491
17492 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17493 nonce_pos,
17494 nonce_count_pos,
17495 nonce_client_pos,
17496 qop_pos,
17497 tmp_digest[0],
17498 tmp_digest[1],
17499 tmp_digest[2],
17500 tmp_digest[3]);
17501 }
17502 else
17503 {
17504 esalt_len = 1 + nonce_len + 1 + 32;
17505
17506 if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH);
17507
17508 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17509 nonce_pos,
17510 tmp_digest[0],
17511 tmp_digest[1],
17512 tmp_digest[2],
17513 tmp_digest[3]);
17514 }
17515
17516 // add 0x80 to esalt
17517
17518 esalt_buf_ptr[esalt_len] = 0x80;
17519
17520 sip->esalt_len = esalt_len;
17521
17522 /*
17523 * actual salt
17524 */
17525
17526 char *sip_salt_ptr = (char *) sip->salt_buf;
17527
17528 uint salt_len = user_len + 1 + realm_len + 1;
17529
17530 uint max_salt_len = 119;
17531
17532 if (salt_len > max_salt_len) return (PARSER_SALT_LENGTH);
17533
17534 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17535
17536 sip->salt_len = salt_len;
17537
17538 /*
17539 * fake salt (for sorting)
17540 */
17541
17542 char *salt_buf_ptr = (char *) salt->salt_buf;
17543
17544 max_salt_len = 55;
17545
17546 uint fake_salt_len = salt_len;
17547
17548 if (fake_salt_len > max_salt_len)
17549 {
17550 fake_salt_len = max_salt_len;
17551 }
17552
17553 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17554
17555 salt->salt_len = fake_salt_len;
17556
17557 /*
17558 * digest
17559 */
17560
17561 digest[0] = hex_to_uint (&digest_pos[ 0]);
17562 digest[1] = hex_to_uint (&digest_pos[ 8]);
17563 digest[2] = hex_to_uint (&digest_pos[16]);
17564 digest[3] = hex_to_uint (&digest_pos[24]);
17565
17566 digest[0] = byte_swap_32 (digest[0]);
17567 digest[1] = byte_swap_32 (digest[1]);
17568 digest[2] = byte_swap_32 (digest[2]);
17569 digest[3] = byte_swap_32 (digest[3]);
17570
17571 return (PARSER_OK);
17572 }
17573
17574 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17575 {
17576 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17577
17578 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17579
17580 uint32_t *digest = (uint32_t *) hash_buf->digest;
17581
17582 salt_t *salt = hash_buf->salt;
17583
17584 // digest
17585
17586 char *digest_pos = input_buf;
17587
17588 digest[0] = hex_to_uint (&digest_pos[0]);
17589 digest[1] = 0;
17590 digest[2] = 0;
17591 digest[3] = 0;
17592
17593 // salt
17594
17595 char *salt_buf = input_buf + 8 + 1;
17596
17597 uint salt_len = 8;
17598
17599 char *salt_buf_ptr = (char *) salt->salt_buf;
17600
17601 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17602
17603 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17604
17605 salt->salt_len = salt_len;
17606
17607 return (PARSER_OK);
17608 }
17609
17610 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17611 {
17612 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
17613
17614 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17615
17616 uint32_t *digest = (uint32_t *) hash_buf->digest;
17617
17618 salt_t *salt = hash_buf->salt;
17619
17620 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
17621
17622 /**
17623 * parse line
17624 */
17625
17626 char *p_buf_pos = input_buf + 4;
17627
17628 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
17629
17630 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17631
17632 uint32_t p_buf_len = NumCyclesPower_pos - p_buf_pos;
17633
17634 NumCyclesPower_pos++;
17635
17636 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
17637
17638 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17639
17640 uint32_t NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
17641
17642 salt_len_pos++;
17643
17644 char *salt_buf_pos = strchr (salt_len_pos, '$');
17645
17646 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17647
17648 uint32_t salt_len_len = salt_buf_pos - salt_len_pos;
17649
17650 salt_buf_pos++;
17651
17652 char *iv_len_pos = strchr (salt_buf_pos, '$');
17653
17654 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17655
17656 uint32_t salt_buf_len = iv_len_pos - salt_buf_pos;
17657
17658 iv_len_pos++;
17659
17660 char *iv_buf_pos = strchr (iv_len_pos, '$');
17661
17662 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17663
17664 uint32_t iv_len_len = iv_buf_pos - iv_len_pos;
17665
17666 iv_buf_pos++;
17667
17668 char *crc_buf_pos = strchr (iv_buf_pos, '$');
17669
17670 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17671
17672 uint32_t iv_buf_len = crc_buf_pos - iv_buf_pos;
17673
17674 crc_buf_pos++;
17675
17676 char *data_len_pos = strchr (crc_buf_pos, '$');
17677
17678 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17679
17680 uint32_t crc_buf_len = data_len_pos - crc_buf_pos;
17681
17682 data_len_pos++;
17683
17684 char *unpack_size_pos = strchr (data_len_pos, '$');
17685
17686 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17687
17688 uint32_t data_len_len = unpack_size_pos - data_len_pos;
17689
17690 unpack_size_pos++;
17691
17692 char *data_buf_pos = strchr (unpack_size_pos, '$');
17693
17694 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17695
17696 uint32_t unpack_size_len = data_buf_pos - unpack_size_pos;
17697
17698 data_buf_pos++;
17699
17700 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;
17701
17702 const uint iter = atoi (NumCyclesPower_pos);
17703 const uint crc = atoi (crc_buf_pos);
17704 const uint p_buf = atoi (p_buf_pos);
17705 const uint salt_len = atoi (salt_len_pos);
17706 const uint iv_len = atoi (iv_len_pos);
17707 const uint unpack_size = atoi (unpack_size_pos);
17708 const uint data_len = atoi (data_len_pos);
17709
17710 /**
17711 * verify some data
17712 */
17713
17714 if (p_buf != 0) return (PARSER_SALT_VALUE);
17715 if (salt_len != 0) return (PARSER_SALT_VALUE);
17716
17717 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
17718
17719 if (data_len > 384) return (PARSER_SALT_VALUE);
17720
17721 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
17722
17723 /**
17724 * store data
17725 */
17726
17727 seven_zip->iv_buf[0] = hex_to_uint (&iv_buf_pos[ 0]);
17728 seven_zip->iv_buf[1] = hex_to_uint (&iv_buf_pos[ 8]);
17729 seven_zip->iv_buf[2] = hex_to_uint (&iv_buf_pos[16]);
17730 seven_zip->iv_buf[3] = hex_to_uint (&iv_buf_pos[24]);
17731
17732 seven_zip->iv_len = iv_len;
17733
17734 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
17735
17736 seven_zip->salt_len = 0;
17737
17738 seven_zip->crc = crc;
17739
17740 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
17741 {
17742 seven_zip->data_buf[i] = hex_to_uint (&data_buf_pos[j]);
17743
17744 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
17745 }
17746
17747 seven_zip->data_len = data_len;
17748
17749 seven_zip->unpack_size = unpack_size;
17750
17751 // real salt
17752
17753 salt->salt_buf[0] = seven_zip->data_buf[0];
17754 salt->salt_buf[1] = seven_zip->data_buf[1];
17755 salt->salt_buf[2] = seven_zip->data_buf[2];
17756 salt->salt_buf[3] = seven_zip->data_buf[3];
17757
17758 salt->salt_len = 16;
17759
17760 salt->salt_sign[0] = iter;
17761
17762 salt->salt_iter = 1 << iter;
17763
17764 /**
17765 * digest
17766 */
17767
17768 digest[0] = crc;
17769 digest[1] = 0;
17770 digest[2] = 0;
17771 digest[3] = 0;
17772
17773 return (PARSER_OK);
17774 }
17775
17776 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17777 {
17778 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
17779
17780 uint32_t *digest = (uint32_t *) hash_buf->digest;
17781
17782 digest[0] = hex_to_uint (&input_buf[ 0]);
17783 digest[1] = hex_to_uint (&input_buf[ 8]);
17784 digest[2] = hex_to_uint (&input_buf[16]);
17785 digest[3] = hex_to_uint (&input_buf[24]);
17786 digest[4] = hex_to_uint (&input_buf[32]);
17787 digest[5] = hex_to_uint (&input_buf[40]);
17788 digest[6] = hex_to_uint (&input_buf[48]);
17789 digest[7] = hex_to_uint (&input_buf[56]);
17790
17791 digest[0] = byte_swap_32 (digest[0]);
17792 digest[1] = byte_swap_32 (digest[1]);
17793 digest[2] = byte_swap_32 (digest[2]);
17794 digest[3] = byte_swap_32 (digest[3]);
17795 digest[4] = byte_swap_32 (digest[4]);
17796 digest[5] = byte_swap_32 (digest[5]);
17797 digest[6] = byte_swap_32 (digest[6]);
17798 digest[7] = byte_swap_32 (digest[7]);
17799
17800 return (PARSER_OK);
17801 }
17802
17803 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17804 {
17805 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
17806
17807 uint32_t *digest = (uint32_t *) hash_buf->digest;
17808
17809 digest[ 0] = hex_to_uint (&input_buf[ 0]);
17810 digest[ 1] = hex_to_uint (&input_buf[ 8]);
17811 digest[ 2] = hex_to_uint (&input_buf[ 16]);
17812 digest[ 3] = hex_to_uint (&input_buf[ 24]);
17813 digest[ 4] = hex_to_uint (&input_buf[ 32]);
17814 digest[ 5] = hex_to_uint (&input_buf[ 40]);
17815 digest[ 6] = hex_to_uint (&input_buf[ 48]);
17816 digest[ 7] = hex_to_uint (&input_buf[ 56]);
17817 digest[ 8] = hex_to_uint (&input_buf[ 64]);
17818 digest[ 9] = hex_to_uint (&input_buf[ 72]);
17819 digest[10] = hex_to_uint (&input_buf[ 80]);
17820 digest[11] = hex_to_uint (&input_buf[ 88]);
17821 digest[12] = hex_to_uint (&input_buf[ 96]);
17822 digest[13] = hex_to_uint (&input_buf[104]);
17823 digest[14] = hex_to_uint (&input_buf[112]);
17824 digest[15] = hex_to_uint (&input_buf[120]);
17825
17826 digest[ 0] = byte_swap_32 (digest[ 0]);
17827 digest[ 1] = byte_swap_32 (digest[ 1]);
17828 digest[ 2] = byte_swap_32 (digest[ 2]);
17829 digest[ 3] = byte_swap_32 (digest[ 3]);
17830 digest[ 4] = byte_swap_32 (digest[ 4]);
17831 digest[ 5] = byte_swap_32 (digest[ 5]);
17832 digest[ 6] = byte_swap_32 (digest[ 6]);
17833 digest[ 7] = byte_swap_32 (digest[ 7]);
17834 digest[ 8] = byte_swap_32 (digest[ 8]);
17835 digest[ 9] = byte_swap_32 (digest[ 9]);
17836 digest[10] = byte_swap_32 (digest[10]);
17837 digest[11] = byte_swap_32 (digest[11]);
17838 digest[12] = byte_swap_32 (digest[12]);
17839 digest[13] = byte_swap_32 (digest[13]);
17840 digest[14] = byte_swap_32 (digest[14]);
17841 digest[15] = byte_swap_32 (digest[15]);
17842
17843 return (PARSER_OK);
17844 }
17845
17846 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17847 {
17848 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
17849
17850 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17851
17852 uint32_t *digest = (uint32_t *) hash_buf->digest;
17853
17854 salt_t *salt = hash_buf->salt;
17855
17856 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
17857
17858 /**
17859 * parse line
17860 */
17861
17862 // iterations
17863
17864 char *iter_pos = input_buf + 4;
17865
17866 uint32_t iter = atoi (iter_pos);
17867
17868 if (iter < 1) return (PARSER_SALT_ITERATION);
17869 if (iter > 999999) return (PARSER_SALT_ITERATION);
17870
17871 // first is *raw* salt
17872
17873 char *salt_pos = strchr (iter_pos, ':');
17874
17875 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17876
17877 salt_pos++;
17878
17879 char *hash_pos = strchr (salt_pos, ':');
17880
17881 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17882
17883 uint32_t salt_len = hash_pos - salt_pos;
17884
17885 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17886
17887 hash_pos++;
17888
17889 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
17890
17891 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17892
17893 // decode salt
17894
17895 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
17896
17897 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17898
17899 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17900
17901 salt_buf_ptr[salt_len + 3] = 0x01;
17902 salt_buf_ptr[salt_len + 4] = 0x80;
17903
17904 salt->salt_len = salt_len;
17905 salt->salt_iter = iter - 1;
17906
17907 // decode hash
17908
17909 char tmp_buf[100];
17910
17911 memset (tmp_buf, 0, sizeof (tmp_buf));
17912
17913 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
17914
17915 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17916
17917 memcpy (digest, tmp_buf, 16);
17918
17919 // add some stuff to normal salt to make sorted happy
17920
17921 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
17922 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
17923 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
17924 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
17925 salt->salt_buf[4] = salt->salt_iter;
17926
17927 return (PARSER_OK);
17928 }
17929
17930 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17931 {
17932 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
17933
17934 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
17935
17936 uint32_t *digest = (uint32_t *) hash_buf->digest;
17937
17938 salt_t *salt = hash_buf->salt;
17939
17940 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
17941
17942 /**
17943 * parse line
17944 */
17945
17946 // iterations
17947
17948 char *iter_pos = input_buf + 5;
17949
17950 uint32_t iter = atoi (iter_pos);
17951
17952 if (iter < 1) return (PARSER_SALT_ITERATION);
17953 if (iter > 999999) return (PARSER_SALT_ITERATION);
17954
17955 // first is *raw* salt
17956
17957 char *salt_pos = strchr (iter_pos, ':');
17958
17959 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17960
17961 salt_pos++;
17962
17963 char *hash_pos = strchr (salt_pos, ':');
17964
17965 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17966
17967 uint32_t salt_len = hash_pos - salt_pos;
17968
17969 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17970
17971 hash_pos++;
17972
17973 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
17974
17975 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17976
17977 // decode salt
17978
17979 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
17980
17981 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17982
17983 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17984
17985 salt_buf_ptr[salt_len + 3] = 0x01;
17986 salt_buf_ptr[salt_len + 4] = 0x80;
17987
17988 salt->salt_len = salt_len;
17989 salt->salt_iter = iter - 1;
17990
17991 // decode hash
17992
17993 char tmp_buf[100];
17994
17995 memset (tmp_buf, 0, sizeof (tmp_buf));
17996
17997 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
17998
17999 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18000
18001 memcpy (digest, tmp_buf, 16);
18002
18003 digest[0] = byte_swap_32 (digest[0]);
18004 digest[1] = byte_swap_32 (digest[1]);
18005 digest[2] = byte_swap_32 (digest[2]);
18006 digest[3] = byte_swap_32 (digest[3]);
18007
18008 // add some stuff to normal salt to make sorted happy
18009
18010 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18011 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18012 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18013 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18014 salt->salt_buf[4] = salt->salt_iter;
18015
18016 return (PARSER_OK);
18017 }
18018
18019 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18020 {
18021 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18022
18023 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18024
18025 uint64_t *digest = (uint64_t *) hash_buf->digest;
18026
18027 salt_t *salt = hash_buf->salt;
18028
18029 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18030
18031 /**
18032 * parse line
18033 */
18034
18035 // iterations
18036
18037 char *iter_pos = input_buf + 7;
18038
18039 uint32_t iter = atoi (iter_pos);
18040
18041 if (iter < 1) return (PARSER_SALT_ITERATION);
18042 if (iter > 999999) return (PARSER_SALT_ITERATION);
18043
18044 // first is *raw* salt
18045
18046 char *salt_pos = strchr (iter_pos, ':');
18047
18048 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18049
18050 salt_pos++;
18051
18052 char *hash_pos = strchr (salt_pos, ':');
18053
18054 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18055
18056 uint32_t salt_len = hash_pos - salt_pos;
18057
18058 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18059
18060 hash_pos++;
18061
18062 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
18063
18064 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18065
18066 // decode salt
18067
18068 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18069
18070 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18071
18072 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18073
18074 salt_buf_ptr[salt_len + 3] = 0x01;
18075 salt_buf_ptr[salt_len + 4] = 0x80;
18076
18077 salt->salt_len = salt_len;
18078 salt->salt_iter = iter - 1;
18079
18080 // decode hash
18081
18082 char tmp_buf[100];
18083
18084 memset (tmp_buf, 0, sizeof (tmp_buf));
18085
18086 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
18087
18088 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18089
18090 memcpy (digest, tmp_buf, 64);
18091
18092 digest[0] = byte_swap_64 (digest[0]);
18093 digest[1] = byte_swap_64 (digest[1]);
18094 digest[2] = byte_swap_64 (digest[2]);
18095 digest[3] = byte_swap_64 (digest[3]);
18096 digest[4] = byte_swap_64 (digest[4]);
18097 digest[5] = byte_swap_64 (digest[5]);
18098 digest[6] = byte_swap_64 (digest[6]);
18099 digest[7] = byte_swap_64 (digest[7]);
18100
18101 // add some stuff to normal salt to make sorted happy
18102
18103 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18104 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18105 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18106 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18107 salt->salt_buf[4] = salt->salt_iter;
18108
18109 return (PARSER_OK);
18110 }
18111
18112 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18113 {
18114 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18115
18116 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18117
18118 uint *digest = (uint *) hash_buf->digest;
18119
18120 salt_t *salt = hash_buf->salt;
18121
18122 /**
18123 * parse line
18124 */
18125
18126 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18127
18128 char *hash_pos = strchr (salt_pos, '$');
18129
18130 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18131
18132 uint32_t salt_len = hash_pos - salt_pos;
18133
18134 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18135
18136 hash_pos++;
18137
18138 uint32_t hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18139
18140 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18141
18142 // decode hash
18143
18144 digest[ 0] = hex_to_uint (&hash_pos[0]);
18145 digest[ 1] = hex_to_uint (&hash_pos[8]);
18146 digest[ 2] = 0;
18147 digest[ 3] = 0;
18148 digest[ 4] = 0;
18149 digest[ 5] = 0;
18150 digest[ 6] = 0;
18151 digest[ 7] = 0;
18152 digest[ 8] = 0;
18153 digest[ 9] = 0;
18154 digest[10] = 0;
18155 digest[11] = 0;
18156 digest[12] = 0;
18157 digest[13] = 0;
18158 digest[14] = 0;
18159 digest[15] = 0;
18160
18161 // decode salt
18162
18163 salt->salt_buf[0] = hex_to_uint (&salt_pos[0]);
18164 salt->salt_buf[1] = hex_to_uint (&salt_pos[8]);
18165
18166 salt->salt_iter = ROUNDS_ECRYPTFS;
18167 salt->salt_len = 8;
18168
18169 return (PARSER_OK);
18170 }
18171
18172 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18173 {
18174 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18175
18176 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18177
18178 unsigned char c19 = itoa64_to_int (input_buf[19]);
18179
18180 if (c19 & 3) return (PARSER_HASH_VALUE);
18181
18182 salt_t *salt = hash_buf->salt;
18183
18184 uint32_t *digest = (uint32_t *) hash_buf->digest;
18185
18186 // iteration count
18187
18188 salt->salt_iter = itoa64_to_int (input_buf[1])
18189 | itoa64_to_int (input_buf[2]) << 6
18190 | itoa64_to_int (input_buf[3]) << 12
18191 | itoa64_to_int (input_buf[4]) << 18;
18192
18193 // set salt
18194
18195 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18196 | itoa64_to_int (input_buf[6]) << 6
18197 | itoa64_to_int (input_buf[7]) << 12
18198 | itoa64_to_int (input_buf[8]) << 18;
18199
18200 salt->salt_len = 4;
18201
18202 char tmp_buf[100];
18203
18204 memset (tmp_buf, 0, sizeof (tmp_buf));
18205
18206 base64_decode (itoa64_to_int, input_buf + 9, 11, tmp_buf);
18207
18208 memcpy (digest, tmp_buf, 8);
18209
18210 uint tt;
18211
18212 IP (digest[0], digest[1], tt);
18213
18214 digest[0] = ROTATE_RIGHT (digest[0], 31);
18215 digest[1] = ROTATE_RIGHT (digest[1], 31);
18216 digest[2] = 0;
18217 digest[3] = 0;
18218
18219 return (PARSER_OK);
18220 }
18221
18222 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18223 {
18224 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18225
18226 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18227
18228 uint32_t *digest = (uint32_t *) hash_buf->digest;
18229
18230 salt_t *salt = hash_buf->salt;
18231
18232 /**
18233 * parse line
18234 */
18235
18236 char *type_pos = input_buf + 6 + 1;
18237
18238 char *salt_pos = strchr (type_pos, '*');
18239
18240 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18241
18242 uint32_t type_len = salt_pos - type_pos;
18243
18244 if (type_len != 1) return (PARSER_SALT_LENGTH);
18245
18246 salt_pos++;
18247
18248 char *crypted_pos = strchr (salt_pos, '*');
18249
18250 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18251
18252 uint32_t salt_len = crypted_pos - salt_pos;
18253
18254 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18255
18256 crypted_pos++;
18257
18258 uint32_t crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18259
18260 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18261
18262 /**
18263 * copy data
18264 */
18265
18266 salt->salt_buf[0] = hex_to_uint (&salt_pos[0]);
18267 salt->salt_buf[1] = hex_to_uint (&salt_pos[8]);
18268
18269 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18270 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18271
18272 salt->salt_buf[2] = hex_to_uint (&crypted_pos[ 0]);
18273 salt->salt_buf[3] = hex_to_uint (&crypted_pos[ 8]);
18274 salt->salt_buf[4] = hex_to_uint (&crypted_pos[16]);
18275 salt->salt_buf[5] = hex_to_uint (&crypted_pos[24]);
18276
18277 salt->salt_len = 24;
18278 salt->salt_iter = ROUNDS_RAR3;
18279
18280 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18281 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18282
18283 digest[0] = 0xc43d7b00;
18284 digest[1] = 0x40070000;
18285 digest[2] = 0;
18286 digest[3] = 0;
18287
18288 return (PARSER_OK);
18289 }
18290
18291 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18292 {
18293 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18294
18295 uint32_t *digest = (uint32_t *) hash_buf->digest;
18296
18297 salt_t *salt = hash_buf->salt;
18298
18299 digest[0] = hex_to_uint (&input_buf[ 0]);
18300 digest[1] = hex_to_uint (&input_buf[ 8]);
18301 digest[2] = hex_to_uint (&input_buf[16]);
18302 digest[3] = hex_to_uint (&input_buf[24]);
18303 digest[4] = hex_to_uint (&input_buf[32]);
18304 digest[5] = hex_to_uint (&input_buf[40]);
18305 digest[6] = hex_to_uint (&input_buf[48]);
18306 digest[7] = hex_to_uint (&input_buf[56]);
18307
18308 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18309
18310 uint salt_len = input_len - 64 - 1;
18311
18312 char *salt_buf = input_buf + 64 + 1;
18313
18314 char *salt_buf_ptr = (char *) salt->salt_buf;
18315
18316 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18317
18318 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18319
18320 salt->salt_len = salt_len;
18321
18322 /**
18323 * we can precompute the first sha256 transform
18324 */
18325
18326 uint w[16];
18327
18328 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18329 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18330 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18331 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18332 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18333 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18334 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18335 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18336 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18337 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18338 w[10] = byte_swap_32 (salt->salt_buf[10]);
18339 w[11] = byte_swap_32 (salt->salt_buf[11]);
18340 w[12] = byte_swap_32 (salt->salt_buf[12]);
18341 w[13] = byte_swap_32 (salt->salt_buf[13]);
18342 w[14] = byte_swap_32 (salt->salt_buf[14]);
18343 w[15] = byte_swap_32 (salt->salt_buf[15]);
18344
18345 uint pc256[8];
18346
18347 pc256[0] = SHA256M_A;
18348 pc256[1] = SHA256M_B;
18349 pc256[2] = SHA256M_C;
18350 pc256[3] = SHA256M_D;
18351 pc256[4] = SHA256M_E;
18352 pc256[5] = SHA256M_F;
18353 pc256[6] = SHA256M_G;
18354 pc256[7] = SHA256M_H;
18355
18356 sha256_64 (w, pc256);
18357
18358 salt->salt_buf_pc[0] = pc256[0];
18359 salt->salt_buf_pc[1] = pc256[1];
18360 salt->salt_buf_pc[2] = pc256[2];
18361 salt->salt_buf_pc[3] = pc256[3];
18362 salt->salt_buf_pc[4] = pc256[4];
18363 salt->salt_buf_pc[5] = pc256[5];
18364 salt->salt_buf_pc[6] = pc256[6];
18365 salt->salt_buf_pc[7] = pc256[7];
18366
18367 digest[0] -= pc256[0];
18368 digest[1] -= pc256[1];
18369 digest[2] -= pc256[2];
18370 digest[3] -= pc256[3];
18371 digest[4] -= pc256[4];
18372 digest[5] -= pc256[5];
18373 digest[6] -= pc256[6];
18374 digest[7] -= pc256[7];
18375
18376 return (PARSER_OK);
18377 }
18378
18379 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18380 {
18381 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18382
18383 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18384
18385 uint32_t *digest = (uint32_t *) hash_buf->digest;
18386
18387 salt_t *salt = hash_buf->salt;
18388
18389 /**
18390 * parse line
18391 */
18392
18393 char *data_len_pos = input_buf + 1 + 10 + 1;
18394
18395 char *data_buf_pos = strchr (data_len_pos, '$');
18396
18397 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18398
18399 uint32_t data_len_len = data_buf_pos - data_len_pos;
18400
18401 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18402 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18403
18404 data_buf_pos++;
18405
18406 uint32_t data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18407
18408 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18409
18410 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18411
18412 uint32_t data_len = atoi (data_len_pos);
18413
18414 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18415
18416 /**
18417 * salt
18418 */
18419
18420 char *salt_pos = data_buf_pos;
18421
18422 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
18423 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
18424 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]);
18425 salt->salt_buf[3] = hex_to_uint (&salt_pos[24]);
18426
18427 // this is actually the CT, which is also the hash later (if matched)
18428
18429 salt->salt_buf[4] = hex_to_uint (&salt_pos[32]);
18430 salt->salt_buf[5] = hex_to_uint (&salt_pos[40]);
18431 salt->salt_buf[6] = hex_to_uint (&salt_pos[48]);
18432 salt->salt_buf[7] = hex_to_uint (&salt_pos[56]);
18433
18434 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18435
18436 salt->salt_iter = 10 - 1;
18437
18438 /**
18439 * digest buf
18440 */
18441
18442 digest[0] = salt->salt_buf[4];
18443 digest[1] = salt->salt_buf[5];
18444 digest[2] = salt->salt_buf[6];
18445 digest[3] = salt->salt_buf[7];
18446
18447 return (PARSER_OK);
18448 }
18449
18450 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18451 {
18452 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
18453
18454 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18455
18456 uint32_t *digest = (uint32_t *) hash_buf->digest;
18457
18458 salt_t *salt = hash_buf->salt;
18459
18460 /**
18461 * parse line
18462 */
18463
18464 char *salt_pos = input_buf + 11 + 1;
18465
18466 char *iter_pos = strchr (salt_pos, ',');
18467
18468 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18469
18470 uint32_t salt_len = iter_pos - salt_pos;
18471
18472 if (salt_len != 20) return (PARSER_SALT_LENGTH);
18473
18474 iter_pos++;
18475
18476 char *hash_pos = strchr (iter_pos, ',');
18477
18478 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18479
18480 uint32_t iter_len = hash_pos - iter_pos;
18481
18482 if (iter_len > 5) return (PARSER_SALT_LENGTH);
18483
18484 hash_pos++;
18485
18486 uint32_t hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
18487
18488 if (hash_len != 64) return (PARSER_HASH_LENGTH);
18489
18490 /**
18491 * salt
18492 */
18493
18494 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
18495 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
18496 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]) & 0xffff0000;
18497 salt->salt_buf[3] = 0x00018000;
18498
18499 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18500 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18501 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
18502 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
18503
18504 salt->salt_len = salt_len / 2;
18505
18506 salt->salt_iter = atoi (iter_pos) - 1;
18507
18508 /**
18509 * digest buf
18510 */
18511
18512 digest[0] = hex_to_uint (&hash_pos[ 0]);
18513 digest[1] = hex_to_uint (&hash_pos[ 8]);
18514 digest[2] = hex_to_uint (&hash_pos[16]);
18515 digest[3] = hex_to_uint (&hash_pos[24]);
18516 digest[4] = hex_to_uint (&hash_pos[32]);
18517 digest[5] = hex_to_uint (&hash_pos[40]);
18518 digest[6] = hex_to_uint (&hash_pos[48]);
18519 digest[7] = hex_to_uint (&hash_pos[56]);
18520
18521 return (PARSER_OK);
18522 }
18523
18524 /**
18525 * parallel running threads
18526 */
18527
18528 #ifdef WIN
18529
18530 BOOL WINAPI sigHandler_default (DWORD sig)
18531 {
18532 switch (sig)
18533 {
18534 case CTRL_CLOSE_EVENT:
18535
18536 /*
18537 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
18538 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
18539 * function otherwise it is to late (e.g. after returning from this function)
18540 */
18541
18542 myabort ();
18543
18544 SetConsoleCtrlHandler (NULL, TRUE);
18545
18546 hc_sleep (10);
18547
18548 return TRUE;
18549
18550 case CTRL_C_EVENT:
18551 case CTRL_LOGOFF_EVENT:
18552 case CTRL_SHUTDOWN_EVENT:
18553
18554 myabort ();
18555
18556 SetConsoleCtrlHandler (NULL, TRUE);
18557
18558 return TRUE;
18559 }
18560
18561 return FALSE;
18562 }
18563
18564 BOOL WINAPI sigHandler_benchmark (DWORD sig)
18565 {
18566 switch (sig)
18567 {
18568 case CTRL_CLOSE_EVENT:
18569
18570 myabort ();
18571
18572 SetConsoleCtrlHandler (NULL, TRUE);
18573
18574 hc_sleep (10);
18575
18576 return TRUE;
18577
18578 case CTRL_C_EVENT:
18579 case CTRL_LOGOFF_EVENT:
18580 case CTRL_SHUTDOWN_EVENT:
18581
18582 myquit ();
18583
18584 SetConsoleCtrlHandler (NULL, TRUE);
18585
18586 return TRUE;
18587 }
18588
18589 return FALSE;
18590 }
18591
18592 void hc_signal (BOOL WINAPI (callback) (DWORD))
18593 {
18594 if (callback == NULL)
18595 {
18596 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
18597 }
18598 else
18599 {
18600 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
18601 }
18602 }
18603
18604 #else
18605
18606 void sigHandler_default (int sig)
18607 {
18608 myabort ();
18609
18610 signal (sig, NULL);
18611 }
18612
18613 void sigHandler_benchmark (int sig)
18614 {
18615 myquit ();
18616
18617 signal (sig, NULL);
18618 }
18619
18620 void hc_signal (void (callback) (int))
18621 {
18622 if (callback == NULL) callback = SIG_DFL;
18623
18624 signal (SIGINT, callback);
18625 signal (SIGTERM, callback);
18626 signal (SIGABRT, callback);
18627 }
18628
18629 #endif
18630
18631 void status_display ();
18632
18633 void *thread_keypress (void *p)
18634 {
18635 int benchmark = *((int *) p);
18636
18637 uint quiet = data.quiet;
18638
18639 tty_break();
18640
18641 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
18642 {
18643 int ch = tty_getchar();
18644
18645 if (ch == -1) break;
18646
18647 if (ch == 0) continue;
18648
18649 #ifdef _POSIX
18650 if (ch != '\n')
18651 #endif
18652
18653 hc_thread_mutex_lock (mux_display);
18654
18655 log_info ("");
18656
18657 switch (ch)
18658 {
18659 case 's':
18660 case '\n':
18661
18662 log_info ("");
18663
18664 status_display ();
18665
18666 log_info ("");
18667
18668 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18669 if (quiet == 0) fflush (stdout);
18670
18671 break;
18672
18673 case 'b':
18674
18675 log_info ("");
18676
18677 bypass ();
18678
18679 log_info ("");
18680
18681 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18682 if (quiet == 0) fflush (stdout);
18683
18684 break;
18685
18686 case 'p':
18687
18688 log_info ("");
18689
18690 SuspendThreads ();
18691
18692 log_info ("");
18693
18694 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18695 if (quiet == 0) fflush (stdout);
18696
18697 break;
18698
18699 case 'r':
18700
18701 log_info ("");
18702
18703 ResumeThreads ();
18704
18705 log_info ("");
18706
18707 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18708 if (quiet == 0) fflush (stdout);
18709
18710 break;
18711
18712 case 'c':
18713
18714 log_info ("");
18715
18716 if (benchmark == 1) break;
18717
18718 stop_at_checkpoint ();
18719
18720 log_info ("");
18721
18722 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18723 if (quiet == 0) fflush (stdout);
18724
18725 break;
18726
18727 case 'q':
18728
18729 log_info ("");
18730
18731 if (benchmark == 1)
18732 {
18733 myquit ();
18734 }
18735 else
18736 {
18737 myabort ();
18738 }
18739
18740 break;
18741 }
18742
18743 hc_thread_mutex_unlock (mux_display);
18744 }
18745
18746 tty_fix();
18747
18748 return (p);
18749 }
18750
18751 /**
18752 * rules common
18753 */
18754
18755 bool class_num (char c)
18756 {
18757 return ((c >= '0') && (c <= '9'));
18758 }
18759
18760 bool class_lower (char c)
18761 {
18762 return ((c >= 'a') && (c <= 'z'));
18763 }
18764
18765 bool class_upper (char c)
18766 {
18767 return ((c >= 'A') && (c <= 'Z'));
18768 }
18769
18770 bool class_alpha (char c)
18771 {
18772 return (class_lower (c) || class_upper (c));
18773 }
18774
18775 char conv_ctoi (char c)
18776 {
18777 if (class_num (c))
18778 {
18779 return c - '0';
18780 }
18781 else if (class_upper (c))
18782 {
18783 return c - 'A' + (char) 10;
18784 }
18785
18786 return (char) (-1);
18787 }
18788
18789 char conv_itoc (char c)
18790 {
18791 if (c < 10)
18792 {
18793 return c + '0';
18794 }
18795 else if (c < 37)
18796 {
18797 return c + 'A' - (char) 10;
18798 }
18799
18800 return (char) (-1);
18801 }
18802
18803 /**
18804 * GPU rules
18805 */
18806
18807 #define INCR_POS if (++rule_pos == rule_len) return (-1)
18808 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
18809 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
18810 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
18811 #define MAX_GPU_RULES 14
18812 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
18813 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
18814 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
18815
18816 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
18817 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
18818 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
18819 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
18820
18821 int cpu_rule_to_gpu_rule (char rule_buf[BUFSIZ], uint rule_len, gpu_rule_t *rule)
18822 {
18823 uint rule_pos;
18824 uint rule_cnt;
18825
18826 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_GPU_RULES; rule_pos++, rule_cnt++)
18827 {
18828 switch (rule_buf[rule_pos])
18829 {
18830 case ' ':
18831 rule_cnt--;
18832 break;
18833
18834 case RULE_OP_MANGLE_NOOP:
18835 SET_NAME (rule, rule_buf[rule_pos]);
18836 break;
18837
18838 case RULE_OP_MANGLE_LREST:
18839 SET_NAME (rule, rule_buf[rule_pos]);
18840 break;
18841
18842 case RULE_OP_MANGLE_UREST:
18843 SET_NAME (rule, rule_buf[rule_pos]);
18844 break;
18845
18846 case RULE_OP_MANGLE_LREST_UFIRST:
18847 SET_NAME (rule, rule_buf[rule_pos]);
18848 break;
18849
18850 case RULE_OP_MANGLE_UREST_LFIRST:
18851 SET_NAME (rule, rule_buf[rule_pos]);
18852 break;
18853
18854 case RULE_OP_MANGLE_TREST:
18855 SET_NAME (rule, rule_buf[rule_pos]);
18856 break;
18857
18858 case RULE_OP_MANGLE_TOGGLE_AT:
18859 SET_NAME (rule, rule_buf[rule_pos]);
18860 SET_P0_CONV (rule, rule_buf[rule_pos]);
18861 break;
18862
18863 case RULE_OP_MANGLE_REVERSE:
18864 SET_NAME (rule, rule_buf[rule_pos]);
18865 break;
18866
18867 case RULE_OP_MANGLE_DUPEWORD:
18868 SET_NAME (rule, rule_buf[rule_pos]);
18869 break;
18870
18871 case RULE_OP_MANGLE_DUPEWORD_TIMES:
18872 SET_NAME (rule, rule_buf[rule_pos]);
18873 SET_P0_CONV (rule, rule_buf[rule_pos]);
18874 break;
18875
18876 case RULE_OP_MANGLE_REFLECT:
18877 SET_NAME (rule, rule_buf[rule_pos]);
18878 break;
18879
18880 case RULE_OP_MANGLE_ROTATE_LEFT:
18881 SET_NAME (rule, rule_buf[rule_pos]);
18882 break;
18883
18884 case RULE_OP_MANGLE_ROTATE_RIGHT:
18885 SET_NAME (rule, rule_buf[rule_pos]);
18886 break;
18887
18888 case RULE_OP_MANGLE_APPEND:
18889 SET_NAME (rule, rule_buf[rule_pos]);
18890 SET_P0 (rule, rule_buf[rule_pos]);
18891 break;
18892
18893 case RULE_OP_MANGLE_PREPEND:
18894 SET_NAME (rule, rule_buf[rule_pos]);
18895 SET_P0 (rule, rule_buf[rule_pos]);
18896 break;
18897
18898 case RULE_OP_MANGLE_DELETE_FIRST:
18899 SET_NAME (rule, rule_buf[rule_pos]);
18900 break;
18901
18902 case RULE_OP_MANGLE_DELETE_LAST:
18903 SET_NAME (rule, rule_buf[rule_pos]);
18904 break;
18905
18906 case RULE_OP_MANGLE_DELETE_AT:
18907 SET_NAME (rule, rule_buf[rule_pos]);
18908 SET_P0_CONV (rule, rule_buf[rule_pos]);
18909 break;
18910
18911 case RULE_OP_MANGLE_EXTRACT:
18912 SET_NAME (rule, rule_buf[rule_pos]);
18913 SET_P0_CONV (rule, rule_buf[rule_pos]);
18914 SET_P1_CONV (rule, rule_buf[rule_pos]);
18915 break;
18916
18917 case RULE_OP_MANGLE_OMIT:
18918 SET_NAME (rule, rule_buf[rule_pos]);
18919 SET_P0_CONV (rule, rule_buf[rule_pos]);
18920 SET_P1_CONV (rule, rule_buf[rule_pos]);
18921 break;
18922
18923 case RULE_OP_MANGLE_INSERT:
18924 SET_NAME (rule, rule_buf[rule_pos]);
18925 SET_P0_CONV (rule, rule_buf[rule_pos]);
18926 SET_P1 (rule, rule_buf[rule_pos]);
18927 break;
18928
18929 case RULE_OP_MANGLE_OVERSTRIKE:
18930 SET_NAME (rule, rule_buf[rule_pos]);
18931 SET_P0_CONV (rule, rule_buf[rule_pos]);
18932 SET_P1 (rule, rule_buf[rule_pos]);
18933 break;
18934
18935 case RULE_OP_MANGLE_TRUNCATE_AT:
18936 SET_NAME (rule, rule_buf[rule_pos]);
18937 SET_P0_CONV (rule, rule_buf[rule_pos]);
18938 break;
18939
18940 case RULE_OP_MANGLE_REPLACE:
18941 SET_NAME (rule, rule_buf[rule_pos]);
18942 SET_P0 (rule, rule_buf[rule_pos]);
18943 SET_P1 (rule, rule_buf[rule_pos]);
18944 break;
18945
18946 case RULE_OP_MANGLE_PURGECHAR:
18947 return (-1);
18948 break;
18949
18950 case RULE_OP_MANGLE_TOGGLECASE_REC:
18951 return (-1);
18952 break;
18953
18954 case RULE_OP_MANGLE_DUPECHAR_FIRST:
18955 SET_NAME (rule, rule_buf[rule_pos]);
18956 SET_P0_CONV (rule, rule_buf[rule_pos]);
18957 break;
18958
18959 case RULE_OP_MANGLE_DUPECHAR_LAST:
18960 SET_NAME (rule, rule_buf[rule_pos]);
18961 SET_P0_CONV (rule, rule_buf[rule_pos]);
18962 break;
18963
18964 case RULE_OP_MANGLE_DUPECHAR_ALL:
18965 SET_NAME (rule, rule_buf[rule_pos]);
18966 break;
18967
18968 case RULE_OP_MANGLE_SWITCH_FIRST:
18969 SET_NAME (rule, rule_buf[rule_pos]);
18970 break;
18971
18972 case RULE_OP_MANGLE_SWITCH_LAST:
18973 SET_NAME (rule, rule_buf[rule_pos]);
18974 break;
18975
18976 case RULE_OP_MANGLE_SWITCH_AT:
18977 SET_NAME (rule, rule_buf[rule_pos]);
18978 SET_P0_CONV (rule, rule_buf[rule_pos]);
18979 SET_P1_CONV (rule, rule_buf[rule_pos]);
18980 break;
18981
18982 case RULE_OP_MANGLE_CHR_SHIFTL:
18983 SET_NAME (rule, rule_buf[rule_pos]);
18984 SET_P0_CONV (rule, rule_buf[rule_pos]);
18985 break;
18986
18987 case RULE_OP_MANGLE_CHR_SHIFTR:
18988 SET_NAME (rule, rule_buf[rule_pos]);
18989 SET_P0_CONV (rule, rule_buf[rule_pos]);
18990 break;
18991
18992 case RULE_OP_MANGLE_CHR_INCR:
18993 SET_NAME (rule, rule_buf[rule_pos]);
18994 SET_P0_CONV (rule, rule_buf[rule_pos]);
18995 break;
18996
18997 case RULE_OP_MANGLE_CHR_DECR:
18998 SET_NAME (rule, rule_buf[rule_pos]);
18999 SET_P0_CONV (rule, rule_buf[rule_pos]);
19000 break;
19001
19002 case RULE_OP_MANGLE_REPLACE_NP1:
19003 SET_NAME (rule, rule_buf[rule_pos]);
19004 SET_P0_CONV (rule, rule_buf[rule_pos]);
19005 break;
19006
19007 case RULE_OP_MANGLE_REPLACE_NM1:
19008 SET_NAME (rule, rule_buf[rule_pos]);
19009 SET_P0_CONV (rule, rule_buf[rule_pos]);
19010 break;
19011
19012 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19013 SET_NAME (rule, rule_buf[rule_pos]);
19014 SET_P0_CONV (rule, rule_buf[rule_pos]);
19015 break;
19016
19017 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19018 SET_NAME (rule, rule_buf[rule_pos]);
19019 SET_P0_CONV (rule, rule_buf[rule_pos]);
19020 break;
19021
19022 case RULE_OP_MANGLE_TITLE:
19023 SET_NAME (rule, rule_buf[rule_pos]);
19024 break;
19025
19026 default:
19027 return (-1);
19028 break;
19029 }
19030 }
19031
19032 if (rule_pos < rule_len) return (-1);
19033
19034 return (0);
19035 }
19036
19037 int gpu_rule_to_cpu_rule (char rule_buf[BUFSIZ], gpu_rule_t *rule)
19038 {
19039 uint rule_cnt;
19040 uint rule_pos;
19041 uint rule_len = BUFSIZ - 1; // maximum possible len
19042
19043 char rule_cmd;
19044
19045 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_GPU_RULES; rule_pos++, rule_cnt++)
19046 {
19047 GET_NAME (rule);
19048
19049 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19050
19051 switch (rule_cmd)
19052 {
19053 case RULE_OP_MANGLE_NOOP:
19054 rule_buf[rule_pos] = rule_cmd;
19055 break;
19056
19057 case RULE_OP_MANGLE_LREST:
19058 rule_buf[rule_pos] = rule_cmd;
19059 break;
19060
19061 case RULE_OP_MANGLE_UREST:
19062 rule_buf[rule_pos] = rule_cmd;
19063 break;
19064
19065 case RULE_OP_MANGLE_LREST_UFIRST:
19066 rule_buf[rule_pos] = rule_cmd;
19067 break;
19068
19069 case RULE_OP_MANGLE_UREST_LFIRST:
19070 rule_buf[rule_pos] = rule_cmd;
19071 break;
19072
19073 case RULE_OP_MANGLE_TREST:
19074 rule_buf[rule_pos] = rule_cmd;
19075 break;
19076
19077 case RULE_OP_MANGLE_TOGGLE_AT:
19078 rule_buf[rule_pos] = rule_cmd;
19079 GET_P0_CONV (rule);
19080 break;
19081
19082 case RULE_OP_MANGLE_REVERSE:
19083 rule_buf[rule_pos] = rule_cmd;
19084 break;
19085
19086 case RULE_OP_MANGLE_DUPEWORD:
19087 rule_buf[rule_pos] = rule_cmd;
19088 break;
19089
19090 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19091 rule_buf[rule_pos] = rule_cmd;
19092 GET_P0_CONV (rule);
19093 break;
19094
19095 case RULE_OP_MANGLE_REFLECT:
19096 rule_buf[rule_pos] = rule_cmd;
19097 break;
19098
19099 case RULE_OP_MANGLE_ROTATE_LEFT:
19100 rule_buf[rule_pos] = rule_cmd;
19101 break;
19102
19103 case RULE_OP_MANGLE_ROTATE_RIGHT:
19104 rule_buf[rule_pos] = rule_cmd;
19105 break;
19106
19107 case RULE_OP_MANGLE_APPEND:
19108 rule_buf[rule_pos] = rule_cmd;
19109 GET_P0 (rule);
19110 break;
19111
19112 case RULE_OP_MANGLE_PREPEND:
19113 rule_buf[rule_pos] = rule_cmd;
19114 GET_P0 (rule);
19115 break;
19116
19117 case RULE_OP_MANGLE_DELETE_FIRST:
19118 rule_buf[rule_pos] = rule_cmd;
19119 break;
19120
19121 case RULE_OP_MANGLE_DELETE_LAST:
19122 rule_buf[rule_pos] = rule_cmd;
19123 break;
19124
19125 case RULE_OP_MANGLE_DELETE_AT:
19126 rule_buf[rule_pos] = rule_cmd;
19127 GET_P0_CONV (rule);
19128 break;
19129
19130 case RULE_OP_MANGLE_EXTRACT:
19131 rule_buf[rule_pos] = rule_cmd;
19132 GET_P0_CONV (rule);
19133 GET_P1_CONV (rule);
19134 break;
19135
19136 case RULE_OP_MANGLE_OMIT:
19137 rule_buf[rule_pos] = rule_cmd;
19138 GET_P0_CONV (rule);
19139 GET_P1_CONV (rule);
19140 break;
19141
19142 case RULE_OP_MANGLE_INSERT:
19143 rule_buf[rule_pos] = rule_cmd;
19144 GET_P0_CONV (rule);
19145 GET_P1 (rule);
19146 break;
19147
19148 case RULE_OP_MANGLE_OVERSTRIKE:
19149 rule_buf[rule_pos] = rule_cmd;
19150 GET_P0_CONV (rule);
19151 GET_P1 (rule);
19152 break;
19153
19154 case RULE_OP_MANGLE_TRUNCATE_AT:
19155 rule_buf[rule_pos] = rule_cmd;
19156 GET_P0_CONV (rule);
19157 break;
19158
19159 case RULE_OP_MANGLE_REPLACE:
19160 rule_buf[rule_pos] = rule_cmd;
19161 GET_P0 (rule);
19162 GET_P1 (rule);
19163 break;
19164
19165 case RULE_OP_MANGLE_PURGECHAR:
19166 return (-1);
19167 break;
19168
19169 case RULE_OP_MANGLE_TOGGLECASE_REC:
19170 return (-1);
19171 break;
19172
19173 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19174 rule_buf[rule_pos] = rule_cmd;
19175 GET_P0_CONV (rule);
19176 break;
19177
19178 case RULE_OP_MANGLE_DUPECHAR_LAST:
19179 rule_buf[rule_pos] = rule_cmd;
19180 GET_P0_CONV (rule);
19181 break;
19182
19183 case RULE_OP_MANGLE_DUPECHAR_ALL:
19184 rule_buf[rule_pos] = rule_cmd;
19185 break;
19186
19187 case RULE_OP_MANGLE_SWITCH_FIRST:
19188 rule_buf[rule_pos] = rule_cmd;
19189 break;
19190
19191 case RULE_OP_MANGLE_SWITCH_LAST:
19192 rule_buf[rule_pos] = rule_cmd;
19193 break;
19194
19195 case RULE_OP_MANGLE_SWITCH_AT:
19196 rule_buf[rule_pos] = rule_cmd;
19197 GET_P0_CONV (rule);
19198 GET_P1_CONV (rule);
19199 break;
19200
19201 case RULE_OP_MANGLE_CHR_SHIFTL:
19202 rule_buf[rule_pos] = rule_cmd;
19203 GET_P0_CONV (rule);
19204 break;
19205
19206 case RULE_OP_MANGLE_CHR_SHIFTR:
19207 rule_buf[rule_pos] = rule_cmd;
19208 GET_P0_CONV (rule);
19209 break;
19210
19211 case RULE_OP_MANGLE_CHR_INCR:
19212 rule_buf[rule_pos] = rule_cmd;
19213 GET_P0_CONV (rule);
19214 break;
19215
19216 case RULE_OP_MANGLE_CHR_DECR:
19217 rule_buf[rule_pos] = rule_cmd;
19218 GET_P0_CONV (rule);
19219 break;
19220
19221 case RULE_OP_MANGLE_REPLACE_NP1:
19222 rule_buf[rule_pos] = rule_cmd;
19223 GET_P0_CONV (rule);
19224 break;
19225
19226 case RULE_OP_MANGLE_REPLACE_NM1:
19227 rule_buf[rule_pos] = rule_cmd;
19228 GET_P0_CONV (rule);
19229 break;
19230
19231 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19232 rule_buf[rule_pos] = rule_cmd;
19233 GET_P0_CONV (rule);
19234 break;
19235
19236 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19237 rule_buf[rule_pos] = rule_cmd;
19238 GET_P0_CONV (rule);
19239 break;
19240
19241 case RULE_OP_MANGLE_TITLE:
19242 rule_buf[rule_pos] = rule_cmd;
19243 break;
19244
19245 case 0:
19246 return rule_pos - 1;
19247 break;
19248
19249 default:
19250 return (-1);
19251 break;
19252 }
19253 }
19254
19255 if (rule_cnt > 0)
19256 {
19257 return rule_pos;
19258 }
19259
19260 return (-1);
19261 }
19262
19263 /**
19264 * CPU rules : this is from hashcat sources, cpu based rules
19265 */
19266
19267 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19268 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19269
19270 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19271 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19272 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19273
19274 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19275 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19276 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19277
19278 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19279 {
19280 int pos;
19281
19282 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19283
19284 return (arr_len);
19285 }
19286
19287 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19288 {
19289 int pos;
19290
19291 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19292
19293 return (arr_len);
19294 }
19295
19296 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19297 {
19298 int pos;
19299
19300 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19301
19302 return (arr_len);
19303 }
19304
19305 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19306 {
19307 int l;
19308 int r;
19309
19310 for (l = 0; l < arr_len; l++)
19311 {
19312 r = arr_len - 1 - l;
19313
19314 if (l >= r) break;
19315
19316 MANGLE_SWITCH (arr, l, r);
19317 }
19318
19319 return (arr_len);
19320 }
19321
19322 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19323 {
19324 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19325
19326 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19327
19328 return (arr_len * 2);
19329 }
19330
19331 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19332 {
19333 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19334
19335 int orig_len = arr_len;
19336
19337 int i;
19338
19339 for (i = 0; i < times; i++)
19340 {
19341 memcpy (&arr[arr_len], arr, orig_len);
19342
19343 arr_len += orig_len;
19344 }
19345
19346 return (arr_len);
19347 }
19348
19349 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19350 {
19351 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19352
19353 mangle_double (arr, arr_len);
19354
19355 mangle_reverse (arr + arr_len, arr_len);
19356
19357 return (arr_len * 2);
19358 }
19359
19360 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19361 {
19362 int l;
19363 int r;
19364
19365 for (l = 0, r = arr_len - 1; r > 0; r--)
19366 {
19367 MANGLE_SWITCH (arr, l, r);
19368 }
19369
19370 return (arr_len);
19371 }
19372
19373 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19374 {
19375 int l;
19376 int r;
19377
19378 for (l = 0, r = arr_len - 1; l < r; l++)
19379 {
19380 MANGLE_SWITCH (arr, l, r);
19381 }
19382
19383 return (arr_len);
19384 }
19385
19386 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19387 {
19388 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19389
19390 arr[arr_len] = c;
19391
19392 return (arr_len + 1);
19393 }
19394
19395 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19396 {
19397 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19398
19399 int arr_pos;
19400
19401 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19402 {
19403 arr[arr_pos + 1] = arr[arr_pos];
19404 }
19405
19406 arr[0] = c;
19407
19408 return (arr_len + 1);
19409 }
19410
19411 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19412 {
19413 if (upos >= arr_len) return (arr_len);
19414
19415 int arr_pos;
19416
19417 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
19418 {
19419 arr[arr_pos] = arr[arr_pos + 1];
19420 }
19421
19422 return (arr_len - 1);
19423 }
19424
19425 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19426 {
19427 if (upos >= arr_len) return (arr_len);
19428
19429 if ((upos + ulen) > arr_len) return (arr_len);
19430
19431 int arr_pos;
19432
19433 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
19434 {
19435 arr[arr_pos] = arr[upos + arr_pos];
19436 }
19437
19438 return (ulen);
19439 }
19440
19441 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19442 {
19443 if (upos >= arr_len) return (arr_len);
19444
19445 if ((upos + ulen) >= arr_len) return (arr_len);
19446
19447 int arr_pos;
19448
19449 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
19450 {
19451 arr[arr_pos] = arr[arr_pos + ulen];
19452 }
19453
19454 return (arr_len - ulen);
19455 }
19456
19457 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19458 {
19459 if (upos >= arr_len) return (arr_len);
19460
19461 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19462
19463 int arr_pos;
19464
19465 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
19466 {
19467 arr[arr_pos + 1] = arr[arr_pos];
19468 }
19469
19470 arr[upos] = c;
19471
19472 return (arr_len + 1);
19473 }
19474
19475 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)
19476 {
19477 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
19478
19479 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
19480
19481 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
19482
19483 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
19484
19485 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
19486
19487 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
19488
19489 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
19490
19491 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
19492
19493 return (arr_len + arr2_cpy);
19494 }
19495
19496 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19497 {
19498 if (upos >= arr_len) return (arr_len);
19499
19500 arr[upos] = c;
19501
19502 return (arr_len);
19503 }
19504
19505 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19506 {
19507 if (upos >= arr_len) return (arr_len);
19508
19509 memset (arr + upos, 0, arr_len - upos);
19510
19511 return (upos);
19512 }
19513
19514 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
19515 {
19516 int arr_pos;
19517
19518 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
19519 {
19520 if (arr[arr_pos] != oldc) continue;
19521
19522 arr[arr_pos] = newc;
19523 }
19524
19525 return (arr_len);
19526 }
19527
19528 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
19529 {
19530 int arr_pos;
19531
19532 int ret_len;
19533
19534 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
19535 {
19536 if (arr[arr_pos] == c) continue;
19537
19538 arr[ret_len] = arr[arr_pos];
19539
19540 ret_len++;
19541 }
19542
19543 return (ret_len);
19544 }
19545
19546 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
19547 {
19548 if (ulen > arr_len) return (arr_len);
19549
19550 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19551
19552 char cs[100];
19553
19554 memcpy (cs, arr, ulen);
19555
19556 int i;
19557
19558 for (i = 0; i < ulen; i++)
19559 {
19560 char c = cs[i];
19561
19562 arr_len = mangle_insert (arr, arr_len, i, c);
19563 }
19564
19565 return (arr_len);
19566 }
19567
19568 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
19569 {
19570 if (ulen > arr_len) return (arr_len);
19571
19572 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19573
19574 int upos = arr_len - ulen;
19575
19576 int i;
19577
19578 for (i = 0; i < ulen; i++)
19579 {
19580 char c = arr[upos + i];
19581
19582 arr_len = mangle_append (arr, arr_len, c);
19583 }
19584
19585 return (arr_len);
19586 }
19587
19588 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19589 {
19590 if ( arr_len == 0) return (arr_len);
19591 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19592
19593 char c = arr[upos];
19594
19595 int i;
19596
19597 for (i = 0; i < ulen; i++)
19598 {
19599 arr_len = mangle_insert (arr, arr_len, upos, c);
19600 }
19601
19602 return (arr_len);
19603 }
19604
19605 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
19606 {
19607 if ( arr_len == 0) return (arr_len);
19608 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
19609
19610 int arr_pos;
19611
19612 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19613 {
19614 int new_pos = arr_pos * 2;
19615
19616 arr[new_pos] = arr[arr_pos];
19617
19618 arr[new_pos + 1] = arr[arr_pos];
19619 }
19620
19621 return (arr_len * 2);
19622 }
19623
19624 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
19625 {
19626 if (upos >= arr_len) return (arr_len);
19627 if (upos2 >= arr_len) return (arr_len);
19628
19629 MANGLE_SWITCH (arr, upos, upos2);
19630
19631 return (arr_len);
19632 }
19633
19634 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
19635 {
19636 MANGLE_SWITCH (arr, upos, upos2);
19637
19638 return (arr_len);
19639 }
19640
19641 int mangle_chr_shiftl (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19642 {
19643 if (upos >= arr_len) return (arr_len);
19644
19645 arr[upos] <<= 1;
19646
19647 return (arr_len);
19648 }
19649
19650 int mangle_chr_shiftr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19651 {
19652 if (upos >= arr_len) return (arr_len);
19653
19654 arr[upos] >>= 1;
19655
19656 return (arr_len);
19657 }
19658
19659 int mangle_chr_incr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19660 {
19661 if (upos >= arr_len) return (arr_len);
19662
19663 arr[upos] += 1;
19664
19665 return (arr_len);
19666 }
19667
19668 int mangle_chr_decr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19669 {
19670 if (upos >= arr_len) return (arr_len);
19671
19672 arr[upos] -= 1;
19673
19674 return (arr_len);
19675 }
19676
19677 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
19678 {
19679 int upper_next = 1;
19680
19681 int pos;
19682
19683 for (pos = 0; pos < arr_len; pos++)
19684 {
19685 if (arr[pos] == ' ')
19686 {
19687 upper_next = 1;
19688
19689 continue;
19690 }
19691
19692 if (upper_next)
19693 {
19694 upper_next = 0;
19695
19696 MANGLE_UPPER_AT (arr, pos);
19697 }
19698 else
19699 {
19700 MANGLE_LOWER_AT (arr, pos);
19701 }
19702 }
19703
19704 return (arr_len);
19705 }
19706
19707 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], uint32_t rp_gen_func_min, uint32_t rp_gen_func_max)
19708 {
19709 uint32_t rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
19710
19711 uint32_t j;
19712
19713 uint32_t rule_pos = 0;
19714
19715 for (j = 0; j < rp_gen_num; j++)
19716 {
19717 uint32_t r = 0;
19718 uint32_t p1 = 0;
19719 uint32_t p2 = 0;
19720 uint32_t p3 = 0;
19721
19722 switch ((char) get_random_num (0, 9))
19723 {
19724 case 0:
19725 r = get_random_num (0, sizeof (grp_op_nop));
19726 rule_buf[rule_pos++] = grp_op_nop[r];
19727 break;
19728
19729 case 1:
19730 r = get_random_num (0, sizeof (grp_op_pos_p0));
19731 rule_buf[rule_pos++] = grp_op_pos_p0[r];
19732 p1 = get_random_num (0, sizeof (grp_pos));
19733 rule_buf[rule_pos++] = grp_pos[p1];
19734 break;
19735
19736 case 2:
19737 r = get_random_num (0, sizeof (grp_op_pos_p1));
19738 rule_buf[rule_pos++] = grp_op_pos_p1[r];
19739 p1 = get_random_num (1, 6);
19740 rule_buf[rule_pos++] = grp_pos[p1];
19741 break;
19742
19743 case 3:
19744 r = get_random_num (0, sizeof (grp_op_chr));
19745 rule_buf[rule_pos++] = grp_op_chr[r];
19746 p1 = get_random_num (0x20, 0x7e);
19747 rule_buf[rule_pos++] = (char) p1;
19748 break;
19749
19750 case 4:
19751 r = get_random_num (0, sizeof (grp_op_chr_chr));
19752 rule_buf[rule_pos++] = grp_op_chr_chr[r];
19753 p1 = get_random_num (0x20, 0x7e);
19754 rule_buf[rule_pos++] = (char) p1;
19755 p2 = get_random_num (0x20, 0x7e);
19756 while (p1 == p2)
19757 p2 = get_random_num (0x20, 0x7e);
19758 rule_buf[rule_pos++] = (char) p2;
19759 break;
19760
19761 case 5:
19762 r = get_random_num (0, sizeof (grp_op_pos_chr));
19763 rule_buf[rule_pos++] = grp_op_pos_chr[r];
19764 p1 = get_random_num (0, sizeof (grp_pos));
19765 rule_buf[rule_pos++] = grp_pos[p1];
19766 p2 = get_random_num (0x20, 0x7e);
19767 rule_buf[rule_pos++] = (char) p2;
19768 break;
19769
19770 case 6:
19771 r = get_random_num (0, sizeof (grp_op_pos_pos0));
19772 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
19773 p1 = get_random_num (0, sizeof (grp_pos));
19774 rule_buf[rule_pos++] = grp_pos[p1];
19775 p2 = get_random_num (0, sizeof (grp_pos));
19776 while (p1 == p2)
19777 p2 = get_random_num (0, sizeof (grp_pos));
19778 rule_buf[rule_pos++] = grp_pos[p2];
19779 break;
19780
19781 case 7:
19782 r = get_random_num (0, sizeof (grp_op_pos_pos1));
19783 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
19784 p1 = get_random_num (0, sizeof (grp_pos));
19785 rule_buf[rule_pos++] = grp_pos[p1];
19786 p2 = get_random_num (1, sizeof (grp_pos));
19787 while (p1 == p2)
19788 p2 = get_random_num (1, sizeof (grp_pos));
19789 rule_buf[rule_pos++] = grp_pos[p2];
19790 break;
19791
19792 case 8:
19793 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
19794 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
19795 p1 = get_random_num (0, sizeof (grp_pos));
19796 rule_buf[rule_pos++] = grp_pos[p1];
19797 p2 = get_random_num (1, sizeof (grp_pos));
19798 rule_buf[rule_pos++] = grp_pos[p1];
19799 p3 = get_random_num (0, sizeof (grp_pos));
19800 rule_buf[rule_pos++] = grp_pos[p3];
19801 break;
19802 }
19803 }
19804
19805 return (rule_pos);
19806 }
19807
19808 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
19809 {
19810 char mem[BLOCK_SIZE];
19811
19812 if (in == NULL) return (RULE_RC_REJECT_ERROR);
19813
19814 if (out == NULL) return (RULE_RC_REJECT_ERROR);
19815
19816 if (in_len < 1) return (RULE_RC_REJECT_ERROR);
19817
19818 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
19819
19820 int out_len = in_len;
19821 int mem_len = in_len;
19822
19823 memcpy (out, in, out_len);
19824
19825 int rule_pos;
19826
19827 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
19828 {
19829 int upos; int upos2;
19830 int ulen;
19831
19832 switch (rule[rule_pos])
19833 {
19834 case ' ':
19835 break;
19836
19837 case RULE_OP_MANGLE_NOOP:
19838 break;
19839
19840 case RULE_OP_MANGLE_LREST:
19841 out_len = mangle_lrest (out, out_len);
19842 break;
19843
19844 case RULE_OP_MANGLE_UREST:
19845 out_len = mangle_urest (out, out_len);
19846 break;
19847
19848 case RULE_OP_MANGLE_LREST_UFIRST:
19849 out_len = mangle_lrest (out, out_len);
19850 if (out_len) MANGLE_UPPER_AT (out, 0);
19851 break;
19852
19853 case RULE_OP_MANGLE_UREST_LFIRST:
19854 out_len = mangle_urest (out, out_len);
19855 if (out_len) MANGLE_LOWER_AT (out, 0);
19856 break;
19857
19858 case RULE_OP_MANGLE_TREST:
19859 out_len = mangle_trest (out, out_len);
19860 break;
19861
19862 case RULE_OP_MANGLE_TOGGLE_AT:
19863 NEXT_RULEPOS (rule_pos);
19864 NEXT_RPTOI (rule, rule_pos, upos);
19865 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
19866 break;
19867
19868 case RULE_OP_MANGLE_REVERSE:
19869 out_len = mangle_reverse (out, out_len);
19870 break;
19871
19872 case RULE_OP_MANGLE_DUPEWORD:
19873 out_len = mangle_double (out, out_len);
19874 break;
19875
19876 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19877 NEXT_RULEPOS (rule_pos);
19878 NEXT_RPTOI (rule, rule_pos, ulen);
19879 out_len = mangle_double_times (out, out_len, ulen);
19880 break;
19881
19882 case RULE_OP_MANGLE_REFLECT:
19883 out_len = mangle_reflect (out, out_len);
19884 break;
19885
19886 case RULE_OP_MANGLE_ROTATE_LEFT:
19887 mangle_rotate_left (out, out_len);
19888 break;
19889
19890 case RULE_OP_MANGLE_ROTATE_RIGHT:
19891 mangle_rotate_right (out, out_len);
19892 break;
19893
19894 case RULE_OP_MANGLE_APPEND:
19895 NEXT_RULEPOS (rule_pos);
19896 out_len = mangle_append (out, out_len, rule[rule_pos]);
19897 break;
19898
19899 case RULE_OP_MANGLE_PREPEND:
19900 NEXT_RULEPOS (rule_pos);
19901 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
19902 break;
19903
19904 case RULE_OP_MANGLE_DELETE_FIRST:
19905 out_len = mangle_delete_at (out, out_len, 0);
19906 break;
19907
19908 case RULE_OP_MANGLE_DELETE_LAST:
19909 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
19910 break;
19911
19912 case RULE_OP_MANGLE_DELETE_AT:
19913 NEXT_RULEPOS (rule_pos);
19914 NEXT_RPTOI (rule, rule_pos, upos);
19915 out_len = mangle_delete_at (out, out_len, upos);
19916 break;
19917
19918 case RULE_OP_MANGLE_EXTRACT:
19919 NEXT_RULEPOS (rule_pos);
19920 NEXT_RPTOI (rule, rule_pos, upos);
19921 NEXT_RULEPOS (rule_pos);
19922 NEXT_RPTOI (rule, rule_pos, ulen);
19923 out_len = mangle_extract (out, out_len, upos, ulen);
19924 break;
19925
19926 case RULE_OP_MANGLE_OMIT:
19927 NEXT_RULEPOS (rule_pos);
19928 NEXT_RPTOI (rule, rule_pos, upos);
19929 NEXT_RULEPOS (rule_pos);
19930 NEXT_RPTOI (rule, rule_pos, ulen);
19931 out_len = mangle_omit (out, out_len, upos, ulen);
19932 break;
19933
19934 case RULE_OP_MANGLE_INSERT:
19935 NEXT_RULEPOS (rule_pos);
19936 NEXT_RPTOI (rule, rule_pos, upos);
19937 NEXT_RULEPOS (rule_pos);
19938 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
19939 break;
19940
19941 case RULE_OP_MANGLE_OVERSTRIKE:
19942 NEXT_RULEPOS (rule_pos);
19943 NEXT_RPTOI (rule, rule_pos, upos);
19944 NEXT_RULEPOS (rule_pos);
19945 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
19946 break;
19947
19948 case RULE_OP_MANGLE_TRUNCATE_AT:
19949 NEXT_RULEPOS (rule_pos);
19950 NEXT_RPTOI (rule, rule_pos, upos);
19951 out_len = mangle_truncate_at (out, out_len, upos);
19952 break;
19953
19954 case RULE_OP_MANGLE_REPLACE:
19955 NEXT_RULEPOS (rule_pos);
19956 NEXT_RULEPOS (rule_pos);
19957 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
19958 break;
19959
19960 case RULE_OP_MANGLE_PURGECHAR:
19961 NEXT_RULEPOS (rule_pos);
19962 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
19963 break;
19964
19965 case RULE_OP_MANGLE_TOGGLECASE_REC:
19966 /* todo */
19967 break;
19968
19969 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19970 NEXT_RULEPOS (rule_pos);
19971 NEXT_RPTOI (rule, rule_pos, ulen);
19972 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
19973 break;
19974
19975 case RULE_OP_MANGLE_DUPECHAR_LAST:
19976 NEXT_RULEPOS (rule_pos);
19977 NEXT_RPTOI (rule, rule_pos, ulen);
19978 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
19979 break;
19980
19981 case RULE_OP_MANGLE_DUPECHAR_ALL:
19982 out_len = mangle_dupechar (out, out_len);
19983 break;
19984
19985 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19986 NEXT_RULEPOS (rule_pos);
19987 NEXT_RPTOI (rule, rule_pos, ulen);
19988 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
19989 break;
19990
19991 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19992 NEXT_RULEPOS (rule_pos);
19993 NEXT_RPTOI (rule, rule_pos, ulen);
19994 out_len = mangle_dupeblock_append (out, out_len, ulen);
19995 break;
19996
19997 case RULE_OP_MANGLE_SWITCH_FIRST:
19998 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
19999 break;
20000
20001 case RULE_OP_MANGLE_SWITCH_LAST:
20002 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20003 break;
20004
20005 case RULE_OP_MANGLE_SWITCH_AT:
20006 NEXT_RULEPOS (rule_pos);
20007 NEXT_RPTOI (rule, rule_pos, upos);
20008 NEXT_RULEPOS (rule_pos);
20009 NEXT_RPTOI (rule, rule_pos, upos2);
20010 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20011 break;
20012
20013 case RULE_OP_MANGLE_CHR_SHIFTL:
20014 NEXT_RULEPOS (rule_pos);
20015 NEXT_RPTOI (rule, rule_pos, upos);
20016 mangle_chr_shiftl ((uint8_t *) out, out_len, upos);
20017 break;
20018
20019 case RULE_OP_MANGLE_CHR_SHIFTR:
20020 NEXT_RULEPOS (rule_pos);
20021 NEXT_RPTOI (rule, rule_pos, upos);
20022 mangle_chr_shiftr ((uint8_t *) out, out_len, upos);
20023 break;
20024
20025 case RULE_OP_MANGLE_CHR_INCR:
20026 NEXT_RULEPOS (rule_pos);
20027 NEXT_RPTOI (rule, rule_pos, upos);
20028 mangle_chr_incr ((uint8_t *) out, out_len, upos);
20029 break;
20030
20031 case RULE_OP_MANGLE_CHR_DECR:
20032 NEXT_RULEPOS (rule_pos);
20033 NEXT_RPTOI (rule, rule_pos, upos);
20034 mangle_chr_decr ((uint8_t *) out, out_len, upos);
20035 break;
20036
20037 case RULE_OP_MANGLE_REPLACE_NP1:
20038 NEXT_RULEPOS (rule_pos);
20039 NEXT_RPTOI (rule, rule_pos, upos);
20040 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20041 break;
20042
20043 case RULE_OP_MANGLE_REPLACE_NM1:
20044 NEXT_RULEPOS (rule_pos);
20045 NEXT_RPTOI (rule, rule_pos, upos);
20046 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20047 break;
20048
20049 case RULE_OP_MANGLE_TITLE:
20050 out_len = mangle_title (out, out_len);
20051 break;
20052
20053 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20054 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20055 NEXT_RULEPOS (rule_pos);
20056 NEXT_RPTOI (rule, rule_pos, upos);
20057 NEXT_RULEPOS (rule_pos);
20058 NEXT_RPTOI (rule, rule_pos, ulen);
20059 NEXT_RULEPOS (rule_pos);
20060 NEXT_RPTOI (rule, rule_pos, upos2);
20061 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20062 break;
20063
20064 case RULE_OP_MANGLE_APPEND_MEMORY:
20065 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20066 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20067 memcpy (out + out_len, mem, mem_len);
20068 out_len += mem_len;
20069 break;
20070
20071 case RULE_OP_MANGLE_PREPEND_MEMORY:
20072 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20073 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20074 memcpy (mem + mem_len, out, out_len);
20075 out_len += mem_len;
20076 memcpy (out, mem, out_len);
20077 break;
20078
20079 case RULE_OP_MEMORIZE_WORD:
20080 memcpy (mem, out, out_len);
20081 mem_len = out_len;
20082 break;
20083
20084 case RULE_OP_REJECT_LESS:
20085 NEXT_RULEPOS (rule_pos);
20086 NEXT_RPTOI (rule, rule_pos, upos);
20087 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20088 break;
20089
20090 case RULE_OP_REJECT_GREATER:
20091 NEXT_RULEPOS (rule_pos);
20092 NEXT_RPTOI (rule, rule_pos, upos);
20093 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20094 break;
20095
20096 case RULE_OP_REJECT_CONTAIN:
20097 NEXT_RULEPOS (rule_pos);
20098 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20099 break;
20100
20101 case RULE_OP_REJECT_NOT_CONTAIN:
20102 NEXT_RULEPOS (rule_pos);
20103 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20104 break;
20105
20106 case RULE_OP_REJECT_EQUAL_FIRST:
20107 NEXT_RULEPOS (rule_pos);
20108 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20109 break;
20110
20111 case RULE_OP_REJECT_EQUAL_LAST:
20112 NEXT_RULEPOS (rule_pos);
20113 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20114 break;
20115
20116 case RULE_OP_REJECT_EQUAL_AT:
20117 NEXT_RULEPOS (rule_pos);
20118 NEXT_RPTOI (rule, rule_pos, upos);
20119 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20120 NEXT_RULEPOS (rule_pos);
20121 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20122 break;
20123
20124 case RULE_OP_REJECT_CONTAINS:
20125 NEXT_RULEPOS (rule_pos);
20126 NEXT_RPTOI (rule, rule_pos, upos);
20127 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20128 NEXT_RULEPOS (rule_pos);
20129 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20130 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20131 break;
20132
20133 case RULE_OP_REJECT_MEMORY:
20134 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20135 break;
20136
20137 default:
20138 return (RULE_RC_SYNTAX_ERROR);
20139 break;
20140 }
20141 }
20142
20143 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20144
20145 return (out_len);
20146 }