Activate reordering or files to help integration into linux distributions
[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 #ifdef _WIN
2637 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2638 {
2639 NvU32 pGpuCount;
2640
2641 if (hc_NvAPI_EnumPhysicalGPUs (nvGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2642
2643 if (pGpuCount == 0)
2644 {
2645 log_info ("WARN: No NvAPI adapters found");
2646
2647 return (0);
2648 }
2649
2650 return (pGpuCount);
2651 }
2652 #endif
2653
2654 #ifdef LINUX
2655 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2656 {
2657 int pGpuCount = 0;
2658
2659 for (uint i = 0; i < DEVICES_MAX; i++)
2660 {
2661 if (hc_NVML_nvmlDeviceGetHandleByIndex (data.hm_dll, 1, i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2662
2663 //can be used to determine if the device by index matches the cuda device by index
2664 //char name[100]; memset (name, 0, sizeof (name));
2665 //hc_NVML_nvmlDeviceGetName (data.hm_dll, nvGPUHandle[i], name, sizeof (name) - 1);
2666
2667 pGpuCount++;
2668 }
2669
2670 if (pGpuCount == 0)
2671 {
2672 log_info ("WARN: No NVML adapters found");
2673
2674 return (0);
2675 }
2676
2677 return (pGpuCount);
2678 }
2679 #endif
2680
2681 void hm_close (HM_LIB hm_dll)
2682 {
2683 #ifdef _POSIX
2684 dlclose (hm_dll);
2685
2686 #elif _WIN
2687 FreeLibrary (hm_dll);
2688
2689 #endif
2690 }
2691
2692 HM_LIB hm_init ()
2693 {
2694 HM_LIB hm_dll = NULL;
2695
2696 if (data.vendor_id == VENDOR_ID_AMD)
2697 {
2698 #ifdef _POSIX
2699 hm_dll = dlopen ("libatiadlxx.so", RTLD_LAZY | RTLD_GLOBAL);
2700
2701 #elif _WIN
2702 hm_dll = LoadLibrary ("atiadlxx.dll");
2703
2704 if (hm_dll == NULL)
2705 {
2706 hm_dll = LoadLibrary ("atiadlxy.dll");
2707 }
2708
2709 #endif
2710 }
2711
2712 #ifdef LINUX
2713 if (data.vendor_id == VENDOR_ID_NV)
2714 {
2715 hm_dll = dlopen ("libnvidia-ml.so", RTLD_LAZY | RTLD_GLOBAL);
2716 }
2717 #endif
2718
2719 return hm_dll;
2720 }
2721
2722 int get_adapters_num_amd (HM_LIB hm_dll, int *iNumberAdapters)
2723 {
2724 if (hc_ADL_Adapter_NumberOfAdapters_Get (hm_dll, iNumberAdapters) != ADL_OK) return -1;
2725
2726 if (iNumberAdapters == 0)
2727 {
2728 log_info ("WARN: No ADL adapters found.");
2729
2730 return -1;
2731 }
2732
2733 return 0;
2734 }
2735
2736 /*
2737 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2738 {
2739 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2740 ADLODParameters lpOdParameters;
2741
2742 lpOdParameters.iSize = sizeof (ADLODParameters);
2743 size_t plevels_size = 0;
2744
2745 if (hc_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2746
2747 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2748 __func__, iAdapterIndex,
2749 lpOdParameters.iNumberOfPerformanceLevels,
2750 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2751 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2752
2753 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2754
2755 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2756
2757 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2758
2759 if (hc_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2760
2761 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2762 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2763 __func__, iAdapterIndex, j,
2764 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2765
2766 myfree (lpOdPerformanceLevels);
2767
2768 return 0;
2769 }
2770 */
2771
2772 LPAdapterInfo hm_get_adapter_info_amd (HM_LIB hm_dll, int iNumberAdapters)
2773 {
2774 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2775
2776 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2777
2778 if (hc_ADL_Adapter_AdapterInfo_Get (hm_dll, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2779
2780 return lpAdapterInfo;
2781 }
2782
2783 /*
2784 //
2785 // does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2786 //
2787
2788 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2789 {
2790 uint32_t idx = -1;
2791
2792 for (uint i = 0; i < num_adl_adapters; i++)
2793 {
2794 int opencl_bus_num = hm_device[i].busid;
2795 int opencl_dev_num = hm_device[i].devid;
2796
2797 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2798 {
2799 idx = i;
2800
2801 break;
2802 }
2803 }
2804
2805 if (idx >= DEVICES_MAX) return -1;
2806
2807 return idx;
2808 }
2809
2810 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2811 {
2812 for (uint i = 0; i < opencl_num_devices; i++)
2813 {
2814 cl_device_topology_amd device_topology;
2815
2816 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2817
2818 hm_device[i].busid = device_topology.pcie.bus;
2819 hm_device[i].devid = device_topology.pcie.device;
2820 }
2821 }
2822 */
2823
2824 void hm_sort_adl_adapters_by_busid_devid (uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2825 {
2826 // basically bubble sort
2827
2828 for (int i = 0; i < num_adl_adapters; i++)
2829 {
2830 for (int j = 0; j < num_adl_adapters - 1; j++)
2831 {
2832 // get info of adapter [x]
2833
2834 uint32_t adapter_index_x = valid_adl_device_list[j];
2835 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2836
2837 uint32_t bus_num_x = info_x.iBusNumber;
2838 uint32_t dev_num_x = info_x.iDeviceNumber;
2839
2840 // get info of adapter [y]
2841
2842 uint32_t adapter_index_y = valid_adl_device_list[j + 1];
2843 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2844
2845 uint32_t bus_num_y = info_y.iBusNumber;
2846 uint32_t dev_num_y = info_y.iDeviceNumber;
2847
2848 uint need_swap = 0;
2849
2850 if (bus_num_y < bus_num_x)
2851 {
2852 need_swap = 1;
2853 }
2854 else if (bus_num_y == bus_num_x)
2855 {
2856 if (dev_num_y < dev_num_x)
2857 {
2858 need_swap = 1;
2859 }
2860 }
2861
2862 if (need_swap == 1)
2863 {
2864 uint32_t temp = valid_adl_device_list[j + 1];
2865
2866 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2867 valid_adl_device_list[j + 0] = temp;
2868 }
2869 }
2870 }
2871 }
2872
2873 uint32_t *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2874 {
2875 *num_adl_adapters = 0;
2876
2877 uint32_t *adl_adapters = NULL;
2878
2879 int *bus_numbers = NULL;
2880 int *device_numbers = NULL;
2881
2882 for (int i = 0; i < iNumberAdapters; i++)
2883 {
2884 AdapterInfo info = lpAdapterInfo[i];
2885
2886 if ((info.strUDID == NULL) || (strlen (info.strUDID) < 1)) continue;
2887
2888 #ifdef WIN
2889 if (info.iVendorID != 1002) continue;
2890 #else
2891 if (info.iVendorID != 0x1002) continue;
2892 #endif
2893
2894 if (info.iBusNumber < 0) continue;
2895 if (info.iDeviceNumber < 0) continue;
2896
2897 int found = 0;
2898
2899 for (int pos = 0; pos < *num_adl_adapters; pos++)
2900 {
2901 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2902 {
2903 found = 1;
2904 break;
2905 }
2906 }
2907
2908 if (found) continue;
2909
2910 // add it to the list
2911
2912 adl_adapters = (uint32_t *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2913
2914 adl_adapters[*num_adl_adapters] = i;
2915
2916 // rest is just bookkeeping
2917
2918 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2919 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2920
2921 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2922 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2923
2924 (*num_adl_adapters)++;
2925 }
2926
2927 myfree (bus_numbers);
2928 myfree (device_numbers);
2929
2930 // sort the list by increasing bus id, device id number
2931
2932 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2933
2934 return adl_adapters;
2935 }
2936
2937 int hm_check_fanspeed_control (HM_LIB hm_dll, hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2938 {
2939 // loop through all valid devices
2940
2941 for (int i = 0; i < num_adl_adapters; i++)
2942 {
2943 uint32_t adapter_index = valid_adl_device_list[i];
2944
2945 // get AdapterInfo
2946
2947 AdapterInfo info = lpAdapterInfo[adapter_index];
2948
2949 // unfortunately this doesn't work since bus id and dev id are not unique
2950 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2951 // if (opencl_device_index == -1) continue;
2952
2953 int opencl_device_index = i;
2954
2955 // if (hm_show_performance_level (hm_dll, info.iAdapterIndex) != 0) return -1;
2956
2957 // get fanspeed info
2958
2959 if (hm_device[opencl_device_index].od_version == 5)
2960 {
2961 ADLFanSpeedInfo FanSpeedInfo;
2962
2963 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2964
2965 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2966
2967 if (hc_ADL_Overdrive5_FanSpeedInfo_Get (hm_dll, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2968
2969 // check read and write capability in fanspeedinfo
2970
2971 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2972 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2973 {
2974 hm_device[opencl_device_index].fan_supported = 1;
2975 }
2976 else
2977 {
2978 hm_device[opencl_device_index].fan_supported = 0;
2979 }
2980 }
2981 else // od_version == 6
2982 {
2983 ADLOD6FanSpeedInfo faninfo;
2984
2985 memset (&faninfo, 0, sizeof (faninfo));
2986
2987 if (hc_ADL_Overdrive6_FanSpeed_Get (hm_dll, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
2988
2989 // check read capability in fanspeedinfo
2990
2991 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
2992 {
2993 hm_device[opencl_device_index].fan_supported = 1;
2994 }
2995 else
2996 {
2997 hm_device[opencl_device_index].fan_supported = 0;
2998 }
2999 }
3000 }
3001
3002 return 0;
3003 }
3004
3005 int hm_get_overdrive_version (HM_LIB hm_dll, hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3006 {
3007 for (int i = 0; i < num_adl_adapters; i++)
3008 {
3009 uint32_t adapter_index = valid_adl_device_list[i];
3010
3011 // get AdapterInfo
3012
3013 AdapterInfo info = lpAdapterInfo[adapter_index];
3014
3015 // get overdrive version
3016
3017 int od_supported = 0;
3018 int od_enabled = 0;
3019 int od_version = 0;
3020
3021 if (hc_ADL_Overdrive_Caps (hm_dll, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3022
3023 // store the overdrive version in hm_device
3024
3025 // unfortunately this doesn't work since bus id and dev id are not unique
3026 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3027 // if (opencl_device_index == -1) continue;
3028
3029 int opencl_device_index = i;
3030
3031 hm_device[opencl_device_index].od_version = od_version;
3032 }
3033
3034 return 0;
3035 }
3036
3037 int hm_get_adapter_index_amd (hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3038 {
3039 for (int i = 0; i < num_adl_adapters; i++)
3040 {
3041 uint32_t adapter_index = valid_adl_device_list[i];
3042
3043 // get AdapterInfo
3044
3045 AdapterInfo info = lpAdapterInfo[adapter_index];
3046
3047 // store the iAdapterIndex in hm_device
3048
3049 // unfortunately this doesn't work since bus id and dev id are not unique
3050 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3051 // if (opencl_device_index == -1) continue;
3052
3053 int opencl_device_index = i;
3054
3055 hm_device[opencl_device_index].adapter_index.amd = info.iAdapterIndex;
3056 }
3057
3058 return num_adl_adapters;
3059 }
3060
3061 int hm_get_temperature_with_device_id (const uint device_id)
3062 {
3063 if (data.vendor_id == VENDOR_ID_AMD)
3064 {
3065 if (data.hm_dll)
3066 {
3067 if (data.hm_device[device_id].od_version == 5)
3068 {
3069 ADLTemperature Temperature;
3070
3071 Temperature.iSize = sizeof (ADLTemperature);
3072
3073 if (hc_ADL_Overdrive5_Temperature_Get (data.hm_dll, data.hm_device[device_id].adapter_index.amd, 0, &Temperature) != ADL_OK) return -1;
3074
3075 return Temperature.iTemperature / 1000;
3076 }
3077 else if (data.hm_device[device_id].od_version == 6)
3078 {
3079 int Temperature = 0;
3080
3081 if (hc_ADL_Overdrive6_Temperature_Get (data.hm_dll, data.hm_device[device_id].adapter_index.amd, &Temperature) != ADL_OK) return -1;
3082
3083 return Temperature / 1000;
3084 }
3085 }
3086 }
3087
3088 if (data.vendor_id == VENDOR_ID_NV)
3089 {
3090 #ifdef LINUX
3091 int temperature = 0;
3092
3093 hc_NVML_nvmlDeviceGetTemperature (data.hm_dll, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_GPU, (unsigned int *) &temperature);
3094
3095 return temperature;
3096 #endif
3097
3098 #ifdef WIN
3099 NV_GPU_THERMAL_SETTINGS pThermalSettings;
3100
3101 pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER;
3102 pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU;
3103 pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN;
3104 pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
3105
3106 if (hc_NvAPI_GPU_GetThermalSettings (data.hm_device[device_id].adapter_index.nv, 0, &pThermalSettings) != NVAPI_OK) return -1;
3107
3108 return pThermalSettings.sensor[0].currentTemp;
3109 #endif
3110 }
3111
3112 return -1;
3113 }
3114
3115 int hm_get_fanspeed_with_device_id (const uint device_id)
3116 {
3117 if (data.hm_device[device_id].fan_supported == 1)
3118 {
3119 if (data.vendor_id == VENDOR_ID_AMD)
3120 {
3121 if (data.hm_dll)
3122 {
3123 if (data.hm_device[device_id].od_version == 5)
3124 {
3125 ADLFanSpeedValue lpFanSpeedValue;
3126
3127 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3128
3129 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3130 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3131 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3132
3133 if (hc_ADL_Overdrive5_FanSpeed_Get (data.hm_dll, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3134
3135 return lpFanSpeedValue.iFanSpeed;
3136 }
3137 else // od_version == 6
3138 {
3139 ADLOD6FanSpeedInfo faninfo;
3140
3141 memset (&faninfo, 0, sizeof (faninfo));
3142
3143 if (hc_ADL_Overdrive6_FanSpeed_Get (data.hm_dll, data.hm_device[device_id].adapter_index.amd, &faninfo) != ADL_OK) return -1;
3144
3145 return faninfo.iFanSpeedPercent;
3146 }
3147 }
3148 }
3149
3150 if (data.vendor_id == VENDOR_ID_NV)
3151 {
3152 #ifdef LINUX
3153 int speed = 0;
3154
3155 hc_NVML_nvmlDeviceGetFanSpeed (data.hm_dll, 1, data.hm_device[device_id].adapter_index.nv, (unsigned int *) &speed);
3156
3157 return speed;
3158 #endif
3159
3160 #ifdef WIN
3161 NvU32 speed = 0;
3162
3163 hc_NvAPI_GPU_GetTachReading (data.hm_device[device_id].adapter_index.nv, &speed);
3164
3165 return speed;
3166 #endif
3167 }
3168 }
3169
3170 return -1;
3171 }
3172
3173 int hm_get_utilization_with_device_id (const uint device_id)
3174 {
3175 if (data.vendor_id == VENDOR_ID_AMD)
3176 {
3177 if (data.hm_dll)
3178 {
3179 ADLPMActivity PMActivity;
3180
3181 PMActivity.iSize = sizeof (ADLPMActivity);
3182
3183 if (hc_ADL_Overdrive_CurrentActivity_Get (data.hm_dll, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3184
3185 return PMActivity.iActivityPercent;
3186 }
3187 }
3188
3189 if (data.vendor_id == VENDOR_ID_NV)
3190 {
3191 #ifdef LINUX
3192 nvmlUtilization_t utilization;
3193
3194 hc_NVML_nvmlDeviceGetUtilizationRates (data.hm_dll, data.hm_device[device_id].adapter_index.nv, &utilization);
3195
3196 return utilization.gpu;
3197 #endif
3198
3199 #ifdef WIN
3200 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3201
3202 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3203
3204 if (hc_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_device[device_id].adapter_index.nv, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3205
3206 return pDynamicPstatesInfoEx.utilization[0].percentage;
3207 #endif
3208 }
3209
3210 return -1;
3211 }
3212
3213 int hm_set_fanspeed_with_device_id_amd (const uint device_id, const int fanspeed)
3214 {
3215 if (data.hm_device[device_id].fan_supported == 1)
3216 {
3217 if (data.hm_dll)
3218 {
3219 if (data.hm_device[device_id].od_version == 5)
3220 {
3221 ADLFanSpeedValue lpFanSpeedValue;
3222
3223 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3224
3225 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3226 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3227 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3228 lpFanSpeedValue.iFanSpeed = fanspeed;
3229
3230 if (hc_ADL_Overdrive5_FanSpeed_Set (data.hm_dll, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3231
3232 return 0;
3233 }
3234 else // od_version == 6
3235 {
3236 ADLOD6FanSpeedValue fan_speed_value;
3237
3238 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3239
3240 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3241 fan_speed_value.iFanSpeed = fanspeed;
3242
3243 if (hc_ADL_Overdrive6_FanSpeed_Set (data.hm_dll, data.hm_device[device_id].adapter_index.amd, &fan_speed_value) != ADL_OK) return -1;
3244
3245 return 0;
3246 }
3247 }
3248 }
3249
3250 return -1;
3251 }
3252
3253 /**
3254 * maskprocessor
3255 */
3256
3257 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3258 {
3259 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3260
3261 if (css_cnt > SP_PW_MAX)
3262 {
3263 log_error ("ERROR: mask length is too long");
3264
3265 exit (-1);
3266 }
3267
3268 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3269 {
3270 uint *uniq_tbl = uniq_tbls[css_pos];
3271
3272 uint *cs_buf = css[css_pos].cs_buf;
3273 uint cs_len = css[css_pos].cs_len;
3274
3275 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3276 {
3277 uint c = cs_buf[cs_pos] & 0xff;
3278
3279 uniq_tbl[c] = 1;
3280 }
3281 }
3282 }
3283
3284 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3285 {
3286 cs_t *cs = &css[css_cnt];
3287
3288 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3289
3290 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3291
3292 memset (css_uniq, 0, css_uniq_sz);
3293
3294 size_t i;
3295
3296 for (i = 0; i < cs->cs_len; i++)
3297 {
3298 const uint u = cs->cs_buf[i];
3299
3300 css_uniq[u] = 1;
3301 }
3302
3303 for (i = 0; i < in_len; i++)
3304 {
3305 uint u = in_buf[i] & 0xff;
3306
3307 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3308
3309 if (css_uniq[u] == 1) continue;
3310
3311 css_uniq[u] = 1;
3312
3313 cs->cs_buf[cs->cs_len] = u;
3314
3315 cs->cs_len++;
3316 }
3317
3318 myfree (css_uniq);
3319 }
3320
3321 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3322 {
3323 size_t in_pos;
3324
3325 for (in_pos = 0; in_pos < in_len; in_pos++)
3326 {
3327 uint p0 = in_buf[in_pos] & 0xff;
3328
3329 if (interpret == 1 && p0 == '?')
3330 {
3331 in_pos++;
3332
3333 if (in_pos == in_len) break;
3334
3335 uint p1 = in_buf[in_pos] & 0xff;
3336
3337 switch (p1)
3338 {
3339 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3340 break;
3341 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3342 break;
3343 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3344 break;
3345 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3346 break;
3347 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3348 break;
3349 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3350 break;
3351 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3352 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3353 break;
3354 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3355 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3356 break;
3357 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3358 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3359 break;
3360 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3361 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3362 break;
3363 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3364 break;
3365 default: log_error ("Syntax error: %s", in_buf);
3366 exit (-1);
3367 }
3368 }
3369 else
3370 {
3371 if (data.hex_charset)
3372 {
3373 in_pos++;
3374
3375 if (in_pos == in_len)
3376 {
3377 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3378
3379 exit (-1);
3380 }
3381
3382 uint p1 = in_buf[in_pos] & 0xff;
3383
3384 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3385 {
3386 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3387
3388 exit (-1);
3389 }
3390
3391 uint chr = 0;
3392
3393 chr = hex_convert (p1) << 0;
3394 chr |= hex_convert (p0) << 4;
3395
3396 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3397 }
3398 else
3399 {
3400 uint chr = p0;
3401
3402 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3403 }
3404 }
3405 }
3406 }
3407
3408 uint64_t mp_get_sum (uint css_cnt, cs_t *css)
3409 {
3410 uint64_t sum = 1;
3411
3412 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3413 {
3414 sum *= css[css_pos].cs_len;
3415 }
3416
3417 return (sum);
3418 }
3419
3420 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3421 {
3422 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3423
3424 uint mask_pos;
3425 uint css_pos;
3426
3427 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3428 {
3429 char p0 = mask_buf[mask_pos];
3430
3431 if (p0 == '?')
3432 {
3433 mask_pos++;
3434
3435 if (mask_pos == mask_len) break;
3436
3437 char p1 = mask_buf[mask_pos];
3438
3439 uint chr = p1;
3440
3441 switch (p1)
3442 {
3443 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3444 break;
3445 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3446 break;
3447 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3448 break;
3449 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3450 break;
3451 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3452 break;
3453 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3454 break;
3455 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3456 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3457 break;
3458 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3459 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3460 break;
3461 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3462 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3463 break;
3464 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3465 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3466 break;
3467 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3468 break;
3469 default: log_error ("ERROR: syntax error: %s", mask_buf);
3470 exit (-1);
3471 }
3472 }
3473 else
3474 {
3475 if (data.hex_charset)
3476 {
3477 mask_pos++;
3478
3479 // if there is no 2nd hex character, show an error:
3480
3481 if (mask_pos == mask_len)
3482 {
3483 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3484
3485 exit (-1);
3486 }
3487
3488 char p1 = mask_buf[mask_pos];
3489
3490 // if they are not valid hex character, show an error:
3491
3492 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3493 {
3494 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3495
3496 exit (-1);
3497 }
3498
3499 uint chr = 0;
3500
3501 chr |= hex_convert (p1) << 0;
3502 chr |= hex_convert (p0) << 4;
3503
3504 mp_add_cs_buf (&chr, 1, css, css_pos);
3505 }
3506 else
3507 {
3508 uint chr = p0;
3509
3510 mp_add_cs_buf (&chr, 1, css, css_pos);
3511 }
3512 }
3513 }
3514
3515 if (css_pos == 0)
3516 {
3517 log_error ("ERROR: invalid mask length (0)");
3518
3519 exit (-1);
3520 }
3521
3522 *css_cnt = css_pos;
3523
3524 return (css);
3525 }
3526
3527 void mp_exec (uint64_t val, char *buf, cs_t *css, int css_cnt)
3528 {
3529 for (int i = 0; i < css_cnt; i++)
3530 {
3531 uint len = css[i].cs_len;
3532 uint64_t next = val / len;
3533 uint pos = val % len;
3534 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3535 val = next;
3536 }
3537 }
3538
3539 void mp_cut_at (char *mask, uint max)
3540 {
3541 uint i;
3542 uint j;
3543 uint mask_len = strlen (mask);
3544
3545 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3546 {
3547 if (mask[i] == '?') i++;
3548 }
3549
3550 mask[i] = 0;
3551 }
3552
3553 void mp_setup_sys (cs_t *mp_sys)
3554 {
3555 uint pos;
3556 uint chr;
3557 uint donec[CHARSIZ];
3558
3559 memset (donec, 0, sizeof (donec));
3560
3561 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3562 mp_sys[0].cs_buf[pos++] = chr;
3563 mp_sys[0].cs_len = pos; }
3564
3565 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3566 mp_sys[1].cs_buf[pos++] = chr;
3567 mp_sys[1].cs_len = pos; }
3568
3569 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3570 mp_sys[2].cs_buf[pos++] = chr;
3571 mp_sys[2].cs_len = pos; }
3572
3573 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3574 mp_sys[3].cs_buf[pos++] = chr;
3575 mp_sys[3].cs_len = pos; }
3576
3577 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3578 mp_sys[4].cs_len = pos; }
3579
3580 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3581 mp_sys[5].cs_len = pos; }
3582 }
3583
3584 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3585 {
3586 FILE *fp = fopen (buf, "rb");
3587
3588 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3589 {
3590 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3591 }
3592 else
3593 {
3594 char mp_file[1024];
3595
3596 memset (mp_file, 0, sizeof (mp_file));
3597
3598 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3599
3600 fclose (fp);
3601
3602 len = in_superchop (mp_file);
3603
3604 if (len == 0)
3605 {
3606 log_info ("WARNING: charset file corrupted");
3607
3608 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3609 }
3610 else
3611 {
3612 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3613 }
3614 }
3615 }
3616
3617 void mp_reset_usr (cs_t *mp_usr, uint index)
3618 {
3619 mp_usr[index].cs_len = 0;
3620
3621 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3622 }
3623
3624 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3625 {
3626 char *new_mask_buf = (char *) mymalloc (256);
3627
3628 uint mask_pos;
3629
3630 uint css_pos;
3631
3632 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3633 {
3634 if (css_pos == len) break;
3635
3636 char p0 = mask_buf[mask_pos];
3637
3638 new_mask_buf[mask_pos] = p0;
3639
3640 if (p0 == '?')
3641 {
3642 mask_pos++;
3643
3644 if (mask_pos == mask_len) break;
3645
3646 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3647 }
3648 else
3649 {
3650 if (data.hex_charset)
3651 {
3652 mask_pos++;
3653
3654 if (mask_pos == mask_len)
3655 {
3656 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3657
3658 exit (-1);
3659 }
3660
3661 char p1 = mask_buf[mask_pos];
3662
3663 // if they are not valid hex character, show an error:
3664
3665 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3666 {
3667 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3668
3669 exit (-1);
3670 }
3671
3672 new_mask_buf[mask_pos] = p1;
3673 }
3674 }
3675 }
3676
3677 if (css_pos == len) return (new_mask_buf);
3678
3679 myfree (new_mask_buf);
3680
3681 return (NULL);
3682 }
3683
3684 /**
3685 * statprocessor
3686 */
3687
3688 uint64_t sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3689 {
3690 uint64_t sum = 1;
3691
3692 uint i;
3693
3694 for (i = start; i < stop; i++)
3695 {
3696 sum *= root_css_buf[i].cs_len;
3697 }
3698
3699 return (sum);
3700 }
3701
3702 void sp_exec (uint64_t ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3703 {
3704 uint64_t v = ctx;
3705
3706 cs_t *cs = &root_css_buf[start];
3707
3708 uint i;
3709
3710 for (i = start; i < stop; i++)
3711 {
3712 const uint64_t m = v % cs->cs_len;
3713 const uint64_t d = v / cs->cs_len;
3714
3715 v = d;
3716
3717 const uint k = cs->cs_buf[m];
3718
3719 pw_buf[i - start] = (char) k;
3720
3721 cs = &markov_css_buf[(i * CHARSIZ) + k];
3722 }
3723 }
3724
3725 int sp_comp_val (const void *p1, const void *p2)
3726 {
3727 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3728 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3729
3730 return b2->val - b1->val;
3731 }
3732
3733 void sp_setup_tbl (const char *shared_dir, char *hcstat, uint disable, uint classic, hcstat_table_t *root_table_buf, hcstat_table_t *markov_table_buf)
3734 {
3735 uint i;
3736 uint j;
3737 uint k;
3738
3739 /**
3740 * Initialize hcstats
3741 */
3742
3743 uint64_t *root_stats_buf = (uint64_t *) mycalloc (SP_ROOT_CNT, sizeof (uint64_t));
3744
3745 uint64_t *root_stats_ptr = root_stats_buf;
3746
3747 uint64_t *root_stats_buf_by_pos[SP_PW_MAX];
3748
3749 for (i = 0; i < SP_PW_MAX; i++)
3750 {
3751 root_stats_buf_by_pos[i] = root_stats_ptr;
3752
3753 root_stats_ptr += CHARSIZ;
3754 }
3755
3756 uint64_t *markov_stats_buf = (uint64_t *) mycalloc (SP_MARKOV_CNT, sizeof (uint64_t));
3757
3758 uint64_t *markov_stats_ptr = markov_stats_buf;
3759
3760 uint64_t *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3761
3762 for (i = 0; i < SP_PW_MAX; i++)
3763 {
3764 for (j = 0; j < CHARSIZ; j++)
3765 {
3766 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3767
3768 markov_stats_ptr += CHARSIZ;
3769 }
3770 }
3771
3772 /**
3773 * Load hcstats File
3774 */
3775
3776 if (hcstat == NULL)
3777 {
3778 char hcstat_tmp[256];
3779
3780 memset (hcstat_tmp, 0, sizeof (hcstat_tmp));
3781
3782 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
3783
3784 hcstat = hcstat_tmp;
3785 }
3786
3787 FILE *fd = fopen (hcstat, "rb");
3788
3789 if (fd == NULL)
3790 {
3791 log_error ("%s: %s", hcstat, strerror (errno));
3792
3793 exit (-1);
3794 }
3795
3796 if (fread (root_stats_buf, sizeof (uint64_t), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3797 {
3798 log_error ("%s: Could not load data", hcstat);
3799
3800 exit (-1);
3801 }
3802
3803 if (fread (markov_stats_buf, sizeof (uint64_t), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3804 {
3805 log_error ("%s: Could not load data", hcstat);
3806
3807 exit (-1);
3808 }
3809
3810 fclose (fd);
3811
3812 /**
3813 * Markov modifier of hcstat_table on user request
3814 */
3815
3816 if (disable)
3817 {
3818 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (uint64_t));
3819 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (uint64_t));
3820 }
3821
3822 if (classic)
3823 {
3824 /* Add all stats to first position */
3825
3826 for (i = 1; i < SP_PW_MAX; i++)
3827 {
3828 uint64_t *out = root_stats_buf_by_pos[0];
3829 uint64_t *in = root_stats_buf_by_pos[i];
3830
3831 for (j = 0; j < CHARSIZ; j++)
3832 {
3833 *out++ += *in++;
3834 }
3835 }
3836
3837 for (i = 1; i < SP_PW_MAX; i++)
3838 {
3839 uint64_t *out = markov_stats_buf_by_key[0][0];
3840 uint64_t *in = markov_stats_buf_by_key[i][0];
3841
3842 for (j = 0; j < CHARSIZ; j++)
3843 {
3844 for (k = 0; k < CHARSIZ; k++)
3845 {
3846 *out++ += *in++;
3847 }
3848 }
3849 }
3850
3851 /* copy them to all pw_positions */
3852
3853 for (i = 1; i < SP_PW_MAX; i++)
3854 {
3855 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (uint64_t));
3856 }
3857
3858 for (i = 1; i < SP_PW_MAX; i++)
3859 {
3860 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (uint64_t));
3861 }
3862 }
3863
3864 /**
3865 * Initialize tables
3866 */
3867
3868 hcstat_table_t *root_table_ptr = root_table_buf;
3869
3870 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
3871
3872 for (i = 0; i < SP_PW_MAX; i++)
3873 {
3874 root_table_buf_by_pos[i] = root_table_ptr;
3875
3876 root_table_ptr += CHARSIZ;
3877 }
3878
3879 hcstat_table_t *markov_table_ptr = markov_table_buf;
3880
3881 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
3882
3883 for (i = 0; i < SP_PW_MAX; i++)
3884 {
3885 for (j = 0; j < CHARSIZ; j++)
3886 {
3887 markov_table_buf_by_key[i][j] = markov_table_ptr;
3888
3889 markov_table_ptr += CHARSIZ;
3890 }
3891 }
3892
3893 /**
3894 * Convert hcstat to tables
3895 */
3896
3897 for (i = 0; i < SP_ROOT_CNT; i++)
3898 {
3899 uint key = i % CHARSIZ;
3900
3901 root_table_buf[i].key = key;
3902 root_table_buf[i].val = root_stats_buf[i];
3903 }
3904
3905 for (i = 0; i < SP_MARKOV_CNT; i++)
3906 {
3907 uint key = i % CHARSIZ;
3908
3909 markov_table_buf[i].key = key;
3910 markov_table_buf[i].val = markov_stats_buf[i];
3911 }
3912
3913 myfree (root_stats_buf);
3914 myfree (markov_stats_buf);
3915
3916 /**
3917 * Finally sort them
3918 */
3919
3920 for (i = 0; i < SP_PW_MAX; i++)
3921 {
3922 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3923 }
3924
3925 for (i = 0; i < SP_PW_MAX; i++)
3926 {
3927 for (j = 0; j < CHARSIZ; j++)
3928 {
3929 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3930 }
3931 }
3932 }
3933
3934 void sp_tbl_to_css (hcstat_table_t *root_table_buf, hcstat_table_t *markov_table_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint threshold, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3935 {
3936 /**
3937 * Convert tables to css
3938 */
3939
3940 for (uint i = 0; i < SP_ROOT_CNT; i++)
3941 {
3942 uint pw_pos = i / CHARSIZ;
3943
3944 cs_t *cs = &root_css_buf[pw_pos];
3945
3946 if (cs->cs_len == threshold) continue;
3947
3948 uint key = root_table_buf[i].key;
3949
3950 if (uniq_tbls[pw_pos][key] == 0) continue;
3951
3952 cs->cs_buf[cs->cs_len] = key;
3953
3954 cs->cs_len++;
3955 }
3956
3957 /**
3958 * Convert table to css
3959 */
3960
3961 for (uint i = 0; i < SP_MARKOV_CNT; i++)
3962 {
3963 uint c = i / CHARSIZ;
3964
3965 cs_t *cs = &markov_css_buf[c];
3966
3967 if (cs->cs_len == threshold) continue;
3968
3969 uint pw_pos = c / CHARSIZ;
3970
3971 uint key = markov_table_buf[i].key;
3972
3973 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
3974
3975 cs->cs_buf[cs->cs_len] = key;
3976
3977 cs->cs_len++;
3978 }
3979
3980 /*
3981 for (uint i = 0; i < 8; i++)
3982 {
3983 for (uint j = 0x20; j < 0x80; j++)
3984 {
3985 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
3986
3987 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
3988
3989 for (uint k = 0; k < 10; k++)
3990 {
3991 printf (" %u\n", ptr->cs_buf[k]);
3992 }
3993 }
3994 }
3995 */
3996 }
3997
3998 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
3999 {
4000 for (uint i = 0; i < SP_PW_MAX; i += 2)
4001 {
4002 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4003
4004 out += CHARSIZ;
4005 in += CHARSIZ;
4006
4007 out->key = 0;
4008 out->val = 1;
4009
4010 out++;
4011
4012 for (uint j = 1; j < CHARSIZ; j++)
4013 {
4014 out->key = j;
4015 out->val = 0;
4016
4017 out++;
4018 }
4019 }
4020 }
4021
4022 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4023 {
4024 for (uint i = 0; i < SP_PW_MAX; i += 2)
4025 {
4026 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4027
4028 out += CHARSIZ * CHARSIZ;
4029 in += CHARSIZ * CHARSIZ;
4030
4031 for (uint j = 0; j < CHARSIZ; j++)
4032 {
4033 out->key = 0;
4034 out->val = 1;
4035
4036 out++;
4037
4038 for (uint k = 1; k < CHARSIZ; k++)
4039 {
4040 out->key = k;
4041 out->val = 0;
4042
4043 out++;
4044 }
4045 }
4046 }
4047 }
4048
4049 /**
4050 * mixed shared functions
4051 */
4052
4053 void dump_hex (const char *s, size_t size)
4054 {
4055 size_t i;
4056
4057 for (i = 0; i < size; i++)
4058 {
4059 log_info_nn ("%02x ", (unsigned char) s[i]);
4060 }
4061
4062 log_info ("");
4063 }
4064
4065 void usage_mini_print (const char *progname)
4066 {
4067 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4068 }
4069
4070 void usage_big_print (const char *progname)
4071 {
4072 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4073 }
4074
4075 char *get_exec_path ()
4076 {
4077 int exec_path_len = 1024;
4078
4079 char *exec_path = (char *) mymalloc (exec_path_len);
4080
4081 #ifdef LINUX
4082
4083 char tmp[32];
4084
4085 sprintf (tmp, "/proc/%d/exe", getpid ());
4086
4087 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4088
4089 #endif
4090
4091 #ifdef WIN
4092
4093 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4094
4095 #endif
4096
4097 exec_path[len] = 0;
4098
4099 return exec_path;
4100 }
4101
4102 char *get_install_dir (const char *progname)
4103 {
4104 char *install_dir = mystrdup (progname);
4105 char *last_slash = NULL;
4106
4107 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4108 {
4109 *last_slash = 0;
4110 }
4111 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4112 {
4113 *last_slash = 0;
4114 }
4115 else
4116 {
4117 install_dir[0] = '.';
4118 install_dir[1] = 0;
4119 }
4120
4121 return (install_dir);
4122 }
4123
4124 char *get_profile_dir (const char *homedir)
4125 {
4126 #define DOT_HASHCAT ".hashcat"
4127
4128 char *profile_dir = (char *) mymalloc (strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1);
4129
4130 sprintf (profile_dir, "%s/%s", homedir, DOT_HASHCAT);
4131
4132 return profile_dir;
4133 }
4134
4135 char *get_session_dir (const char *profile_dir, const char *session)
4136 {
4137 char *session_dir = (char *) mymalloc (strlen (profile_dir) + 1 + strlen (session) + 1);
4138
4139 sprintf (session_dir, "%s/%s", profile_dir, session);
4140
4141 return session_dir;
4142 }
4143
4144 void truecrypt_crc32 (char *file, unsigned char keytab[64])
4145 {
4146 uint crc = ~0;
4147
4148 FILE *fd = fopen (file, "rb");
4149
4150 if (fd == NULL)
4151 {
4152 log_error ("%s: %s", file, strerror (errno));
4153
4154 exit (-1);
4155 }
4156
4157 #define MAX_KEY_SIZE (1024 * 1024)
4158
4159 char *buf = (char *) mymalloc (MAX_KEY_SIZE);
4160
4161 int nread = fread (buf, 1, MAX_KEY_SIZE, fd);
4162
4163 int kpos = 0;
4164
4165 for (int fpos = 0; fpos < nread; fpos++)
4166 {
4167 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4168
4169 keytab[kpos++] += (crc >> 24) & 0xff;
4170 keytab[kpos++] += (crc >> 16) & 0xff;
4171 keytab[kpos++] += (crc >> 8) & 0xff;
4172 keytab[kpos++] += (crc >> 0) & 0xff;
4173
4174 if (kpos >= 64) kpos = 0;
4175 }
4176
4177 myfree (buf);
4178
4179 fclose(fd);
4180 }
4181
4182 void set_cpu_affinity (char *cpu_affinity)
4183 {
4184 #ifdef WIN
4185 DWORD_PTR aff_mask = 0;
4186 #endif
4187
4188 #ifdef LINUX
4189 cpu_set_t cpuset;
4190
4191 CPU_ZERO (&cpuset);
4192 #endif
4193
4194 if (cpu_affinity)
4195 {
4196 char *devices = strdup (cpu_affinity);
4197
4198 char *next = strtok (devices, ",");
4199
4200 do
4201 {
4202 uint cpu_id = atoi (next);
4203
4204 if (cpu_id == 0)
4205 {
4206 #ifdef WIN
4207 aff_mask = 0;
4208 #endif
4209
4210 #ifdef LINUX
4211 CPU_ZERO (&cpuset);
4212 #endif
4213
4214 break;
4215 }
4216
4217 if (cpu_id > 32)
4218 {
4219 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4220
4221 exit (-1);
4222 }
4223
4224 #ifdef WIN
4225 aff_mask |= 1 << (cpu_id - 1);
4226 #endif
4227
4228 #ifdef LINUX
4229 CPU_SET ((cpu_id - 1), &cpuset);
4230 #endif
4231
4232 } while ((next = strtok (NULL, ",")) != NULL);
4233
4234 free (devices);
4235 }
4236
4237 #ifdef WIN
4238 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4239 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4240 #endif
4241
4242 #ifdef LINUX
4243 pthread_t thread = pthread_self ();
4244 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4245 #endif
4246 }
4247
4248 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4249 {
4250 char *element, *end;
4251
4252 end = (char *) base + nmemb * size;
4253
4254 for (element = (char *) base; element < end; element += size)
4255 if (!compar (element, key))
4256 return element;
4257
4258 return NULL;
4259 }
4260
4261 int sort_by_salt (const void *v1, const void *v2)
4262 {
4263 const salt_t *s1 = (const salt_t *) v1;
4264 const salt_t *s2 = (const salt_t *) v2;
4265
4266 const int res1 = s1->salt_len - s2->salt_len;
4267
4268 if (res1 != 0) return (res1);
4269
4270 const int res2 = s1->salt_iter - s2->salt_iter;
4271
4272 if (res2 != 0) return (res2);
4273
4274 uint n;
4275
4276 n = 12;
4277
4278 while (n--)
4279 {
4280 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4281 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4282 }
4283
4284 n = 8;
4285
4286 while (n--)
4287 {
4288 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4289 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4290 }
4291
4292 return (0);
4293 }
4294
4295 int sort_by_salt_buf (const void *v1, const void *v2)
4296 {
4297 const pot_t *p1 = (const pot_t *) v1;
4298 const pot_t *p2 = (const pot_t *) v2;
4299
4300 const hash_t *h1 = &p1->hash;
4301 const hash_t *h2 = &p2->hash;
4302
4303 const salt_t *s1 = h1->salt;
4304 const salt_t *s2 = h2->salt;
4305
4306 uint n = 12;
4307
4308 while (n--)
4309 {
4310 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4311 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4312 }
4313
4314 return 0;
4315 }
4316
4317 int sort_by_hash_t_salt (const void *v1, const void *v2)
4318 {
4319 const hash_t *h1 = (const hash_t *) v1;
4320 const hash_t *h2 = (const hash_t *) v2;
4321
4322 const salt_t *s1 = h1->salt;
4323 const salt_t *s2 = h2->salt;
4324
4325 // testphase: this should work
4326 uint n = 12;
4327
4328 while (n--)
4329 {
4330 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4331 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4332 }
4333
4334 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4335 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4336 if (s1->salt_len > s2->salt_len) return ( 1);
4337 if (s1->salt_len < s2->salt_len) return (-1);
4338
4339 uint n = s1->salt_len;
4340
4341 while (n--)
4342 {
4343 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4344 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4345 }
4346 */
4347
4348 return 0;
4349 }
4350
4351 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4352 {
4353 const hash_t *h1 = (const hash_t *) v1;
4354 const hash_t *h2 = (const hash_t *) v2;
4355
4356 const salt_t *s1 = h1->salt;
4357 const salt_t *s2 = h2->salt;
4358
4359 // 12 - 2 (since last 2 uints contain the digest)
4360 uint n = 10;
4361
4362 while (n--)
4363 {
4364 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4365 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4366 }
4367
4368 return 0;
4369 }
4370
4371 int sort_by_hash_no_salt (const void *v1, const void *v2)
4372 {
4373 const hash_t *h1 = (const hash_t *) v1;
4374 const hash_t *h2 = (const hash_t *) v2;
4375
4376 const void *d1 = h1->digest;
4377 const void *d2 = h2->digest;
4378
4379 return data.sort_by_digest (d1, d2);
4380 }
4381
4382 int sort_by_hash (const void *v1, const void *v2)
4383 {
4384 const hash_t *h1 = (const hash_t *) v1;
4385 const hash_t *h2 = (const hash_t *) v2;
4386
4387 if (data.isSalted)
4388 {
4389 const salt_t *s1 = h1->salt;
4390 const salt_t *s2 = h2->salt;
4391
4392 int res = sort_by_salt (s1, s2);
4393
4394 if (res != 0) return (res);
4395 }
4396
4397 const void *d1 = h1->digest;
4398 const void *d2 = h2->digest;
4399
4400 return data.sort_by_digest (d1, d2);
4401 }
4402
4403 int sort_by_pot (const void *v1, const void *v2)
4404 {
4405 const pot_t *p1 = (const pot_t *) v1;
4406 const pot_t *p2 = (const pot_t *) v2;
4407
4408 const hash_t *h1 = &p1->hash;
4409 const hash_t *h2 = &p2->hash;
4410
4411 return sort_by_hash (h1, h2);
4412 }
4413
4414 int sort_by_mtime (const void *p1, const void *p2)
4415 {
4416 const char **f1 = (const char **) p1;
4417 const char **f2 = (const char **) p2;
4418
4419 struct stat s1; stat (*f1, &s1);
4420 struct stat s2; stat (*f2, &s2);
4421
4422 return s2.st_mtime - s1.st_mtime;
4423 }
4424
4425 int sort_by_cpu_rule (const void *p1, const void *p2)
4426 {
4427 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4428 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4429
4430 return memcmp (r1, r2, sizeof (cpu_rule_t));
4431 }
4432
4433 int sort_by_gpu_rule (const void *p1, const void *p2)
4434 {
4435 const gpu_rule_t *r1 = (const gpu_rule_t *) p1;
4436 const gpu_rule_t *r2 = (const gpu_rule_t *) p2;
4437
4438 return memcmp (r1, r2, sizeof (gpu_rule_t));
4439 }
4440
4441 int sort_by_stringptr (const void *p1, const void *p2)
4442 {
4443 const char **s1 = (const char **) p1;
4444 const char **s2 = (const char **) p2;
4445
4446 return strcmp (*s1, *s2);
4447 }
4448
4449 int sort_by_dictstat (const void *s1, const void *s2)
4450 {
4451 dictstat_t *d1 = (dictstat_t *) s1;
4452 dictstat_t *d2 = (dictstat_t *) s2;
4453
4454 #ifdef _POSIX
4455 d2->stat.st_atim = d1->stat.st_atim;
4456 #else
4457 d2->stat.st_atime = d1->stat.st_atime;
4458 #endif
4459
4460 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4461 }
4462
4463 int sort_by_bitmap (const void *p1, const void *p2)
4464 {
4465 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4466 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4467
4468 return b1->collisions - b2->collisions;
4469 }
4470
4471 int sort_by_digest_4_2 (const void *v1, const void *v2)
4472 {
4473 const uint32_t *d1 = (const uint32_t *) v1;
4474 const uint32_t *d2 = (const uint32_t *) v2;
4475
4476 uint n = 2;
4477
4478 while (n--)
4479 {
4480 if (d1[n] > d2[n]) return ( 1);
4481 if (d1[n] < d2[n]) return (-1);
4482 }
4483
4484 return (0);
4485 }
4486
4487 int sort_by_digest_4_4 (const void *v1, const void *v2)
4488 {
4489 const uint32_t *d1 = (const uint32_t *) v1;
4490 const uint32_t *d2 = (const uint32_t *) v2;
4491
4492 uint n = 4;
4493
4494 while (n--)
4495 {
4496 if (d1[n] > d2[n]) return ( 1);
4497 if (d1[n] < d2[n]) return (-1);
4498 }
4499
4500 return (0);
4501 }
4502
4503 int sort_by_digest_4_5 (const void *v1, const void *v2)
4504 {
4505 const uint32_t *d1 = (const uint32_t *) v1;
4506 const uint32_t *d2 = (const uint32_t *) v2;
4507
4508 uint n = 5;
4509
4510 while (n--)
4511 {
4512 if (d1[n] > d2[n]) return ( 1);
4513 if (d1[n] < d2[n]) return (-1);
4514 }
4515
4516 return (0);
4517 }
4518
4519 int sort_by_digest_4_6 (const void *v1, const void *v2)
4520 {
4521 const uint32_t *d1 = (const uint32_t *) v1;
4522 const uint32_t *d2 = (const uint32_t *) v2;
4523
4524 uint n = 6;
4525
4526 while (n--)
4527 {
4528 if (d1[n] > d2[n]) return ( 1);
4529 if (d1[n] < d2[n]) return (-1);
4530 }
4531
4532 return (0);
4533 }
4534
4535 int sort_by_digest_4_8 (const void *v1, const void *v2)
4536 {
4537 const uint32_t *d1 = (const uint32_t *) v1;
4538 const uint32_t *d2 = (const uint32_t *) v2;
4539
4540 uint n = 8;
4541
4542 while (n--)
4543 {
4544 if (d1[n] > d2[n]) return ( 1);
4545 if (d1[n] < d2[n]) return (-1);
4546 }
4547
4548 return (0);
4549 }
4550
4551 int sort_by_digest_4_16 (const void *v1, const void *v2)
4552 {
4553 const uint32_t *d1 = (const uint32_t *) v1;
4554 const uint32_t *d2 = (const uint32_t *) v2;
4555
4556 uint n = 16;
4557
4558 while (n--)
4559 {
4560 if (d1[n] > d2[n]) return ( 1);
4561 if (d1[n] < d2[n]) return (-1);
4562 }
4563
4564 return (0);
4565 }
4566
4567 int sort_by_digest_4_32 (const void *v1, const void *v2)
4568 {
4569 const uint32_t *d1 = (const uint32_t *) v1;
4570 const uint32_t *d2 = (const uint32_t *) v2;
4571
4572 uint n = 32;
4573
4574 while (n--)
4575 {
4576 if (d1[n] > d2[n]) return ( 1);
4577 if (d1[n] < d2[n]) return (-1);
4578 }
4579
4580 return (0);
4581 }
4582
4583 int sort_by_digest_4_64 (const void *v1, const void *v2)
4584 {
4585 const uint32_t *d1 = (const uint32_t *) v1;
4586 const uint32_t *d2 = (const uint32_t *) v2;
4587
4588 uint n = 64;
4589
4590 while (n--)
4591 {
4592 if (d1[n] > d2[n]) return ( 1);
4593 if (d1[n] < d2[n]) return (-1);
4594 }
4595
4596 return (0);
4597 }
4598
4599 int sort_by_digest_8_8 (const void *v1, const void *v2)
4600 {
4601 const uint64_t *d1 = (const uint64_t *) v1;
4602 const uint64_t *d2 = (const uint64_t *) v2;
4603
4604 uint n = 8;
4605
4606 while (n--)
4607 {
4608 if (d1[n] > d2[n]) return ( 1);
4609 if (d1[n] < d2[n]) return (-1);
4610 }
4611
4612 return (0);
4613 }
4614
4615 int sort_by_digest_8_16 (const void *v1, const void *v2)
4616 {
4617 const uint64_t *d1 = (const uint64_t *) v1;
4618 const uint64_t *d2 = (const uint64_t *) v2;
4619
4620 uint n = 16;
4621
4622 while (n--)
4623 {
4624 if (d1[n] > d2[n]) return ( 1);
4625 if (d1[n] < d2[n]) return (-1);
4626 }
4627
4628 return (0);
4629 }
4630
4631 int sort_by_digest_8_25 (const void *v1, const void *v2)
4632 {
4633 const uint64_t *d1 = (const uint64_t *) v1;
4634 const uint64_t *d2 = (const uint64_t *) v2;
4635
4636 uint n = 25;
4637
4638 while (n--)
4639 {
4640 if (d1[n] > d2[n]) return ( 1);
4641 if (d1[n] < d2[n]) return (-1);
4642 }
4643
4644 return (0);
4645 }
4646
4647 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4648 {
4649 const uint32_t *d1 = (const uint32_t *) v1;
4650 const uint32_t *d2 = (const uint32_t *) v2;
4651
4652 const uint dgst_pos0 = data.dgst_pos0;
4653 const uint dgst_pos1 = data.dgst_pos1;
4654 const uint dgst_pos2 = data.dgst_pos2;
4655 const uint dgst_pos3 = data.dgst_pos3;
4656
4657 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4658 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4659 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4660 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4661 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4662 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4663 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4664 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4665
4666 return (0);
4667 }
4668
4669 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)
4670 {
4671 uint outfile_autohex = data.outfile_autohex;
4672
4673 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4674
4675 FILE *debug_fp = NULL;
4676
4677 if (debug_file != NULL)
4678 {
4679 debug_fp = fopen (debug_file, "ab");
4680 }
4681 else
4682 {
4683 debug_fp = stderr;
4684 }
4685
4686 if (debug_fp == NULL)
4687 {
4688 log_info ("WARNING: Could not open debug-file for writing");
4689 }
4690 else
4691 {
4692 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4693 {
4694 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4695
4696 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4697 }
4698
4699 fwrite (rule_ptr, rule_len, 1, debug_fp);
4700
4701 if (debug_mode == 4)
4702 {
4703 fputc (':', debug_fp);
4704
4705 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4706 }
4707
4708 fputc ('\n', debug_fp);
4709
4710 if (debug_file != NULL) fclose (debug_fp);
4711 }
4712 }
4713
4714 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4715 {
4716 int needs_hexify = 0;
4717
4718 if (outfile_autohex == 1)
4719 {
4720 for (uint i = 0; i < plain_len; i++)
4721 {
4722 if (plain_ptr[i] < 0x20)
4723 {
4724 needs_hexify = 1;
4725
4726 break;
4727 }
4728
4729 if (plain_ptr[i] > 0x7f)
4730 {
4731 needs_hexify = 1;
4732
4733 break;
4734 }
4735 }
4736 }
4737
4738 if (needs_hexify == 1)
4739 {
4740 fprintf (fp, "$HEX[");
4741
4742 for (uint i = 0; i < plain_len; i++)
4743 {
4744 fprintf (fp, "%02x", plain_ptr[i]);
4745 }
4746
4747 fprintf (fp, "]");
4748 }
4749 else
4750 {
4751 fwrite (plain_ptr, plain_len, 1, fp);
4752 }
4753 }
4754
4755 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)
4756 {
4757 uint outfile_format = data.outfile_format;
4758
4759 char separator = data.separator;
4760
4761 if (outfile_format & OUTFILE_FMT_HASH)
4762 {
4763 fprintf (out_fp, "%s", out_buf);
4764
4765 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4766 {
4767 fputc (separator, out_fp);
4768 }
4769 }
4770 else if (data.username)
4771 {
4772 if (username != NULL)
4773 {
4774 for (uint i = 0; i < user_len; i++)
4775 {
4776 fprintf (out_fp, "%c", username[i]);
4777 }
4778
4779 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4780 {
4781 fputc (separator, out_fp);
4782 }
4783 }
4784 }
4785
4786 if (outfile_format & OUTFILE_FMT_PLAIN)
4787 {
4788 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4789
4790 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4791 {
4792 fputc (separator, out_fp);
4793 }
4794 }
4795
4796 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4797 {
4798 for (uint i = 0; i < plain_len; i++)
4799 {
4800 fprintf (out_fp, "%02x", plain_ptr[i]);
4801 }
4802
4803 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4804 {
4805 fputc (separator, out_fp);
4806 }
4807 }
4808
4809 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4810 {
4811 #ifdef _WIN
4812 __mingw_fprintf (out_fp, "%llu", crackpos);
4813 #endif
4814
4815 #ifdef _POSIX
4816 #ifdef __x86_64__
4817 fprintf (out_fp, "%lu", crackpos);
4818 #else
4819 fprintf (out_fp, "%llu", crackpos);
4820 #endif
4821 #endif
4822 }
4823
4824 fputc ('\n', out_fp);
4825 }
4826
4827 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)
4828 {
4829 pot_t pot_key;
4830
4831 pot_key.hash.salt = hashes_buf->salt;
4832 pot_key.hash.digest = hashes_buf->digest;
4833
4834 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4835
4836 if (pot_ptr)
4837 {
4838 log_info_nn ("");
4839
4840 input_buf[input_len] = 0;
4841
4842 // user
4843 unsigned char *username = NULL;
4844 uint user_len = 0;
4845
4846 if (data.username)
4847 {
4848 user_t *user = hashes_buf->hash_info->user;
4849
4850 if (user)
4851 {
4852 username = (unsigned char *) (user->user_name);
4853
4854 user_len = user->user_len;
4855 }
4856 }
4857
4858 // do output the line
4859 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
4860 }
4861 }
4862
4863 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
4864 #define LM_MASKED_PLAIN "[notfound]"
4865
4866 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)
4867 {
4868 // left
4869
4870 pot_t pot_left_key;
4871
4872 pot_left_key.hash.salt = hash_left->salt;
4873 pot_left_key.hash.digest = hash_left->digest;
4874
4875 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4876
4877 // right
4878
4879 uint weak_hash_found = 0;
4880
4881 pot_t pot_right_key;
4882
4883 pot_right_key.hash.salt = hash_right->salt;
4884 pot_right_key.hash.digest = hash_right->digest;
4885
4886 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4887
4888 if (pot_right_ptr == NULL)
4889 {
4890 // special case, if "weak hash"
4891
4892 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
4893 {
4894 weak_hash_found = 1;
4895
4896 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4897
4898 // in theory this is not needed, but we are paranoia:
4899
4900 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4901 pot_right_ptr->plain_len = 0;
4902 }
4903 }
4904
4905 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
4906 {
4907 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
4908
4909 return;
4910 }
4911
4912 // at least one half was found:
4913
4914 log_info_nn ("");
4915
4916 input_buf[input_len] = 0;
4917
4918 // user
4919
4920 unsigned char *username = NULL;
4921 uint user_len = 0;
4922
4923 if (data.username)
4924 {
4925 user_t *user = hash_left->hash_info->user;
4926
4927 if (user)
4928 {
4929 username = (unsigned char *) (user->user_name);
4930
4931 user_len = user->user_len;
4932 }
4933 }
4934
4935 // mask the part which was not found
4936
4937 uint left_part_masked = 0;
4938 uint right_part_masked = 0;
4939
4940 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
4941
4942 if (pot_left_ptr == NULL)
4943 {
4944 left_part_masked = 1;
4945
4946 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4947
4948 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
4949
4950 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
4951 pot_left_ptr->plain_len = mask_plain_len;
4952 }
4953
4954 if (pot_right_ptr == NULL)
4955 {
4956 right_part_masked = 1;
4957
4958 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4959
4960 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4961
4962 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
4963 pot_right_ptr->plain_len = mask_plain_len;
4964 }
4965
4966 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
4967
4968 pot_t pot_ptr;
4969
4970 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
4971
4972 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
4973
4974 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
4975
4976 // do output the line
4977
4978 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
4979
4980 if (weak_hash_found == 1) myfree (pot_right_ptr);
4981
4982 if (left_part_masked == 1) myfree (pot_left_ptr);
4983 if (right_part_masked == 1) myfree (pot_right_ptr);
4984 }
4985
4986 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)
4987 {
4988 pot_t pot_key;
4989
4990 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
4991
4992 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4993
4994 if (pot_ptr == NULL)
4995 {
4996 log_info_nn ("");
4997
4998 input_buf[input_len] = 0;
4999
5000 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5001 }
5002 }
5003
5004 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)
5005 {
5006 // left
5007
5008 pot_t pot_left_key;
5009
5010 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5011
5012 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5013
5014 // right
5015
5016 pot_t pot_right_key;
5017
5018 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5019
5020 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5021
5022 uint weak_hash_found = 0;
5023
5024 if (pot_right_ptr == NULL)
5025 {
5026 // special case, if "weak hash"
5027
5028 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5029 {
5030 weak_hash_found = 1;
5031
5032 // we just need that pot_right_ptr is not a NULL pointer
5033
5034 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5035 }
5036 }
5037
5038 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5039 {
5040 if (weak_hash_found == 1) myfree (pot_right_ptr);
5041
5042 return;
5043 }
5044
5045 // ... at least one part was not cracked
5046
5047 log_info_nn ("");
5048
5049 input_buf[input_len] = 0;
5050
5051 // only show the hash part which is still not cracked
5052
5053 uint user_len = input_len - 32;
5054
5055 char hash_output[user_len + 33];
5056
5057 memset (hash_output, 0, sizeof (hash_output));
5058
5059 memcpy (hash_output, input_buf, input_len);
5060
5061 if (pot_left_ptr != NULL)
5062 {
5063 // only show right part (because left part was already found)
5064
5065 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5066
5067 hash_output[user_len + 16] = 0;
5068 }
5069
5070 if (pot_right_ptr != NULL)
5071 {
5072 // only show left part (because right part was already found)
5073
5074 memcpy (hash_output + user_len, input_buf + user_len, 16);
5075
5076 hash_output[user_len + 16] = 0;
5077 }
5078
5079 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5080
5081 if (weak_hash_found == 1) myfree (pot_right_ptr);
5082 }
5083
5084 uint devices_to_devicemask (char *gpu_devices)
5085 {
5086 uint gpu_devicemask = 0;
5087
5088 if (gpu_devices)
5089 {
5090 char *devices = strdup (gpu_devices);
5091
5092 char *next = strtok (devices, ",");
5093
5094 do
5095 {
5096 uint gpu_id = atoi (next);
5097
5098 if (gpu_id < 1 || gpu_id > 8)
5099 {
5100 log_error ("ERROR: invalid gpu_id %u specified", gpu_id);
5101
5102 exit (-1);
5103 }
5104
5105 gpu_devicemask |= 1 << (gpu_id - 1);
5106
5107 } while ((next = strtok (NULL, ",")) != NULL);
5108
5109 free (devices);
5110 }
5111
5112 return gpu_devicemask;
5113 }
5114
5115 uint get_random_num (uint min, uint max)
5116 {
5117 if (min == max) return (min);
5118
5119 return (uint) ((rand () % (max - min)) + min);
5120 }
5121
5122 uint32_t mydivc32 (const uint32_t dividend, const uint32_t divisor)
5123 {
5124 uint32_t quotient = dividend / divisor;
5125
5126 if (dividend % divisor) quotient++;
5127
5128 return quotient;
5129 }
5130
5131 uint64_t mydivc64 (const uint64_t dividend, const uint64_t divisor)
5132 {
5133 uint64_t quotient = dividend / divisor;
5134
5135 if (dividend % divisor) quotient++;
5136
5137 return quotient;
5138 }
5139
5140 void format_timer_display (struct tm *tm, char *buf, size_t len)
5141 {
5142 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5143 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5144
5145 if (tm->tm_year - 70)
5146 {
5147 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5148 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5149
5150 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5151 }
5152 else if (tm->tm_yday)
5153 {
5154 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5155 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5156
5157 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5158 }
5159 else if (tm->tm_hour)
5160 {
5161 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5162 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5163
5164 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5165 }
5166 else if (tm->tm_min)
5167 {
5168 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5169 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5170
5171 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5172 }
5173 else
5174 {
5175 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5176
5177 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5178 }
5179 }
5180
5181 void format_speed_display (float val, char *buf, size_t len)
5182 {
5183 if (val <= 0)
5184 {
5185 buf[0] = '0';
5186 buf[1] = ' ';
5187 buf[2] = 0;
5188
5189 return;
5190 }
5191
5192 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5193
5194 uint level = 0;
5195
5196 while (val > 99999)
5197 {
5198 val /= 1000;
5199
5200 level++;
5201 }
5202
5203 /* generate output */
5204
5205 if (level == 0)
5206 {
5207 snprintf (buf, len - 1, "%.0f ", val);
5208 }
5209 else
5210 {
5211 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5212 }
5213 }
5214
5215 void lowercase (char *buf, int len)
5216 {
5217 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5218 }
5219
5220 void uppercase (char *buf, int len)
5221 {
5222 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5223 }
5224
5225 int fgetl (FILE *fp, char *line_buf)
5226 {
5227 int line_len = 0;
5228
5229 while (!feof (fp))
5230 {
5231 const int c = fgetc (fp);
5232
5233 if (c == EOF) break;
5234
5235 line_buf[line_len] = (char) c;
5236
5237 line_len++;
5238
5239 if (line_len == BUFSIZ) line_len--;
5240
5241 if (c == '\n') break;
5242 }
5243
5244 if (line_len == 0) return 0;
5245
5246 if (line_buf[line_len - 1] == '\n')
5247 {
5248 line_len--;
5249
5250 line_buf[line_len] = 0;
5251 }
5252
5253 if (line_len == 0) return 0;
5254
5255 if (line_buf[line_len - 1] == '\r')
5256 {
5257 line_len--;
5258
5259 line_buf[line_len] = 0;
5260 }
5261
5262 return (line_len);
5263 }
5264
5265 int in_superchop (char *buf)
5266 {
5267 int len = strlen (buf);
5268
5269 while (len)
5270 {
5271 if (buf[len - 1] == '\n')
5272 {
5273 len--;
5274
5275 continue;
5276 }
5277
5278 if (buf[len - 1] == '\r')
5279 {
5280 len--;
5281
5282 continue;
5283 }
5284
5285 break;
5286 }
5287
5288 buf[len] = 0;
5289
5290 return len;
5291 }
5292
5293 char **scan_directory (const char *path)
5294 {
5295 char *tmp_path = mystrdup (path);
5296
5297 size_t tmp_path_len = strlen (tmp_path);
5298
5299 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5300 {
5301 tmp_path[tmp_path_len - 1] = 0;
5302
5303 tmp_path_len = strlen (tmp_path);
5304 }
5305
5306 char **files = NULL;
5307
5308 int num_files = 0;
5309
5310 DIR *d;
5311
5312 if ((d = opendir (tmp_path)) != NULL)
5313 {
5314 struct dirent *de;
5315
5316 while ((de = readdir (d)) != NULL)
5317 {
5318 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5319
5320 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5321
5322 char *path_file = (char *) mymalloc (path_size + 1);
5323
5324 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5325
5326 path_file[path_size] = 0;
5327
5328 DIR *d_test;
5329
5330 if ((d_test = opendir (path_file)) != NULL)
5331 {
5332 closedir (d_test);
5333
5334 myfree (path_file);
5335 }
5336 else
5337 {
5338 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5339
5340 num_files++;
5341
5342 files[num_files - 1] = path_file;
5343 }
5344 }
5345
5346 closedir (d);
5347 }
5348 else if (errno == ENOTDIR)
5349 {
5350 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5351
5352 num_files++;
5353
5354 files[num_files - 1] = mystrdup (path);
5355 }
5356
5357 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5358
5359 num_files++;
5360
5361 files[num_files - 1] = NULL;
5362
5363 myfree (tmp_path);
5364
5365 return (files);
5366 }
5367
5368 int count_dictionaries (char **dictionary_files)
5369 {
5370 if (dictionary_files == NULL) return 0;
5371
5372 int cnt = 0;
5373
5374 for (int d = 0; dictionary_files[d] != NULL; d++)
5375 {
5376 cnt++;
5377 }
5378
5379 return (cnt);
5380 }
5381
5382 char *stroptitype (const uint opti_type)
5383 {
5384 switch (opti_type)
5385 {
5386 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5387 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5388 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5389 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5390 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5391 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5392 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5393 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5394 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5395 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5396 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5397 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5398 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5399 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5400 }
5401
5402 return (NULL);
5403 }
5404
5405 char *strparser (const uint parser_status)
5406 {
5407 switch (parser_status)
5408 {
5409 case PARSER_OK: return ((char *) PA_000); break;
5410 case PARSER_COMMENT: return ((char *) PA_001); break;
5411 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5412 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5413 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5414 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5415 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5416 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5417 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5418 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5419 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5420 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5421 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5422 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5423 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5424 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5425 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5426 }
5427
5428 return ((char *) PA_255);
5429 }
5430
5431 char *strhashtype (const uint hash_mode)
5432 {
5433 switch (hash_mode)
5434 {
5435 case 0: return ((char *) HT_00000); break;
5436 case 10: return ((char *) HT_00010); break;
5437 case 11: return ((char *) HT_00011); break;
5438 case 12: return ((char *) HT_00012); break;
5439 case 20: return ((char *) HT_00020); break;
5440 case 21: return ((char *) HT_00021); break;
5441 case 22: return ((char *) HT_00022); break;
5442 case 23: return ((char *) HT_00023); break;
5443 case 30: return ((char *) HT_00030); break;
5444 case 40: return ((char *) HT_00040); break;
5445 case 50: return ((char *) HT_00050); break;
5446 case 60: return ((char *) HT_00060); break;
5447 case 100: return ((char *) HT_00100); break;
5448 case 101: return ((char *) HT_00101); break;
5449 case 110: return ((char *) HT_00110); break;
5450 case 111: return ((char *) HT_00111); break;
5451 case 112: return ((char *) HT_00112); break;
5452 case 120: return ((char *) HT_00120); break;
5453 case 121: return ((char *) HT_00121); break;
5454 case 122: return ((char *) HT_00122); break;
5455 case 124: return ((char *) HT_00124); break;
5456 case 130: return ((char *) HT_00130); break;
5457 case 131: return ((char *) HT_00131); break;
5458 case 132: return ((char *) HT_00132); break;
5459 case 133: return ((char *) HT_00133); break;
5460 case 140: return ((char *) HT_00140); break;
5461 case 141: return ((char *) HT_00141); break;
5462 case 150: return ((char *) HT_00150); break;
5463 case 160: return ((char *) HT_00160); break;
5464 case 190: return ((char *) HT_00190); break;
5465 case 200: return ((char *) HT_00200); break;
5466 case 300: return ((char *) HT_00300); break;
5467 case 400: return ((char *) HT_00400); break;
5468 case 500: return ((char *) HT_00500); break;
5469 case 501: return ((char *) HT_00501); break;
5470 case 900: return ((char *) HT_00900); break;
5471 case 910: return ((char *) HT_00910); break;
5472 case 1000: return ((char *) HT_01000); break;
5473 case 1100: return ((char *) HT_01100); break;
5474 case 1400: return ((char *) HT_01400); break;
5475 case 1410: return ((char *) HT_01410); break;
5476 case 1420: return ((char *) HT_01420); break;
5477 case 1421: return ((char *) HT_01421); break;
5478 case 1430: return ((char *) HT_01430); break;
5479 case 1440: return ((char *) HT_01440); break;
5480 case 1441: return ((char *) HT_01441); break;
5481 case 1450: return ((char *) HT_01450); break;
5482 case 1460: return ((char *) HT_01460); break;
5483 case 1500: return ((char *) HT_01500); break;
5484 case 1600: return ((char *) HT_01600); break;
5485 case 1700: return ((char *) HT_01700); break;
5486 case 1710: return ((char *) HT_01710); break;
5487 case 1711: return ((char *) HT_01711); break;
5488 case 1720: return ((char *) HT_01720); break;
5489 case 1722: return ((char *) HT_01722); break;
5490 case 1730: return ((char *) HT_01730); break;
5491 case 1731: return ((char *) HT_01731); break;
5492 case 1740: return ((char *) HT_01740); break;
5493 case 1750: return ((char *) HT_01750); break;
5494 case 1760: return ((char *) HT_01760); break;
5495 case 1800: return ((char *) HT_01800); break;
5496 case 2100: return ((char *) HT_02100); break;
5497 case 2400: return ((char *) HT_02400); break;
5498 case 2410: return ((char *) HT_02410); break;
5499 case 2500: return ((char *) HT_02500); break;
5500 case 2600: return ((char *) HT_02600); break;
5501 case 2611: return ((char *) HT_02611); break;
5502 case 2612: return ((char *) HT_02612); break;
5503 case 2711: return ((char *) HT_02711); break;
5504 case 2811: return ((char *) HT_02811); break;
5505 case 3000: return ((char *) HT_03000); break;
5506 case 3100: return ((char *) HT_03100); break;
5507 case 3200: return ((char *) HT_03200); break;
5508 case 3710: return ((char *) HT_03710); break;
5509 case 3711: return ((char *) HT_03711); break;
5510 case 3800: return ((char *) HT_03800); break;
5511 case 4300: return ((char *) HT_04300); break;
5512 case 4400: return ((char *) HT_04400); break;
5513 case 4500: return ((char *) HT_04500); break;
5514 case 4700: return ((char *) HT_04700); break;
5515 case 4800: return ((char *) HT_04800); break;
5516 case 4900: return ((char *) HT_04900); break;
5517 case 5000: return ((char *) HT_05000); break;
5518 case 5100: return ((char *) HT_05100); break;
5519 case 5200: return ((char *) HT_05200); break;
5520 case 5300: return ((char *) HT_05300); break;
5521 case 5400: return ((char *) HT_05400); break;
5522 case 5500: return ((char *) HT_05500); break;
5523 case 5600: return ((char *) HT_05600); break;
5524 case 5700: return ((char *) HT_05700); break;
5525 case 5800: return ((char *) HT_05800); break;
5526 case 6000: return ((char *) HT_06000); break;
5527 case 6100: return ((char *) HT_06100); break;
5528 case 6211: return ((char *) HT_06211); break;
5529 case 6212: return ((char *) HT_06212); break;
5530 case 6213: return ((char *) HT_06213); break;
5531 case 6221: return ((char *) HT_06221); break;
5532 case 6222: return ((char *) HT_06222); break;
5533 case 6223: return ((char *) HT_06223); break;
5534 case 6231: return ((char *) HT_06231); break;
5535 case 6232: return ((char *) HT_06232); break;
5536 case 6233: return ((char *) HT_06233); break;
5537 case 6241: return ((char *) HT_06241); break;
5538 case 6242: return ((char *) HT_06242); break;
5539 case 6243: return ((char *) HT_06243); break;
5540 case 6300: return ((char *) HT_06300); break;
5541 case 6400: return ((char *) HT_06400); break;
5542 case 6500: return ((char *) HT_06500); break;
5543 case 6600: return ((char *) HT_06600); break;
5544 case 6700: return ((char *) HT_06700); break;
5545 case 6800: return ((char *) HT_06800); break;
5546 case 6900: return ((char *) HT_06900); break;
5547 case 7100: return ((char *) HT_07100); break;
5548 case 7200: return ((char *) HT_07200); break;
5549 case 7300: return ((char *) HT_07300); break;
5550 case 7400: return ((char *) HT_07400); break;
5551 case 7500: return ((char *) HT_07500); break;
5552 case 7600: return ((char *) HT_07600); break;
5553 case 7700: return ((char *) HT_07700); break;
5554 case 7800: return ((char *) HT_07800); break;
5555 case 7900: return ((char *) HT_07900); break;
5556 case 8000: return ((char *) HT_08000); break;
5557 case 8100: return ((char *) HT_08100); break;
5558 case 8200: return ((char *) HT_08200); break;
5559 case 8300: return ((char *) HT_08300); break;
5560 case 8400: return ((char *) HT_08400); break;
5561 case 8500: return ((char *) HT_08500); break;
5562 case 8600: return ((char *) HT_08600); break;
5563 case 8700: return ((char *) HT_08700); break;
5564 case 8800: return ((char *) HT_08800); break;
5565 case 8900: return ((char *) HT_08900); break;
5566 case 9000: return ((char *) HT_09000); break;
5567 case 9100: return ((char *) HT_09100); break;
5568 case 9200: return ((char *) HT_09200); break;
5569 case 9300: return ((char *) HT_09300); break;
5570 case 9400: return ((char *) HT_09400); break;
5571 case 9500: return ((char *) HT_09500); break;
5572 case 9600: return ((char *) HT_09600); break;
5573 case 9700: return ((char *) HT_09700); break;
5574 case 9710: return ((char *) HT_09710); break;
5575 case 9720: return ((char *) HT_09720); break;
5576 case 9800: return ((char *) HT_09800); break;
5577 case 9810: return ((char *) HT_09810); break;
5578 case 9820: return ((char *) HT_09820); break;
5579 case 9900: return ((char *) HT_09900); break;
5580 case 10000: return ((char *) HT_10000); break;
5581 case 10100: return ((char *) HT_10100); break;
5582 case 10200: return ((char *) HT_10200); break;
5583 case 10300: return ((char *) HT_10300); break;
5584 case 10400: return ((char *) HT_10400); break;
5585 case 10410: return ((char *) HT_10410); break;
5586 case 10420: return ((char *) HT_10420); break;
5587 case 10500: return ((char *) HT_10500); break;
5588 case 10600: return ((char *) HT_10600); break;
5589 case 10700: return ((char *) HT_10700); break;
5590 case 10800: return ((char *) HT_10800); break;
5591 case 10900: return ((char *) HT_10900); break;
5592 case 11000: return ((char *) HT_11000); break;
5593 case 11100: return ((char *) HT_11100); break;
5594 case 11200: return ((char *) HT_11200); break;
5595 case 11300: return ((char *) HT_11300); break;
5596 case 11400: return ((char *) HT_11400); break;
5597 case 11500: return ((char *) HT_11500); break;
5598 case 11600: return ((char *) HT_11600); break;
5599 case 11700: return ((char *) HT_11700); break;
5600 case 11800: return ((char *) HT_11800); break;
5601 case 11900: return ((char *) HT_11900); break;
5602 case 12000: return ((char *) HT_12000); break;
5603 case 12100: return ((char *) HT_12100); break;
5604 case 12200: return ((char *) HT_12200); break;
5605 case 12300: return ((char *) HT_12300); break;
5606 case 12400: return ((char *) HT_12400); break;
5607 case 12500: return ((char *) HT_12500); break;
5608 case 12600: return ((char *) HT_12600); break;
5609 case 12700: return ((char *) HT_12700); break;
5610 case 12800: return ((char *) HT_12800); break;
5611 }
5612
5613 return ((char *) "Unknown");
5614 }
5615
5616 char *strstatus (const uint devices_status)
5617 {
5618 switch (devices_status)
5619 {
5620 case STATUS_INIT: return ((char *) ST_0000); break;
5621 case STATUS_STARTING: return ((char *) ST_0001); break;
5622 case STATUS_RUNNING: return ((char *) ST_0002); break;
5623 case STATUS_PAUSED: return ((char *) ST_0003); break;
5624 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5625 case STATUS_CRACKED: return ((char *) ST_0005); break;
5626 case STATUS_ABORTED: return ((char *) ST_0006); break;
5627 case STATUS_QUIT: return ((char *) ST_0007); break;
5628 case STATUS_BYPASS: return ((char *) ST_0008); break;
5629 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5630 }
5631
5632 return ((char *) "Unknown");
5633 }
5634
5635 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5636 {
5637 uint hash_type = data.hash_type;
5638 uint hash_mode = data.hash_mode;
5639 uint salt_type = data.salt_type;
5640 uint opts_type = data.opts_type;
5641 uint opti_type = data.opti_type;
5642 uint dgst_size = data.dgst_size;
5643
5644 char *hashfile = data.hashfile;
5645
5646 uint len = 4096;
5647
5648 uint digest_buf[64];
5649
5650 uint64_t *digest_buf64 = (uint64_t *) digest_buf;
5651
5652 char *digests_buf_ptr = (char *) data.digests_buf;
5653
5654 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5655
5656 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5657 {
5658 uint tt;
5659
5660 switch (hash_type)
5661 {
5662 case HASH_TYPE_DESCRYPT:
5663 FP (digest_buf[1], digest_buf[0], tt);
5664 break;
5665
5666 case HASH_TYPE_DESRACF:
5667 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 29);
5668 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 29);
5669
5670 FP (digest_buf[1], digest_buf[0], tt);
5671 break;
5672
5673 case HASH_TYPE_LM:
5674 FP (digest_buf[1], digest_buf[0], tt);
5675 break;
5676
5677 case HASH_TYPE_NETNTLM:
5678 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 29);
5679 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 29);
5680 digest_buf[2] = ROTATE_LEFT (digest_buf[2], 29);
5681 digest_buf[3] = ROTATE_LEFT (digest_buf[3], 29);
5682
5683 FP (digest_buf[1], digest_buf[0], tt);
5684 FP (digest_buf[3], digest_buf[2], tt);
5685 break;
5686
5687 case HASH_TYPE_BSDICRYPT:
5688 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 31);
5689 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 31);
5690
5691 FP (digest_buf[1], digest_buf[0], tt);
5692 break;
5693 }
5694 }
5695
5696 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5697 {
5698 switch (hash_type)
5699 {
5700 case HASH_TYPE_MD4:
5701 digest_buf[0] += MD4M_A;
5702 digest_buf[1] += MD4M_B;
5703 digest_buf[2] += MD4M_C;
5704 digest_buf[3] += MD4M_D;
5705 break;
5706
5707 case HASH_TYPE_MD5:
5708 digest_buf[0] += MD5M_A;
5709 digest_buf[1] += MD5M_B;
5710 digest_buf[2] += MD5M_C;
5711 digest_buf[3] += MD5M_D;
5712 break;
5713
5714 case HASH_TYPE_SHA1:
5715 digest_buf[0] += SHA1M_A;
5716 digest_buf[1] += SHA1M_B;
5717 digest_buf[2] += SHA1M_C;
5718 digest_buf[3] += SHA1M_D;
5719 digest_buf[4] += SHA1M_E;
5720 break;
5721
5722 case HASH_TYPE_SHA256:
5723 digest_buf[0] += SHA256M_A;
5724 digest_buf[1] += SHA256M_B;
5725 digest_buf[2] += SHA256M_C;
5726 digest_buf[3] += SHA256M_D;
5727 digest_buf[4] += SHA256M_E;
5728 digest_buf[5] += SHA256M_F;
5729 digest_buf[6] += SHA256M_G;
5730 digest_buf[7] += SHA256M_H;
5731 break;
5732
5733 case HASH_TYPE_SHA384:
5734 digest_buf64[0] += SHA384M_A;
5735 digest_buf64[1] += SHA384M_B;
5736 digest_buf64[2] += SHA384M_C;
5737 digest_buf64[3] += SHA384M_D;
5738 digest_buf64[4] += SHA384M_E;
5739 digest_buf64[5] += SHA384M_F;
5740 digest_buf64[6] += 0;
5741 digest_buf64[7] += 0;
5742 break;
5743
5744 case HASH_TYPE_SHA512:
5745 digest_buf64[0] += SHA512M_A;
5746 digest_buf64[1] += SHA512M_B;
5747 digest_buf64[2] += SHA512M_C;
5748 digest_buf64[3] += SHA512M_D;
5749 digest_buf64[4] += SHA512M_E;
5750 digest_buf64[5] += SHA512M_F;
5751 digest_buf64[6] += SHA512M_G;
5752 digest_buf64[7] += SHA512M_H;
5753 break;
5754 }
5755 }
5756
5757 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
5758 {
5759 if (dgst_size == DGST_SIZE_4_2)
5760 {
5761 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5762 }
5763 else if (dgst_size == DGST_SIZE_4_4)
5764 {
5765 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5766 }
5767 else if (dgst_size == DGST_SIZE_4_5)
5768 {
5769 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5770 }
5771 else if (dgst_size == DGST_SIZE_4_6)
5772 {
5773 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5774 }
5775 else if (dgst_size == DGST_SIZE_4_8)
5776 {
5777 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5778 }
5779 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
5780 {
5781 if (hash_type == HASH_TYPE_WHIRLPOOL)
5782 {
5783 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5784 }
5785 else if (hash_type == HASH_TYPE_SHA384)
5786 {
5787 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5788 }
5789 else if (hash_type == HASH_TYPE_SHA512)
5790 {
5791 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5792 }
5793 else if (hash_type == HASH_TYPE_GOST)
5794 {
5795 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5796 }
5797 }
5798 else if (dgst_size == DGST_SIZE_4_64)
5799 {
5800 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5801 }
5802 else if (dgst_size == DGST_SIZE_8_25)
5803 {
5804 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5805 }
5806 }
5807
5808 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
5809 | (data.salt_type == SALT_TYPE_EXTERN)
5810 | (data.salt_type == SALT_TYPE_EMBEDDED));
5811
5812 salt_t salt;
5813
5814 if (isSalted)
5815 {
5816 memset (&salt, 0, sizeof (salt_t));
5817
5818 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
5819
5820 char *ptr = (char *) salt.salt_buf;
5821
5822 uint len = salt.salt_len;
5823
5824 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5825 {
5826 uint tt;
5827
5828 switch (hash_type)
5829 {
5830 case HASH_TYPE_NETNTLM:
5831
5832 salt.salt_buf[0] = ROTATE_RIGHT (salt.salt_buf[0], 3);
5833 salt.salt_buf[1] = ROTATE_RIGHT (salt.salt_buf[1], 3);
5834
5835 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
5836
5837 break;
5838 }
5839 }
5840
5841 if (opts_type & OPTS_TYPE_ST_UNICODE)
5842 {
5843 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5844 {
5845 ptr[i] = ptr[j];
5846 }
5847
5848 len = len / 2;
5849 }
5850
5851 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
5852 {
5853 uint max = salt.salt_len / 4;
5854
5855 if (len % 4) max++;
5856
5857 for (uint i = 0; i < max; i++)
5858 {
5859 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
5860 }
5861 }
5862
5863 if (opts_type & OPTS_TYPE_ST_HEX)
5864 {
5865 char tmp[64];
5866
5867 memset (tmp, 0, sizeof (tmp));
5868
5869 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5870 {
5871 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
5872 }
5873
5874 len = len * 2;
5875
5876 memcpy (ptr, tmp, len);
5877 }
5878
5879 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
5880
5881 memset (ptr + len, 0, memset_size);
5882
5883 salt.salt_len = len;
5884 }
5885
5886 //
5887 // some modes require special encoding
5888 //
5889
5890 uint out_buf_plain[256];
5891 uint out_buf_salt[256];
5892
5893 char tmp_buf[1024];
5894
5895 memset (out_buf_plain, 0, sizeof (out_buf_plain));
5896 memset (out_buf_salt, 0, sizeof (out_buf_salt));
5897
5898 memset (tmp_buf, 0, sizeof (tmp_buf));
5899
5900 char *ptr_plain = (char *) out_buf_plain;
5901 char *ptr_salt = (char *) out_buf_salt;
5902
5903 if (hash_mode == 22)
5904 {
5905 char username[30];
5906
5907 memset (username, 0, sizeof (username));
5908
5909 memcpy (username, salt.salt_buf, salt.salt_len - 22);
5910
5911 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
5912
5913 uint16_t *ptr = (uint16_t *) digest_buf;
5914
5915 tmp_buf[ 0] = sig[0];
5916 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
5917 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
5918 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
5919 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
5920 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
5921 tmp_buf[ 6] = sig[1];
5922 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
5923 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
5924 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
5925 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
5926 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
5927 tmp_buf[12] = sig[2];
5928 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
5929 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
5930 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
5931 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
5932 tmp_buf[17] = sig[3];
5933 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
5934 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
5935 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
5936 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
5937 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
5938 tmp_buf[23] = sig[4];
5939 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
5940 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
5941 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
5942 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
5943 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
5944 tmp_buf[29] = sig[5];
5945
5946 snprintf (out_buf, len-1, "%s:%s",
5947 tmp_buf,
5948 username);
5949 }
5950 else if (hash_mode == 23)
5951 {
5952 // do not show the \nskyper\n part in output
5953
5954 char *salt_buf_ptr = (char *) salt.salt_buf;
5955
5956 salt_buf_ptr[salt.salt_len - 8] = 0;
5957
5958 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
5959 digest_buf[0],
5960 digest_buf[1],
5961 digest_buf[2],
5962 digest_buf[3],
5963 salt_buf_ptr);
5964 }
5965 else if (hash_mode == 101)
5966 {
5967 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
5968
5969 digest_buf[0] = byte_swap_32 (digest_buf[0]);
5970 digest_buf[1] = byte_swap_32 (digest_buf[1]);
5971 digest_buf[2] = byte_swap_32 (digest_buf[2]);
5972 digest_buf[3] = byte_swap_32 (digest_buf[3]);
5973 digest_buf[4] = byte_swap_32 (digest_buf[4]);
5974
5975 memcpy (tmp_buf, digest_buf, 20);
5976
5977 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
5978
5979 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
5980 }
5981 else if (hash_mode == 111)
5982 {
5983 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
5984
5985 digest_buf[0] = byte_swap_32 (digest_buf[0]);
5986 digest_buf[1] = byte_swap_32 (digest_buf[1]);
5987 digest_buf[2] = byte_swap_32 (digest_buf[2]);
5988 digest_buf[3] = byte_swap_32 (digest_buf[3]);
5989 digest_buf[4] = byte_swap_32 (digest_buf[4]);
5990
5991 memcpy (tmp_buf, digest_buf, 20);
5992 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
5993
5994 base64_encode (int_to_base64, tmp_buf, 20 + salt.salt_len, ptr_plain);
5995
5996 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
5997 }
5998 else if (hash_mode == 122)
5999 {
6000 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6001 (unsigned char *) salt.salt_buf,
6002 digest_buf[0],
6003 digest_buf[1],
6004 digest_buf[2],
6005 digest_buf[3],
6006 digest_buf[4]);
6007 }
6008 else if (hash_mode == 124)
6009 {
6010 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6011 (unsigned char *) salt.salt_buf,
6012 digest_buf[0],
6013 digest_buf[1],
6014 digest_buf[2],
6015 digest_buf[3],
6016 digest_buf[4]);
6017 }
6018 else if (hash_mode == 131)
6019 {
6020 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6021 (unsigned char *) salt.salt_buf,
6022 0, 0, 0, 0, 0,
6023 digest_buf[0],
6024 digest_buf[1],
6025 digest_buf[2],
6026 digest_buf[3],
6027 digest_buf[4]);
6028 }
6029 else if (hash_mode == 132)
6030 {
6031 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6032 (unsigned char *) salt.salt_buf,
6033 digest_buf[0],
6034 digest_buf[1],
6035 digest_buf[2],
6036 digest_buf[3],
6037 digest_buf[4]);
6038 }
6039 else if (hash_mode == 133)
6040 {
6041 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6042
6043 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6044 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6045 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6046 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6047 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6048
6049 memcpy (tmp_buf, digest_buf, 20);
6050
6051 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
6052
6053 snprintf (out_buf, len-1, "%s", ptr_plain);
6054 }
6055 else if (hash_mode == 141)
6056 {
6057 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6058
6059 base64_encode (int_to_base64, tmp_buf, salt.salt_len, ptr_salt);
6060
6061 memset (tmp_buf, 0, sizeof (tmp_buf));
6062
6063 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6064
6065 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6066 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6067 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6068 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6069 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6070
6071 memcpy (tmp_buf, digest_buf, 20);
6072
6073 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
6074
6075 ptr_plain[27] = 0;
6076
6077 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6078 }
6079 else if (hash_mode == 400)
6080 {
6081 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6082
6083 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6084 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6085 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6086 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6087
6088 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6089
6090 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6091 }
6092 else if (hash_mode == 500)
6093 {
6094 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6095
6096 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6097 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6098 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6099 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6100
6101 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6102
6103 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6104 {
6105 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6106 }
6107 else
6108 {
6109 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6110 }
6111 }
6112 else if (hash_mode == 501)
6113 {
6114 uint digest_idx = salt.digests_offset + digest_pos;
6115
6116 hashinfo_t **hashinfo_ptr = data.hash_info;
6117 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6118
6119 snprintf (out_buf, len-1, "%s", hash_buf);
6120 }
6121 else if (hash_mode == 1421)
6122 {
6123 uint8_t *salt_ptr = (uint8_t *) salt.salt_buf;
6124
6125 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6126 salt_ptr[0],
6127 salt_ptr[1],
6128 salt_ptr[2],
6129 salt_ptr[3],
6130 salt_ptr[4],
6131 salt_ptr[5],
6132 digest_buf[0],
6133 digest_buf[1],
6134 digest_buf[2],
6135 digest_buf[3],
6136 digest_buf[4],
6137 digest_buf[5],
6138 digest_buf[6],
6139 digest_buf[7]);
6140 }
6141 else if (hash_mode == 1441)
6142 {
6143 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6144
6145 base64_encode (int_to_base64, tmp_buf, salt.salt_len, ptr_salt);
6146
6147 memset (tmp_buf, 0, sizeof (tmp_buf));
6148
6149 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6150
6151 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6152 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6153 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6154 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6155 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6156 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6157 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6158 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6159
6160 memcpy (tmp_buf, digest_buf, 32);
6161
6162 base64_encode (int_to_base64, tmp_buf, 32, ptr_plain);
6163
6164 ptr_plain[43] = 0;
6165
6166 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6167 }
6168 else if (hash_mode == 1500)
6169 {
6170 out_buf[0] = salt.salt_sign[0] & 0xff;
6171 out_buf[1] = salt.salt_sign[1] & 0xff;
6172 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6173 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6174 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6175
6176 memset (tmp_buf, 0, sizeof (tmp_buf));
6177
6178 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6179
6180 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6181 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6182
6183 memcpy (tmp_buf, digest_buf, 8);
6184
6185 base64_encode (int_to_itoa64, tmp_buf, 8, ptr_plain);
6186
6187 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6188
6189 out_buf[13] = 0;
6190 }
6191 else if (hash_mode == 1600)
6192 {
6193 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6194
6195 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6196 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6197 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6198 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6199
6200 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6201
6202 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6203 {
6204 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6205 }
6206 else
6207 {
6208 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6209 }
6210 }
6211 else if (hash_mode == 1711)
6212 {
6213 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6214
6215 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6216 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6217 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6218 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6219 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6220 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6221 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6222 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6223
6224 memcpy (tmp_buf, digest_buf, 64);
6225 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6226
6227 base64_encode (int_to_base64, tmp_buf, 64 + salt.salt_len, ptr_plain);
6228
6229 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6230 }
6231 else if (hash_mode == 1722)
6232 {
6233 uint *ptr = digest_buf;
6234
6235 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6236 (unsigned char *) salt.salt_buf,
6237 ptr[ 1], ptr[ 0],
6238 ptr[ 3], ptr[ 2],
6239 ptr[ 5], ptr[ 4],
6240 ptr[ 7], ptr[ 6],
6241 ptr[ 9], ptr[ 8],
6242 ptr[11], ptr[10],
6243 ptr[13], ptr[12],
6244 ptr[15], ptr[14]);
6245 }
6246 else if (hash_mode == 1731)
6247 {
6248 uint *ptr = digest_buf;
6249
6250 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6251 (unsigned char *) salt.salt_buf,
6252 ptr[ 1], ptr[ 0],
6253 ptr[ 3], ptr[ 2],
6254 ptr[ 5], ptr[ 4],
6255 ptr[ 7], ptr[ 6],
6256 ptr[ 9], ptr[ 8],
6257 ptr[11], ptr[10],
6258 ptr[13], ptr[12],
6259 ptr[15], ptr[14]);
6260 }
6261 else if (hash_mode == 1800)
6262 {
6263 // temp workaround
6264
6265 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6266 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6267 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6268 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6269 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6270 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6271 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6272 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6273
6274 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6275
6276 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6277 {
6278 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6279 }
6280 else
6281 {
6282 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6283 }
6284 }
6285 else if (hash_mode == 2100)
6286 {
6287 uint pos = 0;
6288
6289 snprintf (out_buf + pos, len-1, "%s%i#",
6290 SIGNATURE_DCC2,
6291 salt.salt_iter + 1);
6292
6293 uint signature_len = strlen (out_buf);
6294
6295 pos += signature_len;
6296 len -= signature_len;
6297
6298 char *salt_ptr = (char *) salt.salt_buf;
6299
6300 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6301
6302 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6303 byte_swap_32 (digest_buf[0]),
6304 byte_swap_32 (digest_buf[1]),
6305 byte_swap_32 (digest_buf[2]),
6306 byte_swap_32 (digest_buf[3]));
6307 }
6308 else if ((hash_mode == 2400) || (hash_mode == 2410))
6309 {
6310 memcpy (tmp_buf, digest_buf, 16);
6311
6312 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6313
6314 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6315 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6316 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6317 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6318
6319 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6320 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6321 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6322 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6323
6324 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6325 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6326 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6327 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6328
6329 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6330 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6331 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6332 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6333
6334 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6335 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6336 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6337 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6338
6339 out_buf[16] = 0;
6340 }
6341 else if (hash_mode == 2500)
6342 {
6343 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6344
6345 wpa_t *wpa = &wpas[salt_pos];
6346
6347 uint pke[25];
6348
6349 char *pke_ptr = (char *) pke;
6350
6351 for (uint i = 0; i < 25; i++)
6352 {
6353 pke[i] = byte_swap_32 (wpa->pke[i]);
6354 }
6355
6356 unsigned char mac1[6];
6357 unsigned char mac2[6];
6358
6359 memcpy (mac1, pke_ptr + 23, 6);
6360 memcpy (mac2, pke_ptr + 29, 6);
6361
6362 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6363 (char *) salt.salt_buf,
6364 mac1[0],
6365 mac1[1],
6366 mac1[2],
6367 mac1[3],
6368 mac1[4],
6369 mac1[5],
6370 mac2[0],
6371 mac2[1],
6372 mac2[2],
6373 mac2[3],
6374 mac2[4],
6375 mac2[5]);
6376 }
6377 else if (hash_mode == 4400)
6378 {
6379 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6380 byte_swap_32 (digest_buf[0]),
6381 byte_swap_32 (digest_buf[1]),
6382 byte_swap_32 (digest_buf[2]),
6383 byte_swap_32 (digest_buf[3]));
6384 }
6385 else if (hash_mode == 4700)
6386 {
6387 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6388 byte_swap_32 (digest_buf[0]),
6389 byte_swap_32 (digest_buf[1]),
6390 byte_swap_32 (digest_buf[2]),
6391 byte_swap_32 (digest_buf[3]),
6392 byte_swap_32 (digest_buf[4]));
6393 }
6394 else if (hash_mode == 4800)
6395 {
6396 uint8_t chap_id_byte = (uint8_t) salt.salt_buf[4];
6397
6398 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6399 digest_buf[0],
6400 digest_buf[1],
6401 digest_buf[2],
6402 digest_buf[3],
6403 byte_swap_32 (salt.salt_buf[0]),
6404 byte_swap_32 (salt.salt_buf[1]),
6405 byte_swap_32 (salt.salt_buf[2]),
6406 byte_swap_32 (salt.salt_buf[3]),
6407 chap_id_byte);
6408 }
6409 else if (hash_mode == 4900)
6410 {
6411 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6412 byte_swap_32 (digest_buf[0]),
6413 byte_swap_32 (digest_buf[1]),
6414 byte_swap_32 (digest_buf[2]),
6415 byte_swap_32 (digest_buf[3]),
6416 byte_swap_32 (digest_buf[4]));
6417 }
6418 else if (hash_mode == 5100)
6419 {
6420 snprintf (out_buf, len-1, "%08x%08x",
6421 digest_buf[0],
6422 digest_buf[1]);
6423 }
6424 else if (hash_mode == 5200)
6425 {
6426 snprintf (out_buf, len-1, "%s", hashfile);
6427 }
6428 else if (hash_mode == 5300)
6429 {
6430 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6431
6432 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6433
6434 int buf_len = len -1;
6435
6436 // msg_buf
6437
6438 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6439
6440 for (uint i = 0; i < ikepsk_msg_len; i++)
6441 {
6442 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6443 {
6444 snprintf (out_buf, buf_len, ":");
6445
6446 buf_len--;
6447 out_buf++;
6448 }
6449
6450 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6451
6452 buf_len -= 8;
6453 out_buf += 8;
6454 }
6455
6456 // nr_buf
6457
6458 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6459
6460 for (uint i = 0; i < ikepsk_nr_len; i++)
6461 {
6462 if ((i == 0) || (i == 5))
6463 {
6464 snprintf (out_buf, buf_len, ":");
6465
6466 buf_len--;
6467 out_buf++;
6468 }
6469
6470 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6471
6472 buf_len -= 8;
6473 out_buf += 8;
6474 }
6475
6476 // digest_buf
6477
6478 for (uint i = 0; i < 4; i++)
6479 {
6480 if (i == 0)
6481 {
6482 snprintf (out_buf, buf_len, ":");
6483
6484 buf_len--;
6485 out_buf++;
6486 }
6487
6488 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6489
6490 buf_len -= 8;
6491 out_buf += 8;
6492 }
6493 }
6494 else if (hash_mode == 5400)
6495 {
6496 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6497
6498 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6499
6500 int buf_len = len -1;
6501
6502 // msg_buf
6503
6504 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6505
6506 for (uint i = 0; i < ikepsk_msg_len; i++)
6507 {
6508 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6509 {
6510 snprintf (out_buf, buf_len, ":");
6511
6512 buf_len--;
6513 out_buf++;
6514 }
6515
6516 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6517
6518 buf_len -= 8;
6519 out_buf += 8;
6520 }
6521
6522 // nr_buf
6523
6524 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6525
6526 for (uint i = 0; i < ikepsk_nr_len; i++)
6527 {
6528 if ((i == 0) || (i == 5))
6529 {
6530 snprintf (out_buf, buf_len, ":");
6531
6532 buf_len--;
6533 out_buf++;
6534 }
6535
6536 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6537
6538 buf_len -= 8;
6539 out_buf += 8;
6540 }
6541
6542 // digest_buf
6543
6544 for (uint i = 0; i < 5; i++)
6545 {
6546 if (i == 0)
6547 {
6548 snprintf (out_buf, buf_len, ":");
6549
6550 buf_len--;
6551 out_buf++;
6552 }
6553
6554 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6555
6556 buf_len -= 8;
6557 out_buf += 8;
6558 }
6559 }
6560 else if (hash_mode == 5500)
6561 {
6562 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6563
6564 netntlm_t *netntlm = &netntlms[salt_pos];
6565
6566 char user_buf[64];
6567 char domain_buf[64];
6568 char srvchall_buf[1024];
6569 char clichall_buf[1024];
6570
6571 memset (user_buf, 0, sizeof (user_buf));
6572 memset (domain_buf, 0, sizeof (domain_buf));
6573 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6574 memset (clichall_buf, 0, sizeof (clichall_buf));
6575
6576 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6577 {
6578 char *ptr = (char *) netntlm->userdomain_buf;
6579
6580 user_buf[i] = ptr[j];
6581 }
6582
6583 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6584 {
6585 char *ptr = (char *) netntlm->userdomain_buf;
6586
6587 domain_buf[i] = ptr[netntlm->user_len + j];
6588 }
6589
6590 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6591 {
6592 char *ptr = (char *) netntlm->chall_buf;
6593
6594 sprintf (srvchall_buf + j, "%02x", (uint8_t) ptr[i]);
6595 }
6596
6597 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6598 {
6599 char *ptr = (char *) netntlm->chall_buf;
6600
6601 sprintf (clichall_buf + j, "%02x", (uint8_t) ptr[netntlm->srvchall_len + i]);
6602 }
6603
6604 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6605 user_buf,
6606 domain_buf,
6607 srvchall_buf,
6608 digest_buf[0],
6609 digest_buf[1],
6610 digest_buf[2],
6611 digest_buf[3],
6612 byte_swap_32 (salt.salt_buf_pc[0]),
6613 byte_swap_32 (salt.salt_buf_pc[1]),
6614 clichall_buf);
6615 }
6616 else if (hash_mode == 5600)
6617 {
6618 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6619
6620 netntlm_t *netntlm = &netntlms[salt_pos];
6621
6622 char user_buf[64];
6623 char domain_buf[64];
6624 char srvchall_buf[1024];
6625 char clichall_buf[1024];
6626
6627 memset (user_buf, 0, sizeof (user_buf));
6628 memset (domain_buf, 0, sizeof (domain_buf));
6629 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6630 memset (clichall_buf, 0, sizeof (clichall_buf));
6631
6632 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6633 {
6634 char *ptr = (char *) netntlm->userdomain_buf;
6635
6636 user_buf[i] = ptr[j];
6637 }
6638
6639 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6640 {
6641 char *ptr = (char *) netntlm->userdomain_buf;
6642
6643 domain_buf[i] = ptr[netntlm->user_len + j];
6644 }
6645
6646 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6647 {
6648 char *ptr = (char *) netntlm->chall_buf;
6649
6650 sprintf (srvchall_buf + j, "%02x", (uint8_t) ptr[i]);
6651 }
6652
6653 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6654 {
6655 char *ptr = (char *) netntlm->chall_buf;
6656
6657 sprintf (clichall_buf + j, "%02x", (uint8_t) ptr[netntlm->srvchall_len + i]);
6658 }
6659
6660 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6661 user_buf,
6662 domain_buf,
6663 srvchall_buf,
6664 digest_buf[0],
6665 digest_buf[1],
6666 digest_buf[2],
6667 digest_buf[3],
6668 clichall_buf);
6669 }
6670 else if (hash_mode == 5700)
6671 {
6672 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6673
6674 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6675 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6676 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6677 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6678 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6679 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6680 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6681 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6682
6683 memcpy (tmp_buf, digest_buf, 32);
6684
6685 base64_encode (int_to_itoa64, tmp_buf, 32, ptr_plain);
6686
6687 ptr_plain[43] = 0;
6688
6689 snprintf (out_buf, len-1, "%s", ptr_plain);
6690 }
6691 else if (hash_mode == 5800)
6692 {
6693 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6694 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6695 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6696 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6697 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6698
6699 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6700 digest_buf[0],
6701 digest_buf[1],
6702 digest_buf[2],
6703 digest_buf[3],
6704 digest_buf[4]);
6705 }
6706 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6707 {
6708 snprintf (out_buf, len-1, "%s", hashfile);
6709 }
6710 else if (hash_mode == 6300)
6711 {
6712 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6713
6714 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6715 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6716 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6717 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6718
6719 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6720
6721 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6722 }
6723 else if (hash_mode == 6400)
6724 {
6725 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6726
6727 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6728 }
6729 else if (hash_mode == 6500)
6730 {
6731 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6732
6733 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6734 }
6735 else if (hash_mode == 6600)
6736 {
6737 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6738
6739 agilekey_t *agilekey = &agilekeys[salt_pos];
6740
6741 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6742 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6743
6744 uint buf_len = len - 1;
6745
6746 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6747 buf_len -= 22;
6748
6749 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6750 {
6751 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6752
6753 buf_len -= 2;
6754 }
6755 }
6756 else if (hash_mode == 6700)
6757 {
6758 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6759
6760 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6761 }
6762 else if (hash_mode == 6800)
6763 {
6764 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6765 }
6766 else if (hash_mode == 7100)
6767 {
6768 uint *ptr = digest_buf;
6769
6770 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6771
6772 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6773
6774 uint esalt[16];
6775
6776 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6777 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6778 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6779 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6780 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6781 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6782 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6783 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6784
6785 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",
6786 SIGNATURE_SHA512OSX,
6787 salt.salt_iter + 1,
6788 esalt[ 0], esalt[ 1],
6789 esalt[ 2], esalt[ 3],
6790 esalt[ 4], esalt[ 5],
6791 esalt[ 6], esalt[ 7],
6792 ptr [ 1], ptr [ 0],
6793 ptr [ 3], ptr [ 2],
6794 ptr [ 5], ptr [ 4],
6795 ptr [ 7], ptr [ 6],
6796 ptr [ 9], ptr [ 8],
6797 ptr [11], ptr [10],
6798 ptr [13], ptr [12],
6799 ptr [15], ptr [14]);
6800 }
6801 else if (hash_mode == 7200)
6802 {
6803 uint *ptr = digest_buf;
6804
6805 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6806
6807 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6808
6809 uint len_used = 0;
6810
6811 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
6812
6813 len_used = strlen (out_buf);
6814
6815 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
6816
6817 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
6818 {
6819 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
6820 }
6821
6822 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",
6823 ptr [ 1], ptr [ 0],
6824 ptr [ 3], ptr [ 2],
6825 ptr [ 5], ptr [ 4],
6826 ptr [ 7], ptr [ 6],
6827 ptr [ 9], ptr [ 8],
6828 ptr [11], ptr [10],
6829 ptr [13], ptr [12],
6830 ptr [15], ptr [14]);
6831 }
6832 else if (hash_mode == 7300)
6833 {
6834 rakp_t *rakps = (rakp_t *) data.esalts_buf;
6835
6836 rakp_t *rakp = &rakps[salt_pos];
6837
6838 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
6839 {
6840 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
6841 }
6842
6843 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
6844 digest_buf[0],
6845 digest_buf[1],
6846 digest_buf[2],
6847 digest_buf[3],
6848 digest_buf[4]);
6849 }
6850 else if (hash_mode == 7400)
6851 {
6852 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6853
6854 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6855 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6856 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6857 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6858 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6859 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6860 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6861 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6862
6863 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6864
6865 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
6866 {
6867 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6868 }
6869 else
6870 {
6871 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6872 }
6873 }
6874 else if (hash_mode == 7500)
6875 {
6876 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
6877
6878 krb5pa_t *krb5pa = &krb5pas[salt_pos];
6879
6880 uint8_t *ptr_timestamp = (uint8_t *) krb5pa->timestamp;
6881 uint8_t *ptr_checksum = (uint8_t *) krb5pa->checksum;
6882
6883 char data[128];
6884
6885 char *ptr_data = data;
6886
6887 for (uint i = 0; i < 36; i++, ptr_data += 2)
6888 {
6889 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
6890 }
6891
6892 for (uint i = 0; i < 16; i++, ptr_data += 2)
6893 {
6894 sprintf (ptr_data, "%02x", ptr_checksum[i]);
6895 }
6896
6897 *ptr_data = 0;
6898
6899 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
6900 SIGNATURE_KRB5PA,
6901 (char *) krb5pa->user,
6902 (char *) krb5pa->realm,
6903 (char *) krb5pa->salt,
6904 data);
6905 }
6906 else if (hash_mode == 7700)
6907 {
6908 snprintf (out_buf, len-1, "%s$%08X%08X",
6909 (char *) salt.salt_buf,
6910 digest_buf[0],
6911 digest_buf[1]);
6912 }
6913 else if (hash_mode == 7800)
6914 {
6915 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
6916 (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 == 7900)
6924 {
6925 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6926
6927 // ugly hack start
6928
6929 char *tmp = (char *) salt.salt_buf_pc;
6930
6931 ptr_plain[42] = tmp[0];
6932
6933 // ugly hack end
6934
6935 ptr_plain[43] = 0;
6936
6937 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6938 }
6939 else if (hash_mode == 8000)
6940 {
6941 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
6942 (unsigned char *) salt.salt_buf,
6943 digest_buf[0],
6944 digest_buf[1],
6945 digest_buf[2],
6946 digest_buf[3],
6947 digest_buf[4],
6948 digest_buf[5],
6949 digest_buf[6],
6950 digest_buf[7]);
6951 }
6952 else if (hash_mode == 8100)
6953 {
6954 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6955 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6956
6957 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
6958 (unsigned char *) salt.salt_buf,
6959 digest_buf[0],
6960 digest_buf[1],
6961 digest_buf[2],
6962 digest_buf[3],
6963 digest_buf[4]);
6964 }
6965 else if (hash_mode == 8200)
6966 {
6967 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
6968
6969 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
6970
6971 char data_buf[4096];
6972
6973 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
6974 {
6975 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
6976 }
6977
6978 data_buf[cloudkey->data_len * 2] = 0;
6979
6980 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6981 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6982 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6983 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6984 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6985 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6986 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6987 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6988
6989 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6990 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6991 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
6992 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
6993
6994 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
6995 digest_buf[0],
6996 digest_buf[1],
6997 digest_buf[2],
6998 digest_buf[3],
6999 digest_buf[4],
7000 digest_buf[5],
7001 digest_buf[6],
7002 digest_buf[7],
7003 salt.salt_buf[0],
7004 salt.salt_buf[1],
7005 salt.salt_buf[2],
7006 salt.salt_buf[3],
7007 salt.salt_iter + 1,
7008 data_buf);
7009 }
7010 else if (hash_mode == 8300)
7011 {
7012 // todo
7013
7014 char digest_buf_c[33];
7015
7016 base32_encode (int_to_itoa32, (char *) digest_buf, 32, digest_buf_c);
7017
7018 digest_buf_c[32] = 0;
7019
7020 // domain
7021
7022 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7023
7024 char domain_buf_c[33];
7025
7026 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7027
7028 for (uint i = 0; i < salt_pc_len; i++)
7029 {
7030 const char next = domain_buf_c[i];
7031
7032 domain_buf_c[i] = '.';
7033
7034 i += next;
7035 }
7036
7037 domain_buf_c[salt_pc_len] = 0;
7038
7039 // final
7040
7041 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7042 }
7043 else if (hash_mode == 8500)
7044 {
7045 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7046 }
7047 else if (hash_mode == 2612)
7048 {
7049 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7050 SIGNATURE_PHPS,
7051 (char *) salt.salt_buf,
7052 digest_buf[0],
7053 digest_buf[1],
7054 digest_buf[2],
7055 digest_buf[3]);
7056 }
7057 else if (hash_mode == 3711)
7058 {
7059 char *salt_ptr = (char *) salt.salt_buf;
7060
7061 salt_ptr[salt.salt_len - 1] = 0;
7062
7063 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7064 SIGNATURE_MEDIAWIKI_B,
7065 salt_ptr,
7066 digest_buf[0],
7067 digest_buf[1],
7068 digest_buf[2],
7069 digest_buf[3]);
7070 }
7071 else if (hash_mode == 8800)
7072 {
7073 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7074
7075 androidfde_t *androidfde = &androidfdes[salt_pos];
7076
7077 char tmp[3073];
7078
7079 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7080 {
7081 sprintf (tmp + j, "%08x", androidfde->data[i]);
7082 }
7083
7084 tmp[3072] = 0;
7085
7086 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7087 SIGNATURE_ANDROIDFDE,
7088 byte_swap_32 (salt.salt_buf[0]),
7089 byte_swap_32 (salt.salt_buf[1]),
7090 byte_swap_32 (salt.salt_buf[2]),
7091 byte_swap_32 (salt.salt_buf[3]),
7092 byte_swap_32 (digest_buf[0]),
7093 byte_swap_32 (digest_buf[1]),
7094 byte_swap_32 (digest_buf[2]),
7095 byte_swap_32 (digest_buf[3]),
7096 tmp);
7097 }
7098 else if (hash_mode == 8900)
7099 {
7100 uint N = salt.scrypt_N;
7101 uint r = salt.scrypt_r;
7102 uint p = salt.scrypt_p;
7103
7104 char base64_salt[32];
7105
7106 memset (base64_salt, 0, 32);
7107
7108 base64_encode (int_to_base64, (char *) salt.salt_buf, salt.salt_len, base64_salt + 0);
7109
7110 memset (tmp_buf, 0, 46);
7111
7112 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7113 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7114 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7115 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7116 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7117 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7118 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7119 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7120 digest_buf[8] = 0; // needed for base64_encode ()
7121
7122 base64_encode (int_to_base64, (char *) digest_buf, 32, tmp_buf + 0);
7123
7124 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7125 SIGNATURE_SCRYPT,
7126 N,
7127 r,
7128 p,
7129 base64_salt,
7130 tmp_buf);
7131 }
7132 else if (hash_mode == 9000)
7133 {
7134 snprintf (out_buf, len-1, "%s", hashfile);
7135 }
7136 else if (hash_mode == 9200)
7137 {
7138 // salt
7139
7140 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7141
7142 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7143
7144 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7145
7146 // hash
7147
7148 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7149 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7150 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7151 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7152 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7153 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7154 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7155 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7156 digest_buf[8] = 0; // needed for base64_encode ()
7157
7158 char tmp_buf[64];
7159 memset (tmp_buf, 0, sizeof (tmp_buf));
7160
7161 base64_encode (int_to_itoa64, (char *) digest_buf, 32, tmp_buf);
7162 tmp_buf[43] = 0; // cut it here
7163
7164 // output
7165
7166 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7167 }
7168 else if (hash_mode == 9300)
7169 {
7170 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7171 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7172 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7173 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7174 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7175 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7176 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7177 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7178 digest_buf[8] = 0; // needed for base64_encode ()
7179
7180 char tmp_buf[64];
7181 memset (tmp_buf, 0, sizeof (tmp_buf));
7182
7183 base64_encode (int_to_itoa64, (char *) digest_buf, 32, tmp_buf);
7184 tmp_buf[43] = 0; // cut it here
7185
7186 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7187
7188 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7189 }
7190 else if (hash_mode == 9400)
7191 {
7192 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7193
7194 office2007_t *office2007 = &office2007s[salt_pos];
7195
7196 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7197 SIGNATURE_OFFICE2007,
7198 2007,
7199 20,
7200 office2007->keySize,
7201 16,
7202 salt.salt_buf[0],
7203 salt.salt_buf[1],
7204 salt.salt_buf[2],
7205 salt.salt_buf[3],
7206 office2007->encryptedVerifier[0],
7207 office2007->encryptedVerifier[1],
7208 office2007->encryptedVerifier[2],
7209 office2007->encryptedVerifier[3],
7210 office2007->encryptedVerifierHash[0],
7211 office2007->encryptedVerifierHash[1],
7212 office2007->encryptedVerifierHash[2],
7213 office2007->encryptedVerifierHash[3],
7214 office2007->encryptedVerifierHash[4]);
7215 }
7216 else if (hash_mode == 9500)
7217 {
7218 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7219
7220 office2010_t *office2010 = &office2010s[salt_pos];
7221
7222 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,
7223
7224 salt.salt_buf[0],
7225 salt.salt_buf[1],
7226 salt.salt_buf[2],
7227 salt.salt_buf[3],
7228 office2010->encryptedVerifier[0],
7229 office2010->encryptedVerifier[1],
7230 office2010->encryptedVerifier[2],
7231 office2010->encryptedVerifier[3],
7232 office2010->encryptedVerifierHash[0],
7233 office2010->encryptedVerifierHash[1],
7234 office2010->encryptedVerifierHash[2],
7235 office2010->encryptedVerifierHash[3],
7236 office2010->encryptedVerifierHash[4],
7237 office2010->encryptedVerifierHash[5],
7238 office2010->encryptedVerifierHash[6],
7239 office2010->encryptedVerifierHash[7]);
7240 }
7241 else if (hash_mode == 9600)
7242 {
7243 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7244
7245 office2013_t *office2013 = &office2013s[salt_pos];
7246
7247 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,
7248
7249 salt.salt_buf[0],
7250 salt.salt_buf[1],
7251 salt.salt_buf[2],
7252 salt.salt_buf[3],
7253 office2013->encryptedVerifier[0],
7254 office2013->encryptedVerifier[1],
7255 office2013->encryptedVerifier[2],
7256 office2013->encryptedVerifier[3],
7257 office2013->encryptedVerifierHash[0],
7258 office2013->encryptedVerifierHash[1],
7259 office2013->encryptedVerifierHash[2],
7260 office2013->encryptedVerifierHash[3],
7261 office2013->encryptedVerifierHash[4],
7262 office2013->encryptedVerifierHash[5],
7263 office2013->encryptedVerifierHash[6],
7264 office2013->encryptedVerifierHash[7]);
7265 }
7266 else if (hash_mode == 9700)
7267 {
7268 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7269
7270 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7271
7272 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7273 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7274 byte_swap_32 (salt.salt_buf[0]),
7275 byte_swap_32 (salt.salt_buf[1]),
7276 byte_swap_32 (salt.salt_buf[2]),
7277 byte_swap_32 (salt.salt_buf[3]),
7278 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7279 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7280 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7281 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7282 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7283 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7284 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7285 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7286 }
7287 else if (hash_mode == 9710)
7288 {
7289 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7290
7291 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7292
7293 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7294 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7295 byte_swap_32 (salt.salt_buf[0]),
7296 byte_swap_32 (salt.salt_buf[1]),
7297 byte_swap_32 (salt.salt_buf[2]),
7298 byte_swap_32 (salt.salt_buf[3]),
7299 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7300 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7301 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7302 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7303 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7304 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7305 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7306 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7307 }
7308 else if (hash_mode == 9720)
7309 {
7310 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7311
7312 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7313
7314 uint8_t *rc4key = (uint8_t *) oldoffice01->rc4key;
7315
7316 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7317 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7318 byte_swap_32 (salt.salt_buf[0]),
7319 byte_swap_32 (salt.salt_buf[1]),
7320 byte_swap_32 (salt.salt_buf[2]),
7321 byte_swap_32 (salt.salt_buf[3]),
7322 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7323 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7324 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7325 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7326 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7327 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7328 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7329 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7330 rc4key[0],
7331 rc4key[1],
7332 rc4key[2],
7333 rc4key[3],
7334 rc4key[4]);
7335 }
7336 else if (hash_mode == 9800)
7337 {
7338 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7339
7340 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7341
7342 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7343 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7344 salt.salt_buf[0],
7345 salt.salt_buf[1],
7346 salt.salt_buf[2],
7347 salt.salt_buf[3],
7348 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7349 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7350 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7351 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7352 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7353 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7354 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7355 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7356 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7357 }
7358 else if (hash_mode == 9810)
7359 {
7360 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7361
7362 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7363
7364 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7365 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7366 salt.salt_buf[0],
7367 salt.salt_buf[1],
7368 salt.salt_buf[2],
7369 salt.salt_buf[3],
7370 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7371 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7372 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7373 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7374 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7375 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7376 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7377 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7378 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7379 }
7380 else if (hash_mode == 9820)
7381 {
7382 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7383
7384 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7385
7386 uint8_t *rc4key = (uint8_t *) oldoffice34->rc4key;
7387
7388 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7389 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7390 salt.salt_buf[0],
7391 salt.salt_buf[1],
7392 salt.salt_buf[2],
7393 salt.salt_buf[3],
7394 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7395 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7396 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7397 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7398 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7399 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7400 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7401 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7402 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7403 rc4key[0],
7404 rc4key[1],
7405 rc4key[2],
7406 rc4key[3],
7407 rc4key[4]);
7408 }
7409 else if (hash_mode == 10000)
7410 {
7411 // salt
7412
7413 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7414
7415 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7416
7417 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7418
7419 // hash
7420
7421 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7422 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7423 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7424 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7425 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7426 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7427 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7428 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7429 digest_buf[8] = 0; // needed for base64_encode ()
7430
7431 char tmp_buf[64];
7432 memset (tmp_buf, 0, sizeof (tmp_buf));
7433
7434 base64_encode (int_to_base64, (char *) digest_buf, 32, tmp_buf);
7435
7436 // output
7437
7438 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7439 }
7440 else if (hash_mode == 10100)
7441 {
7442 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7443 digest_buf[0],
7444 digest_buf[1],
7445 2,
7446 4,
7447 byte_swap_32 (salt.salt_buf[0]),
7448 byte_swap_32 (salt.salt_buf[1]),
7449 byte_swap_32 (salt.salt_buf[2]),
7450 byte_swap_32 (salt.salt_buf[3]));
7451 }
7452 else if (hash_mode == 10200)
7453 {
7454 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7455
7456 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7457
7458 // challenge
7459
7460 char challenge[100];
7461
7462 memset (challenge, 0, sizeof (challenge));
7463
7464 base64_encode (int_to_base64, (char *) salt.salt_buf, salt.salt_len, challenge);
7465
7466 // response
7467
7468 char tmp_buf[100];
7469
7470 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7471 (char *) cram_md5->user,
7472 digest_buf[0],
7473 digest_buf[1],
7474 digest_buf[2],
7475 digest_buf[3]);
7476
7477 char response[100];
7478
7479 memset (response, 0, sizeof (response));
7480
7481 base64_encode (int_to_base64, (char *) tmp_buf, tmp_len, response);
7482
7483 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7484 }
7485 else if (hash_mode == 10300)
7486 {
7487 char tmp_buf[100];
7488
7489 memset (tmp_buf, 0, sizeof (tmp_buf));
7490
7491 memcpy (tmp_buf + 0, digest_buf, 20);
7492 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7493
7494 uint tmp_len = 20 + salt.salt_len;
7495
7496 // base64 encode it
7497
7498 char base64_encoded[100];
7499
7500 memset (base64_encoded, 0, sizeof (base64_encoded));
7501
7502 base64_encode (int_to_base64, (char *) tmp_buf, tmp_len, base64_encoded);
7503
7504 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7505 }
7506 else if (hash_mode == 10400)
7507 {
7508 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7509
7510 pdf_t *pdf = &pdfs[salt_pos];
7511
7512 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",
7513
7514 pdf->V,
7515 pdf->R,
7516 40,
7517 pdf->P,
7518 pdf->enc_md,
7519 pdf->id_len,
7520 byte_swap_32 (pdf->id_buf[0]),
7521 byte_swap_32 (pdf->id_buf[1]),
7522 byte_swap_32 (pdf->id_buf[2]),
7523 byte_swap_32 (pdf->id_buf[3]),
7524 pdf->u_len,
7525 byte_swap_32 (pdf->u_buf[0]),
7526 byte_swap_32 (pdf->u_buf[1]),
7527 byte_swap_32 (pdf->u_buf[2]),
7528 byte_swap_32 (pdf->u_buf[3]),
7529 byte_swap_32 (pdf->u_buf[4]),
7530 byte_swap_32 (pdf->u_buf[5]),
7531 byte_swap_32 (pdf->u_buf[6]),
7532 byte_swap_32 (pdf->u_buf[7]),
7533 pdf->o_len,
7534 byte_swap_32 (pdf->o_buf[0]),
7535 byte_swap_32 (pdf->o_buf[1]),
7536 byte_swap_32 (pdf->o_buf[2]),
7537 byte_swap_32 (pdf->o_buf[3]),
7538 byte_swap_32 (pdf->o_buf[4]),
7539 byte_swap_32 (pdf->o_buf[5]),
7540 byte_swap_32 (pdf->o_buf[6]),
7541 byte_swap_32 (pdf->o_buf[7])
7542 );
7543 }
7544 else if (hash_mode == 10410)
7545 {
7546 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7547
7548 pdf_t *pdf = &pdfs[salt_pos];
7549
7550 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",
7551
7552 pdf->V,
7553 pdf->R,
7554 40,
7555 pdf->P,
7556 pdf->enc_md,
7557 pdf->id_len,
7558 byte_swap_32 (pdf->id_buf[0]),
7559 byte_swap_32 (pdf->id_buf[1]),
7560 byte_swap_32 (pdf->id_buf[2]),
7561 byte_swap_32 (pdf->id_buf[3]),
7562 pdf->u_len,
7563 byte_swap_32 (pdf->u_buf[0]),
7564 byte_swap_32 (pdf->u_buf[1]),
7565 byte_swap_32 (pdf->u_buf[2]),
7566 byte_swap_32 (pdf->u_buf[3]),
7567 byte_swap_32 (pdf->u_buf[4]),
7568 byte_swap_32 (pdf->u_buf[5]),
7569 byte_swap_32 (pdf->u_buf[6]),
7570 byte_swap_32 (pdf->u_buf[7]),
7571 pdf->o_len,
7572 byte_swap_32 (pdf->o_buf[0]),
7573 byte_swap_32 (pdf->o_buf[1]),
7574 byte_swap_32 (pdf->o_buf[2]),
7575 byte_swap_32 (pdf->o_buf[3]),
7576 byte_swap_32 (pdf->o_buf[4]),
7577 byte_swap_32 (pdf->o_buf[5]),
7578 byte_swap_32 (pdf->o_buf[6]),
7579 byte_swap_32 (pdf->o_buf[7])
7580 );
7581 }
7582 else if (hash_mode == 10420)
7583 {
7584 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7585
7586 pdf_t *pdf = &pdfs[salt_pos];
7587
7588 uint8_t *rc4key = (uint8_t *) pdf->rc4key;
7589
7590 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",
7591
7592 pdf->V,
7593 pdf->R,
7594 40,
7595 pdf->P,
7596 pdf->enc_md,
7597 pdf->id_len,
7598 byte_swap_32 (pdf->id_buf[0]),
7599 byte_swap_32 (pdf->id_buf[1]),
7600 byte_swap_32 (pdf->id_buf[2]),
7601 byte_swap_32 (pdf->id_buf[3]),
7602 pdf->u_len,
7603 byte_swap_32 (pdf->u_buf[0]),
7604 byte_swap_32 (pdf->u_buf[1]),
7605 byte_swap_32 (pdf->u_buf[2]),
7606 byte_swap_32 (pdf->u_buf[3]),
7607 byte_swap_32 (pdf->u_buf[4]),
7608 byte_swap_32 (pdf->u_buf[5]),
7609 byte_swap_32 (pdf->u_buf[6]),
7610 byte_swap_32 (pdf->u_buf[7]),
7611 pdf->o_len,
7612 byte_swap_32 (pdf->o_buf[0]),
7613 byte_swap_32 (pdf->o_buf[1]),
7614 byte_swap_32 (pdf->o_buf[2]),
7615 byte_swap_32 (pdf->o_buf[3]),
7616 byte_swap_32 (pdf->o_buf[4]),
7617 byte_swap_32 (pdf->o_buf[5]),
7618 byte_swap_32 (pdf->o_buf[6]),
7619 byte_swap_32 (pdf->o_buf[7]),
7620 rc4key[0],
7621 rc4key[1],
7622 rc4key[2],
7623 rc4key[3],
7624 rc4key[4]
7625 );
7626 }
7627 else if (hash_mode == 10500)
7628 {
7629 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7630
7631 pdf_t *pdf = &pdfs[salt_pos];
7632
7633 if (pdf->id_len == 32)
7634 {
7635 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",
7636
7637 pdf->V,
7638 pdf->R,
7639 128,
7640 pdf->P,
7641 pdf->enc_md,
7642 pdf->id_len,
7643 byte_swap_32 (pdf->id_buf[0]),
7644 byte_swap_32 (pdf->id_buf[1]),
7645 byte_swap_32 (pdf->id_buf[2]),
7646 byte_swap_32 (pdf->id_buf[3]),
7647 byte_swap_32 (pdf->id_buf[4]),
7648 byte_swap_32 (pdf->id_buf[5]),
7649 byte_swap_32 (pdf->id_buf[6]),
7650 byte_swap_32 (pdf->id_buf[7]),
7651 pdf->u_len,
7652 byte_swap_32 (pdf->u_buf[0]),
7653 byte_swap_32 (pdf->u_buf[1]),
7654 byte_swap_32 (pdf->u_buf[2]),
7655 byte_swap_32 (pdf->u_buf[3]),
7656 byte_swap_32 (pdf->u_buf[4]),
7657 byte_swap_32 (pdf->u_buf[5]),
7658 byte_swap_32 (pdf->u_buf[6]),
7659 byte_swap_32 (pdf->u_buf[7]),
7660 pdf->o_len,
7661 byte_swap_32 (pdf->o_buf[0]),
7662 byte_swap_32 (pdf->o_buf[1]),
7663 byte_swap_32 (pdf->o_buf[2]),
7664 byte_swap_32 (pdf->o_buf[3]),
7665 byte_swap_32 (pdf->o_buf[4]),
7666 byte_swap_32 (pdf->o_buf[5]),
7667 byte_swap_32 (pdf->o_buf[6]),
7668 byte_swap_32 (pdf->o_buf[7])
7669 );
7670 }
7671 else
7672 {
7673 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",
7674
7675 pdf->V,
7676 pdf->R,
7677 128,
7678 pdf->P,
7679 pdf->enc_md,
7680 pdf->id_len,
7681 byte_swap_32 (pdf->id_buf[0]),
7682 byte_swap_32 (pdf->id_buf[1]),
7683 byte_swap_32 (pdf->id_buf[2]),
7684 byte_swap_32 (pdf->id_buf[3]),
7685 pdf->u_len,
7686 byte_swap_32 (pdf->u_buf[0]),
7687 byte_swap_32 (pdf->u_buf[1]),
7688 byte_swap_32 (pdf->u_buf[2]),
7689 byte_swap_32 (pdf->u_buf[3]),
7690 byte_swap_32 (pdf->u_buf[4]),
7691 byte_swap_32 (pdf->u_buf[5]),
7692 byte_swap_32 (pdf->u_buf[6]),
7693 byte_swap_32 (pdf->u_buf[7]),
7694 pdf->o_len,
7695 byte_swap_32 (pdf->o_buf[0]),
7696 byte_swap_32 (pdf->o_buf[1]),
7697 byte_swap_32 (pdf->o_buf[2]),
7698 byte_swap_32 (pdf->o_buf[3]),
7699 byte_swap_32 (pdf->o_buf[4]),
7700 byte_swap_32 (pdf->o_buf[5]),
7701 byte_swap_32 (pdf->o_buf[6]),
7702 byte_swap_32 (pdf->o_buf[7])
7703 );
7704 }
7705 }
7706 else if (hash_mode == 10600)
7707 {
7708 uint digest_idx = salt.digests_offset + digest_pos;
7709
7710 hashinfo_t **hashinfo_ptr = data.hash_info;
7711 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7712
7713 snprintf (out_buf, len-1, "%s", hash_buf);
7714 }
7715 else if (hash_mode == 10700)
7716 {
7717 uint digest_idx = salt.digests_offset + digest_pos;
7718
7719 hashinfo_t **hashinfo_ptr = data.hash_info;
7720 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7721
7722 snprintf (out_buf, len-1, "%s", hash_buf);
7723 }
7724 else if (hash_mode == 10900)
7725 {
7726 uint digest_idx = salt.digests_offset + digest_pos;
7727
7728 hashinfo_t **hashinfo_ptr = data.hash_info;
7729 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7730
7731 snprintf (out_buf, len-1, "%s", hash_buf);
7732 }
7733 else if (hash_mode == 11100)
7734 {
7735 uint32_t salt_challenge = salt.salt_buf[0];
7736
7737 salt_challenge = byte_swap_32 (salt_challenge);
7738
7739 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7740
7741 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7742 SIGNATURE_POSTGRESQL_AUTH,
7743 user_name,
7744 salt_challenge,
7745 digest_buf[0],
7746 digest_buf[1],
7747 digest_buf[2],
7748 digest_buf[3]);
7749 }
7750 else if (hash_mode == 11200)
7751 {
7752 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7753 SIGNATURE_MYSQL_AUTH,
7754 (unsigned char *) salt.salt_buf,
7755 digest_buf[0],
7756 digest_buf[1],
7757 digest_buf[2],
7758 digest_buf[3],
7759 digest_buf[4]);
7760 }
7761 else if (hash_mode == 11300)
7762 {
7763 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7764
7765 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7766
7767 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7768 const uint ckey_len = bitcoin_wallet->ckey_len;
7769 const uint public_key_len = bitcoin_wallet->public_key_len;
7770
7771 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7772 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7773 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7774
7775 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7776 {
7777 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->cry_master_buf;
7778
7779 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7780 }
7781
7782 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7783 {
7784 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->ckey_buf;
7785
7786 sprintf (ckey_buf + j, "%02x", ptr[i]);
7787 }
7788
7789 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7790 {
7791 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->public_key_buf;
7792
7793 sprintf (public_key_buf + j, "%02x", ptr[i]);
7794 }
7795
7796 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
7797 SIGNATURE_BITCOIN_WALLET,
7798 cry_master_len * 2,
7799 cry_master_buf,
7800 salt.salt_len,
7801 (unsigned char *) salt.salt_buf,
7802 salt.salt_iter + 1,
7803 ckey_len * 2,
7804 ckey_buf,
7805 public_key_len * 2,
7806 public_key_buf
7807 );
7808
7809 free (cry_master_buf);
7810 free (ckey_buf);
7811 free (public_key_buf);
7812 }
7813 else if (hash_mode == 11400)
7814 {
7815 uint digest_idx = salt.digests_offset + digest_pos;
7816
7817 hashinfo_t **hashinfo_ptr = data.hash_info;
7818 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7819
7820 snprintf (out_buf, len-1, "%s", hash_buf);
7821 }
7822 else if (hash_mode == 11600)
7823 {
7824 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
7825
7826 seven_zip_t *seven_zip = &seven_zips[salt_pos];
7827
7828 const uint data_len = seven_zip->data_len;
7829
7830 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
7831
7832 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
7833 {
7834 const uint8_t *ptr = (const uint8_t *) seven_zip->data_buf;
7835
7836 sprintf (data_buf + j, "%02x", ptr[i]);
7837 }
7838
7839 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
7840 SIGNATURE_SEVEN_ZIP,
7841 0,
7842 salt.salt_sign[0],
7843 0,
7844 (char *) seven_zip->salt_buf,
7845 seven_zip->iv_len,
7846 seven_zip->iv_buf[0],
7847 seven_zip->iv_buf[1],
7848 seven_zip->iv_buf[2],
7849 seven_zip->iv_buf[3],
7850 seven_zip->crc,
7851 seven_zip->data_len,
7852 seven_zip->unpack_size,
7853 data_buf);
7854
7855 free (data_buf);
7856 }
7857 else if (hash_mode == 11700)
7858 {
7859 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7860 digest_buf[0],
7861 digest_buf[1],
7862 digest_buf[2],
7863 digest_buf[3],
7864 digest_buf[4],
7865 digest_buf[5],
7866 digest_buf[6],
7867 digest_buf[7]);
7868 }
7869 else if (hash_mode == 11800)
7870 {
7871 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
7872 digest_buf[ 0],
7873 digest_buf[ 1],
7874 digest_buf[ 2],
7875 digest_buf[ 3],
7876 digest_buf[ 4],
7877 digest_buf[ 5],
7878 digest_buf[ 6],
7879 digest_buf[ 7],
7880 digest_buf[ 8],
7881 digest_buf[ 9],
7882 digest_buf[10],
7883 digest_buf[11],
7884 digest_buf[12],
7885 digest_buf[13],
7886 digest_buf[14],
7887 digest_buf[15]);
7888 }
7889 else if (hash_mode == 11900)
7890 {
7891 uint digest_idx = salt.digests_offset + digest_pos;
7892
7893 hashinfo_t **hashinfo_ptr = data.hash_info;
7894 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7895
7896 snprintf (out_buf, len-1, "%s", hash_buf);
7897 }
7898 else if (hash_mode == 12000)
7899 {
7900 uint digest_idx = salt.digests_offset + digest_pos;
7901
7902 hashinfo_t **hashinfo_ptr = data.hash_info;
7903 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7904
7905 snprintf (out_buf, len-1, "%s", hash_buf);
7906 }
7907 else if (hash_mode == 12100)
7908 {
7909 uint digest_idx = salt.digests_offset + digest_pos;
7910
7911 hashinfo_t **hashinfo_ptr = data.hash_info;
7912 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7913
7914 snprintf (out_buf, len-1, "%s", hash_buf);
7915 }
7916 else if (hash_mode == 12200)
7917 {
7918 uint *ptr_digest = digest_buf;
7919 uint *ptr_salt = salt.salt_buf;
7920
7921 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
7922 SIGNATURE_ECRYPTFS,
7923 ptr_salt[0],
7924 ptr_salt[1],
7925 ptr_digest[0],
7926 ptr_digest[1]);
7927 }
7928 else if (hash_mode == 12300)
7929 {
7930 uint *ptr_digest = digest_buf;
7931 uint *ptr_salt = salt.salt_buf;
7932
7933 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",
7934 ptr_digest[ 0], ptr_digest[ 1],
7935 ptr_digest[ 2], ptr_digest[ 3],
7936 ptr_digest[ 4], ptr_digest[ 5],
7937 ptr_digest[ 6], ptr_digest[ 7],
7938 ptr_digest[ 8], ptr_digest[ 9],
7939 ptr_digest[10], ptr_digest[11],
7940 ptr_digest[12], ptr_digest[13],
7941 ptr_digest[14], ptr_digest[15],
7942 ptr_salt[0],
7943 ptr_salt[1],
7944 ptr_salt[2],
7945 ptr_salt[3]);
7946 }
7947 else if (hash_mode == 12400)
7948 {
7949 // encode iteration count
7950
7951 char salt_iter[5];
7952
7953 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
7954 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
7955 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
7956 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
7957 salt_iter[4] = 0;
7958
7959 // encode salt
7960
7961 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
7962 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
7963 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
7964 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
7965 ptr_salt[4] = 0;
7966
7967 // encode digest
7968
7969 memset (tmp_buf, 0, sizeof (tmp_buf));
7970
7971 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7972 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7973
7974 memcpy (tmp_buf, digest_buf, 8);
7975
7976 base64_encode (int_to_itoa64, tmp_buf, 8, ptr_plain);
7977
7978 ptr_plain[11] = 0;
7979
7980 // fill the resulting buffer
7981
7982 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
7983 }
7984 else if (hash_mode == 12500)
7985 {
7986 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
7987 SIGNATURE_RAR3,
7988 byte_swap_32 (salt.salt_buf[0]),
7989 byte_swap_32 (salt.salt_buf[1]),
7990 salt.salt_buf[2],
7991 salt.salt_buf[3],
7992 salt.salt_buf[4],
7993 salt.salt_buf[5]);
7994 }
7995 else if (hash_mode == 12600)
7996 {
7997 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7998 digest_buf[0] + salt.salt_buf_pc[0],
7999 digest_buf[1] + salt.salt_buf_pc[1],
8000 digest_buf[2] + salt.salt_buf_pc[2],
8001 digest_buf[3] + salt.salt_buf_pc[3],
8002 digest_buf[4] + salt.salt_buf_pc[4],
8003 digest_buf[5] + salt.salt_buf_pc[5],
8004 digest_buf[6] + salt.salt_buf_pc[6],
8005 digest_buf[7] + salt.salt_buf_pc[7]);
8006 }
8007 else if (hash_mode == 12700)
8008 {
8009 uint digest_idx = salt.digests_offset + digest_pos;
8010
8011 hashinfo_t **hashinfo_ptr = data.hash_info;
8012 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8013
8014 snprintf (out_buf, len-1, "%s", hash_buf);
8015 }
8016 else if (hash_mode == 12800)
8017 {
8018 const uint8_t *ptr = (const uint8_t *) salt.salt_buf;
8019
8020 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",
8021 SIGNATURE_MS_DRSR,
8022 ptr[0],
8023 ptr[1],
8024 ptr[2],
8025 ptr[3],
8026 ptr[4],
8027 ptr[5],
8028 ptr[6],
8029 ptr[7],
8030 ptr[8],
8031 ptr[9],
8032 salt.salt_iter + 1,
8033 byte_swap_32 (digest_buf[0]),
8034 byte_swap_32 (digest_buf[1]),
8035 byte_swap_32 (digest_buf[2]),
8036 byte_swap_32 (digest_buf[3]),
8037 byte_swap_32 (digest_buf[4]),
8038 byte_swap_32 (digest_buf[5]),
8039 byte_swap_32 (digest_buf[6]),
8040 byte_swap_32 (digest_buf[7])
8041 );
8042 }
8043 else
8044 {
8045 if (hash_type == HASH_TYPE_MD4)
8046 {
8047 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8048 digest_buf[0],
8049 digest_buf[1],
8050 digest_buf[2],
8051 digest_buf[3]);
8052 }
8053 else if (hash_type == HASH_TYPE_MD5)
8054 {
8055 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8056 digest_buf[0],
8057 digest_buf[1],
8058 digest_buf[2],
8059 digest_buf[3]);
8060 }
8061 else if (hash_type == HASH_TYPE_SHA1)
8062 {
8063 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8064 digest_buf[0],
8065 digest_buf[1],
8066 digest_buf[2],
8067 digest_buf[3],
8068 digest_buf[4]);
8069 }
8070 else if (hash_type == HASH_TYPE_SHA256)
8071 {
8072 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8073 digest_buf[0],
8074 digest_buf[1],
8075 digest_buf[2],
8076 digest_buf[3],
8077 digest_buf[4],
8078 digest_buf[5],
8079 digest_buf[6],
8080 digest_buf[7]);
8081 }
8082 else if (hash_type == HASH_TYPE_SHA384)
8083 {
8084 uint *ptr = digest_buf;
8085
8086 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8087 ptr[ 1], ptr[ 0],
8088 ptr[ 3], ptr[ 2],
8089 ptr[ 5], ptr[ 4],
8090 ptr[ 7], ptr[ 6],
8091 ptr[ 9], ptr[ 8],
8092 ptr[11], ptr[10]);
8093 }
8094 else if (hash_type == HASH_TYPE_SHA512)
8095 {
8096 uint *ptr = digest_buf;
8097
8098 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8099 ptr[ 1], ptr[ 0],
8100 ptr[ 3], ptr[ 2],
8101 ptr[ 5], ptr[ 4],
8102 ptr[ 7], ptr[ 6],
8103 ptr[ 9], ptr[ 8],
8104 ptr[11], ptr[10],
8105 ptr[13], ptr[12],
8106 ptr[15], ptr[14]);
8107 }
8108 else if (hash_type == HASH_TYPE_LM)
8109 {
8110 snprintf (out_buf, len-1, "%08x%08x",
8111 digest_buf[0],
8112 digest_buf[1]);
8113 }
8114 else if (hash_type == HASH_TYPE_ORACLEH)
8115 {
8116 snprintf (out_buf, len-1, "%08X%08X",
8117 digest_buf[0],
8118 digest_buf[1]);
8119 }
8120 else if (hash_type == HASH_TYPE_BCRYPT)
8121 {
8122 base64_encode (int_to_bf64, (char *) salt.salt_buf, 16, tmp_buf + 0);
8123 base64_encode (int_to_bf64, (char *) digest_buf, 23, tmp_buf + 22);
8124
8125 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8126
8127 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8128 }
8129 else if (hash_type == HASH_TYPE_KECCAK)
8130 {
8131 uint *ptr = digest_buf;
8132
8133 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",
8134 ptr[ 1], ptr[ 0],
8135 ptr[ 3], ptr[ 2],
8136 ptr[ 5], ptr[ 4],
8137 ptr[ 7], ptr[ 6],
8138 ptr[ 9], ptr[ 8],
8139 ptr[11], ptr[10],
8140 ptr[13], ptr[12],
8141 ptr[15], ptr[14],
8142 ptr[17], ptr[16],
8143 ptr[19], ptr[18],
8144 ptr[21], ptr[20],
8145 ptr[23], ptr[22],
8146 ptr[25], ptr[24],
8147 ptr[27], ptr[26],
8148 ptr[29], ptr[28],
8149 ptr[31], ptr[30],
8150 ptr[33], ptr[32],
8151 ptr[35], ptr[34],
8152 ptr[37], ptr[36],
8153 ptr[39], ptr[38],
8154 ptr[41], ptr[30],
8155 ptr[43], ptr[42],
8156 ptr[45], ptr[44],
8157 ptr[47], ptr[46],
8158 ptr[49], ptr[48]
8159 );
8160
8161 out_buf[salt.keccak_mdlen * 2] = 0;
8162 }
8163 else if (hash_type == HASH_TYPE_RIPEMD160)
8164 {
8165 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8166 digest_buf[0],
8167 digest_buf[1],
8168 digest_buf[2],
8169 digest_buf[3],
8170 digest_buf[4]);
8171 }
8172 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8173 {
8174 digest_buf[ 0] = digest_buf[ 0];
8175 digest_buf[ 1] = digest_buf[ 1];
8176 digest_buf[ 2] = digest_buf[ 2];
8177 digest_buf[ 3] = digest_buf[ 3];
8178 digest_buf[ 4] = digest_buf[ 4];
8179 digest_buf[ 5] = digest_buf[ 5];
8180 digest_buf[ 6] = digest_buf[ 6];
8181 digest_buf[ 7] = digest_buf[ 7];
8182 digest_buf[ 8] = digest_buf[ 8];
8183 digest_buf[ 9] = digest_buf[ 9];
8184 digest_buf[10] = digest_buf[10];
8185 digest_buf[11] = digest_buf[11];
8186 digest_buf[12] = digest_buf[12];
8187 digest_buf[13] = digest_buf[13];
8188 digest_buf[14] = digest_buf[14];
8189 digest_buf[15] = digest_buf[15];
8190
8191 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8192 digest_buf[ 0],
8193 digest_buf[ 1],
8194 digest_buf[ 2],
8195 digest_buf[ 3],
8196 digest_buf[ 4],
8197 digest_buf[ 5],
8198 digest_buf[ 6],
8199 digest_buf[ 7],
8200 digest_buf[ 8],
8201 digest_buf[ 9],
8202 digest_buf[10],
8203 digest_buf[11],
8204 digest_buf[12],
8205 digest_buf[13],
8206 digest_buf[14],
8207 digest_buf[15]);
8208 }
8209 else if (hash_type == HASH_TYPE_GOST)
8210 {
8211 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8212 digest_buf[0],
8213 digest_buf[1],
8214 digest_buf[2],
8215 digest_buf[3],
8216 digest_buf[4],
8217 digest_buf[5],
8218 digest_buf[6],
8219 digest_buf[7]);
8220 }
8221 else if (hash_type == HASH_TYPE_MYSQL)
8222 {
8223 snprintf (out_buf, len-1, "%08x%08x",
8224 digest_buf[0],
8225 digest_buf[1]);
8226 }
8227 else if (hash_type == HASH_TYPE_LOTUS5)
8228 {
8229 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8230 digest_buf[0],
8231 digest_buf[1],
8232 digest_buf[2],
8233 digest_buf[3]);
8234 }
8235 else if (hash_type == HASH_TYPE_LOTUS6)
8236 {
8237 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8238 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8239 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8240 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8241
8242 char buf[16];
8243
8244 memcpy (buf + 0, salt.salt_buf, 5);
8245 memcpy (buf + 5, digest_buf, 9);
8246
8247 buf[3] -= -4;
8248
8249 base64_encode (int_to_lotus64, buf, 14, tmp_buf);
8250
8251 tmp_buf[18] = salt.salt_buf_pc[7];
8252 tmp_buf[19] = 0;
8253
8254 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8255 }
8256 else if (hash_type == HASH_TYPE_LOTUS8)
8257 {
8258 char buf[52];
8259
8260 memset (buf, 0, sizeof (buf));
8261
8262 // salt
8263
8264 memcpy (buf + 0, salt.salt_buf, 16);
8265
8266 buf[3] -= -4;
8267
8268 // iteration
8269
8270 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8271
8272 // chars
8273
8274 buf[26] = salt.salt_buf_pc[0];
8275 buf[27] = salt.salt_buf_pc[1];
8276
8277 // digest
8278
8279 memcpy (buf + 28, digest_buf, 8);
8280
8281 base64_encode (int_to_lotus64, buf, 36, tmp_buf);
8282
8283 tmp_buf[49] = 0;
8284
8285 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8286 }
8287 else if (hash_type == HASH_TYPE_CRC32)
8288 {
8289 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8290 }
8291 }
8292
8293 if (salt_type == SALT_TYPE_INTERN)
8294 {
8295 size_t pos = strlen (out_buf);
8296
8297 out_buf[pos] = data.separator;
8298
8299 char *ptr = (char *) salt.salt_buf;
8300
8301 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8302
8303 out_buf[pos + 1 + salt.salt_len] = 0;
8304 }
8305 }
8306
8307 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8308 {
8309 memset (hccap, 0, sizeof (hccap_t));
8310
8311 salt_t *salt = &data.salts_buf[salt_pos];
8312
8313 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8314
8315 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8316 wpa_t *wpa = &wpas[salt_pos];
8317
8318 hccap->keyver = wpa->keyver;
8319
8320 hccap->eapol_size = wpa->eapol_size;
8321
8322 if (wpa->keyver != 1)
8323 {
8324 uint eapol_tmp[64];
8325
8326 for (uint i = 0; i < 64; i++)
8327 {
8328 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8329 }
8330
8331 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8332 }
8333 else
8334 {
8335 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8336 }
8337
8338 uint pke_tmp[25];
8339
8340 for (int i = 5; i < 25; i++)
8341 {
8342 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8343 }
8344
8345 char *pke_ptr = (char *) pke_tmp;
8346
8347 memcpy (hccap->mac1, pke_ptr + 23, 6);
8348 memcpy (hccap->mac2, pke_ptr + 29, 6);
8349 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8350 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8351
8352 char *digests_buf_ptr = (char *) data.digests_buf;
8353
8354 uint dgst_size = data.dgst_size;
8355
8356 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8357
8358 if (wpa->keyver != 1)
8359 {
8360 uint digest_tmp[4];
8361
8362 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8363 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8364 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8365 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8366
8367 memcpy (hccap->keymic, digest_tmp, 16);
8368 }
8369 else
8370 {
8371 memcpy (hccap->keymic, digest_ptr, 16);
8372 }
8373 }
8374
8375 void SuspendThreads ()
8376 {
8377 if (data.devices_status == STATUS_RUNNING)
8378 {
8379 hc_timer_set (&data.timer_paused);
8380
8381 data.devices_status = STATUS_PAUSED;
8382
8383 log_info ("Paused");
8384 }
8385 }
8386
8387 void ResumeThreads ()
8388 {
8389 if (data.devices_status == STATUS_PAUSED)
8390 {
8391 float ms_paused;
8392
8393 hc_timer_get (data.timer_paused, ms_paused);
8394
8395 data.ms_paused += ms_paused;
8396
8397 data.devices_status = STATUS_RUNNING;
8398
8399 log_info ("Resumed");
8400 }
8401 }
8402
8403 void bypass ()
8404 {
8405 if (data.devices_status != STATUS_RUNNING) return;
8406
8407 data.devices_status = STATUS_BYPASS;
8408
8409 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8410 }
8411
8412 void stop_at_checkpoint ()
8413 {
8414 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8415 {
8416 if (data.devices_status != STATUS_RUNNING) return;
8417 }
8418
8419 // this feature only makes sense if --restore-disable was not specified
8420
8421 if (data.restore_disable == 1)
8422 {
8423 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8424
8425 return;
8426 }
8427
8428 // check if monitoring of Restore Point updates should be enabled or disabled
8429
8430 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8431 {
8432 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8433
8434 // save the current restore point value
8435
8436 data.checkpoint_cur_words = get_lowest_words_done ();
8437
8438 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8439 }
8440 else
8441 {
8442 data.devices_status = STATUS_RUNNING;
8443
8444 // reset the global value for checkpoint checks
8445
8446 data.checkpoint_cur_words = 0;
8447
8448 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8449 }
8450 }
8451
8452 void myabort ()
8453 {
8454 if (data.devices_status == STATUS_INIT) return;
8455 if (data.devices_status == STATUS_STARTING) return;
8456
8457 data.devices_status = STATUS_ABORTED;
8458 }
8459
8460 void myquit ()
8461 {
8462 if (data.devices_status == STATUS_INIT) return;
8463 if (data.devices_status == STATUS_STARTING) return;
8464
8465 data.devices_status = STATUS_QUIT;
8466 }
8467
8468 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const unsigned char **kernel_sources)
8469 {
8470 FILE *fp;
8471
8472 if ((fp = fopen (kernel_file, "rb")) != NULL)
8473 {
8474 struct stat st;
8475
8476 memset (&st, 0, sizeof (st));
8477
8478 stat (kernel_file, &st);
8479
8480 unsigned char *buf = (unsigned char *) mymalloc (st.st_size + 1);
8481
8482 size_t num_read = fread (buf, sizeof (unsigned char), st.st_size, fp);
8483
8484 if (num_read != (size_t) st.st_size)
8485 {
8486 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8487
8488 exit (-1);
8489 }
8490
8491 fclose (fp);
8492
8493 buf[st.st_size] = 0;
8494
8495 for (int i = 0; i < num_devices; i++)
8496 {
8497 kernel_lengths[i] = (size_t) st.st_size;
8498
8499 kernel_sources[i] = buf;
8500 }
8501 }
8502 else
8503 {
8504 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8505
8506 exit (-1);
8507 }
8508
8509 return;
8510 }
8511
8512 void writeProgramBin (char *dst, unsigned char *binary, size_t binary_size)
8513 {
8514 FILE *fp = fopen (dst, "wb");
8515
8516 fwrite (binary, sizeof (unsigned char), binary_size, fp);
8517
8518 fflush (fp);
8519 fclose (fp);
8520 }
8521
8522 /**
8523 * restore
8524 */
8525
8526 restore_data_t *init_restore (int argc, char **argv)
8527 {
8528 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8529
8530 if (data.restore_disable == 0)
8531 {
8532 FILE *fp = fopen (data.eff_restore_file, "rb");
8533
8534 if (fp)
8535 {
8536 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8537
8538 if (nread != 1)
8539 {
8540 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8541
8542 exit (-1);
8543 }
8544
8545 fclose (fp);
8546
8547 if (rd->pid)
8548 {
8549 char pidbin[BUFSIZ];
8550
8551 int pidbin_len;
8552
8553 #ifdef _POSIX
8554 memset (pidbin, 0, sizeof (pidbin));
8555
8556 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8557
8558 FILE *fd = fopen (pidbin, "rb");
8559
8560 if (fd)
8561 {
8562 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8563
8564 pidbin[pidbin_len] = 0;
8565
8566 fclose (fd);
8567
8568 char *argv0_r = strrchr (argv[0], '/');
8569
8570 char *pidbin_r = strrchr (pidbin, '/');
8571
8572 if (argv0_r == NULL) argv0_r = argv[0];
8573
8574 if (pidbin_r == NULL) pidbin_r = pidbin;
8575
8576 if (strcmp (argv0_r, pidbin_r) == 0)
8577 {
8578 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8579
8580 exit (-1);
8581 }
8582 }
8583
8584 #elif _WIN
8585 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8586
8587 char pidbin2[BUFSIZ];
8588
8589 int pidbin2_len;
8590
8591 memset (pidbin2, 0, sizeof (pidbin2));
8592
8593 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8594 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8595
8596 pidbin[pidbin_len] = 0;
8597 pidbin2[pidbin2_len] = 0;
8598
8599 if (pidbin2_len)
8600 {
8601 if (strcmp (pidbin, pidbin2) == 0)
8602 {
8603 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8604
8605 exit (-1);
8606 }
8607 }
8608 #endif
8609 }
8610
8611 if (rd->version_bin < RESTORE_MIN)
8612 {
8613 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8614
8615 exit (-1);
8616 }
8617 }
8618 }
8619
8620 memset (rd, 0, sizeof (restore_data_t));
8621
8622 rd->version_bin = VERSION_BIN;
8623
8624 #ifdef _POSIX
8625 rd->pid = getpid ();
8626 #elif _WIN
8627 rd->pid = GetCurrentProcessId ();
8628 #endif
8629
8630 if (getcwd (rd->cwd, 255) == NULL)
8631 {
8632 myfree (rd);
8633
8634 return (NULL);
8635 }
8636
8637 rd->argc = argc;
8638 rd->argv = argv;
8639
8640 return (rd);
8641 }
8642
8643 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8644 {
8645 FILE *fp = fopen (eff_restore_file, "rb");
8646
8647 if (fp == NULL)
8648 {
8649 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8650
8651 exit (-1);
8652 }
8653
8654 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8655 {
8656 log_error ("ERROR: cannot read %s", eff_restore_file);
8657
8658 exit (-1);
8659 }
8660
8661 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8662
8663 for (uint i = 0; i < rd->argc; i++)
8664 {
8665 char buf[BUFSIZ];
8666
8667 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8668 {
8669 log_error ("ERROR: cannot read %s", eff_restore_file);
8670
8671 exit (-1);
8672 }
8673
8674 size_t len = strlen (buf);
8675
8676 if (len) buf[len - 1] = 0;
8677
8678 rd->argv[i] = mystrdup (buf);
8679 }
8680
8681 fclose (fp);
8682
8683 char new_cwd[256];
8684
8685 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8686
8687 if (nwd == NULL)
8688 {
8689 log_error ("Restore file is corrupted");
8690 }
8691
8692 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8693 {
8694 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8695 {
8696 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8697
8698 exit (-1);
8699 }
8700
8701 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8702 }
8703
8704
8705 if (chdir (rd->cwd))
8706 {
8707 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8708
8709 exit (-1);
8710 }
8711 }
8712
8713 uint64_t get_lowest_words_done ()
8714 {
8715 uint64_t words_cur = -1;
8716
8717 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8718 {
8719 hc_device_param_t *device_param = &data.devices_param[device_id];
8720
8721 const uint64_t words_done = device_param->words_done;
8722
8723 if (words_done < words_cur) words_cur = words_done;
8724 }
8725
8726 // It's possible that a GPU's workload isn't finished right after a restore-case.
8727 // In that case, this function would return 0 and overwrite the real restore point
8728 // There's also data.words_cur which is set to rd->words_cur but it changes while
8729 // the attack is running therefore we should stick to rd->words_cur.
8730 // Note that -s influences rd->words_cur we should keep a close look on that.
8731
8732 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
8733
8734 return words_cur;
8735 }
8736
8737 void write_restore (const char *new_restore_file, restore_data_t *rd)
8738 {
8739 uint64_t words_cur = get_lowest_words_done ();
8740
8741 rd->words_cur = words_cur;
8742
8743 FILE *fp = fopen (new_restore_file, "wb");
8744
8745 if (fp == NULL)
8746 {
8747 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
8748
8749 exit (-1);
8750 }
8751
8752 if (setvbuf (fp, NULL, _IONBF, 0))
8753 {
8754 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
8755
8756 exit (-1);
8757 }
8758
8759 fwrite (rd, sizeof (restore_data_t), 1, fp);
8760
8761 for (uint i = 0; i < rd->argc; i++)
8762 {
8763 fprintf (fp, "%s", rd->argv[i]);
8764 fputc ('\n', fp);
8765 }
8766
8767 fflush (fp);
8768
8769 fsync (fileno (fp));
8770
8771 fclose (fp);
8772 }
8773
8774 void cycle_restore ()
8775 {
8776 const char *eff_restore_file = data.eff_restore_file;
8777 const char *new_restore_file = data.new_restore_file;
8778
8779 restore_data_t *rd = data.rd;
8780
8781 write_restore (new_restore_file, rd);
8782
8783 struct stat st;
8784
8785 memset (&st, 0, sizeof(st));
8786
8787 if (stat (eff_restore_file, &st) == 0)
8788 {
8789 if (unlink (eff_restore_file))
8790 {
8791 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
8792 }
8793 }
8794
8795 if (rename (new_restore_file, eff_restore_file))
8796 {
8797 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
8798 }
8799 }
8800
8801 void check_checkpoint ()
8802 {
8803 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
8804
8805 uint64_t words_cur = get_lowest_words_done ();
8806
8807 if (words_cur != data.checkpoint_cur_words)
8808 {
8809 myabort ();
8810 }
8811 }
8812
8813 /**
8814 * adjustments
8815 */
8816
8817 uint set_gpu_accel (uint hash_mode)
8818 {
8819 switch (hash_mode)
8820 {
8821 case 0: return GET_ACCEL (0);
8822 case 10: return GET_ACCEL (10);
8823 case 11: return GET_ACCEL (11);
8824 case 12: return GET_ACCEL (12);
8825 case 20: return GET_ACCEL (20);
8826 case 21: return GET_ACCEL (21);
8827 case 22: return GET_ACCEL (22);
8828 case 23: return GET_ACCEL (23);
8829 case 30: return GET_ACCEL (30);
8830 case 40: return GET_ACCEL (40);
8831 case 50: return GET_ACCEL (50);
8832 case 60: return GET_ACCEL (60);
8833 case 100: return GET_ACCEL (100);
8834 case 101: return GET_ACCEL (101);
8835 case 110: return GET_ACCEL (110);
8836 case 111: return GET_ACCEL (111);
8837 case 112: return GET_ACCEL (112);
8838 case 120: return GET_ACCEL (120);
8839 case 121: return GET_ACCEL (121);
8840 case 122: return GET_ACCEL (122);
8841 case 124: return GET_ACCEL (124);
8842 case 130: return GET_ACCEL (130);
8843 case 131: return GET_ACCEL (131);
8844 case 132: return GET_ACCEL (132);
8845 case 133: return GET_ACCEL (133);
8846 case 140: return GET_ACCEL (140);
8847 case 141: return GET_ACCEL (141);
8848 case 150: return GET_ACCEL (150);
8849 case 160: return GET_ACCEL (160);
8850 case 190: return GET_ACCEL (190);
8851 case 200: return GET_ACCEL (200);
8852 case 300: return GET_ACCEL (300);
8853 case 400: return GET_ACCEL (400);
8854 case 500: return GET_ACCEL (500);
8855 case 501: return GET_ACCEL (501);
8856 case 900: return GET_ACCEL (900);
8857 case 910: return GET_ACCEL (910);
8858 case 1000: return GET_ACCEL (1000);
8859 case 1100: return GET_ACCEL (1100);
8860 case 1400: return GET_ACCEL (1400);
8861 case 1410: return GET_ACCEL (1410);
8862 case 1420: return GET_ACCEL (1420);
8863 case 1421: return GET_ACCEL (1421);
8864 case 1430: return GET_ACCEL (1430);
8865 case 1440: return GET_ACCEL (1440);
8866 case 1441: return GET_ACCEL (1441);
8867 case 1450: return GET_ACCEL (1450);
8868 case 1460: return GET_ACCEL (1460);
8869 case 1500: return GET_ACCEL (1500);
8870 case 1600: return GET_ACCEL (1600);
8871 case 1700: return GET_ACCEL (1700);
8872 case 1710: return GET_ACCEL (1710);
8873 case 1711: return GET_ACCEL (1711);
8874 case 1720: return GET_ACCEL (1720);
8875 case 1722: return GET_ACCEL (1722);
8876 case 1730: return GET_ACCEL (1730);
8877 case 1731: return GET_ACCEL (1731);
8878 case 1740: return GET_ACCEL (1740);
8879 case 1750: return GET_ACCEL (1750);
8880 case 1760: return GET_ACCEL (1760);
8881 case 1800: return GET_ACCEL (1800);
8882 case 2100: return GET_ACCEL (2100);
8883 case 2400: return GET_ACCEL (2400);
8884 case 2410: return GET_ACCEL (2410);
8885 case 2500: return GET_ACCEL (2500);
8886 case 2600: return GET_ACCEL (2600);
8887 case 2611: return GET_ACCEL (2611);
8888 case 2612: return GET_ACCEL (2612);
8889 case 2711: return GET_ACCEL (2711);
8890 case 2811: return GET_ACCEL (2811);
8891 case 3000: return GET_ACCEL (3000);
8892 case 3100: return GET_ACCEL (3100);
8893 case 3200: return GET_ACCEL (3200);
8894 case 3710: return GET_ACCEL (3710);
8895 case 3711: return GET_ACCEL (3711);
8896 case 3800: return GET_ACCEL (3800);
8897 case 4300: return GET_ACCEL (4300);
8898 case 4400: return GET_ACCEL (4400);
8899 case 4500: return GET_ACCEL (4500);
8900 case 4700: return GET_ACCEL (4700);
8901 case 4800: return GET_ACCEL (4800);
8902 case 4900: return GET_ACCEL (4900);
8903 case 5000: return GET_ACCEL (5000);
8904 case 5100: return GET_ACCEL (5100);
8905 case 5200: return GET_ACCEL (5200);
8906 case 5300: return GET_ACCEL (5300);
8907 case 5400: return GET_ACCEL (5400);
8908 case 5500: return GET_ACCEL (5500);
8909 case 5600: return GET_ACCEL (5600);
8910 case 5700: return GET_ACCEL (5700);
8911 case 5800: return GET_ACCEL (5800);
8912 case 6000: return GET_ACCEL (6000);
8913 case 6100: return GET_ACCEL (6100);
8914 case 6211: return GET_ACCEL (6211);
8915 case 6212: return GET_ACCEL (6212);
8916 case 6213: return GET_ACCEL (6213);
8917 case 6221: return GET_ACCEL (6221);
8918 case 6222: return GET_ACCEL (6222);
8919 case 6223: return GET_ACCEL (6223);
8920 case 6231: return GET_ACCEL (6231);
8921 case 6232: return GET_ACCEL (6232);
8922 case 6233: return GET_ACCEL (6233);
8923 case 6241: return GET_ACCEL (6241);
8924 case 6242: return GET_ACCEL (6242);
8925 case 6243: return GET_ACCEL (6243);
8926 case 6300: return GET_ACCEL (6300);
8927 case 6400: return GET_ACCEL (6400);
8928 case 6500: return GET_ACCEL (6500);
8929 case 6600: return GET_ACCEL (6600);
8930 case 6700: return GET_ACCEL (6700);
8931 case 6800: return GET_ACCEL (6800);
8932 case 6900: return GET_ACCEL (6900);
8933 case 7100: return GET_ACCEL (7100);
8934 case 7200: return GET_ACCEL (7200);
8935 case 7300: return GET_ACCEL (7300);
8936 case 7400: return GET_ACCEL (7400);
8937 case 7500: return GET_ACCEL (7500);
8938 case 7600: return GET_ACCEL (7600);
8939 case 7700: return GET_ACCEL (7700);
8940 case 7800: return GET_ACCEL (7800);
8941 case 7900: return GET_ACCEL (7900);
8942 case 8000: return GET_ACCEL (8000);
8943 case 8100: return GET_ACCEL (8100);
8944 case 8200: return GET_ACCEL (8200);
8945 case 8300: return GET_ACCEL (8300);
8946 case 8400: return GET_ACCEL (8400);
8947 case 8500: return GET_ACCEL (8500);
8948 case 8600: return GET_ACCEL (8600);
8949 case 8700: return GET_ACCEL (8700);
8950 case 8800: return GET_ACCEL (8800);
8951 case 8900: return GET_ACCEL (8900);
8952 case 9000: return GET_ACCEL (9000);
8953 case 9100: return GET_ACCEL (9100);
8954 case 9200: return GET_ACCEL (9200);
8955 case 9300: return GET_ACCEL (9300);
8956 case 9400: return GET_ACCEL (9400);
8957 case 9500: return GET_ACCEL (9500);
8958 case 9600: return GET_ACCEL (9600);
8959 case 9700: return GET_ACCEL (9700);
8960 case 9710: return GET_ACCEL (9710);
8961 case 9720: return GET_ACCEL (9720);
8962 case 9800: return GET_ACCEL (9800);
8963 case 9810: return GET_ACCEL (9810);
8964 case 9820: return GET_ACCEL (9820);
8965 case 9900: return GET_ACCEL (9900);
8966 case 10000: return GET_ACCEL (10000);
8967 case 10100: return GET_ACCEL (10100);
8968 case 10200: return GET_ACCEL (10200);
8969 case 10300: return GET_ACCEL (10300);
8970 case 10400: return GET_ACCEL (10400);
8971 case 10410: return GET_ACCEL (10410);
8972 case 10420: return GET_ACCEL (10420);
8973 case 10500: return GET_ACCEL (10500);
8974 case 10600: return GET_ACCEL (10600);
8975 case 10700: return GET_ACCEL (10700);
8976 case 10800: return GET_ACCEL (10800);
8977 case 10900: return GET_ACCEL (10900);
8978 case 11000: return GET_ACCEL (11000);
8979 case 11100: return GET_ACCEL (11100);
8980 case 11200: return GET_ACCEL (11200);
8981 case 11300: return GET_ACCEL (11300);
8982 case 11400: return GET_ACCEL (11400);
8983 case 11500: return GET_ACCEL (11500);
8984 case 11600: return GET_ACCEL (11600);
8985 case 11700: return GET_ACCEL (11700);
8986 case 11800: return GET_ACCEL (11800);
8987 case 11900: return GET_ACCEL (11900);
8988 case 12000: return GET_ACCEL (12000);
8989 case 12100: return GET_ACCEL (12100);
8990 case 12200: return GET_ACCEL (12200);
8991 case 12300: return GET_ACCEL (12300);
8992 case 12400: return GET_ACCEL (12400);
8993 case 12500: return GET_ACCEL (12500);
8994 case 12600: return GET_ACCEL (12600);
8995 case 12700: return GET_ACCEL (12700);
8996 case 12800: return GET_ACCEL (12800);
8997 }
8998
8999 return 0;
9000 }
9001
9002 uint set_gpu_loops (uint hash_mode)
9003 {
9004 switch (hash_mode)
9005 {
9006 case 0: return GET_LOOPS (0);
9007 case 10: return GET_LOOPS (10);
9008 case 11: return GET_LOOPS (11);
9009 case 12: return GET_LOOPS (12);
9010 case 20: return GET_LOOPS (20);
9011 case 21: return GET_LOOPS (21);
9012 case 22: return GET_LOOPS (22);
9013 case 23: return GET_LOOPS (23);
9014 case 30: return GET_LOOPS (30);
9015 case 40: return GET_LOOPS (40);
9016 case 50: return GET_LOOPS (50);
9017 case 60: return GET_LOOPS (60);
9018 case 100: return GET_LOOPS (100);
9019 case 101: return GET_LOOPS (101);
9020 case 110: return GET_LOOPS (110);
9021 case 111: return GET_LOOPS (111);
9022 case 112: return GET_LOOPS (112);
9023 case 120: return GET_LOOPS (120);
9024 case 121: return GET_LOOPS (121);
9025 case 122: return GET_LOOPS (122);
9026 case 124: return GET_LOOPS (124);
9027 case 130: return GET_LOOPS (130);
9028 case 131: return GET_LOOPS (131);
9029 case 132: return GET_LOOPS (132);
9030 case 133: return GET_LOOPS (133);
9031 case 140: return GET_LOOPS (140);
9032 case 141: return GET_LOOPS (141);
9033 case 150: return GET_LOOPS (150);
9034 case 160: return GET_LOOPS (160);
9035 case 190: return GET_LOOPS (190);
9036 case 200: return GET_LOOPS (200);
9037 case 300: return GET_LOOPS (300);
9038 case 400: return GET_LOOPS (400);
9039 case 500: return GET_LOOPS (500);
9040 case 501: return GET_LOOPS (501);
9041 case 900: return GET_LOOPS (900);
9042 case 910: return GET_LOOPS (910);
9043 case 1000: return GET_LOOPS (1000);
9044 case 1100: return GET_LOOPS (1100);
9045 case 1400: return GET_LOOPS (1400);
9046 case 1410: return GET_LOOPS (1410);
9047 case 1420: return GET_LOOPS (1420);
9048 case 1421: return GET_LOOPS (1421);
9049 case 1430: return GET_LOOPS (1430);
9050 case 1440: return GET_LOOPS (1440);
9051 case 1441: return GET_LOOPS (1441);
9052 case 1450: return GET_LOOPS (1450);
9053 case 1460: return GET_LOOPS (1460);
9054 case 1500: return GET_LOOPS (1500);
9055 case 1600: return GET_LOOPS (1600);
9056 case 1700: return GET_LOOPS (1700);
9057 case 1710: return GET_LOOPS (1710);
9058 case 1711: return GET_LOOPS (1711);
9059 case 1720: return GET_LOOPS (1720);
9060 case 1722: return GET_LOOPS (1722);
9061 case 1730: return GET_LOOPS (1730);
9062 case 1731: return GET_LOOPS (1731);
9063 case 1740: return GET_LOOPS (1740);
9064 case 1750: return GET_LOOPS (1750);
9065 case 1760: return GET_LOOPS (1760);
9066 case 1800: return GET_LOOPS (1800);
9067 case 2100: return GET_LOOPS (2100);
9068 case 2400: return GET_LOOPS (2400);
9069 case 2410: return GET_LOOPS (2410);
9070 case 2500: return GET_LOOPS (2500);
9071 case 2600: return GET_LOOPS (2600);
9072 case 2611: return GET_LOOPS (2611);
9073 case 2612: return GET_LOOPS (2612);
9074 case 2711: return GET_LOOPS (2711);
9075 case 2811: return GET_LOOPS (2811);
9076 case 3000: return GET_LOOPS (3000);
9077 case 3100: return GET_LOOPS (3100);
9078 case 3200: return GET_LOOPS (3200);
9079 case 3710: return GET_LOOPS (3710);
9080 case 3711: return GET_LOOPS (3711);
9081 case 3800: return GET_LOOPS (3800);
9082 case 4300: return GET_LOOPS (4300);
9083 case 4400: return GET_LOOPS (4400);
9084 case 4500: return GET_LOOPS (4500);
9085 case 4700: return GET_LOOPS (4700);
9086 case 4800: return GET_LOOPS (4800);
9087 case 4900: return GET_LOOPS (4900);
9088 case 5000: return GET_LOOPS (5000);
9089 case 5100: return GET_LOOPS (5100);
9090 case 5200: return GET_LOOPS (5200);
9091 case 5300: return GET_LOOPS (5300);
9092 case 5400: return GET_LOOPS (5400);
9093 case 5500: return GET_LOOPS (5500);
9094 case 5600: return GET_LOOPS (5600);
9095 case 5700: return GET_LOOPS (5700);
9096 case 5800: return GET_LOOPS (5800);
9097 case 6000: return GET_LOOPS (6000);
9098 case 6100: return GET_LOOPS (6100);
9099 case 6211: return GET_LOOPS (6211);
9100 case 6212: return GET_LOOPS (6212);
9101 case 6213: return GET_LOOPS (6213);
9102 case 6221: return GET_LOOPS (6221);
9103 case 6222: return GET_LOOPS (6222);
9104 case 6223: return GET_LOOPS (6223);
9105 case 6231: return GET_LOOPS (6231);
9106 case 6232: return GET_LOOPS (6232);
9107 case 6233: return GET_LOOPS (6233);
9108 case 6241: return GET_LOOPS (6241);
9109 case 6242: return GET_LOOPS (6242);
9110 case 6243: return GET_LOOPS (6243);
9111 case 6300: return GET_LOOPS (6300);
9112 case 6400: return GET_LOOPS (6400);
9113 case 6500: return GET_LOOPS (6500);
9114 case 6600: return GET_LOOPS (6600);
9115 case 6700: return GET_LOOPS (6700);
9116 case 6800: return GET_LOOPS (6800);
9117 case 6900: return GET_LOOPS (6900);
9118 case 7100: return GET_LOOPS (7100);
9119 case 7200: return GET_LOOPS (7200);
9120 case 7300: return GET_LOOPS (7300);
9121 case 7400: return GET_LOOPS (7400);
9122 case 7500: return GET_LOOPS (7500);
9123 case 7600: return GET_LOOPS (7600);
9124 case 7700: return GET_LOOPS (7700);
9125 case 7800: return GET_LOOPS (7800);
9126 case 7900: return GET_LOOPS (7900);
9127 case 8000: return GET_LOOPS (8000);
9128 case 8100: return GET_LOOPS (8100);
9129 case 8200: return GET_LOOPS (8200);
9130 case 8300: return GET_LOOPS (8300);
9131 case 8400: return GET_LOOPS (8400);
9132 case 8500: return GET_LOOPS (8500);
9133 case 8600: return GET_LOOPS (8600);
9134 case 8700: return GET_LOOPS (8700);
9135 case 8800: return GET_LOOPS (8800);
9136 case 8900: return GET_LOOPS (8900);
9137 case 9000: return GET_LOOPS (9000);
9138 case 9100: return GET_LOOPS (9100);
9139 case 9200: return GET_LOOPS (9200);
9140 case 9300: return GET_LOOPS (9300);
9141 case 9400: return GET_LOOPS (9400);
9142 case 9500: return GET_LOOPS (9500);
9143 case 9600: return GET_LOOPS (9600);
9144 case 9700: return GET_LOOPS (9700);
9145 case 9710: return GET_LOOPS (9710);
9146 case 9720: return GET_LOOPS (9720);
9147 case 9800: return GET_LOOPS (9800);
9148 case 9810: return GET_LOOPS (9810);
9149 case 9820: return GET_LOOPS (9820);
9150 case 9900: return GET_LOOPS (9900);
9151 case 10000: return GET_LOOPS (10000);
9152 case 10100: return GET_LOOPS (10100);
9153 case 10200: return GET_LOOPS (10200);
9154 case 10300: return GET_LOOPS (10300);
9155 case 10400: return GET_LOOPS (10400);
9156 case 10410: return GET_LOOPS (10410);
9157 case 10420: return GET_LOOPS (10420);
9158 case 10500: return GET_LOOPS (10500);
9159 case 10600: return GET_LOOPS (10600);
9160 case 10700: return GET_LOOPS (10700);
9161 case 10800: return GET_LOOPS (10800);
9162 case 10900: return GET_LOOPS (10900);
9163 case 11000: return GET_LOOPS (11000);
9164 case 11100: return GET_LOOPS (11100);
9165 case 11200: return GET_LOOPS (11200);
9166 case 11300: return GET_LOOPS (11300);
9167 case 11400: return GET_LOOPS (11400);
9168 case 11500: return GET_LOOPS (11500);
9169 case 11600: return GET_LOOPS (11600);
9170 case 11700: return GET_LOOPS (11700);
9171 case 11800: return GET_LOOPS (11800);
9172 case 11900: return GET_LOOPS (11900);
9173 case 12000: return GET_LOOPS (12000);
9174 case 12100: return GET_LOOPS (12100);
9175 case 12200: return GET_LOOPS (12200);
9176 case 12300: return GET_LOOPS (12300);
9177 case 12400: return GET_LOOPS (12400);
9178 case 12500: return GET_LOOPS (12500);
9179 case 12600: return GET_LOOPS (12600);
9180 case 12700: return GET_LOOPS (12700);
9181 case 12800: return GET_LOOPS (12800);
9182 }
9183
9184 return 0;
9185 }
9186
9187 /**
9188 * parser
9189 */
9190
9191 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9192 {
9193 char tmp[256];
9194
9195 if (salt_len > sizeof(tmp))
9196 {
9197 return UINT_MAX;
9198 }
9199
9200 memset (tmp, 0, sizeof (tmp));
9201 memcpy (tmp, in, salt_len);
9202
9203 if (data.opts_type & OPTS_TYPE_ST_HEX)
9204 {
9205 if ((salt_len % 2) == 0)
9206 {
9207 uint new_salt_len = salt_len / 2;
9208
9209 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9210 {
9211 char p0 = tmp[j + 0];
9212 char p1 = tmp[j + 1];
9213
9214 tmp[i] = hex_convert (p1) << 0;
9215 tmp[i] |= hex_convert (p0) << 4;
9216 }
9217
9218 salt_len = new_salt_len;
9219 }
9220 else
9221 {
9222 return UINT_MAX;
9223 }
9224 }
9225 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9226 {
9227 salt_len = base64_decode (base64_to_int, in, salt_len, tmp);
9228 }
9229
9230 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9231
9232 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9233 {
9234 if (salt_len < 20)
9235 {
9236 uint *tmp_uint = (uint *) tmp;
9237
9238 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9239 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9240 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9241 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9242 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9243 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9244 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9245 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9246 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9247 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9248
9249 salt_len = salt_len * 2;
9250 }
9251 else
9252 {
9253 return UINT_MAX;
9254 }
9255 }
9256
9257 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9258 {
9259 lowercase (tmp, salt_len);
9260 }
9261
9262 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9263 {
9264 uppercase (tmp, salt_len);
9265 }
9266
9267 uint len = salt_len;
9268
9269 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9270 {
9271 tmp[len++] = 0x80;
9272 }
9273
9274 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9275 {
9276 tmp[len++] = 0x01;
9277 }
9278
9279 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9280 {
9281 uint *tmp_uint = (uint *) tmp;
9282
9283 uint max = len / 4;
9284
9285 if (len % 4) max++;
9286
9287 for (uint i = 0; i < max; i++)
9288 {
9289 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9290 }
9291
9292 // Important: we may need to increase the length of memcpy since
9293 // we don't want to "loose" some swapped bytes (could happen if
9294 // they do not perfectly fit in the 4-byte blocks)
9295 // Memcpy does always copy the bytes in the BE order, but since
9296 // we swapped them, some important bytes could be in positions
9297 // we normally skip with the original len
9298
9299 if (len % 4) len += 4 - (len % 4);
9300 }
9301
9302 memcpy (out, tmp, len);
9303
9304 return (salt_len);
9305 }
9306
9307 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9308 {
9309 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9310
9311 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9312
9313 uint32_t *digest = (uint32_t *) hash_buf->digest;
9314
9315 salt_t *salt = hash_buf->salt;
9316
9317 memcpy ((char *) salt->salt_sign, input_buf, 6);
9318
9319 char *iter_pos = input_buf + 4;
9320
9321 salt->salt_iter = 1 << atoi (iter_pos);
9322
9323 char *salt_pos = strchr (iter_pos, '$');
9324
9325 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9326
9327 salt_pos++;
9328
9329 uint salt_len = 16;
9330
9331 salt->salt_len = salt_len;
9332
9333 char tmp_buf[100];
9334
9335 memset (tmp_buf, 0, sizeof (tmp_buf));
9336
9337 base64_decode (bf64_to_int, salt_pos, 22, tmp_buf);
9338
9339 char *salt_buf_ptr = (char *) salt->salt_buf;
9340
9341 memcpy (salt_buf_ptr, tmp_buf, 16);
9342
9343 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9344 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9345 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9346 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9347
9348 char *hash_pos = salt_pos + 22;
9349
9350 memset (tmp_buf, 0, sizeof (tmp_buf));
9351
9352 base64_decode (bf64_to_int, hash_pos, 31, tmp_buf);
9353
9354 memcpy (digest, tmp_buf, 24);
9355
9356 digest[0] = byte_swap_32 (digest[0]);
9357 digest[1] = byte_swap_32 (digest[1]);
9358 digest[2] = byte_swap_32 (digest[2]);
9359 digest[3] = byte_swap_32 (digest[3]);
9360 digest[4] = byte_swap_32 (digest[4]);
9361 digest[5] = byte_swap_32 (digest[5]);
9362
9363 digest[5] &= ~0xff; // its just 23 not 24 !
9364
9365 return (PARSER_OK);
9366 }
9367
9368 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9369 {
9370 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9371
9372 uint32_t *digest = (uint32_t *) hash_buf->digest;
9373
9374 char tmp_buf[100];
9375
9376 memset (tmp_buf, 0, sizeof (tmp_buf));
9377
9378 base64_decode (itoa64_to_int, input_buf, 43, tmp_buf);
9379
9380 memcpy (digest, tmp_buf, 32);
9381
9382 digest[0] = byte_swap_32 (digest[0]);
9383 digest[1] = byte_swap_32 (digest[1]);
9384 digest[2] = byte_swap_32 (digest[2]);
9385 digest[3] = byte_swap_32 (digest[3]);
9386 digest[4] = byte_swap_32 (digest[4]);
9387 digest[5] = byte_swap_32 (digest[5]);
9388 digest[6] = byte_swap_32 (digest[6]);
9389 digest[7] = byte_swap_32 (digest[7]);
9390
9391 digest[0] -= SHA256M_A;
9392 digest[1] -= SHA256M_B;
9393 digest[2] -= SHA256M_C;
9394 digest[3] -= SHA256M_D;
9395 digest[4] -= SHA256M_E;
9396 digest[5] -= SHA256M_F;
9397 digest[6] -= SHA256M_G;
9398 digest[7] -= SHA256M_H;
9399
9400 return (PARSER_OK);
9401 }
9402
9403 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9404 {
9405 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9406
9407 uint32_t *digest = (uint32_t *) hash_buf->digest;
9408
9409 digest[0] = hex_to_uint (&input_buf[ 0]);
9410 digest[1] = hex_to_uint (&input_buf[ 8]);
9411
9412 digest[0] = byte_swap_32 (digest[0]);
9413 digest[1] = byte_swap_32 (digest[1]);
9414
9415 uint tt;
9416
9417 IP (digest[0], digest[1], tt);
9418
9419 digest[0] = digest[0];
9420 digest[1] = digest[1];
9421 digest[2] = 0;
9422 digest[3] = 0;
9423
9424 return (PARSER_OK);
9425 }
9426
9427 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9428 {
9429 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9430
9431 uint32_t *digest = (uint32_t *) hash_buf->digest;
9432
9433 salt_t *salt = hash_buf->salt;
9434
9435 char *hash_pos = input_buf + 8;
9436
9437 digest[0] = hex_to_uint (&hash_pos[ 0]);
9438 digest[1] = hex_to_uint (&hash_pos[ 8]);
9439 digest[2] = hex_to_uint (&hash_pos[16]);
9440 digest[3] = hex_to_uint (&hash_pos[24]);
9441 digest[4] = hex_to_uint (&hash_pos[32]);
9442
9443 digest[0] -= SHA1M_A;
9444 digest[1] -= SHA1M_B;
9445 digest[2] -= SHA1M_C;
9446 digest[3] -= SHA1M_D;
9447 digest[4] -= SHA1M_E;
9448
9449 uint salt_len = 8;
9450
9451 char *salt_buf_ptr = (char *) salt->salt_buf;
9452
9453 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9454
9455 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9456
9457 salt->salt_len = salt_len;
9458
9459 return (PARSER_OK);
9460 }
9461
9462 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9463 {
9464 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9465
9466 uint64_t *digest = (uint64_t *) hash_buf->digest;
9467
9468 salt_t *salt = hash_buf->salt;
9469
9470 char *hash_pos = input_buf + 8;
9471
9472 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
9473 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
9474 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
9475 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
9476 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
9477 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
9478 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
9479 digest[7] = hex_to_uint64_t (&hash_pos[112]);
9480
9481 digest[0] -= SHA512M_A;
9482 digest[1] -= SHA512M_B;
9483 digest[2] -= SHA512M_C;
9484 digest[3] -= SHA512M_D;
9485 digest[4] -= SHA512M_E;
9486 digest[5] -= SHA512M_F;
9487 digest[6] -= SHA512M_G;
9488 digest[7] -= SHA512M_H;
9489
9490 uint salt_len = 8;
9491
9492 char *salt_buf_ptr = (char *) salt->salt_buf;
9493
9494 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9495
9496 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9497
9498 salt->salt_len = salt_len;
9499
9500 return (PARSER_OK);
9501 }
9502
9503 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9504 {
9505 if (data.opts_type & OPTS_TYPE_ST_HEX)
9506 {
9507 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9508 }
9509 else
9510 {
9511 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9512 }
9513
9514 uint32_t *digest = (uint32_t *) hash_buf->digest;
9515
9516 salt_t *salt = hash_buf->salt;
9517
9518 digest[0] = hex_to_uint (&input_buf[ 0]);
9519 digest[1] = hex_to_uint (&input_buf[ 8]);
9520 digest[2] = hex_to_uint (&input_buf[16]);
9521 digest[3] = hex_to_uint (&input_buf[24]);
9522
9523 digest[0] = byte_swap_32 (digest[0]);
9524 digest[1] = byte_swap_32 (digest[1]);
9525 digest[2] = byte_swap_32 (digest[2]);
9526 digest[3] = byte_swap_32 (digest[3]);
9527
9528 digest[0] -= MD5M_A;
9529 digest[1] -= MD5M_B;
9530 digest[2] -= MD5M_C;
9531 digest[3] -= MD5M_D;
9532
9533 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9534
9535 uint salt_len = input_len - 32 - 1;
9536
9537 char *salt_buf = input_buf + 32 + 1;
9538
9539 char *salt_buf_ptr = (char *) salt->salt_buf;
9540
9541 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9542
9543 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9544
9545 salt->salt_len = salt_len;
9546
9547 return (PARSER_OK);
9548 }
9549
9550 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9551 {
9552 if (data.opts_type & OPTS_TYPE_ST_HEX)
9553 {
9554 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9555 }
9556 else
9557 {
9558 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9559 }
9560
9561 // unscramble
9562
9563 char clean_input_buf[32];
9564
9565 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9566 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9567
9568 for (int i = 0, j = 0, k = 0; i < 30; i++)
9569 {
9570 if (i == pos[j])
9571 {
9572 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9573
9574 j++;
9575 }
9576 else
9577 {
9578 clean_input_buf[k] = input_buf[i];
9579
9580 k++;
9581 }
9582 }
9583
9584 // base64 decode
9585
9586 uint32_t *digest = (uint32_t *) hash_buf->digest;
9587
9588 salt_t *salt = hash_buf->salt;
9589
9590 char a, b, c, d, e, f;
9591
9592 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9593 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9594 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9595 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9596 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9597 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9598
9599 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9600 | (((d << 12) | (e << 6) | (f)) << 0);
9601
9602 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9603 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9604 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9605 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9606 e = base64_to_int (clean_input_buf[10] & 0x7f);
9607 f = base64_to_int (clean_input_buf[11] & 0x7f);
9608
9609 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9610 | (((d << 12) | (e << 6) | (f)) << 0);
9611
9612 a = base64_to_int (clean_input_buf[12] & 0x7f);
9613 b = base64_to_int (clean_input_buf[13] & 0x7f);
9614 c = base64_to_int (clean_input_buf[14] & 0x7f);
9615 d = base64_to_int (clean_input_buf[15] & 0x7f);
9616 e = base64_to_int (clean_input_buf[16] & 0x7f);
9617 f = base64_to_int (clean_input_buf[17] & 0x7f);
9618
9619 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9620 | (((d << 12) | (e << 6) | (f)) << 0);
9621
9622 a = base64_to_int (clean_input_buf[18] & 0x7f);
9623 b = base64_to_int (clean_input_buf[19] & 0x7f);
9624 c = base64_to_int (clean_input_buf[20] & 0x7f);
9625 d = base64_to_int (clean_input_buf[21] & 0x7f);
9626 e = base64_to_int (clean_input_buf[22] & 0x7f);
9627 f = base64_to_int (clean_input_buf[23] & 0x7f);
9628
9629 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
9630 | (((d << 12) | (e << 6) | (f)) << 0);
9631
9632 digest[0] = byte_swap_32 (digest[0]);
9633 digest[1] = byte_swap_32 (digest[1]);
9634 digest[2] = byte_swap_32 (digest[2]);
9635 digest[3] = byte_swap_32 (digest[3]);
9636
9637 digest[0] -= MD5M_A;
9638 digest[1] -= MD5M_B;
9639 digest[2] -= MD5M_C;
9640 digest[3] -= MD5M_D;
9641
9642 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
9643
9644 uint salt_len = input_len - 30 - 1;
9645
9646 char *salt_buf = input_buf + 30 + 1;
9647
9648 char *salt_buf_ptr = (char *) salt->salt_buf;
9649
9650 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9651
9652 // max. salt length: salt_buf[32] => 32 - 22 (":Administration Tools:") = 10
9653 if (salt_len > 10) return (PARSER_SALT_LENGTH);
9654
9655 salt->salt_len = salt_len;
9656
9657 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9658
9659 salt->salt_len += 22;
9660
9661 return (PARSER_OK);
9662 }
9663
9664 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9665 {
9666 if (data.opts_type & OPTS_TYPE_ST_HEX)
9667 {
9668 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9669 }
9670 else
9671 {
9672 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9673 }
9674
9675 uint32_t *digest = (uint32_t *) hash_buf->digest;
9676
9677 salt_t *salt = hash_buf->salt;
9678
9679 digest[0] = hex_to_uint (&input_buf[ 0]);
9680 digest[1] = hex_to_uint (&input_buf[ 8]);
9681 digest[2] = hex_to_uint (&input_buf[16]);
9682 digest[3] = hex_to_uint (&input_buf[24]);
9683 digest[4] = hex_to_uint (&input_buf[32]);
9684
9685 digest[0] -= SHA1M_A;
9686 digest[1] -= SHA1M_B;
9687 digest[2] -= SHA1M_C;
9688 digest[3] -= SHA1M_D;
9689 digest[4] -= SHA1M_E;
9690
9691 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9692
9693 uint salt_len = input_len - 40 - 1;
9694
9695 char *salt_buf = input_buf + 40 + 1;
9696
9697 char *salt_buf_ptr = (char *) salt->salt_buf;
9698
9699 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9700
9701 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9702
9703 salt->salt_len = salt_len;
9704
9705 return (PARSER_OK);
9706 }
9707
9708 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9709 {
9710 if (data.opts_type & OPTS_TYPE_ST_HEX)
9711 {
9712 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9713 }
9714 else
9715 {
9716 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9717 }
9718
9719 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9720
9721 char *iter_pos = input_buf + 6;
9722
9723 salt_t *salt = hash_buf->salt;
9724
9725 salt->salt_iter = atoi (iter_pos) - 1;
9726
9727 char *salt_pos = strchr (iter_pos, '#');
9728
9729 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9730
9731 salt_pos++;
9732
9733 char *digest_pos = strchr (salt_pos, '#');
9734
9735 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9736
9737 digest_pos++;
9738
9739 uint salt_len = digest_pos - salt_pos - 1;
9740
9741 uint32_t *digest = (uint32_t *) hash_buf->digest;
9742
9743 digest[0] = hex_to_uint (&digest_pos[ 0]);
9744 digest[1] = hex_to_uint (&digest_pos[ 8]);
9745 digest[2] = hex_to_uint (&digest_pos[16]);
9746 digest[3] = hex_to_uint (&digest_pos[24]);
9747
9748 char *salt_buf_ptr = (char *) salt->salt_buf;
9749
9750 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9751
9752 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9753
9754 salt->salt_len = salt_len;
9755
9756 return (PARSER_OK);
9757 }
9758
9759 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9760 {
9761 uint32_t *digest = (uint32_t *) hash_buf->digest;
9762
9763 salt_t *salt = hash_buf->salt;
9764
9765 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9766
9767 hccap_t in;
9768
9769 memcpy (&in, input_buf, input_len);
9770
9771 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9772
9773 memcpy (digest, in.keymic, 16);
9774
9775 /*
9776 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9777 The phrase "Pairwise key expansion"
9778 Access Point Address (Referred to as Authenticator Address AA)
9779 Supplicant Address (referred to as Supplicant Address SA)
9780 Access Point Nonce (referred to as Authenticator Anonce)
9781 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9782 */
9783
9784 uint salt_len = strlen (in.essid);
9785
9786 memcpy (salt->salt_buf, in.essid, salt_len);
9787
9788 salt->salt_len = salt_len;
9789
9790 salt->salt_iter = ROUNDS_WPA2 - 1;
9791
9792 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
9793
9794 memcpy (pke_ptr, "Pairwise key expansion", 23);
9795
9796 if (memcmp (in.mac1, in.mac2, 6) < 0)
9797 {
9798 memcpy (pke_ptr + 23, in.mac1, 6);
9799 memcpy (pke_ptr + 29, in.mac2, 6);
9800 }
9801 else
9802 {
9803 memcpy (pke_ptr + 23, in.mac2, 6);
9804 memcpy (pke_ptr + 29, in.mac1, 6);
9805 }
9806
9807 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
9808 {
9809 memcpy (pke_ptr + 35, in.nonce1, 32);
9810 memcpy (pke_ptr + 67, in.nonce2, 32);
9811 }
9812 else
9813 {
9814 memcpy (pke_ptr + 35, in.nonce2, 32);
9815 memcpy (pke_ptr + 67, in.nonce1, 32);
9816 }
9817
9818 for (int i = 0; i < 25; i++)
9819 {
9820 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
9821 }
9822
9823 wpa->keyver = in.keyver;
9824
9825 if (wpa->keyver > 255)
9826 {
9827 log_info ("ATTENTION!");
9828 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
9829 log_info (" This could be due to a recent aircrack-ng bug.");
9830 log_info (" The key version was automatically reset to a reasonable value.");
9831 log_info ("");
9832
9833 wpa->keyver &= 0xff;
9834 }
9835
9836 wpa->eapol_size = in.eapol_size;
9837
9838 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
9839
9840 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
9841
9842 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
9843
9844 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
9845
9846 if (wpa->keyver == 1)
9847 {
9848 // nothing to do
9849 }
9850 else
9851 {
9852 digest[0] = byte_swap_32 (digest[0]);
9853 digest[1] = byte_swap_32 (digest[1]);
9854 digest[2] = byte_swap_32 (digest[2]);
9855 digest[3] = byte_swap_32 (digest[3]);
9856
9857 for (int i = 0; i < 64; i++)
9858 {
9859 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
9860 }
9861 }
9862
9863 salt->salt_buf[10] = digest[1];
9864 salt->salt_buf[11] = digest[2];
9865
9866 return (PARSER_OK);
9867 }
9868
9869 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9870 {
9871 uint32_t *digest = (uint32_t *) hash_buf->digest;
9872
9873 salt_t *salt = hash_buf->salt;
9874
9875 if (input_len == 0)
9876 {
9877 log_error ("Password Safe v2 container not specified");
9878
9879 exit (-1);
9880 }
9881
9882 FILE *fp = fopen (input_buf, "rb");
9883
9884 if (fp == NULL)
9885 {
9886 log_error ("%s: %s", input_buf, strerror (errno));
9887
9888 exit (-1);
9889 }
9890
9891 typedef struct
9892 {
9893 uint32_t random[2];
9894 uint32_t hash[5];
9895 uint32_t salt[5]; // unused, but makes better valid check
9896 uint32_t iv[2]; // unused, but makes better valid check
9897
9898 } psafe2_hdr;
9899
9900 psafe2_hdr buf;
9901
9902 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
9903
9904 fclose (fp);
9905
9906 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
9907
9908 salt->salt_buf[0] = buf.random[0];
9909 salt->salt_buf[1] = buf.random[1];
9910
9911 salt->salt_len = 8;
9912 salt->salt_iter = 1000;
9913
9914 digest[0] = byte_swap_32 (buf.hash[0]);
9915 digest[1] = byte_swap_32 (buf.hash[1]);
9916 digest[2] = byte_swap_32 (buf.hash[2]);
9917 digest[3] = byte_swap_32 (buf.hash[3]);
9918 digest[4] = byte_swap_32 (buf.hash[4]);
9919
9920 return (PARSER_OK);
9921 }
9922
9923 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9924 {
9925 uint32_t *digest = (uint32_t *) hash_buf->digest;
9926
9927 salt_t *salt = hash_buf->salt;
9928
9929 if (input_len == 0)
9930 {
9931 log_error (".psafe3 not specified");
9932
9933 exit (-1);
9934 }
9935
9936 FILE *fp = fopen (input_buf, "rb");
9937
9938 if (fp == NULL)
9939 {
9940 log_error ("%s: %s", input_buf, strerror (errno));
9941
9942 exit (-1);
9943 }
9944
9945 psafe3_t in;
9946
9947 int n = fread (&in, sizeof (psafe3_t), 1, fp);
9948
9949 fclose (fp);
9950
9951 data.hashfile = input_buf; // we will need this in case it gets cracked
9952
9953 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
9954
9955 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
9956
9957 salt->salt_iter = in.iterations + 1;
9958
9959 salt->salt_buf[0] = in.salt_buf[0];
9960 salt->salt_buf[1] = in.salt_buf[1];
9961 salt->salt_buf[2] = in.salt_buf[2];
9962 salt->salt_buf[3] = in.salt_buf[3];
9963 salt->salt_buf[4] = in.salt_buf[4];
9964 salt->salt_buf[5] = in.salt_buf[5];
9965 salt->salt_buf[6] = in.salt_buf[6];
9966 salt->salt_buf[7] = in.salt_buf[7];
9967
9968 salt->salt_len = 32;
9969
9970 digest[0] = in.hash_buf[0];
9971 digest[1] = in.hash_buf[1];
9972 digest[2] = in.hash_buf[2];
9973 digest[3] = in.hash_buf[3];
9974 digest[4] = in.hash_buf[4];
9975 digest[5] = in.hash_buf[5];
9976 digest[6] = in.hash_buf[6];
9977 digest[7] = in.hash_buf[7];
9978
9979 digest[0] = byte_swap_32 (digest[0]);
9980 digest[1] = byte_swap_32 (digest[1]);
9981 digest[2] = byte_swap_32 (digest[2]);
9982 digest[3] = byte_swap_32 (digest[3]);
9983 digest[4] = byte_swap_32 (digest[4]);
9984 digest[5] = byte_swap_32 (digest[5]);
9985 digest[6] = byte_swap_32 (digest[6]);
9986 digest[7] = byte_swap_32 (digest[7]);
9987
9988 return (PARSER_OK);
9989 }
9990
9991 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9992 {
9993 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
9994
9995 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
9996
9997 uint32_t *digest = (uint32_t *) hash_buf->digest;
9998
9999 salt_t *salt = hash_buf->salt;
10000
10001 char *iter_pos = input_buf + 3;
10002
10003 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10004
10005 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10006
10007 memcpy ((char *) salt->salt_sign, input_buf, 4);
10008
10009 salt->salt_iter = salt_iter;
10010
10011 char *salt_pos = iter_pos + 1;
10012
10013 uint salt_len = 8;
10014
10015 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10016
10017 salt->salt_len = salt_len;
10018
10019 char *hash_pos = salt_pos + salt_len;
10020
10021 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10022
10023 return (PARSER_OK);
10024 }
10025
10026 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10027 {
10028 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10029
10030 uint32_t *digest = (uint32_t *) hash_buf->digest;
10031
10032 salt_t *salt = hash_buf->salt;
10033
10034 char *salt_pos = input_buf + 3;
10035
10036 uint iterations_len = 0;
10037
10038 if (memcmp (salt_pos, "rounds=", 7) == 0)
10039 {
10040 salt_pos += 7;
10041
10042 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10043
10044 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10045 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10046
10047 salt_pos[0] = 0x0;
10048
10049 salt->salt_iter = atoi (salt_pos - iterations_len);
10050
10051 salt_pos += 1;
10052
10053 iterations_len += 8;
10054 }
10055 else
10056 {
10057 salt->salt_iter = ROUNDS_MD5CRYPT;
10058 }
10059
10060 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10061
10062 char *hash_pos = strchr (salt_pos, '$');
10063
10064 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10065
10066 uint salt_len = hash_pos - salt_pos;
10067
10068 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10069
10070 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10071
10072 salt->salt_len = salt_len;
10073
10074 hash_pos++;
10075
10076 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10077
10078 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10079
10080 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10081
10082 return (PARSER_OK);
10083 }
10084
10085 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10086 {
10087 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10088
10089 uint32_t *digest = (uint32_t *) hash_buf->digest;
10090
10091 salt_t *salt = hash_buf->salt;
10092
10093 char *salt_pos = input_buf + 6;
10094
10095 uint iterations_len = 0;
10096
10097 if (memcmp (salt_pos, "rounds=", 7) == 0)
10098 {
10099 salt_pos += 7;
10100
10101 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10102
10103 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10104 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10105
10106 salt_pos[0] = 0x0;
10107
10108 salt->salt_iter = atoi (salt_pos - iterations_len);
10109
10110 salt_pos += 1;
10111
10112 iterations_len += 8;
10113 }
10114 else
10115 {
10116 salt->salt_iter = ROUNDS_MD5CRYPT;
10117 }
10118
10119 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10120
10121 char *hash_pos = strchr (salt_pos, '$');
10122
10123 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10124
10125 uint salt_len = hash_pos - salt_pos;
10126
10127 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10128
10129 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10130
10131 salt->salt_len = salt_len;
10132
10133 hash_pos++;
10134
10135 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10136
10137 return (PARSER_OK);
10138 }
10139
10140 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10141 {
10142 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10143
10144 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10145
10146 uint32_t *digest = (uint32_t *) hash_buf->digest;
10147
10148 salt_t *salt = hash_buf->salt;
10149
10150 char *salt_pos = input_buf + 14;
10151
10152 char *hash_pos = strchr (salt_pos, '*');
10153
10154 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10155
10156 hash_pos++;
10157
10158 uint salt_len = hash_pos - salt_pos - 1;
10159
10160 char *salt_buf_ptr = (char *) salt->salt_buf;
10161
10162 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10163
10164 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10165
10166 salt->salt_len = salt_len;
10167
10168 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
10169
10170 base64_decode (base64_to_int, hash_pos, 27, tmp_buf);
10171
10172 memcpy (digest, tmp_buf, 20);
10173
10174 digest[0] = byte_swap_32 (digest[0]);
10175 digest[1] = byte_swap_32 (digest[1]);
10176 digest[2] = byte_swap_32 (digest[2]);
10177 digest[3] = byte_swap_32 (digest[3]);
10178 digest[4] = byte_swap_32 (digest[4]);
10179
10180 digest[0] -= SHA1M_A;
10181 digest[1] -= SHA1M_B;
10182 digest[2] -= SHA1M_C;
10183 digest[3] -= SHA1M_D;
10184 digest[4] -= SHA1M_E;
10185
10186 return (PARSER_OK);
10187 }
10188
10189 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10190 {
10191 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10192
10193 unsigned char c12 = itoa64_to_int (input_buf[12]);
10194
10195 if (c12 & 3) return (PARSER_HASH_VALUE);
10196
10197 uint32_t *digest = (uint32_t *) hash_buf->digest;
10198
10199 salt_t *salt = hash_buf->salt;
10200
10201 // for ascii_digest
10202 salt->salt_sign[0] = input_buf[0];
10203 salt->salt_sign[1] = input_buf[1];
10204
10205 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10206 | itoa64_to_int (input_buf[1]) << 6;
10207
10208 salt->salt_len = 2;
10209
10210 char tmp_buf[100];
10211
10212 memset (tmp_buf, 0, sizeof (tmp_buf));
10213
10214 base64_decode (itoa64_to_int, input_buf + 2, 11, tmp_buf);
10215
10216 memcpy (digest, tmp_buf, 8);
10217
10218 uint tt;
10219
10220 IP (digest[0], digest[1], tt);
10221
10222 digest[2] = 0;
10223 digest[3] = 0;
10224
10225 return (PARSER_OK);
10226 }
10227
10228 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10229 {
10230 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10231
10232 uint32_t *digest = (uint32_t *) hash_buf->digest;
10233
10234 digest[0] = hex_to_uint (&input_buf[ 0]);
10235 digest[1] = hex_to_uint (&input_buf[ 8]);
10236 digest[2] = hex_to_uint (&input_buf[16]);
10237 digest[3] = hex_to_uint (&input_buf[24]);
10238
10239 digest[0] = byte_swap_32 (digest[0]);
10240 digest[1] = byte_swap_32 (digest[1]);
10241 digest[2] = byte_swap_32 (digest[2]);
10242 digest[3] = byte_swap_32 (digest[3]);
10243
10244 digest[0] -= MD4M_A;
10245 digest[1] -= MD4M_B;
10246 digest[2] -= MD4M_C;
10247 digest[3] -= MD4M_D;
10248
10249 return (PARSER_OK);
10250 }
10251
10252 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10253 {
10254 if (data.opts_type & OPTS_TYPE_ST_HEX)
10255 {
10256 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10257 }
10258 else
10259 {
10260 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10261 }
10262
10263 uint32_t *digest = (uint32_t *) hash_buf->digest;
10264
10265 salt_t *salt = hash_buf->salt;
10266
10267 digest[0] = hex_to_uint (&input_buf[ 0]);
10268 digest[1] = hex_to_uint (&input_buf[ 8]);
10269 digest[2] = hex_to_uint (&input_buf[16]);
10270 digest[3] = hex_to_uint (&input_buf[24]);
10271
10272 digest[0] = byte_swap_32 (digest[0]);
10273 digest[1] = byte_swap_32 (digest[1]);
10274 digest[2] = byte_swap_32 (digest[2]);
10275 digest[3] = byte_swap_32 (digest[3]);
10276
10277 digest[0] -= MD4M_A;
10278 digest[1] -= MD4M_B;
10279 digest[2] -= MD4M_C;
10280 digest[3] -= MD4M_D;
10281
10282 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10283
10284 uint salt_len = input_len - 32 - 1;
10285
10286 char *salt_buf = input_buf + 32 + 1;
10287
10288 char *salt_buf_ptr = (char *) salt->salt_buf;
10289
10290 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10291
10292 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10293
10294 salt->salt_len = salt_len;
10295
10296 return (PARSER_OK);
10297 }
10298
10299 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10300 {
10301 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10302
10303 uint32_t *digest = (uint32_t *) hash_buf->digest;
10304
10305 digest[0] = hex_to_uint (&input_buf[ 0]);
10306 digest[1] = hex_to_uint (&input_buf[ 8]);
10307 digest[2] = hex_to_uint (&input_buf[16]);
10308 digest[3] = hex_to_uint (&input_buf[24]);
10309
10310 digest[0] = byte_swap_32 (digest[0]);
10311 digest[1] = byte_swap_32 (digest[1]);
10312 digest[2] = byte_swap_32 (digest[2]);
10313 digest[3] = byte_swap_32 (digest[3]);
10314
10315 digest[0] -= MD5M_A;
10316 digest[1] -= MD5M_B;
10317 digest[2] -= MD5M_C;
10318 digest[3] -= MD5M_D;
10319
10320 return (PARSER_OK);
10321 }
10322
10323 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10324 {
10325 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10326
10327 uint32_t *digest = (uint32_t *) hash_buf->digest;
10328
10329 digest[0] = hex_to_uint (&input_buf[0]);
10330 digest[1] = hex_to_uint (&input_buf[8]);
10331 digest[2] = 0;
10332 digest[3] = 0;
10333
10334 digest[0] = byte_swap_32 (digest[0]);
10335 digest[1] = byte_swap_32 (digest[1]);
10336
10337 return (PARSER_OK);
10338 }
10339
10340 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10341 {
10342 if (data.opts_type & OPTS_TYPE_ST_HEX)
10343 {
10344 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10345 }
10346 else
10347 {
10348 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10349 }
10350
10351 uint32_t *digest = (uint32_t *) hash_buf->digest;
10352
10353 salt_t *salt = hash_buf->salt;
10354
10355 digest[0] = hex_to_uint (&input_buf[ 0]);
10356 digest[1] = hex_to_uint (&input_buf[ 8]);
10357 digest[2] = hex_to_uint (&input_buf[16]);
10358 digest[3] = hex_to_uint (&input_buf[24]);
10359
10360 digest[0] = byte_swap_32 (digest[0]);
10361 digest[1] = byte_swap_32 (digest[1]);
10362 digest[2] = byte_swap_32 (digest[2]);
10363 digest[3] = byte_swap_32 (digest[3]);
10364
10365 digest[0] -= MD5M_A;
10366 digest[1] -= MD5M_B;
10367 digest[2] -= MD5M_C;
10368 digest[3] -= MD5M_D;
10369
10370 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10371
10372 uint salt_len = input_len - 32 - 1;
10373
10374 char *salt_buf = input_buf + 32 + 1;
10375
10376 char *salt_buf_ptr = (char *) salt->salt_buf;
10377
10378 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10379
10380 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10381
10382 salt->salt_len = salt_len;
10383
10384 return (PARSER_OK);
10385 }
10386
10387 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10388 {
10389 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10390
10391 uint32_t *digest = (uint32_t *) hash_buf->digest;
10392
10393 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10394 | itoa64_to_int (input_buf[ 1]) << 6
10395 | itoa64_to_int (input_buf[ 2]) << 12
10396 | itoa64_to_int (input_buf[ 3]) << 18;
10397 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10398 | itoa64_to_int (input_buf[ 5]) << 6
10399 | itoa64_to_int (input_buf[ 6]) << 12
10400 | itoa64_to_int (input_buf[ 7]) << 18;
10401 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10402 | itoa64_to_int (input_buf[ 9]) << 6
10403 | itoa64_to_int (input_buf[10]) << 12
10404 | itoa64_to_int (input_buf[11]) << 18;
10405 digest[3] = itoa64_to_int (input_buf[12]) << 0
10406 | itoa64_to_int (input_buf[13]) << 6
10407 | itoa64_to_int (input_buf[14]) << 12
10408 | itoa64_to_int (input_buf[15]) << 18;
10409
10410 digest[0] -= MD5M_A;
10411 digest[1] -= MD5M_B;
10412 digest[2] -= MD5M_C;
10413 digest[3] -= MD5M_D;
10414
10415 digest[0] &= 0x00ffffff;
10416 digest[1] &= 0x00ffffff;
10417 digest[2] &= 0x00ffffff;
10418 digest[3] &= 0x00ffffff;
10419
10420 return (PARSER_OK);
10421 }
10422
10423 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10424 {
10425 if (data.opts_type & OPTS_TYPE_ST_HEX)
10426 {
10427 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10428 }
10429 else
10430 {
10431 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10432 }
10433
10434 uint32_t *digest = (uint32_t *) hash_buf->digest;
10435
10436 salt_t *salt = hash_buf->salt;
10437
10438 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10439 | itoa64_to_int (input_buf[ 1]) << 6
10440 | itoa64_to_int (input_buf[ 2]) << 12
10441 | itoa64_to_int (input_buf[ 3]) << 18;
10442 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10443 | itoa64_to_int (input_buf[ 5]) << 6
10444 | itoa64_to_int (input_buf[ 6]) << 12
10445 | itoa64_to_int (input_buf[ 7]) << 18;
10446 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10447 | itoa64_to_int (input_buf[ 9]) << 6
10448 | itoa64_to_int (input_buf[10]) << 12
10449 | itoa64_to_int (input_buf[11]) << 18;
10450 digest[3] = itoa64_to_int (input_buf[12]) << 0
10451 | itoa64_to_int (input_buf[13]) << 6
10452 | itoa64_to_int (input_buf[14]) << 12
10453 | itoa64_to_int (input_buf[15]) << 18;
10454
10455 digest[0] -= MD5M_A;
10456 digest[1] -= MD5M_B;
10457 digest[2] -= MD5M_C;
10458 digest[3] -= MD5M_D;
10459
10460 digest[0] &= 0x00ffffff;
10461 digest[1] &= 0x00ffffff;
10462 digest[2] &= 0x00ffffff;
10463 digest[3] &= 0x00ffffff;
10464
10465 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10466
10467 uint salt_len = input_len - 16 - 1;
10468
10469 char *salt_buf = input_buf + 16 + 1;
10470
10471 char *salt_buf_ptr = (char *) salt->salt_buf;
10472
10473 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10474
10475 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10476
10477 salt->salt_len = salt_len;
10478
10479 return (PARSER_OK);
10480 }
10481
10482 void transform_netntlmv1_key (const uint8_t *nthash, uint8_t *key)
10483 {
10484 key[0] = (nthash[0] >> 0);
10485 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10486 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10487 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10488 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10489 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10490 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10491 key[7] = (nthash[6] << 1);
10492
10493 key[0] |= 0x01;
10494 key[1] |= 0x01;
10495 key[2] |= 0x01;
10496 key[3] |= 0x01;
10497 key[4] |= 0x01;
10498 key[5] |= 0x01;
10499 key[6] |= 0x01;
10500 key[7] |= 0x01;
10501 }
10502
10503 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10504 {
10505 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10506
10507 uint32_t *digest = (uint32_t *) hash_buf->digest;
10508
10509 salt_t *salt = hash_buf->salt;
10510
10511 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10512
10513 /**
10514 * parse line
10515 */
10516
10517 char *user_pos = input_buf;
10518
10519 char *unused_pos = strchr (user_pos, ':');
10520
10521 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10522
10523 uint user_len = unused_pos - user_pos;
10524
10525 if (user_len > 60) return (PARSER_SALT_LENGTH);
10526
10527 unused_pos++;
10528
10529 char *domain_pos = strchr (unused_pos, ':');
10530
10531 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10532
10533 uint unused_len = domain_pos - unused_pos;
10534
10535 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10536
10537 domain_pos++;
10538
10539 char *srvchall_pos = strchr (domain_pos, ':');
10540
10541 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10542
10543 uint domain_len = srvchall_pos - domain_pos;
10544
10545 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10546
10547 srvchall_pos++;
10548
10549 char *hash_pos = strchr (srvchall_pos, ':');
10550
10551 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10552
10553 uint srvchall_len = hash_pos - srvchall_pos;
10554
10555 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10556
10557 hash_pos++;
10558
10559 char *clichall_pos = strchr (hash_pos, ':');
10560
10561 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10562
10563 uint hash_len = clichall_pos - hash_pos;
10564
10565 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10566
10567 clichall_pos++;
10568
10569 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10570
10571 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10572
10573 /**
10574 * store some data for later use
10575 */
10576
10577 netntlm->user_len = user_len * 2;
10578 netntlm->domain_len = domain_len * 2;
10579 netntlm->srvchall_len = srvchall_len / 2;
10580 netntlm->clichall_len = clichall_len / 2;
10581
10582 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10583 char *chall_ptr = (char *) netntlm->chall_buf;
10584
10585 /**
10586 * handle username and domainname
10587 */
10588
10589 for (uint i = 0; i < user_len; i++)
10590 {
10591 *userdomain_ptr++ = user_pos[i];
10592 *userdomain_ptr++ = 0;
10593 }
10594
10595 for (uint i = 0; i < domain_len; i++)
10596 {
10597 *userdomain_ptr++ = domain_pos[i];
10598 *userdomain_ptr++ = 0;
10599 }
10600
10601 /**
10602 * handle server challenge encoding
10603 */
10604
10605 for (uint i = 0; i < srvchall_len; i += 2)
10606 {
10607 const char p0 = srvchall_pos[i + 0];
10608 const char p1 = srvchall_pos[i + 1];
10609
10610 *chall_ptr++ = hex_convert (p1) << 0
10611 | hex_convert (p0) << 4;
10612 }
10613
10614 /**
10615 * handle client challenge encoding
10616 */
10617
10618 for (uint i = 0; i < clichall_len; i += 2)
10619 {
10620 const char p0 = clichall_pos[i + 0];
10621 const char p1 = clichall_pos[i + 1];
10622
10623 *chall_ptr++ = hex_convert (p1) << 0
10624 | hex_convert (p0) << 4;
10625 }
10626
10627 /**
10628 * store data
10629 */
10630
10631 char *salt_buf_ptr = (char *) salt->salt_buf;
10632
10633 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10634
10635 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10636
10637 salt->salt_len = salt_len;
10638
10639 digest[0] = hex_to_uint (&hash_pos[ 0]);
10640 digest[1] = hex_to_uint (&hash_pos[ 8]);
10641 digest[2] = hex_to_uint (&hash_pos[16]);
10642 digest[3] = hex_to_uint (&hash_pos[24]);
10643
10644 digest[0] = byte_swap_32 (digest[0]);
10645 digest[1] = byte_swap_32 (digest[1]);
10646 digest[2] = byte_swap_32 (digest[2]);
10647 digest[3] = byte_swap_32 (digest[3]);
10648
10649 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10650
10651 uint digest_tmp[2];
10652
10653 digest_tmp[0] = hex_to_uint (&hash_pos[32]);
10654 digest_tmp[1] = hex_to_uint (&hash_pos[40]);
10655
10656 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10657 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10658
10659 /* special case 2: ESS */
10660
10661 if (srvchall_len == 48)
10662 {
10663 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10664 {
10665 uint w[16];
10666
10667 w[ 0] = netntlm->chall_buf[6];
10668 w[ 1] = netntlm->chall_buf[7];
10669 w[ 2] = netntlm->chall_buf[0];
10670 w[ 3] = netntlm->chall_buf[1];
10671 w[ 4] = 0x80;
10672 w[ 5] = 0;
10673 w[ 6] = 0;
10674 w[ 7] = 0;
10675 w[ 8] = 0;
10676 w[ 9] = 0;
10677 w[10] = 0;
10678 w[11] = 0;
10679 w[12] = 0;
10680 w[13] = 0;
10681 w[14] = 16 * 8;
10682 w[15] = 0;
10683
10684 uint dgst[4];
10685
10686 dgst[0] = MAGIC_A;
10687 dgst[1] = MAGIC_B;
10688 dgst[2] = MAGIC_C;
10689 dgst[3] = MAGIC_D;
10690
10691 md5_64 (w, dgst);
10692
10693 salt->salt_buf[0] = dgst[0];
10694 salt->salt_buf[1] = dgst[1];
10695 }
10696 }
10697
10698 /* precompute netntlmv1 exploit start */
10699
10700 for (uint i = 0; i < 0x10000; i++)
10701 {
10702 uint key_md4[2] = { i, 0 };
10703 uint key_des[2] = { 0, 0 };
10704
10705 transform_netntlmv1_key ((uint8_t *) key_md4, (uint8_t *) key_des);
10706
10707 uint Kc[16];
10708 uint Kd[16];
10709
10710 _des_keysetup (key_des, Kc, Kd, c_skb);
10711
10712 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10713
10714 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10715
10716 if (data3[0] != digest_tmp[0]) continue;
10717 if (data3[1] != digest_tmp[1]) continue;
10718
10719 salt->salt_buf[2] = i;
10720
10721 salt->salt_len = 24;
10722
10723 break;
10724 }
10725
10726 salt->salt_buf_pc[0] = digest_tmp[0];
10727 salt->salt_buf_pc[1] = digest_tmp[1];
10728
10729 /* precompute netntlmv1 exploit stop */
10730
10731 uint32_t tt;
10732
10733 IP (digest[0], digest[1], tt);
10734 IP (digest[2], digest[3], tt);
10735
10736 digest[0] = ROTATE_RIGHT (digest[0], 29);
10737 digest[1] = ROTATE_RIGHT (digest[1], 29);
10738 digest[2] = ROTATE_RIGHT (digest[2], 29);
10739 digest[3] = ROTATE_RIGHT (digest[3], 29);
10740
10741 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10742
10743 salt->salt_buf[0] = ROTATE_LEFT (salt->salt_buf[0], 3);
10744 salt->salt_buf[1] = ROTATE_LEFT (salt->salt_buf[1], 3);
10745
10746 return (PARSER_OK);
10747 }
10748
10749 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10750 {
10751 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10752
10753 uint32_t *digest = (uint32_t *) hash_buf->digest;
10754
10755 salt_t *salt = hash_buf->salt;
10756
10757 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10758
10759 /**
10760 * parse line
10761 */
10762
10763 char *user_pos = input_buf;
10764
10765 char *unused_pos = strchr (user_pos, ':');
10766
10767 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10768
10769 uint user_len = unused_pos - user_pos;
10770
10771 if (user_len > 60) return (PARSER_SALT_LENGTH);
10772
10773 unused_pos++;
10774
10775 char *domain_pos = strchr (unused_pos, ':');
10776
10777 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10778
10779 uint unused_len = domain_pos - unused_pos;
10780
10781 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10782
10783 domain_pos++;
10784
10785 char *srvchall_pos = strchr (domain_pos, ':');
10786
10787 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10788
10789 uint domain_len = srvchall_pos - domain_pos;
10790
10791 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10792
10793 srvchall_pos++;
10794
10795 char *hash_pos = strchr (srvchall_pos, ':');
10796
10797 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10798
10799 uint srvchall_len = hash_pos - srvchall_pos;
10800
10801 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
10802
10803 hash_pos++;
10804
10805 char *clichall_pos = strchr (hash_pos, ':');
10806
10807 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10808
10809 uint hash_len = clichall_pos - hash_pos;
10810
10811 if (hash_len != 32) return (PARSER_HASH_LENGTH);
10812
10813 clichall_pos++;
10814
10815 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10816
10817 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
10818
10819 if (clichall_len % 2) return (PARSER_SALT_VALUE);
10820
10821 /**
10822 * store some data for later use
10823 */
10824
10825 netntlm->user_len = user_len * 2;
10826 netntlm->domain_len = domain_len * 2;
10827 netntlm->srvchall_len = srvchall_len / 2;
10828 netntlm->clichall_len = clichall_len / 2;
10829
10830 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10831 char *chall_ptr = (char *) netntlm->chall_buf;
10832
10833 /**
10834 * handle username and domainname
10835 */
10836
10837 for (uint i = 0; i < user_len; i++)
10838 {
10839 *userdomain_ptr++ = toupper (user_pos[i]);
10840 *userdomain_ptr++ = 0;
10841 }
10842
10843 for (uint i = 0; i < domain_len; i++)
10844 {
10845 *userdomain_ptr++ = domain_pos[i];
10846 *userdomain_ptr++ = 0;
10847 }
10848
10849 *userdomain_ptr++ = 0x80;
10850
10851 /**
10852 * handle server challenge encoding
10853 */
10854
10855 for (uint i = 0; i < srvchall_len; i += 2)
10856 {
10857 const char p0 = srvchall_pos[i + 0];
10858 const char p1 = srvchall_pos[i + 1];
10859
10860 *chall_ptr++ = hex_convert (p1) << 0
10861 | hex_convert (p0) << 4;
10862 }
10863
10864 /**
10865 * handle client challenge encoding
10866 */
10867
10868 for (uint i = 0; i < clichall_len; i += 2)
10869 {
10870 const char p0 = clichall_pos[i + 0];
10871 const char p1 = clichall_pos[i + 1];
10872
10873 *chall_ptr++ = hex_convert (p1) << 0
10874 | hex_convert (p0) << 4;
10875 }
10876
10877 *chall_ptr++ = 0x80;
10878
10879 /**
10880 * handle hash itself
10881 */
10882
10883 digest[0] = hex_to_uint (&hash_pos[ 0]);
10884 digest[1] = hex_to_uint (&hash_pos[ 8]);
10885 digest[2] = hex_to_uint (&hash_pos[16]);
10886 digest[3] = hex_to_uint (&hash_pos[24]);
10887
10888 digest[0] = byte_swap_32 (digest[0]);
10889 digest[1] = byte_swap_32 (digest[1]);
10890 digest[2] = byte_swap_32 (digest[2]);
10891 digest[3] = byte_swap_32 (digest[3]);
10892
10893 /**
10894 * reuse challange data as salt_buf, its the buffer that is most likely unique
10895 */
10896
10897 salt->salt_buf[0] = 0;
10898 salt->salt_buf[1] = 0;
10899 salt->salt_buf[2] = 0;
10900 salt->salt_buf[3] = 0;
10901 salt->salt_buf[4] = 0;
10902 salt->salt_buf[5] = 0;
10903 salt->salt_buf[6] = 0;
10904 salt->salt_buf[7] = 0;
10905
10906 uint *uptr;
10907
10908 uptr = (uint *) netntlm->userdomain_buf;
10909
10910 for (uint i = 0; i < 16; i += 16)
10911 {
10912 md5_64 (uptr, salt->salt_buf);
10913 }
10914
10915 uptr = (uint *) netntlm->chall_buf;
10916
10917 for (uint i = 0; i < 256; i += 16)
10918 {
10919 md5_64 (uptr, salt->salt_buf);
10920 }
10921
10922 salt->salt_len = 16;
10923
10924 return (PARSER_OK);
10925 }
10926
10927 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10928 {
10929 if (data.opts_type & OPTS_TYPE_ST_HEX)
10930 {
10931 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
10932 }
10933 else
10934 {
10935 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
10936 }
10937
10938 uint32_t *digest = (uint32_t *) hash_buf->digest;
10939
10940 salt_t *salt = hash_buf->salt;
10941
10942 digest[0] = hex_to_uint (&input_buf[ 0]);
10943 digest[1] = hex_to_uint (&input_buf[ 8]);
10944 digest[2] = hex_to_uint (&input_buf[16]);
10945 digest[3] = hex_to_uint (&input_buf[24]);
10946
10947 digest[0] = byte_swap_32 (digest[0]);
10948 digest[1] = byte_swap_32 (digest[1]);
10949 digest[2] = byte_swap_32 (digest[2]);
10950 digest[3] = byte_swap_32 (digest[3]);
10951
10952 digest[0] -= MD5M_A;
10953 digest[1] -= MD5M_B;
10954 digest[2] -= MD5M_C;
10955 digest[3] -= MD5M_D;
10956
10957 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10958
10959 uint salt_len = input_len - 32 - 1;
10960
10961 char *salt_buf = input_buf + 32 + 1;
10962
10963 char *salt_buf_ptr = (char *) salt->salt_buf;
10964
10965 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10966
10967 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10968
10969 salt->salt_len = salt_len;
10970
10971 return (PARSER_OK);
10972 }
10973
10974 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10975 {
10976 if (data.opts_type & OPTS_TYPE_ST_HEX)
10977 {
10978 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
10979 }
10980 else
10981 {
10982 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
10983 }
10984
10985 uint32_t *digest = (uint32_t *) hash_buf->digest;
10986
10987 salt_t *salt = hash_buf->salt;
10988
10989 digest[0] = hex_to_uint (&input_buf[ 0]);
10990 digest[1] = hex_to_uint (&input_buf[ 8]);
10991 digest[2] = hex_to_uint (&input_buf[16]);
10992 digest[3] = hex_to_uint (&input_buf[24]);
10993
10994 digest[0] = byte_swap_32 (digest[0]);
10995 digest[1] = byte_swap_32 (digest[1]);
10996 digest[2] = byte_swap_32 (digest[2]);
10997 digest[3] = byte_swap_32 (digest[3]);
10998
10999 digest[0] -= MD5M_A;
11000 digest[1] -= MD5M_B;
11001 digest[2] -= MD5M_C;
11002 digest[3] -= MD5M_D;
11003
11004 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11005
11006 uint salt_len = input_len - 32 - 1;
11007
11008 char *salt_buf = input_buf + 32 + 1;
11009
11010 char *salt_buf_ptr = (char *) salt->salt_buf;
11011
11012 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11013
11014 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11015
11016 salt->salt_len = salt_len;
11017
11018 return (PARSER_OK);
11019 }
11020
11021 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11022 {
11023 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11024
11025 uint32_t *digest = (uint32_t *) hash_buf->digest;
11026
11027 salt_t *salt = hash_buf->salt;
11028
11029 digest[0] = hex_to_uint (&input_buf[ 0]);
11030 digest[1] = hex_to_uint (&input_buf[ 8]);
11031 digest[2] = hex_to_uint (&input_buf[16]);
11032 digest[3] = hex_to_uint (&input_buf[24]);
11033
11034 digest[0] = byte_swap_32 (digest[0]);
11035 digest[1] = byte_swap_32 (digest[1]);
11036 digest[2] = byte_swap_32 (digest[2]);
11037 digest[3] = byte_swap_32 (digest[3]);
11038
11039 digest[0] -= MD5M_A;
11040 digest[1] -= MD5M_B;
11041 digest[2] -= MD5M_C;
11042 digest[3] -= MD5M_D;
11043
11044 /**
11045 * This is a virtual salt. While the algorithm is basically not salted
11046 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11047 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11048 */
11049
11050 char *salt_buf_ptr = (char *) salt->salt_buf;
11051
11052 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11053
11054 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11055
11056 salt->salt_len = salt_len;
11057
11058 return (PARSER_OK);
11059 }
11060
11061 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11062 {
11063 if (data.opts_type & OPTS_TYPE_ST_HEX)
11064 {
11065 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11066 }
11067 else
11068 {
11069 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11070 }
11071
11072 uint32_t *digest = (uint32_t *) hash_buf->digest;
11073
11074 salt_t *salt = hash_buf->salt;
11075
11076 digest[0] = hex_to_uint (&input_buf[ 0]);
11077 digest[1] = hex_to_uint (&input_buf[ 8]);
11078 digest[2] = hex_to_uint (&input_buf[16]);
11079 digest[3] = hex_to_uint (&input_buf[24]);
11080
11081 digest[0] = byte_swap_32 (digest[0]);
11082 digest[1] = byte_swap_32 (digest[1]);
11083 digest[2] = byte_swap_32 (digest[2]);
11084 digest[3] = byte_swap_32 (digest[3]);
11085
11086 digest[0] -= MD5M_A;
11087 digest[1] -= MD5M_B;
11088 digest[2] -= MD5M_C;
11089 digest[3] -= MD5M_D;
11090
11091 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11092
11093 uint salt_len = input_len - 32 - 1;
11094
11095 char *salt_buf = input_buf + 32 + 1;
11096
11097 char *salt_buf_ptr = (char *) salt->salt_buf;
11098
11099 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11100
11101 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11102
11103 salt->salt_len = salt_len;
11104
11105 return (PARSER_OK);
11106 }
11107
11108 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11109 {
11110 if (data.opts_type & OPTS_TYPE_ST_HEX)
11111 {
11112 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11113 }
11114 else
11115 {
11116 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11117 }
11118
11119 uint32_t *digest = (uint32_t *) hash_buf->digest;
11120
11121 salt_t *salt = hash_buf->salt;
11122
11123 digest[0] = hex_to_uint (&input_buf[ 0]);
11124 digest[1] = hex_to_uint (&input_buf[ 8]);
11125 digest[2] = hex_to_uint (&input_buf[16]);
11126 digest[3] = hex_to_uint (&input_buf[24]);
11127
11128 digest[0] = byte_swap_32 (digest[0]);
11129 digest[1] = byte_swap_32 (digest[1]);
11130 digest[2] = byte_swap_32 (digest[2]);
11131 digest[3] = byte_swap_32 (digest[3]);
11132
11133 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11134
11135 uint salt_len = input_len - 32 - 1;
11136
11137 char *salt_buf = input_buf + 32 + 1;
11138
11139 char *salt_buf_ptr = (char *) salt->salt_buf;
11140
11141 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11142
11143 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11144
11145 salt->salt_len = salt_len;
11146
11147 return (PARSER_OK);
11148 }
11149
11150 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11151 {
11152 if (data.opts_type & OPTS_TYPE_ST_HEX)
11153 {
11154 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11155 }
11156 else
11157 {
11158 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11159 }
11160
11161 uint32_t *digest = (uint32_t *) hash_buf->digest;
11162
11163 salt_t *salt = hash_buf->salt;
11164
11165 digest[0] = hex_to_uint (&input_buf[ 0]);
11166 digest[1] = hex_to_uint (&input_buf[ 8]);
11167 digest[2] = hex_to_uint (&input_buf[16]);
11168 digest[3] = hex_to_uint (&input_buf[24]);
11169
11170 digest[0] = byte_swap_32 (digest[0]);
11171 digest[1] = byte_swap_32 (digest[1]);
11172 digest[2] = byte_swap_32 (digest[2]);
11173 digest[3] = byte_swap_32 (digest[3]);
11174
11175 digest[0] -= MD4M_A;
11176 digest[1] -= MD4M_B;
11177 digest[2] -= MD4M_C;
11178 digest[3] -= MD4M_D;
11179
11180 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11181
11182 uint salt_len = input_len - 32 - 1;
11183
11184 char *salt_buf = input_buf + 32 + 1;
11185
11186 char *salt_buf_ptr = (char *) salt->salt_buf;
11187
11188 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11189
11190 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11191
11192 salt->salt_len = salt_len;
11193
11194 return (PARSER_OK);
11195 }
11196
11197 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11198 {
11199 if (data.opts_type & OPTS_TYPE_ST_HEX)
11200 {
11201 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11202 }
11203 else
11204 {
11205 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11206 }
11207
11208 uint32_t *digest = (uint32_t *) hash_buf->digest;
11209
11210 salt_t *salt = hash_buf->salt;
11211
11212 digest[0] = hex_to_uint (&input_buf[ 0]);
11213 digest[1] = hex_to_uint (&input_buf[ 8]);
11214 digest[2] = hex_to_uint (&input_buf[16]);
11215 digest[3] = hex_to_uint (&input_buf[24]);
11216
11217 digest[0] = byte_swap_32 (digest[0]);
11218 digest[1] = byte_swap_32 (digest[1]);
11219 digest[2] = byte_swap_32 (digest[2]);
11220 digest[3] = byte_swap_32 (digest[3]);
11221
11222 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11223
11224 uint salt_len = input_len - 32 - 1;
11225
11226 char *salt_buf = input_buf + 32 + 1;
11227
11228 uint salt_pc_block[16];
11229
11230 memset (salt_pc_block, 0, sizeof (salt_pc_block));
11231
11232 char *salt_pc_block_ptr = (char *) salt_pc_block;
11233
11234 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11235
11236 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11237
11238 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11239
11240 salt_pc_block[14] = salt_len * 8;
11241
11242 uint salt_pc_digest[4];
11243
11244 salt_pc_digest[0] = MAGIC_A;
11245 salt_pc_digest[1] = MAGIC_B;
11246 salt_pc_digest[2] = MAGIC_C;
11247 salt_pc_digest[3] = MAGIC_D;
11248
11249 md5_64 (salt_pc_block, salt_pc_digest);
11250
11251 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11252 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11253 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11254 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11255
11256 char *salt_buf_ptr = (char *) salt->salt_buf;
11257
11258 memcpy (salt_buf_ptr, salt_buf, salt_len);
11259
11260 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
11261
11262 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11263 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11264 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11265 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11266
11267 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11268
11269 return (PARSER_OK);
11270 }
11271
11272 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11273 {
11274 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11275
11276 uint32_t *digest = (uint32_t *) hash_buf->digest;
11277
11278 digest[0] = hex_to_uint (&input_buf[ 0]);
11279 digest[1] = hex_to_uint (&input_buf[ 8]);
11280 digest[2] = hex_to_uint (&input_buf[16]);
11281 digest[3] = hex_to_uint (&input_buf[24]);
11282 digest[4] = hex_to_uint (&input_buf[32]);
11283
11284 digest[0] -= SHA1M_A;
11285 digest[1] -= SHA1M_B;
11286 digest[2] -= SHA1M_C;
11287 digest[3] -= SHA1M_D;
11288 digest[4] -= SHA1M_E;
11289
11290 return (PARSER_OK);
11291 }
11292
11293 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11294 {
11295 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11296
11297 uint32_t *digest = (uint32_t *) hash_buf->digest;
11298
11299 digest[0] = hex_to_uint (&input_buf[ 0]);
11300 digest[1] = hex_to_uint (&input_buf[ 8]);
11301 digest[2] = hex_to_uint (&input_buf[16]);
11302 digest[3] = hex_to_uint (&input_buf[24]);
11303 digest[4] = hex_to_uint (&input_buf[32]);
11304
11305 return (PARSER_OK);
11306 }
11307
11308 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11309 {
11310 if (data.opts_type & OPTS_TYPE_ST_HEX)
11311 {
11312 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11313 }
11314 else
11315 {
11316 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11317 }
11318
11319 uint32_t *digest = (uint32_t *) hash_buf->digest;
11320
11321 salt_t *salt = hash_buf->salt;
11322
11323 digest[0] = hex_to_uint (&input_buf[ 0]);
11324 digest[1] = hex_to_uint (&input_buf[ 8]);
11325 digest[2] = hex_to_uint (&input_buf[16]);
11326 digest[3] = hex_to_uint (&input_buf[24]);
11327 digest[4] = hex_to_uint (&input_buf[32]);
11328
11329 digest[0] -= SHA1M_A;
11330 digest[1] -= SHA1M_B;
11331 digest[2] -= SHA1M_C;
11332 digest[3] -= SHA1M_D;
11333 digest[4] -= SHA1M_E;
11334
11335 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11336
11337 uint salt_len = input_len - 40 - 1;
11338
11339 char *salt_buf = input_buf + 40 + 1;
11340
11341 char *salt_buf_ptr = (char *) salt->salt_buf;
11342
11343 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11344
11345 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11346
11347 salt->salt_len = salt_len;
11348
11349 return (PARSER_OK);
11350 }
11351
11352 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11353 {
11354 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11355
11356 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11357
11358 uint32_t *digest = (uint32_t *) hash_buf->digest;
11359
11360 char tmp_buf[100];
11361
11362 memset (tmp_buf, 0, sizeof (tmp_buf));
11363
11364 base64_decode (base64_to_int, input_buf + 5, input_len - 5, tmp_buf);
11365
11366 memcpy (digest, tmp_buf, 20);
11367
11368 digest[0] = byte_swap_32 (digest[0]);
11369 digest[1] = byte_swap_32 (digest[1]);
11370 digest[2] = byte_swap_32 (digest[2]);
11371 digest[3] = byte_swap_32 (digest[3]);
11372 digest[4] = byte_swap_32 (digest[4]);
11373
11374 digest[0] -= SHA1M_A;
11375 digest[1] -= SHA1M_B;
11376 digest[2] -= SHA1M_C;
11377 digest[3] -= SHA1M_D;
11378 digest[4] -= SHA1M_E;
11379
11380 return (PARSER_OK);
11381 }
11382
11383 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11384 {
11385 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11386
11387 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11388
11389 uint32_t *digest = (uint32_t *) hash_buf->digest;
11390
11391 salt_t *salt = hash_buf->salt;
11392
11393 char tmp_buf[100];
11394
11395 memset (tmp_buf, 0, sizeof (tmp_buf));
11396
11397 int tmp_len = base64_decode (base64_to_int, input_buf + 6, input_len - 6, tmp_buf);
11398
11399 memcpy (digest, tmp_buf, 20);
11400
11401 salt->salt_len = tmp_len - 20;
11402
11403 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11404
11405 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11406 {
11407 char *ptr = (char *) salt->salt_buf;
11408
11409 ptr[salt->salt_len] = 0x80;
11410 }
11411
11412 digest[0] = byte_swap_32 (digest[0]);
11413 digest[1] = byte_swap_32 (digest[1]);
11414 digest[2] = byte_swap_32 (digest[2]);
11415 digest[3] = byte_swap_32 (digest[3]);
11416 digest[4] = byte_swap_32 (digest[4]);
11417
11418 digest[0] -= SHA1M_A;
11419 digest[1] -= SHA1M_B;
11420 digest[2] -= SHA1M_C;
11421 digest[3] -= SHA1M_D;
11422 digest[4] -= SHA1M_E;
11423
11424 return (PARSER_OK);
11425 }
11426
11427 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11428 {
11429 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11430
11431 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11432
11433 uint32_t *digest = (uint32_t *) hash_buf->digest;
11434
11435 salt_t *salt = hash_buf->salt;
11436
11437 char *salt_buf = input_buf + 6;
11438
11439 uint salt_len = 8;
11440
11441 char *salt_buf_ptr = (char *) salt->salt_buf;
11442
11443 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11444
11445 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11446
11447 salt->salt_len = salt_len;
11448
11449 char *hash_pos = input_buf + 6 + 8 + 40;
11450
11451 digest[0] = hex_to_uint (&hash_pos[ 0]);
11452 digest[1] = hex_to_uint (&hash_pos[ 8]);
11453 digest[2] = hex_to_uint (&hash_pos[16]);
11454 digest[3] = hex_to_uint (&hash_pos[24]);
11455 digest[4] = hex_to_uint (&hash_pos[32]);
11456
11457 digest[0] -= SHA1M_A;
11458 digest[1] -= SHA1M_B;
11459 digest[2] -= SHA1M_C;
11460 digest[3] -= SHA1M_D;
11461 digest[4] -= SHA1M_E;
11462
11463 return (PARSER_OK);
11464 }
11465
11466 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11467 {
11468 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11469
11470 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11471
11472 uint32_t *digest = (uint32_t *) hash_buf->digest;
11473
11474 salt_t *salt = hash_buf->salt;
11475
11476 char *salt_buf = input_buf + 6;
11477
11478 uint salt_len = 8;
11479
11480 char *salt_buf_ptr = (char *) salt->salt_buf;
11481
11482 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11483
11484 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11485
11486 salt->salt_len = salt_len;
11487
11488 char *hash_pos = input_buf + 6 + 8;
11489
11490 digest[0] = hex_to_uint (&hash_pos[ 0]);
11491 digest[1] = hex_to_uint (&hash_pos[ 8]);
11492 digest[2] = hex_to_uint (&hash_pos[16]);
11493 digest[3] = hex_to_uint (&hash_pos[24]);
11494 digest[4] = hex_to_uint (&hash_pos[32]);
11495
11496 digest[0] -= SHA1M_A;
11497 digest[1] -= SHA1M_B;
11498 digest[2] -= SHA1M_C;
11499 digest[3] -= SHA1M_D;
11500 digest[4] -= SHA1M_E;
11501
11502 return (PARSER_OK);
11503 }
11504
11505 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11506 {
11507 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11508
11509 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11510
11511 uint64_t *digest = (uint64_t *) hash_buf->digest;
11512
11513 salt_t *salt = hash_buf->salt;
11514
11515 char *salt_buf = input_buf + 6;
11516
11517 uint salt_len = 8;
11518
11519 char *salt_buf_ptr = (char *) salt->salt_buf;
11520
11521 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11522
11523 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11524
11525 salt->salt_len = salt_len;
11526
11527 char *hash_pos = input_buf + 6 + 8;
11528
11529 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
11530 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
11531 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
11532 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
11533 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
11534 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
11535 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
11536 digest[7] = hex_to_uint64_t (&hash_pos[112]);
11537
11538 digest[0] -= SHA512M_A;
11539 digest[1] -= SHA512M_B;
11540 digest[2] -= SHA512M_C;
11541 digest[3] -= SHA512M_D;
11542 digest[4] -= SHA512M_E;
11543 digest[5] -= SHA512M_F;
11544 digest[6] -= SHA512M_G;
11545 digest[7] -= SHA512M_H;
11546
11547 return (PARSER_OK);
11548 }
11549
11550 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11551 {
11552 if (data.opts_type & OPTS_TYPE_ST_HEX)
11553 {
11554 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11555 }
11556 else
11557 {
11558 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11559 }
11560
11561 uint32_t *digest = (uint32_t *) hash_buf->digest;
11562
11563 salt_t *salt = hash_buf->salt;
11564
11565 digest[0] = hex_to_uint (&input_buf[ 0]);
11566 digest[1] = hex_to_uint (&input_buf[ 8]);
11567 digest[2] = 0;
11568 digest[3] = 0;
11569
11570 digest[0] = byte_swap_32 (digest[0]);
11571 digest[1] = byte_swap_32 (digest[1]);
11572
11573 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11574
11575 uint salt_len = input_len - 16 - 1;
11576
11577 char *salt_buf = input_buf + 16 + 1;
11578
11579 char *salt_buf_ptr = (char *) salt->salt_buf;
11580
11581 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11582
11583 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11584
11585 salt->salt_len = salt_len;
11586
11587 return (PARSER_OK);
11588 }
11589
11590 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11591 {
11592 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11593
11594 uint32_t *digest = (uint32_t *) hash_buf->digest;
11595
11596 salt_t *salt = hash_buf->salt;
11597
11598 digest[0] = hex_to_uint (&input_buf[ 0]);
11599 digest[1] = hex_to_uint (&input_buf[ 8]);
11600 digest[2] = hex_to_uint (&input_buf[16]);
11601 digest[3] = hex_to_uint (&input_buf[24]);
11602 digest[4] = hex_to_uint (&input_buf[32]);
11603
11604 digest[0] -= SHA1M_A;
11605 digest[1] -= SHA1M_B;
11606 digest[2] -= SHA1M_C;
11607 digest[3] -= SHA1M_D;
11608 digest[4] -= SHA1M_E;
11609
11610 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11611
11612 uint salt_len = input_len - 40 - 1;
11613
11614 char *salt_buf = input_buf + 40 + 1;
11615
11616 char *salt_buf_ptr = (char *) salt->salt_buf;
11617
11618 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11619
11620 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11621
11622 salt->salt_len = salt_len;
11623
11624 return (PARSER_OK);
11625 }
11626
11627 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11628 {
11629 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11630
11631 uint32_t *digest = (uint32_t *) hash_buf->digest;
11632
11633 salt_t *salt = hash_buf->salt;
11634
11635 char *hash_pos = input_buf;
11636
11637 digest[ 0] = hex_to_uint (&hash_pos[ 0]);
11638 digest[ 1] = hex_to_uint (&hash_pos[ 8]);
11639 digest[ 2] = hex_to_uint (&hash_pos[ 16]);
11640 digest[ 3] = hex_to_uint (&hash_pos[ 24]);
11641 digest[ 4] = hex_to_uint (&hash_pos[ 32]);
11642 digest[ 5] = hex_to_uint (&hash_pos[ 40]);
11643 digest[ 6] = hex_to_uint (&hash_pos[ 48]);
11644 digest[ 7] = hex_to_uint (&hash_pos[ 56]);
11645 digest[ 8] = hex_to_uint (&hash_pos[ 64]);
11646 digest[ 9] = hex_to_uint (&hash_pos[ 72]);
11647 digest[10] = hex_to_uint (&hash_pos[ 80]);
11648 digest[11] = hex_to_uint (&hash_pos[ 88]);
11649 digest[12] = hex_to_uint (&hash_pos[ 96]);
11650 digest[13] = hex_to_uint (&hash_pos[104]);
11651 digest[14] = hex_to_uint (&hash_pos[112]);
11652 digest[15] = hex_to_uint (&hash_pos[120]);
11653
11654 char *salt_pos = input_buf + 128;
11655
11656 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
11657 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
11658 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]);
11659 salt->salt_buf[3] = hex_to_uint (&salt_pos[24]);
11660
11661 salt->salt_iter = ROUNDS_ORACLET - 1;
11662 salt->salt_len = 16;
11663
11664 return (PARSER_OK);
11665 }
11666
11667 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11668 {
11669 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11670
11671 uint32_t *digest = (uint32_t *) hash_buf->digest;
11672
11673 digest[0] = hex_to_uint (&input_buf[ 0]);
11674 digest[1] = hex_to_uint (&input_buf[ 8]);
11675 digest[2] = hex_to_uint (&input_buf[16]);
11676 digest[3] = hex_to_uint (&input_buf[24]);
11677 digest[4] = hex_to_uint (&input_buf[32]);
11678 digest[5] = hex_to_uint (&input_buf[40]);
11679 digest[6] = hex_to_uint (&input_buf[48]);
11680 digest[7] = hex_to_uint (&input_buf[56]);
11681
11682 digest[0] -= SHA256M_A;
11683 digest[1] -= SHA256M_B;
11684 digest[2] -= SHA256M_C;
11685 digest[3] -= SHA256M_D;
11686 digest[4] -= SHA256M_E;
11687 digest[5] -= SHA256M_F;
11688 digest[6] -= SHA256M_G;
11689 digest[7] -= SHA256M_H;
11690
11691 return (PARSER_OK);
11692 }
11693
11694 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11695 {
11696 if (data.opts_type & OPTS_TYPE_ST_HEX)
11697 {
11698 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11699 }
11700 else
11701 {
11702 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11703 }
11704
11705 uint32_t *digest = (uint32_t *) hash_buf->digest;
11706
11707 salt_t *salt = hash_buf->salt;
11708
11709 digest[0] = hex_to_uint (&input_buf[ 0]);
11710 digest[1] = hex_to_uint (&input_buf[ 8]);
11711 digest[2] = hex_to_uint (&input_buf[16]);
11712 digest[3] = hex_to_uint (&input_buf[24]);
11713 digest[4] = hex_to_uint (&input_buf[32]);
11714 digest[5] = hex_to_uint (&input_buf[40]);
11715 digest[6] = hex_to_uint (&input_buf[48]);
11716 digest[7] = hex_to_uint (&input_buf[56]);
11717
11718 digest[0] -= SHA256M_A;
11719 digest[1] -= SHA256M_B;
11720 digest[2] -= SHA256M_C;
11721 digest[3] -= SHA256M_D;
11722 digest[4] -= SHA256M_E;
11723 digest[5] -= SHA256M_F;
11724 digest[6] -= SHA256M_G;
11725 digest[7] -= SHA256M_H;
11726
11727 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11728
11729 uint salt_len = input_len - 64 - 1;
11730
11731 char *salt_buf = input_buf + 64 + 1;
11732
11733 char *salt_buf_ptr = (char *) salt->salt_buf;
11734
11735 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11736
11737 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11738
11739 salt->salt_len = salt_len;
11740
11741 return (PARSER_OK);
11742 }
11743
11744 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11745 {
11746 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11747
11748 uint64_t *digest = (uint64_t *) hash_buf->digest;
11749
11750 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11751 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11752 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11753 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11754 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11755 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11756 digest[6] = 0;
11757 digest[7] = 0;
11758
11759 digest[0] -= SHA384M_A;
11760 digest[1] -= SHA384M_B;
11761 digest[2] -= SHA384M_C;
11762 digest[3] -= SHA384M_D;
11763 digest[4] -= SHA384M_E;
11764 digest[5] -= SHA384M_F;
11765 digest[6] -= 0;
11766 digest[7] -= 0;
11767
11768 return (PARSER_OK);
11769 }
11770
11771 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11772 {
11773 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
11774
11775 uint64_t *digest = (uint64_t *) hash_buf->digest;
11776
11777 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11778 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11779 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11780 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11781 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11782 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11783 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
11784 digest[7] = hex_to_uint64_t (&input_buf[112]);
11785
11786 digest[0] -= SHA512M_A;
11787 digest[1] -= SHA512M_B;
11788 digest[2] -= SHA512M_C;
11789 digest[3] -= SHA512M_D;
11790 digest[4] -= SHA512M_E;
11791 digest[5] -= SHA512M_F;
11792 digest[6] -= SHA512M_G;
11793 digest[7] -= SHA512M_H;
11794
11795 return (PARSER_OK);
11796 }
11797
11798 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11799 {
11800 if (data.opts_type & OPTS_TYPE_ST_HEX)
11801 {
11802 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
11803 }
11804 else
11805 {
11806 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
11807 }
11808
11809 uint64_t *digest = (uint64_t *) hash_buf->digest;
11810
11811 salt_t *salt = hash_buf->salt;
11812
11813 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11814 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11815 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11816 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11817 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11818 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11819 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
11820 digest[7] = hex_to_uint64_t (&input_buf[112]);
11821
11822 digest[0] -= SHA512M_A;
11823 digest[1] -= SHA512M_B;
11824 digest[2] -= SHA512M_C;
11825 digest[3] -= SHA512M_D;
11826 digest[4] -= SHA512M_E;
11827 digest[5] -= SHA512M_F;
11828 digest[6] -= SHA512M_G;
11829 digest[7] -= SHA512M_H;
11830
11831 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11832
11833 uint salt_len = input_len - 128 - 1;
11834
11835 char *salt_buf = input_buf + 128 + 1;
11836
11837 char *salt_buf_ptr = (char *) salt->salt_buf;
11838
11839 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11840
11841 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11842
11843 salt->salt_len = salt_len;
11844
11845 return (PARSER_OK);
11846 }
11847
11848 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11849 {
11850 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
11851
11852 uint64_t *digest = (uint64_t *) hash_buf->digest;
11853
11854 salt_t *salt = hash_buf->salt;
11855
11856 char *salt_pos = input_buf + 3;
11857
11858 uint iterations_len = 0;
11859
11860 if (memcmp (salt_pos, "rounds=", 7) == 0)
11861 {
11862 salt_pos += 7;
11863
11864 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
11865
11866 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
11867 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
11868
11869 salt_pos[0] = 0x0;
11870
11871 salt->salt_iter = atoi (salt_pos - iterations_len);
11872
11873 salt_pos += 1;
11874
11875 iterations_len += 8;
11876 }
11877 else
11878 {
11879 salt->salt_iter = ROUNDS_SHA512CRYPT;
11880 }
11881
11882 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
11883
11884 char *hash_pos = strchr (salt_pos, '$');
11885
11886 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11887
11888 uint salt_len = hash_pos - salt_pos;
11889
11890 if (salt_len > 16) return (PARSER_SALT_LENGTH);
11891
11892 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
11893
11894 salt->salt_len = salt_len;
11895
11896 hash_pos++;
11897
11898 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
11899
11900 return (PARSER_OK);
11901 }
11902
11903 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11904 {
11905 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
11906
11907 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
11908
11909 uint64_t *digest = (uint64_t *) hash_buf->digest;
11910
11911 salt_t *salt = hash_buf->salt;
11912
11913 uint keccak_mdlen = input_len / 2;
11914
11915 for (uint i = 0; i < keccak_mdlen / 8; i++)
11916 {
11917 digest[i] = hex_to_uint64_t (&input_buf[i * 16]);
11918
11919 digest[i] = byte_swap_64 (digest[i]);
11920 }
11921
11922 salt->keccak_mdlen = keccak_mdlen;
11923
11924 return (PARSER_OK);
11925 }
11926
11927 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11928 {
11929 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
11930
11931 uint32_t *digest = (uint32_t *) hash_buf->digest;
11932
11933 salt_t *salt = hash_buf->salt;
11934
11935 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
11936
11937 /**
11938 * Parse that strange long line
11939 */
11940
11941 char *in_off[9];
11942
11943 size_t in_len[9];
11944
11945 in_off[0] = strtok (input_buf, ":");
11946
11947 in_len[0] = strlen (in_off[0]);
11948
11949 size_t i;
11950
11951 for (i = 1; i < 9; i++)
11952 {
11953 in_off[i] = strtok (NULL, ":");
11954
11955 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11956
11957 in_len[i] = strlen (in_off[i]);
11958 }
11959
11960 char *ptr;
11961
11962 ptr = (char *) ikepsk->msg_buf;
11963
11964 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_char (in_off[0] + i);
11965 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_char (in_off[1] + i);
11966 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_char (in_off[2] + i);
11967 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_char (in_off[3] + i);
11968 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_char (in_off[4] + i);
11969 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_char (in_off[5] + i);
11970
11971 *ptr = 0x80;
11972
11973 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
11974
11975 ptr = (char *) ikepsk->nr_buf;
11976
11977 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_char (in_off[6] + i);
11978 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_char (in_off[7] + i);
11979
11980 *ptr = 0x80;
11981
11982 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
11983
11984 /**
11985 * Store to database
11986 */
11987
11988 ptr = in_off[8];
11989
11990 digest[0] = hex_to_uint (&ptr[ 0]);
11991 digest[1] = hex_to_uint (&ptr[ 8]);
11992 digest[2] = hex_to_uint (&ptr[16]);
11993 digest[3] = hex_to_uint (&ptr[24]);
11994
11995 digest[0] = byte_swap_32 (digest[0]);
11996 digest[1] = byte_swap_32 (digest[1]);
11997 digest[2] = byte_swap_32 (digest[2]);
11998 digest[3] = byte_swap_32 (digest[3]);
11999
12000 salt->salt_len = 32;
12001
12002 salt->salt_buf[0] = ikepsk->nr_buf[0];
12003 salt->salt_buf[1] = ikepsk->nr_buf[1];
12004 salt->salt_buf[2] = ikepsk->nr_buf[2];
12005 salt->salt_buf[3] = ikepsk->nr_buf[3];
12006 salt->salt_buf[4] = ikepsk->nr_buf[4];
12007 salt->salt_buf[5] = ikepsk->nr_buf[5];
12008 salt->salt_buf[6] = ikepsk->nr_buf[6];
12009 salt->salt_buf[7] = ikepsk->nr_buf[7];
12010
12011 return (PARSER_OK);
12012 }
12013
12014 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12015 {
12016 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12017
12018 uint32_t *digest = (uint32_t *) hash_buf->digest;
12019
12020 salt_t *salt = hash_buf->salt;
12021
12022 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12023
12024 /**
12025 * Parse that strange long line
12026 */
12027
12028 char *in_off[9];
12029
12030 size_t in_len[9];
12031
12032 in_off[0] = strtok (input_buf, ":");
12033
12034 in_len[0] = strlen (in_off[0]);
12035
12036 size_t i;
12037
12038 for (i = 1; i < 9; i++)
12039 {
12040 in_off[i] = strtok (NULL, ":");
12041
12042 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12043
12044 in_len[i] = strlen (in_off[i]);
12045 }
12046
12047 char *ptr;
12048
12049 ptr = (char *) ikepsk->msg_buf;
12050
12051 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_char (in_off[0] + i);
12052 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_char (in_off[1] + i);
12053 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_char (in_off[2] + i);
12054 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_char (in_off[3] + i);
12055 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_char (in_off[4] + i);
12056 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_char (in_off[5] + i);
12057
12058 *ptr = 0x80;
12059
12060 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12061
12062 ptr = (char *) ikepsk->nr_buf;
12063
12064 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_char (in_off[6] + i);
12065 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_char (in_off[7] + i);
12066
12067 *ptr = 0x80;
12068
12069 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12070
12071 /**
12072 * Store to database
12073 */
12074
12075 ptr = in_off[8];
12076
12077 digest[0] = hex_to_uint (&ptr[ 0]);
12078 digest[1] = hex_to_uint (&ptr[ 8]);
12079 digest[2] = hex_to_uint (&ptr[16]);
12080 digest[3] = hex_to_uint (&ptr[24]);
12081 digest[4] = hex_to_uint (&ptr[32]);
12082
12083 salt->salt_len = 32;
12084
12085 salt->salt_buf[0] = ikepsk->nr_buf[0];
12086 salt->salt_buf[1] = ikepsk->nr_buf[1];
12087 salt->salt_buf[2] = ikepsk->nr_buf[2];
12088 salt->salt_buf[3] = ikepsk->nr_buf[3];
12089 salt->salt_buf[4] = ikepsk->nr_buf[4];
12090 salt->salt_buf[5] = ikepsk->nr_buf[5];
12091 salt->salt_buf[6] = ikepsk->nr_buf[6];
12092 salt->salt_buf[7] = ikepsk->nr_buf[7];
12093
12094 return (PARSER_OK);
12095 }
12096
12097 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12098 {
12099 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12100
12101 uint32_t *digest = (uint32_t *) hash_buf->digest;
12102
12103 digest[0] = hex_to_uint (&input_buf[ 0]);
12104 digest[1] = hex_to_uint (&input_buf[ 8]);
12105 digest[2] = hex_to_uint (&input_buf[16]);
12106 digest[3] = hex_to_uint (&input_buf[24]);
12107 digest[4] = hex_to_uint (&input_buf[32]);
12108
12109 digest[0] = byte_swap_32 (digest[0]);
12110 digest[1] = byte_swap_32 (digest[1]);
12111 digest[2] = byte_swap_32 (digest[2]);
12112 digest[3] = byte_swap_32 (digest[3]);
12113 digest[4] = byte_swap_32 (digest[4]);
12114
12115 return (PARSER_OK);
12116 }
12117
12118 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12119 {
12120 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12121
12122 uint32_t *digest = (uint32_t *) hash_buf->digest;
12123
12124 digest[ 0] = hex_to_uint (&input_buf[ 0]);
12125 digest[ 1] = hex_to_uint (&input_buf[ 8]);
12126 digest[ 2] = hex_to_uint (&input_buf[ 16]);
12127 digest[ 3] = hex_to_uint (&input_buf[ 24]);
12128 digest[ 4] = hex_to_uint (&input_buf[ 32]);
12129 digest[ 5] = hex_to_uint (&input_buf[ 40]);
12130 digest[ 6] = hex_to_uint (&input_buf[ 48]);
12131 digest[ 7] = hex_to_uint (&input_buf[ 56]);
12132 digest[ 8] = hex_to_uint (&input_buf[ 64]);
12133 digest[ 9] = hex_to_uint (&input_buf[ 72]);
12134 digest[10] = hex_to_uint (&input_buf[ 80]);
12135 digest[11] = hex_to_uint (&input_buf[ 88]);
12136 digest[12] = hex_to_uint (&input_buf[ 96]);
12137 digest[13] = hex_to_uint (&input_buf[104]);
12138 digest[14] = hex_to_uint (&input_buf[112]);
12139 digest[15] = hex_to_uint (&input_buf[120]);
12140
12141 return (PARSER_OK);
12142 }
12143
12144 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12145 {
12146 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12147
12148 uint32_t *digest = (uint32_t *) hash_buf->digest;
12149
12150 salt_t *salt = hash_buf->salt;
12151
12152 digest[0] = hex_to_uint (&input_buf[ 0]);
12153 digest[1] = hex_to_uint (&input_buf[ 8]);
12154 digest[2] = hex_to_uint (&input_buf[16]);
12155 digest[3] = hex_to_uint (&input_buf[24]);
12156 digest[4] = hex_to_uint (&input_buf[32]);
12157
12158 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12159
12160 uint salt_len = input_len - 40 - 1;
12161
12162 char *salt_buf = input_buf + 40 + 1;
12163
12164 char *salt_buf_ptr = (char *) salt->salt_buf;
12165
12166 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12167
12168 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12169
12170 salt->salt_len = salt_len;
12171
12172 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12173
12174 return (PARSER_OK);
12175 }
12176
12177 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12178 {
12179 uint32_t *digest = (uint32_t *) hash_buf->digest;
12180
12181 salt_t *salt = hash_buf->salt;
12182
12183 tc_t *tc = (tc_t *) hash_buf->esalt;
12184
12185 if (input_len == 0)
12186 {
12187 log_error ("TrueCrypt container not specified");
12188
12189 exit (-1);
12190 }
12191
12192 FILE *fp = fopen (input_buf, "rb");
12193
12194 if (fp == NULL)
12195 {
12196 log_error ("%s: %s", input_buf, strerror (errno));
12197
12198 exit (-1);
12199 }
12200
12201 char buf[512];
12202
12203 int n = fread (buf, 1, sizeof (buf), fp);
12204
12205 fclose (fp);
12206
12207 if (n != 512) return (PARSER_TC_FILE_SIZE);
12208
12209 memcpy (tc->salt_buf, buf, 64);
12210
12211 memcpy (tc->data_buf, buf + 64, 512 - 64);
12212
12213 salt->salt_buf[0] = tc->salt_buf[0];
12214
12215 salt->salt_len = 4;
12216
12217 salt->salt_iter = 1000 - 1;
12218
12219 digest[0] = tc->data_buf[0];
12220
12221 return (PARSER_OK);
12222 }
12223
12224 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12225 {
12226 uint32_t *digest = (uint32_t *) hash_buf->digest;
12227
12228 salt_t *salt = hash_buf->salt;
12229
12230 tc_t *tc = (tc_t *) hash_buf->esalt;
12231
12232 if (input_len == 0)
12233 {
12234 log_error ("TrueCrypt container not specified");
12235
12236 exit (-1);
12237 }
12238
12239 FILE *fp = fopen (input_buf, "rb");
12240
12241 if (fp == NULL)
12242 {
12243 log_error ("%s: %s", input_buf, strerror (errno));
12244
12245 exit (-1);
12246 }
12247
12248 char buf[512];
12249
12250 int n = fread (buf, 1, sizeof (buf), fp);
12251
12252 fclose (fp);
12253
12254 if (n != 512) return (PARSER_TC_FILE_SIZE);
12255
12256 memcpy (tc->salt_buf, buf, 64);
12257
12258 memcpy (tc->data_buf, buf + 64, 512 - 64);
12259
12260 salt->salt_buf[0] = tc->salt_buf[0];
12261
12262 salt->salt_len = 4;
12263
12264 salt->salt_iter = 2000 - 1;
12265
12266 digest[0] = tc->data_buf[0];
12267
12268 return (PARSER_OK);
12269 }
12270
12271 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12272 {
12273 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12274
12275 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12276
12277 uint32_t *digest = (uint32_t *) hash_buf->digest;
12278
12279 salt_t *salt = hash_buf->salt;
12280
12281 char *salt_pos = input_buf + 6;
12282
12283 char *hash_pos = strchr (salt_pos, '$');
12284
12285 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12286
12287 uint salt_len = hash_pos - salt_pos;
12288
12289 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12290
12291 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12292
12293 salt->salt_len = salt_len;
12294
12295 salt->salt_iter = 1000;
12296
12297 hash_pos++;
12298
12299 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12300
12301 return (PARSER_OK);
12302 }
12303
12304 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12305 {
12306 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12307
12308 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12309
12310 uint32_t *digest = (uint32_t *) hash_buf->digest;
12311
12312 salt_t *salt = hash_buf->salt;
12313
12314 char *iter_pos = input_buf + 7;
12315
12316 char *salt_pos = strchr (iter_pos, '$');
12317
12318 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12319
12320 salt_pos++;
12321
12322 char *hash_pos = strchr (salt_pos, '$');
12323
12324 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12325
12326 uint salt_len = hash_pos - salt_pos;
12327
12328 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12329
12330 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12331
12332 salt->salt_len = salt_len;
12333
12334 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12335
12336 salt->salt_sign[0] = atoi (salt_iter);
12337
12338 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12339
12340 hash_pos++;
12341
12342 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12343
12344 digest[0] = byte_swap_32 (digest[0]);
12345 digest[1] = byte_swap_32 (digest[1]);
12346 digest[2] = byte_swap_32 (digest[2]);
12347 digest[3] = byte_swap_32 (digest[3]);
12348 digest[4] = byte_swap_32 (digest[4]);
12349
12350 return (PARSER_OK);
12351 }
12352
12353 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12354 {
12355 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12356
12357 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12358
12359 uint32_t *digest = (uint32_t *) hash_buf->digest;
12360
12361 salt_t *salt = hash_buf->salt;
12362
12363 char *iter_pos = input_buf + 9;
12364
12365 char *salt_pos = strchr (iter_pos, '$');
12366
12367 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12368
12369 salt_pos++;
12370
12371 char *hash_pos = strchr (salt_pos, '$');
12372
12373 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12374
12375 uint salt_len = hash_pos - salt_pos;
12376
12377 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12378
12379 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12380
12381 salt->salt_len = salt_len;
12382
12383 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12384
12385 salt->salt_sign[0] = atoi (salt_iter);
12386
12387 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12388
12389 hash_pos++;
12390
12391 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12392
12393 digest[0] = byte_swap_32 (digest[0]);
12394 digest[1] = byte_swap_32 (digest[1]);
12395 digest[2] = byte_swap_32 (digest[2]);
12396 digest[3] = byte_swap_32 (digest[3]);
12397 digest[4] = byte_swap_32 (digest[4]);
12398 digest[5] = byte_swap_32 (digest[5]);
12399 digest[6] = byte_swap_32 (digest[6]);
12400 digest[7] = byte_swap_32 (digest[7]);
12401
12402 return (PARSER_OK);
12403 }
12404
12405 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12406 {
12407 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12408
12409 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12410
12411 uint64_t *digest = (uint64_t *) hash_buf->digest;
12412
12413 salt_t *salt = hash_buf->salt;
12414
12415 char *iter_pos = input_buf + 9;
12416
12417 char *salt_pos = strchr (iter_pos, '$');
12418
12419 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12420
12421 salt_pos++;
12422
12423 char *hash_pos = strchr (salt_pos, '$');
12424
12425 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12426
12427 uint salt_len = hash_pos - salt_pos;
12428
12429 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12430
12431 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12432
12433 salt->salt_len = salt_len;
12434
12435 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12436
12437 salt->salt_sign[0] = atoi (salt_iter);
12438
12439 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12440
12441 hash_pos++;
12442
12443 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12444
12445 digest[0] = byte_swap_64 (digest[0]);
12446 digest[1] = byte_swap_64 (digest[1]);
12447 digest[2] = byte_swap_64 (digest[2]);
12448 digest[3] = byte_swap_64 (digest[3]);
12449 digest[4] = byte_swap_64 (digest[4]);
12450 digest[5] = byte_swap_64 (digest[5]);
12451 digest[6] = byte_swap_64 (digest[6]);
12452 digest[7] = byte_swap_64 (digest[7]);
12453
12454 return (PARSER_OK);
12455 }
12456
12457 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12458 {
12459 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12460
12461 uint32_t *digest = (uint32_t *) hash_buf->digest;
12462
12463 salt_t *salt = hash_buf->salt;
12464
12465 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12466
12467 /**
12468 * parse line
12469 */
12470
12471 char *iterations_pos = input_buf;
12472
12473 char *saltbuf_pos = strchr (iterations_pos, ':');
12474
12475 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12476
12477 uint iterations_len = saltbuf_pos - iterations_pos;
12478
12479 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12480
12481 saltbuf_pos++;
12482
12483 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12484
12485 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12486
12487 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12488
12489 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12490
12491 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12492
12493 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12494
12495 cipherbuf_pos++;
12496
12497 /**
12498 * pbkdf2 iterations
12499 */
12500
12501 salt->salt_iter = atoi (iterations_pos) - 1;
12502
12503 /**
12504 * handle salt encoding
12505 */
12506
12507 char *saltbuf_ptr = (char *) salt->salt_buf;
12508
12509 for (uint i = 0; i < saltbuf_len; i += 2)
12510 {
12511 const char p0 = saltbuf_pos[i + 0];
12512 const char p1 = saltbuf_pos[i + 1];
12513
12514 *saltbuf_ptr++ = hex_convert (p1) << 0
12515 | hex_convert (p0) << 4;
12516 }
12517
12518 salt->salt_len = saltbuf_len / 2;
12519
12520 /**
12521 * handle cipher encoding
12522 */
12523
12524 uint *tmp = (uint *) mymalloc (32);
12525
12526 char *cipherbuf_ptr = (char *) tmp;
12527
12528 for (uint i = 2016; i < cipherbuf_len; i += 2)
12529 {
12530 const char p0 = cipherbuf_pos[i + 0];
12531 const char p1 = cipherbuf_pos[i + 1];
12532
12533 *cipherbuf_ptr++ = hex_convert (p1) << 0
12534 | hex_convert (p0) << 4;
12535 }
12536
12537 // iv is stored at salt_buf 4 (length 16)
12538 // data is stored at salt_buf 8 (length 16)
12539
12540 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12541 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12542 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12543 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12544
12545 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12546 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12547 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12548 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12549
12550 free (tmp);
12551
12552 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12553 {
12554 const char p0 = cipherbuf_pos[j + 0];
12555 const char p1 = cipherbuf_pos[j + 1];
12556
12557 agilekey->cipher[i] = hex_convert (p1) << 0
12558 | hex_convert (p0) << 4;
12559 }
12560
12561 /**
12562 * digest buf
12563 */
12564
12565 digest[0] = 0x10101010;
12566 digest[1] = 0x10101010;
12567 digest[2] = 0x10101010;
12568 digest[3] = 0x10101010;
12569
12570 return (PARSER_OK);
12571 }
12572
12573 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12574 {
12575 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12576
12577 uint32_t *digest = (uint32_t *) hash_buf->digest;
12578
12579 salt_t *salt = hash_buf->salt;
12580
12581 char *hashbuf_pos = input_buf;
12582
12583 char *iterations_pos = strchr (hashbuf_pos, ':');
12584
12585 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12586
12587 uint hash_len = iterations_pos - hashbuf_pos;
12588
12589 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12590
12591 iterations_pos++;
12592
12593 char *saltbuf_pos = strchr (iterations_pos, ':');
12594
12595 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12596
12597 uint iterations_len = saltbuf_pos - iterations_pos;
12598
12599 saltbuf_pos++;
12600
12601 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12602
12603 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12604
12605 char *salt_buf_ptr = (char *) salt->salt_buf;
12606
12607 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12608
12609 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12610
12611 salt->salt_len = salt_len;
12612
12613 salt->salt_iter = atoi (iterations_pos) - 1;
12614
12615 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
12616 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
12617 digest[2] = hex_to_uint (&hashbuf_pos[16]);
12618 digest[3] = hex_to_uint (&hashbuf_pos[24]);
12619
12620 return (PARSER_OK);
12621 }
12622
12623 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12624 {
12625 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12626
12627 uint32_t *digest = (uint32_t *) hash_buf->digest;
12628
12629 digest[0] = hex_to_uint (&input_buf[ 0]);
12630 digest[1] = hex_to_uint (&input_buf[ 8]);
12631 digest[2] = hex_to_uint (&input_buf[16]);
12632 digest[3] = hex_to_uint (&input_buf[24]);
12633 digest[4] = hex_to_uint (&input_buf[32]);
12634 digest[5] = hex_to_uint (&input_buf[40]);
12635 digest[6] = hex_to_uint (&input_buf[48]);
12636 digest[7] = hex_to_uint (&input_buf[56]);
12637
12638 digest[0] = byte_swap_32 (digest[0]);
12639 digest[1] = byte_swap_32 (digest[1]);
12640 digest[2] = byte_swap_32 (digest[2]);
12641 digest[3] = byte_swap_32 (digest[3]);
12642 digest[4] = byte_swap_32 (digest[4]);
12643 digest[5] = byte_swap_32 (digest[5]);
12644 digest[6] = byte_swap_32 (digest[6]);
12645 digest[7] = byte_swap_32 (digest[7]);
12646
12647 return (PARSER_OK);
12648 }
12649
12650 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12651 {
12652 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12653
12654 uint32_t *digest = (uint32_t *) hash_buf->digest;
12655
12656 salt_t *salt = hash_buf->salt;
12657
12658 char *salt_pos = input_buf + 3;
12659
12660 uint iterations_len = 0;
12661
12662 if (memcmp (salt_pos, "rounds=", 7) == 0)
12663 {
12664 salt_pos += 7;
12665
12666 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12667
12668 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12669 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12670
12671 salt_pos[0] = 0x0;
12672
12673 salt->salt_iter = atoi (salt_pos - iterations_len);
12674
12675 salt_pos += 1;
12676
12677 iterations_len += 8;
12678 }
12679 else
12680 {
12681 salt->salt_iter = ROUNDS_SHA256CRYPT;
12682 }
12683
12684 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12685
12686 char *hash_pos = strchr (salt_pos, '$');
12687
12688 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12689
12690 uint salt_len = hash_pos - salt_pos;
12691
12692 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12693
12694 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12695
12696 salt->salt_len = salt_len;
12697
12698 hash_pos++;
12699
12700 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12701
12702 return (PARSER_OK);
12703 }
12704
12705 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12706 {
12707 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12708
12709 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12710
12711 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12712
12713 uint64_t *digest = (uint64_t *) hash_buf->digest;
12714
12715 salt_t *salt = hash_buf->salt;
12716
12717 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12718
12719 char *iter_pos = input_buf + 4;
12720
12721 char *salt_pos = strchr (iter_pos, '$');
12722
12723 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12724
12725 salt_pos++;
12726
12727 char *hash_pos = strchr (salt_pos, '$');
12728
12729 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12730
12731 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12732
12733 hash_pos++;
12734
12735 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
12736 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
12737 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
12738 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
12739 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
12740 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
12741 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
12742 digest[7] = hex_to_uint64_t (&hash_pos[112]);
12743
12744 uint salt_len = hash_pos - salt_pos - 1;
12745
12746 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12747
12748 salt->salt_len = salt_len / 2;
12749
12750 pbkdf2_sha512->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
12751 pbkdf2_sha512->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
12752 pbkdf2_sha512->salt_buf[2] = hex_to_uint (&salt_pos[16]);
12753 pbkdf2_sha512->salt_buf[3] = hex_to_uint (&salt_pos[24]);
12754 pbkdf2_sha512->salt_buf[4] = hex_to_uint (&salt_pos[32]);
12755 pbkdf2_sha512->salt_buf[5] = hex_to_uint (&salt_pos[40]);
12756 pbkdf2_sha512->salt_buf[6] = hex_to_uint (&salt_pos[48]);
12757 pbkdf2_sha512->salt_buf[7] = hex_to_uint (&salt_pos[56]);
12758
12759 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12760 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12761 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12762 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12763 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12764 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12765 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12766 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12767 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12768 pbkdf2_sha512->salt_buf[9] = 0x80;
12769
12770 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12771
12772 salt->salt_iter = atoi (iter_pos) - 1;
12773
12774 return (PARSER_OK);
12775 }
12776
12777 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12778 {
12779 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12780
12781 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12782
12783 uint32_t *digest = (uint32_t *) hash_buf->digest;
12784
12785 salt_t *salt = hash_buf->salt;
12786
12787 char *salt_pos = input_buf + 14;
12788
12789 char *hash_pos = strchr (salt_pos, '*');
12790
12791 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12792
12793 hash_pos++;
12794
12795 uint salt_len = hash_pos - salt_pos - 1;
12796
12797 char *salt_buf_ptr = (char *) salt->salt_buf;
12798
12799 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
12800
12801 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12802
12803 salt->salt_len = salt_len;
12804
12805 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
12806
12807 base64_decode (base64_to_int, hash_pos, 43, tmp_buf);
12808
12809 memcpy (digest, tmp_buf, 32);
12810
12811 digest[0] = byte_swap_32 (digest[0]);
12812 digest[1] = byte_swap_32 (digest[1]);
12813 digest[2] = byte_swap_32 (digest[2]);
12814 digest[3] = byte_swap_32 (digest[3]);
12815 digest[4] = byte_swap_32 (digest[4]);
12816 digest[5] = byte_swap_32 (digest[5]);
12817 digest[6] = byte_swap_32 (digest[6]);
12818 digest[7] = byte_swap_32 (digest[7]);
12819
12820 digest[0] -= SHA256M_A;
12821 digest[1] -= SHA256M_B;
12822 digest[2] -= SHA256M_C;
12823 digest[3] -= SHA256M_D;
12824 digest[4] -= SHA256M_E;
12825 digest[5] -= SHA256M_F;
12826 digest[6] -= SHA256M_G;
12827 digest[7] -= SHA256M_H;
12828
12829 return (PARSER_OK);
12830 }
12831
12832 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12833 {
12834 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
12835
12836 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12837
12838 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
12839
12840 uint64_t *digest = (uint64_t *) hash_buf->digest;
12841
12842 salt_t *salt = hash_buf->salt;
12843
12844 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12845
12846 char *iter_pos = input_buf + 19;
12847
12848 char *salt_pos = strchr (iter_pos, '.');
12849
12850 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12851
12852 salt_pos++;
12853
12854 char *hash_pos = strchr (salt_pos, '.');
12855
12856 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12857
12858 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12859
12860 hash_pos++;
12861
12862 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
12863 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
12864 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
12865 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
12866 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
12867 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
12868 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
12869 digest[7] = hex_to_uint64_t (&hash_pos[112]);
12870
12871 uint salt_len = hash_pos - salt_pos - 1;
12872
12873 salt_len /= 2;
12874
12875 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
12876
12877 uint i;
12878
12879 for (i = 0; i < salt_len; i++)
12880 {
12881 salt_buf_ptr[i] = hex_to_char (&salt_pos[i * 2]);
12882 }
12883
12884 salt_buf_ptr[salt_len + 3] = 0x01;
12885 salt_buf_ptr[salt_len + 4] = 0x80;
12886
12887 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12888
12889 salt->salt_len = salt_len;
12890
12891 salt->salt_iter = atoi (iter_pos) - 1;
12892
12893 return (PARSER_OK);
12894 }
12895
12896 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12897 {
12898 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
12899
12900 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12901
12902 uint64_t *digest = (uint64_t *) hash_buf->digest;
12903
12904 salt_t *salt = hash_buf->salt;
12905
12906 char tmp_buf[120];
12907
12908 memset (tmp_buf, 0, sizeof (tmp_buf));
12909
12910 int tmp_len = base64_decode (base64_to_int, input_buf + 9, input_len - 9, tmp_buf);
12911
12912 memcpy (digest, tmp_buf, 64);
12913
12914 digest[0] = byte_swap_64 (digest[0]);
12915 digest[1] = byte_swap_64 (digest[1]);
12916 digest[2] = byte_swap_64 (digest[2]);
12917 digest[3] = byte_swap_64 (digest[3]);
12918 digest[4] = byte_swap_64 (digest[4]);
12919 digest[5] = byte_swap_64 (digest[5]);
12920 digest[6] = byte_swap_64 (digest[6]);
12921 digest[7] = byte_swap_64 (digest[7]);
12922
12923 digest[0] -= SHA512M_A;
12924 digest[1] -= SHA512M_B;
12925 digest[2] -= SHA512M_C;
12926 digest[3] -= SHA512M_D;
12927 digest[4] -= SHA512M_E;
12928 digest[5] -= SHA512M_F;
12929 digest[6] -= SHA512M_G;
12930 digest[7] -= SHA512M_H;
12931
12932 salt->salt_len = tmp_len - 64;
12933
12934 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
12935
12936 if (data.opts_type & OPTS_TYPE_ST_ADD80)
12937 {
12938 char *ptr = (char *) salt->salt_buf;
12939
12940 ptr[salt->salt_len] = 0x80;
12941 }
12942
12943 return (PARSER_OK);
12944 }
12945
12946 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12947 {
12948 if (data.opts_type & OPTS_TYPE_ST_HEX)
12949 {
12950 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
12951 }
12952 else
12953 {
12954 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
12955 }
12956
12957 uint32_t *digest = (uint32_t *) hash_buf->digest;
12958
12959 salt_t *salt = hash_buf->salt;
12960
12961 digest[0] = hex_to_uint (&input_buf[ 0]);
12962 digest[1] = hex_to_uint (&input_buf[ 8]);
12963 digest[2] = hex_to_uint (&input_buf[16]);
12964 digest[3] = hex_to_uint (&input_buf[24]);
12965
12966 digest[0] = byte_swap_32 (digest[0]);
12967 digest[1] = byte_swap_32 (digest[1]);
12968 digest[2] = byte_swap_32 (digest[2]);
12969 digest[3] = byte_swap_32 (digest[3]);
12970
12971 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12972
12973 uint salt_len = input_len - 32 - 1;
12974
12975 char *salt_buf = input_buf + 32 + 1;
12976
12977 char *salt_buf_ptr = (char *) salt->salt_buf;
12978
12979 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12980
12981 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12982
12983 salt->salt_len = salt_len;
12984
12985 return (PARSER_OK);
12986 }
12987
12988 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12989 {
12990 if (data.opts_type & OPTS_TYPE_ST_HEX)
12991 {
12992 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
12993 }
12994 else
12995 {
12996 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
12997 }
12998
12999 uint32_t *digest = (uint32_t *) hash_buf->digest;
13000
13001 salt_t *salt = hash_buf->salt;
13002
13003 digest[0] = hex_to_uint (&input_buf[ 0]);
13004 digest[1] = hex_to_uint (&input_buf[ 8]);
13005 digest[2] = hex_to_uint (&input_buf[16]);
13006 digest[3] = hex_to_uint (&input_buf[24]);
13007 digest[4] = hex_to_uint (&input_buf[32]);
13008
13009 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13010
13011 uint salt_len = input_len - 40 - 1;
13012
13013 char *salt_buf = input_buf + 40 + 1;
13014
13015 char *salt_buf_ptr = (char *) salt->salt_buf;
13016
13017 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13018
13019 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13020
13021 salt->salt_len = salt_len;
13022
13023 return (PARSER_OK);
13024 }
13025
13026 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13027 {
13028 if (data.opts_type & OPTS_TYPE_ST_HEX)
13029 {
13030 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13031 }
13032 else
13033 {
13034 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13035 }
13036
13037 uint32_t *digest = (uint32_t *) hash_buf->digest;
13038
13039 salt_t *salt = hash_buf->salt;
13040
13041 digest[0] = hex_to_uint (&input_buf[ 0]);
13042 digest[1] = hex_to_uint (&input_buf[ 8]);
13043 digest[2] = hex_to_uint (&input_buf[16]);
13044 digest[3] = hex_to_uint (&input_buf[24]);
13045 digest[4] = hex_to_uint (&input_buf[32]);
13046 digest[5] = hex_to_uint (&input_buf[40]);
13047 digest[6] = hex_to_uint (&input_buf[48]);
13048 digest[7] = hex_to_uint (&input_buf[56]);
13049
13050 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13051
13052 uint salt_len = input_len - 64 - 1;
13053
13054 char *salt_buf = input_buf + 64 + 1;
13055
13056 char *salt_buf_ptr = (char *) salt->salt_buf;
13057
13058 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13059
13060 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13061
13062 salt->salt_len = salt_len;
13063
13064 return (PARSER_OK);
13065 }
13066
13067 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13068 {
13069 if (data.opts_type & OPTS_TYPE_ST_HEX)
13070 {
13071 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13072 }
13073 else
13074 {
13075 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13076 }
13077
13078 uint64_t *digest = (uint64_t *) hash_buf->digest;
13079
13080 salt_t *salt = hash_buf->salt;
13081
13082 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
13083 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
13084 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
13085 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
13086 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
13087 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
13088 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
13089 digest[7] = hex_to_uint64_t (&input_buf[112]);
13090
13091 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13092
13093 uint salt_len = input_len - 128 - 1;
13094
13095 char *salt_buf = input_buf + 128 + 1;
13096
13097 char *salt_buf_ptr = (char *) salt->salt_buf;
13098
13099 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13100
13101 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13102
13103 salt->salt_len = salt_len;
13104
13105 return (PARSER_OK);
13106 }
13107
13108 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13109 {
13110 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13111
13112 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13113
13114 uint32_t *digest = (uint32_t *) hash_buf->digest;
13115
13116 salt_t *salt = hash_buf->salt;
13117
13118 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13119
13120 /**
13121 * parse line
13122 */
13123
13124 char *user_pos = input_buf + 10 + 1;
13125
13126 char *realm_pos = strchr (user_pos, '$');
13127
13128 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13129
13130 uint user_len = realm_pos - user_pos;
13131
13132 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13133
13134 realm_pos++;
13135
13136 char *salt_pos = strchr (realm_pos, '$');
13137
13138 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13139
13140 uint realm_len = salt_pos - realm_pos;
13141
13142 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13143
13144 salt_pos++;
13145
13146 char *data_pos = strchr (salt_pos, '$');
13147
13148 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13149
13150 uint salt_len = data_pos - salt_pos;
13151
13152 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13153
13154 data_pos++;
13155
13156 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13157
13158 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13159
13160 /**
13161 * copy data
13162 */
13163
13164 memcpy (krb5pa->user, user_pos, user_len);
13165 memcpy (krb5pa->realm, realm_pos, realm_len);
13166 memcpy (krb5pa->salt, salt_pos, salt_len);
13167
13168 char *timestamp_ptr = (char *) krb5pa->timestamp;
13169
13170 for (uint i = 0; i < (36 * 2); i += 2)
13171 {
13172 const char p0 = data_pos[i + 0];
13173 const char p1 = data_pos[i + 1];
13174
13175 *timestamp_ptr++ = hex_convert (p1) << 0
13176 | hex_convert (p0) << 4;
13177 }
13178
13179 char *checksum_ptr = (char *) krb5pa->checksum;
13180
13181 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13182 {
13183 const char p0 = data_pos[i + 0];
13184 const char p1 = data_pos[i + 1];
13185
13186 *checksum_ptr++ = hex_convert (p1) << 0
13187 | hex_convert (p0) << 4;
13188 }
13189
13190 /**
13191 * copy some data to generic buffers to make sorting happy
13192 */
13193
13194 salt->salt_buf[0] = krb5pa->timestamp[0];
13195 salt->salt_buf[1] = krb5pa->timestamp[1];
13196 salt->salt_buf[2] = krb5pa->timestamp[2];
13197 salt->salt_buf[3] = krb5pa->timestamp[3];
13198 salt->salt_buf[4] = krb5pa->timestamp[4];
13199 salt->salt_buf[5] = krb5pa->timestamp[5];
13200 salt->salt_buf[6] = krb5pa->timestamp[6];
13201 salt->salt_buf[7] = krb5pa->timestamp[7];
13202 salt->salt_buf[8] = krb5pa->timestamp[8];
13203
13204 salt->salt_len = 36;
13205
13206 digest[0] = krb5pa->checksum[0];
13207 digest[1] = krb5pa->checksum[1];
13208 digest[2] = krb5pa->checksum[2];
13209 digest[3] = krb5pa->checksum[3];
13210
13211 return (PARSER_OK);
13212 }
13213
13214 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13215 {
13216 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13217
13218 uint32_t *digest = (uint32_t *) hash_buf->digest;
13219
13220 salt_t *salt = hash_buf->salt;
13221
13222 /**
13223 * parse line
13224 */
13225
13226 char *salt_pos = input_buf;
13227
13228 char *hash_pos = strchr (salt_pos, '$');
13229
13230 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13231
13232 uint salt_len = hash_pos - salt_pos;
13233
13234 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13235
13236 hash_pos++;
13237
13238 uint hash_len = input_len - 1 - salt_len;
13239
13240 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13241
13242 /**
13243 * valid some data
13244 */
13245
13246 uint user_len = 0;
13247
13248 for (uint i = 0; i < salt_len; i++)
13249 {
13250 if (salt_pos[i] == ' ') continue;
13251
13252 user_len++;
13253 }
13254
13255 // SAP user names cannot be longer than 12 characters
13256 if (user_len > 12) return (PARSER_SALT_LENGTH);
13257
13258 // SAP user name cannot start with ! or ?
13259 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13260
13261 /**
13262 * copy data
13263 */
13264
13265 char *salt_buf_ptr = (char *) salt->salt_buf;
13266
13267 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13268
13269 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13270
13271 salt->salt_len = salt_len;
13272
13273 digest[0] = hex_to_uint (&hash_pos[0]);
13274 digest[1] = hex_to_uint (&hash_pos[8]);
13275 digest[2] = 0;
13276 digest[3] = 0;
13277
13278 digest[0] = byte_swap_32 (digest[0]);
13279 digest[1] = byte_swap_32 (digest[1]);
13280
13281 return (PARSER_OK);
13282 }
13283
13284 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13285 {
13286 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13287
13288 uint32_t *digest = (uint32_t *) hash_buf->digest;
13289
13290 salt_t *salt = hash_buf->salt;
13291
13292 /**
13293 * parse line
13294 */
13295
13296 char *salt_pos = input_buf;
13297
13298 char *hash_pos = strchr (salt_pos, '$');
13299
13300 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13301
13302 uint salt_len = hash_pos - salt_pos;
13303
13304 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13305
13306 hash_pos++;
13307
13308 uint hash_len = input_len - 1 - salt_len;
13309
13310 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13311
13312 /**
13313 * valid some data
13314 */
13315
13316 uint user_len = 0;
13317
13318 for (uint i = 0; i < salt_len; i++)
13319 {
13320 if (salt_pos[i] == ' ') continue;
13321
13322 user_len++;
13323 }
13324
13325 // SAP user names cannot be longer than 12 characters
13326 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
13327 // so far nobody complained so we stay with this because it helps in optimization
13328 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
13329
13330 if (user_len > 12) return (PARSER_SALT_LENGTH);
13331
13332 // SAP user name cannot start with ! or ?
13333 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13334
13335 /**
13336 * copy data
13337 */
13338
13339 char *salt_buf_ptr = (char *) salt->salt_buf;
13340
13341 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13342
13343 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13344
13345 salt->salt_len = salt_len;
13346
13347 digest[0] = hex_to_uint (&hash_pos[ 0]);
13348 digest[1] = hex_to_uint (&hash_pos[ 8]);
13349 digest[2] = hex_to_uint (&hash_pos[16]);
13350 digest[3] = hex_to_uint (&hash_pos[24]);
13351 digest[4] = hex_to_uint (&hash_pos[32]);
13352
13353 return (PARSER_OK);
13354 }
13355
13356 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13357 {
13358 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13359
13360 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13361
13362 uint64_t *digest = (uint64_t *) hash_buf->digest;
13363
13364 salt_t *salt = hash_buf->salt;
13365
13366 char *iter_pos = input_buf + 3;
13367
13368 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13369
13370 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13371
13372 memcpy ((char *) salt->salt_sign, input_buf, 4);
13373
13374 salt->salt_iter = salt_iter;
13375
13376 char *salt_pos = iter_pos + 1;
13377
13378 uint salt_len = 8;
13379
13380 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13381
13382 salt->salt_len = salt_len;
13383
13384 char *hash_pos = salt_pos + salt_len;
13385
13386 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13387
13388 // ugly hack start
13389
13390 char *tmp = (char *) salt->salt_buf_pc;
13391
13392 tmp[0] = hash_pos[42];
13393
13394 // ugly hack end
13395
13396 digest[ 0] = byte_swap_64 (digest[ 0]);
13397 digest[ 1] = byte_swap_64 (digest[ 1]);
13398 digest[ 2] = byte_swap_64 (digest[ 2]);
13399 digest[ 3] = byte_swap_64 (digest[ 3]);
13400 digest[ 4] = 0;
13401 digest[ 5] = 0;
13402 digest[ 6] = 0;
13403 digest[ 7] = 0;
13404
13405 return (PARSER_OK);
13406 }
13407
13408 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13409 {
13410 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13411
13412 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13413
13414 uint32_t *digest = (uint32_t *) hash_buf->digest;
13415
13416 salt_t *salt = hash_buf->salt;
13417
13418 char *salt_buf = input_buf + 6;
13419
13420 uint salt_len = 16;
13421
13422 char *salt_buf_ptr = (char *) salt->salt_buf;
13423
13424 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13425
13426 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13427
13428 salt->salt_len = salt_len;
13429
13430 char *hash_pos = input_buf + 6 + 16;
13431
13432 digest[0] = hex_to_uint (&hash_pos[ 0]);
13433 digest[1] = hex_to_uint (&hash_pos[ 8]);
13434 digest[2] = hex_to_uint (&hash_pos[16]);
13435 digest[3] = hex_to_uint (&hash_pos[24]);
13436 digest[4] = hex_to_uint (&hash_pos[32]);
13437 digest[5] = hex_to_uint (&hash_pos[40]);
13438 digest[6] = hex_to_uint (&hash_pos[48]);
13439 digest[7] = hex_to_uint (&hash_pos[56]);
13440
13441 return (PARSER_OK);
13442 }
13443
13444 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13445 {
13446 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13447
13448 uint32_t *digest = (uint32_t *) hash_buf->digest;
13449
13450 digest[0] = hex_to_uint (&input_buf[ 0]);
13451 digest[1] = hex_to_uint (&input_buf[ 8]);
13452 digest[2] = 0;
13453 digest[3] = 0;
13454
13455 return (PARSER_OK);
13456 }
13457
13458 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13459 {
13460 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13461
13462 uint32_t *digest = (uint32_t *) hash_buf->digest;
13463
13464 salt_t *salt = hash_buf->salt;
13465
13466 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13467
13468 char *saltbuf_pos = input_buf;
13469
13470 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13471
13472 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13473
13474 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13475
13476 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13477 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13478
13479 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13480
13481 hashbuf_pos++;
13482
13483 uint hashbuf_len = input_len - saltbuf_len - 1;
13484
13485 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13486
13487 char *salt_ptr = (char *) saltbuf_pos;
13488 char *rakp_ptr = (char *) rakp->salt_buf;
13489
13490 uint i;
13491 uint j;
13492
13493 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13494 {
13495 rakp_ptr[j] = hex_to_char (&salt_ptr[i]);
13496 }
13497
13498 rakp_ptr[j] = 0x80;
13499
13500 rakp->salt_len = j;
13501
13502 for (i = 0; i < 64; i++)
13503 {
13504 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13505 }
13506
13507 salt->salt_buf[0] = rakp->salt_buf[0];
13508 salt->salt_buf[1] = rakp->salt_buf[1];
13509 salt->salt_buf[2] = rakp->salt_buf[2];
13510 salt->salt_buf[3] = rakp->salt_buf[3];
13511 salt->salt_buf[4] = rakp->salt_buf[4];
13512 salt->salt_buf[5] = rakp->salt_buf[5];
13513 salt->salt_buf[6] = rakp->salt_buf[6];
13514 salt->salt_buf[7] = rakp->salt_buf[7];
13515
13516 salt->salt_len = 32; // muss min. 32 haben
13517
13518 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
13519 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
13520 digest[2] = hex_to_uint (&hashbuf_pos[16]);
13521 digest[3] = hex_to_uint (&hashbuf_pos[24]);
13522 digest[4] = hex_to_uint (&hashbuf_pos[32]);
13523
13524 return (PARSER_OK);
13525 }
13526
13527 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13528 {
13529 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13530
13531 uint32_t *digest = (uint32_t *) hash_buf->digest;
13532
13533 salt_t *salt = hash_buf->salt;
13534
13535 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13536
13537 char *salt_pos = input_buf + 1;
13538
13539 memcpy (salt->salt_buf, salt_pos, 8);
13540
13541 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13542 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13543
13544 salt->salt_len = 8;
13545
13546 char *hash_pos = salt_pos + 8;
13547
13548 digest[0] = hex_to_uint (&hash_pos[ 0]);
13549 digest[1] = hex_to_uint (&hash_pos[ 8]);
13550 digest[2] = hex_to_uint (&hash_pos[16]);
13551 digest[3] = hex_to_uint (&hash_pos[24]);
13552 digest[4] = hex_to_uint (&hash_pos[32]);
13553
13554 digest[0] -= SHA1M_A;
13555 digest[1] -= SHA1M_B;
13556 digest[2] -= SHA1M_C;
13557 digest[3] -= SHA1M_D;
13558 digest[4] -= SHA1M_E;
13559
13560 return (PARSER_OK);
13561 }
13562
13563 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13564 {
13565 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13566
13567 uint32_t *digest = (uint32_t *) hash_buf->digest;
13568
13569 salt_t *salt = hash_buf->salt;
13570
13571 digest[0] = hex_to_uint (&input_buf[ 0]);
13572 digest[1] = hex_to_uint (&input_buf[ 8]);
13573 digest[2] = hex_to_uint (&input_buf[16]);
13574 digest[3] = hex_to_uint (&input_buf[24]);
13575
13576 digest[0] = byte_swap_32 (digest[0]);
13577 digest[1] = byte_swap_32 (digest[1]);
13578 digest[2] = byte_swap_32 (digest[2]);
13579 digest[3] = byte_swap_32 (digest[3]);
13580
13581 digest[0] -= MD5M_A;
13582 digest[1] -= MD5M_B;
13583 digest[2] -= MD5M_C;
13584 digest[3] -= MD5M_D;
13585
13586 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13587
13588 char *salt_buf_ptr = input_buf + 32 + 1;
13589
13590 uint32_t *salt_buf = salt->salt_buf;
13591
13592 salt_buf[0] = hex_to_uint (&salt_buf_ptr[ 0]);
13593 salt_buf[1] = hex_to_uint (&salt_buf_ptr[ 8]);
13594 salt_buf[2] = hex_to_uint (&salt_buf_ptr[16]);
13595 salt_buf[3] = hex_to_uint (&salt_buf_ptr[24]);
13596
13597 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13598 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13599 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13600 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13601
13602 salt->salt_len = 16 + 1;
13603
13604 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13605
13606 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13607
13608 salt_buf[4] = hex_to_char (&idbyte_buf_ptr[0]) & 0xff;
13609
13610 return (PARSER_OK);
13611 }
13612
13613 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13614 {
13615 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13616
13617 uint32_t *digest = (uint32_t *) hash_buf->digest;
13618
13619 salt_t *salt = hash_buf->salt;
13620
13621 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13622
13623 /**
13624 * parse line
13625 */
13626
13627 char *hashbuf_pos = input_buf;
13628
13629 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13630
13631 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13632
13633 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13634
13635 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13636
13637 saltbuf_pos++;
13638
13639 char *iteration_pos = strchr (saltbuf_pos, ':');
13640
13641 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13642
13643 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13644
13645 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13646
13647 iteration_pos++;
13648
13649 char *databuf_pos = strchr (iteration_pos, ':');
13650
13651 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13652
13653 const uint iteration_len = databuf_pos - iteration_pos;
13654
13655 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13656 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13657
13658 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13659
13660 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13661 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13662
13663 databuf_pos++;
13664
13665 // digest
13666
13667 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
13668 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
13669 digest[2] = hex_to_uint (&hashbuf_pos[16]);
13670 digest[3] = hex_to_uint (&hashbuf_pos[24]);
13671 digest[4] = hex_to_uint (&hashbuf_pos[32]);
13672 digest[5] = hex_to_uint (&hashbuf_pos[40]);
13673 digest[6] = hex_to_uint (&hashbuf_pos[48]);
13674 digest[7] = hex_to_uint (&hashbuf_pos[56]);
13675
13676 // salt
13677
13678 char *saltbuf_ptr = (char *) salt->salt_buf;
13679
13680 for (uint i = 0; i < saltbuf_len; i += 2)
13681 {
13682 const char p0 = saltbuf_pos[i + 0];
13683 const char p1 = saltbuf_pos[i + 1];
13684
13685 *saltbuf_ptr++ = hex_convert (p1) << 0
13686 | hex_convert (p0) << 4;
13687 }
13688
13689 salt->salt_buf[4] = 0x01000000;
13690 salt->salt_buf[5] = 0x80;
13691
13692 salt->salt_len = saltbuf_len / 2;
13693
13694 // iteration
13695
13696 salt->salt_iter = atoi (iteration_pos) - 1;
13697
13698 // data
13699
13700 char *databuf_ptr = (char *) cloudkey->data_buf;
13701
13702 for (uint i = 0; i < databuf_len; i += 2)
13703 {
13704 const char p0 = databuf_pos[i + 0];
13705 const char p1 = databuf_pos[i + 1];
13706
13707 *databuf_ptr++ = hex_convert (p1) << 0
13708 | hex_convert (p0) << 4;
13709 }
13710
13711 *databuf_ptr++ = 0x80;
13712
13713 for (uint i = 0; i < 512; i++)
13714 {
13715 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13716 }
13717
13718 cloudkey->data_len = databuf_len / 2;
13719
13720 return (PARSER_OK);
13721 }
13722
13723 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13724 {
13725 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13726
13727 uint32_t *digest = (uint32_t *) hash_buf->digest;
13728
13729 salt_t *salt = hash_buf->salt;
13730
13731 /**
13732 * parse line
13733 */
13734
13735 char *hashbuf_pos = input_buf;
13736
13737 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13738
13739 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13740
13741 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13742
13743 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13744
13745 domainbuf_pos++;
13746
13747 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13748
13749 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13750
13751 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13752
13753 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13754
13755 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13756
13757 saltbuf_pos++;
13758
13759 char *iteration_pos = strchr (saltbuf_pos, ':');
13760
13761 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13762
13763 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13764
13765 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13766
13767 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13768
13769 iteration_pos++;
13770
13771 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13772
13773 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13774 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13775
13776 // ok, the plan for this algorithm is the following:
13777 // we have 2 salts here, the domain-name and a random salt
13778 // while both are used in the initial transformation,
13779 // only the random salt is used in the following iterations
13780 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13781 // and one that includes only the real salt (stored into salt_buf[]).
13782 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13783
13784 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
13785
13786 base32_decode (itoa32_to_int, hashbuf_pos, 32, tmp_buf);
13787
13788 memcpy (digest, tmp_buf, 20);
13789
13790 digest[0] = byte_swap_32 (digest[0]);
13791 digest[1] = byte_swap_32 (digest[1]);
13792 digest[2] = byte_swap_32 (digest[2]);
13793 digest[3] = byte_swap_32 (digest[3]);
13794 digest[4] = byte_swap_32 (digest[4]);
13795
13796 // domain
13797
13798 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13799
13800 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
13801
13802 char *len_ptr = NULL;
13803
13804 for (uint i = 0; i < domainbuf_len; i++)
13805 {
13806 if (salt_buf_pc_ptr[i] == '.')
13807 {
13808 len_ptr = &salt_buf_pc_ptr[i];
13809
13810 *len_ptr = 0;
13811 }
13812 else
13813 {
13814 *len_ptr += 1;
13815 }
13816 }
13817
13818 salt->salt_buf_pc[7] = domainbuf_len;
13819
13820 // "real" salt
13821
13822 char *salt_buf_ptr = (char *) salt->salt_buf;
13823
13824 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
13825
13826 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13827
13828 salt->salt_len = salt_len;
13829
13830 // iteration
13831
13832 salt->salt_iter = atoi (iteration_pos);
13833
13834 return (PARSER_OK);
13835 }
13836
13837 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13838 {
13839 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
13840
13841 uint32_t *digest = (uint32_t *) hash_buf->digest;
13842
13843 salt_t *salt = hash_buf->salt;
13844
13845 digest[0] = hex_to_uint (&input_buf[ 0]);
13846 digest[1] = hex_to_uint (&input_buf[ 8]);
13847 digest[2] = hex_to_uint (&input_buf[16]);
13848 digest[3] = hex_to_uint (&input_buf[24]);
13849 digest[4] = hex_to_uint (&input_buf[32]);
13850
13851 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13852
13853 uint salt_len = input_len - 40 - 1;
13854
13855 char *salt_buf = input_buf + 40 + 1;
13856
13857 char *salt_buf_ptr = (char *) salt->salt_buf;
13858
13859 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13860
13861 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13862
13863 salt->salt_len = salt_len;
13864
13865 return (PARSER_OK);
13866 }
13867
13868 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13869 {
13870 const uint8_t ascii_to_ebcdic[] =
13871 {
13872 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
13873 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
13874 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
13875 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
13876 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
13877 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
13878 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
13879 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
13880 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
13881 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
13882 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
13883 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
13884 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
13885 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
13886 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
13887 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
13888 };
13889
13890 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
13891
13892 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13893
13894 uint32_t *digest = (uint32_t *) hash_buf->digest;
13895
13896 salt_t *salt = hash_buf->salt;
13897
13898 char *salt_pos = input_buf + 6 + 1;
13899
13900 char *digest_pos = strchr (salt_pos, '*');
13901
13902 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13903
13904 uint salt_len = digest_pos - salt_pos;
13905
13906 if (salt_len > 8) return (PARSER_SALT_LENGTH);
13907
13908 uint hash_len = input_len - 1 - salt_len - 1 - 6;
13909
13910 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13911
13912 digest_pos++;
13913
13914 char *salt_buf_ptr = (char *) salt->salt_buf;
13915 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13916
13917 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13918
13919 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13920
13921 salt->salt_len = salt_len;
13922
13923 for (uint i = 0; i < salt_len; i++)
13924 {
13925 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
13926 }
13927 for (uint i = salt_len; i < 8; i++)
13928 {
13929 salt_buf_pc_ptr[i] = 0x40;
13930 }
13931
13932 uint tt;
13933
13934 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
13935
13936 salt->salt_buf_pc[0] = ROTATE_LEFT (salt->salt_buf_pc[0], 3u);
13937 salt->salt_buf_pc[1] = ROTATE_LEFT (salt->salt_buf_pc[1], 3u);
13938
13939 digest[0] = hex_to_uint (&digest_pos[ 0]);
13940 digest[1] = hex_to_uint (&digest_pos[ 8]);
13941
13942 digest[0] = byte_swap_32 (digest[0]);
13943 digest[1] = byte_swap_32 (digest[1]);
13944
13945 IP (digest[0], digest[1], tt);
13946
13947 digest[0] = ROTATE_RIGHT (digest[0], 29);
13948 digest[1] = ROTATE_RIGHT (digest[1], 29);
13949 digest[2] = 0;
13950 digest[3] = 0;
13951
13952 return (PARSER_OK);
13953 }
13954
13955 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13956 {
13957 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
13958
13959 uint32_t *digest = (uint32_t *) hash_buf->digest;
13960
13961 digest[0] = hex_to_uint (&input_buf[ 0]);
13962 digest[1] = hex_to_uint (&input_buf[ 8]);
13963 digest[2] = hex_to_uint (&input_buf[16]);
13964 digest[3] = hex_to_uint (&input_buf[24]);
13965
13966 digest[0] = byte_swap_32 (digest[0]);
13967 digest[1] = byte_swap_32 (digest[1]);
13968 digest[2] = byte_swap_32 (digest[2]);
13969 digest[3] = byte_swap_32 (digest[3]);
13970
13971 return (PARSER_OK);
13972 }
13973
13974 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13975 {
13976 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
13977
13978 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
13979
13980 uint32_t *digest = (uint32_t *) hash_buf->digest;
13981
13982 salt_t *salt = hash_buf->salt;
13983
13984 char tmp_buf[120];
13985
13986 memset (tmp_buf, 0, sizeof (tmp_buf));
13987
13988 base64_decode (lotus64_to_int, input_buf + 2, input_len - 3, tmp_buf);
13989
13990 tmp_buf[3] += -4; // dont ask!
13991
13992 memcpy (salt->salt_buf, tmp_buf, 5);
13993
13994 salt->salt_len = 5;
13995
13996 memcpy (digest, tmp_buf + 5, 9);
13997
13998 // yes, only 9 byte are needed to crack, but 10 to display
13999
14000 salt->salt_buf_pc[7] = input_buf[20];
14001
14002 return (PARSER_OK);
14003 }
14004
14005 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14006 {
14007 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14008
14009 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14010
14011 uint32_t *digest = (uint32_t *) hash_buf->digest;
14012
14013 salt_t *salt = hash_buf->salt;
14014
14015 char tmp_buf[120];
14016
14017 memset (tmp_buf, 0, sizeof (tmp_buf));
14018
14019 base64_decode (lotus64_to_int, input_buf + 2, input_len - 3, tmp_buf);
14020
14021 tmp_buf[3] += -4; // dont ask!
14022
14023 // salt
14024
14025 memcpy (salt->salt_buf, tmp_buf, 16);
14026
14027 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)
14028
14029 // iteration
14030
14031 char tmp_iter_buf[11];
14032
14033 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14034
14035 tmp_iter_buf[10] = 0;
14036
14037 salt->salt_iter = atoi (tmp_iter_buf);
14038
14039 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14040 {
14041 return (PARSER_SALT_ITERATION);
14042 }
14043
14044 salt->salt_iter--; // first round in init
14045
14046 // 2 additional bytes for display only
14047
14048 salt->salt_buf_pc[0] = tmp_buf[26];
14049 salt->salt_buf_pc[1] = tmp_buf[27];
14050
14051 // digest
14052
14053 memcpy (digest, tmp_buf + 28, 8);
14054
14055 digest[0] = byte_swap_32 (digest[0]);
14056 digest[1] = byte_swap_32 (digest[1]);
14057 digest[2] = 0;
14058 digest[3] = 0;
14059
14060 return (PARSER_OK);
14061 }
14062
14063 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14064 {
14065 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14066
14067 uint32_t *digest = (uint32_t *) hash_buf->digest;
14068
14069 salt_t *salt = hash_buf->salt;
14070
14071 char *salt_buf_pos = input_buf;
14072
14073 char *hash_buf_pos = salt_buf_pos + 6;
14074
14075 digest[0] = hex_to_uint (&hash_buf_pos[ 0]);
14076 digest[1] = hex_to_uint (&hash_buf_pos[ 8]);
14077 digest[2] = hex_to_uint (&hash_buf_pos[16]);
14078 digest[3] = hex_to_uint (&hash_buf_pos[24]);
14079 digest[4] = hex_to_uint (&hash_buf_pos[32]);
14080 digest[5] = hex_to_uint (&hash_buf_pos[40]);
14081 digest[6] = hex_to_uint (&hash_buf_pos[48]);
14082 digest[7] = hex_to_uint (&hash_buf_pos[56]);
14083
14084 digest[0] -= SHA256M_A;
14085 digest[1] -= SHA256M_B;
14086 digest[2] -= SHA256M_C;
14087 digest[3] -= SHA256M_D;
14088 digest[4] -= SHA256M_E;
14089 digest[5] -= SHA256M_F;
14090 digest[6] -= SHA256M_G;
14091 digest[7] -= SHA256M_H;
14092
14093 char *salt_buf_ptr = (char *) salt->salt_buf;
14094
14095 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14096
14097 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14098
14099 salt->salt_len = salt_len;
14100
14101 return (PARSER_OK);
14102 }
14103
14104 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14105 {
14106 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14107
14108 uint32_t *digest = (uint32_t *) hash_buf->digest;
14109
14110 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14111
14112 salt_t *salt = hash_buf->salt;
14113
14114 char *salt_buf = input_buf + 6;
14115
14116 char *digest_buf = strchr (salt_buf, '$');
14117
14118 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14119
14120 uint salt_len = digest_buf - salt_buf;
14121
14122 digest_buf++; // skip the '$' symbol
14123
14124 char *salt_buf_ptr = (char *) salt->salt_buf;
14125
14126 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14127
14128 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14129
14130 salt->salt_len = salt_len;
14131
14132 digest[0] = hex_to_uint (&digest_buf[ 0]);
14133 digest[1] = hex_to_uint (&digest_buf[ 8]);
14134 digest[2] = hex_to_uint (&digest_buf[16]);
14135 digest[3] = hex_to_uint (&digest_buf[24]);
14136
14137 digest[0] = byte_swap_32 (digest[0]);
14138 digest[1] = byte_swap_32 (digest[1]);
14139 digest[2] = byte_swap_32 (digest[2]);
14140 digest[3] = byte_swap_32 (digest[3]);
14141
14142 digest[0] -= MD5M_A;
14143 digest[1] -= MD5M_B;
14144 digest[2] -= MD5M_C;
14145 digest[3] -= MD5M_D;
14146
14147 return (PARSER_OK);
14148 }
14149
14150 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14151 {
14152 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14153
14154 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14155
14156 uint32_t *digest = (uint32_t *) hash_buf->digest;
14157
14158 salt_t *salt = hash_buf->salt;
14159
14160 char *salt_buf = input_buf + 3;
14161
14162 char *digest_buf = strchr (salt_buf, '$');
14163
14164 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14165
14166 uint salt_len = digest_buf - salt_buf;
14167
14168 digest_buf++; // skip the '$' symbol
14169
14170 char *salt_buf_ptr = (char *) salt->salt_buf;
14171
14172 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14173
14174 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14175
14176 salt_buf_ptr[salt_len] = 0x2d;
14177
14178 salt->salt_len = salt_len + 1;
14179
14180 digest[0] = hex_to_uint (&digest_buf[ 0]);
14181 digest[1] = hex_to_uint (&digest_buf[ 8]);
14182 digest[2] = hex_to_uint (&digest_buf[16]);
14183 digest[3] = hex_to_uint (&digest_buf[24]);
14184
14185 digest[0] = byte_swap_32 (digest[0]);
14186 digest[1] = byte_swap_32 (digest[1]);
14187 digest[2] = byte_swap_32 (digest[2]);
14188 digest[3] = byte_swap_32 (digest[3]);
14189
14190 digest[0] -= MD5M_A;
14191 digest[1] -= MD5M_B;
14192 digest[2] -= MD5M_C;
14193 digest[3] -= MD5M_D;
14194
14195 return (PARSER_OK);
14196 }
14197
14198 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14199 {
14200 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14201
14202 uint32_t *digest = (uint32_t *) hash_buf->digest;
14203
14204 char tmp_buf[100];
14205
14206 memset (tmp_buf, 0, sizeof (tmp_buf));
14207
14208 base64_decode (base64_to_int, input_buf, input_len, tmp_buf);
14209
14210 memcpy (digest, tmp_buf, 20);
14211
14212 digest[0] = byte_swap_32 (digest[0]);
14213 digest[1] = byte_swap_32 (digest[1]);
14214 digest[2] = byte_swap_32 (digest[2]);
14215 digest[3] = byte_swap_32 (digest[3]);
14216 digest[4] = byte_swap_32 (digest[4]);
14217
14218 digest[0] -= SHA1M_A;
14219 digest[1] -= SHA1M_B;
14220 digest[2] -= SHA1M_C;
14221 digest[3] -= SHA1M_D;
14222 digest[4] -= SHA1M_E;
14223
14224 return (PARSER_OK);
14225 }
14226
14227 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14228 {
14229 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14230
14231 uint32_t *digest = (uint32_t *) hash_buf->digest;
14232
14233 salt_t *salt = hash_buf->salt;
14234
14235 digest[0] = hex_to_uint (&input_buf[ 0]);
14236 digest[1] = hex_to_uint (&input_buf[ 8]);
14237 digest[2] = hex_to_uint (&input_buf[16]);
14238 digest[3] = hex_to_uint (&input_buf[24]);
14239
14240 digest[0] = byte_swap_32 (digest[0]);
14241 digest[1] = byte_swap_32 (digest[1]);
14242 digest[2] = byte_swap_32 (digest[2]);
14243 digest[3] = byte_swap_32 (digest[3]);
14244
14245 digest[0] -= MD5M_A;
14246 digest[1] -= MD5M_B;
14247 digest[2] -= MD5M_C;
14248 digest[3] -= MD5M_D;
14249
14250 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14251
14252 uint salt_len = input_len - 32 - 1;
14253
14254 char *salt_buf = input_buf + 32 + 1;
14255
14256 char *salt_buf_ptr = (char *) salt->salt_buf;
14257
14258 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14259
14260 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14261
14262 /*
14263 * add static "salt" part
14264 */
14265
14266 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14267
14268 salt_len += 8;
14269
14270 salt->salt_len = salt_len;
14271
14272 return (PARSER_OK);
14273 }
14274
14275 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14276 {
14277 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14278
14279 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14280
14281 uint32_t *digest = (uint32_t *) hash_buf->digest;
14282
14283 salt_t *salt = hash_buf->salt;
14284
14285 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14286
14287 /**
14288 * parse line
14289 */
14290
14291 char *saltlen_pos = input_buf + 1 + 3 + 1;
14292
14293 char *saltbuf_pos = strchr (saltlen_pos, '$');
14294
14295 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14296
14297 uint saltlen_len = saltbuf_pos - saltlen_pos;
14298
14299 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14300
14301 saltbuf_pos++;
14302
14303 char *keylen_pos = strchr (saltbuf_pos, '$');
14304
14305 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14306
14307 uint saltbuf_len = keylen_pos - saltbuf_pos;
14308
14309 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14310
14311 keylen_pos++;
14312
14313 char *keybuf_pos = strchr (keylen_pos, '$');
14314
14315 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14316
14317 uint keylen_len = keybuf_pos - keylen_pos;
14318
14319 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14320
14321 keybuf_pos++;
14322
14323 char *databuf_pos = strchr (keybuf_pos, '$');
14324
14325 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14326
14327 uint keybuf_len = databuf_pos - keybuf_pos;
14328
14329 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14330
14331 databuf_pos++;
14332
14333 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14334
14335 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14336
14337 /**
14338 * copy data
14339 */
14340
14341 digest[0] = hex_to_uint (&keybuf_pos[ 0]);
14342 digest[1] = hex_to_uint (&keybuf_pos[ 8]);
14343 digest[2] = hex_to_uint (&keybuf_pos[16]);
14344 digest[3] = hex_to_uint (&keybuf_pos[24]);
14345
14346 salt->salt_buf[0] = hex_to_uint (&saltbuf_pos[ 0]);
14347 salt->salt_buf[1] = hex_to_uint (&saltbuf_pos[ 8]);
14348 salt->salt_buf[2] = hex_to_uint (&saltbuf_pos[16]);
14349 salt->salt_buf[3] = hex_to_uint (&saltbuf_pos[24]);
14350
14351 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14352 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14353 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14354 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14355
14356 salt->salt_len = 16;
14357 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14358
14359 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14360 {
14361 androidfde->data[j] = hex_to_uint (&databuf_pos[i]);
14362 }
14363
14364 return (PARSER_OK);
14365 }
14366
14367 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14368 {
14369 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14370
14371 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14372
14373 uint32_t *digest = (uint32_t *) hash_buf->digest;
14374
14375 salt_t *salt = hash_buf->salt;
14376
14377 /**
14378 * parse line
14379 */
14380
14381 // first is the N salt parameter
14382
14383 char *N_pos = input_buf + 6;
14384
14385 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14386
14387 N_pos++;
14388
14389 salt->scrypt_N = atoi (N_pos);
14390
14391 // r
14392
14393 char *r_pos = strchr (N_pos, ':');
14394
14395 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14396
14397 r_pos++;
14398
14399 salt->scrypt_r = atoi (r_pos);
14400
14401 // p
14402
14403 char *p_pos = strchr (r_pos, ':');
14404
14405 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14406
14407 p_pos++;
14408
14409 salt->scrypt_p = atoi (p_pos);
14410
14411 // salt
14412
14413 char *saltbuf_pos = strchr (p_pos, ':');
14414
14415 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14416
14417 saltbuf_pos++;
14418
14419 char *hash_pos = strchr (saltbuf_pos, ':');
14420
14421 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14422
14423 hash_pos++;
14424
14425 // base64 decode
14426
14427 char tmp_buf[32];
14428
14429 memset (tmp_buf, 0, sizeof (tmp_buf));
14430
14431 int tmp_len = base64_decode (base64_to_int, saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14432
14433 char *salt_buf_ptr = (char *) salt->salt_buf;
14434
14435 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14436
14437 salt->salt_len = tmp_len;
14438 salt->salt_iter = 1;
14439
14440 // digest - base64 decode
14441
14442 memset (tmp_buf, 0, sizeof (tmp_buf));
14443
14444 tmp_len = input_len - (hash_pos - input_buf);
14445
14446 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14447
14448 base64_decode (base64_to_int, hash_pos, tmp_len, tmp_buf);
14449
14450 memcpy (digest, tmp_buf, 32);
14451
14452 return (PARSER_OK);
14453 }
14454
14455 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14456 {
14457 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14458
14459 uint32_t *digest = (uint32_t *) hash_buf->digest;
14460
14461 salt_t *salt = hash_buf->salt;
14462
14463 /**
14464 * parse line
14465 */
14466
14467 char decrypted[76]; // iv + hash
14468
14469 juniper_decrypt_hash (input_buf, decrypted);
14470
14471 char *md5crypt_hash = decrypted + 12;
14472
14473 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14474
14475 salt->salt_iter = ROUNDS_MD5CRYPT;
14476
14477 char *salt_pos = md5crypt_hash + 3;
14478
14479 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14480
14481 salt->salt_len = hash_pos - salt_pos; // should be 8
14482
14483 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14484
14485 hash_pos++;
14486
14487 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14488
14489 return (PARSER_OK);
14490 }
14491
14492 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14493 {
14494 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14495
14496 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14497
14498 uint32_t *digest = (uint32_t *) hash_buf->digest;
14499
14500 salt_t *salt = hash_buf->salt;
14501
14502 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14503
14504 /**
14505 * parse line
14506 */
14507
14508 // first is *raw* salt
14509
14510 char *salt_pos = input_buf + 3;
14511
14512 char *hash_pos = strchr (salt_pos, '$');
14513
14514 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14515
14516 uint salt_len = hash_pos - salt_pos;
14517
14518 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14519
14520 hash_pos++;
14521
14522 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14523
14524 memcpy (salt_buf_ptr, salt_pos, 14);
14525
14526 salt_buf_ptr[17] = 0x01;
14527 salt_buf_ptr[18] = 0x80;
14528
14529 // add some stuff to normal salt to make sorted happy
14530
14531 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14532 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14533 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14534 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14535
14536 salt->salt_len = salt_len;
14537 salt->salt_iter = ROUNDS_CISCO8 - 1;
14538
14539 // base64 decode hash
14540
14541 char tmp_buf[100];
14542
14543 memset (tmp_buf, 0, sizeof (tmp_buf));
14544
14545 uint hash_len = input_len - 3 - salt_len - 1;
14546
14547 int tmp_len = base64_decode (itoa64_to_int, hash_pos, hash_len, tmp_buf);
14548
14549 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14550
14551 memcpy (digest, tmp_buf, 32);
14552
14553 digest[0] = byte_swap_32 (digest[0]);
14554 digest[1] = byte_swap_32 (digest[1]);
14555 digest[2] = byte_swap_32 (digest[2]);
14556 digest[3] = byte_swap_32 (digest[3]);
14557 digest[4] = byte_swap_32 (digest[4]);
14558 digest[5] = byte_swap_32 (digest[5]);
14559 digest[6] = byte_swap_32 (digest[6]);
14560 digest[7] = byte_swap_32 (digest[7]);
14561
14562 return (PARSER_OK);
14563 }
14564
14565 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14566 {
14567 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14568
14569 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14570
14571 uint32_t *digest = (uint32_t *) hash_buf->digest;
14572
14573 salt_t *salt = hash_buf->salt;
14574
14575 /**
14576 * parse line
14577 */
14578
14579 // first is *raw* salt
14580
14581 char *salt_pos = input_buf + 3;
14582
14583 char *hash_pos = strchr (salt_pos, '$');
14584
14585 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14586
14587 uint salt_len = hash_pos - salt_pos;
14588
14589 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14590
14591 salt->salt_len = salt_len;
14592 hash_pos++;
14593
14594 char *salt_buf_ptr = (char *) salt->salt_buf;
14595
14596 memcpy (salt_buf_ptr, salt_pos, salt_len);
14597 salt_buf_ptr[salt_len] = 0;
14598
14599 // base64 decode hash
14600
14601 char tmp_buf[100];
14602
14603 memset (tmp_buf, 0, sizeof (tmp_buf));
14604
14605 uint hash_len = input_len - 3 - salt_len - 1;
14606
14607 int tmp_len = base64_decode (itoa64_to_int, hash_pos, hash_len, tmp_buf);
14608
14609 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14610
14611 memcpy (digest, tmp_buf, 32);
14612
14613 // fixed:
14614 salt->scrypt_N = 16384;
14615 salt->scrypt_r = 1;
14616 salt->scrypt_p = 1;
14617 salt->salt_iter = 1;
14618
14619 return (PARSER_OK);
14620 }
14621
14622 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14623 {
14624 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14625
14626 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14627
14628 uint32_t *digest = (uint32_t *) hash_buf->digest;
14629
14630 salt_t *salt = hash_buf->salt;
14631
14632 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14633
14634 /**
14635 * parse line
14636 */
14637
14638 char *version_pos = input_buf + 8 + 1;
14639
14640 char *verifierHashSize_pos = strchr (version_pos, '*');
14641
14642 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14643
14644 uint32_t version_len = verifierHashSize_pos - version_pos;
14645
14646 if (version_len != 4) return (PARSER_SALT_LENGTH);
14647
14648 verifierHashSize_pos++;
14649
14650 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14651
14652 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14653
14654 uint32_t verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14655
14656 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14657
14658 keySize_pos++;
14659
14660 char *saltSize_pos = strchr (keySize_pos, '*');
14661
14662 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14663
14664 uint32_t keySize_len = saltSize_pos - keySize_pos;
14665
14666 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14667
14668 saltSize_pos++;
14669
14670 char *osalt_pos = strchr (saltSize_pos, '*');
14671
14672 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14673
14674 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14675
14676 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14677
14678 osalt_pos++;
14679
14680 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14681
14682 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14683
14684 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14685
14686 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14687
14688 encryptedVerifier_pos++;
14689
14690 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14691
14692 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14693
14694 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14695
14696 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14697
14698 encryptedVerifierHash_pos++;
14699
14700 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;
14701
14702 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14703
14704 const uint version = atoi (version_pos);
14705
14706 if (version != 2007) return (PARSER_SALT_VALUE);
14707
14708 const uint verifierHashSize = atoi (verifierHashSize_pos);
14709
14710 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14711
14712 const uint keySize = atoi (keySize_pos);
14713
14714 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14715
14716 office2007->keySize = keySize;
14717
14718 const uint saltSize = atoi (saltSize_pos);
14719
14720 if (saltSize != 16) return (PARSER_SALT_VALUE);
14721
14722 /**
14723 * salt
14724 */
14725
14726 salt->salt_len = 16;
14727 salt->salt_iter = ROUNDS_OFFICE2007;
14728
14729 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14730 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14731 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14732 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14733
14734 /**
14735 * esalt
14736 */
14737
14738 office2007->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14739 office2007->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14740 office2007->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14741 office2007->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14742
14743 office2007->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14744 office2007->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14745 office2007->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14746 office2007->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14747 office2007->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14748
14749 /**
14750 * digest
14751 */
14752
14753 digest[0] = office2007->encryptedVerifierHash[0];
14754 digest[1] = office2007->encryptedVerifierHash[1];
14755 digest[2] = office2007->encryptedVerifierHash[2];
14756 digest[3] = office2007->encryptedVerifierHash[3];
14757
14758 return (PARSER_OK);
14759 }
14760
14761 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14762 {
14763 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14764
14765 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14766
14767 uint32_t *digest = (uint32_t *) hash_buf->digest;
14768
14769 salt_t *salt = hash_buf->salt;
14770
14771 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14772
14773 /**
14774 * parse line
14775 */
14776
14777 char *version_pos = input_buf + 8 + 1;
14778
14779 char *spinCount_pos = strchr (version_pos, '*');
14780
14781 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14782
14783 uint32_t version_len = spinCount_pos - version_pos;
14784
14785 if (version_len != 4) return (PARSER_SALT_LENGTH);
14786
14787 spinCount_pos++;
14788
14789 char *keySize_pos = strchr (spinCount_pos, '*');
14790
14791 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14792
14793 uint32_t spinCount_len = keySize_pos - spinCount_pos;
14794
14795 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14796
14797 keySize_pos++;
14798
14799 char *saltSize_pos = strchr (keySize_pos, '*');
14800
14801 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14802
14803 uint32_t keySize_len = saltSize_pos - keySize_pos;
14804
14805 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14806
14807 saltSize_pos++;
14808
14809 char *osalt_pos = strchr (saltSize_pos, '*');
14810
14811 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14812
14813 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14814
14815 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14816
14817 osalt_pos++;
14818
14819 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14820
14821 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14822
14823 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14824
14825 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14826
14827 encryptedVerifier_pos++;
14828
14829 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14830
14831 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14832
14833 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14834
14835 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14836
14837 encryptedVerifierHash_pos++;
14838
14839 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;
14840
14841 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14842
14843 const uint version = atoi (version_pos);
14844
14845 if (version != 2010) return (PARSER_SALT_VALUE);
14846
14847 const uint spinCount = atoi (spinCount_pos);
14848
14849 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14850
14851 const uint keySize = atoi (keySize_pos);
14852
14853 if (keySize != 128) return (PARSER_SALT_VALUE);
14854
14855 const uint saltSize = atoi (saltSize_pos);
14856
14857 if (saltSize != 16) return (PARSER_SALT_VALUE);
14858
14859 /**
14860 * salt
14861 */
14862
14863 salt->salt_len = 16;
14864 salt->salt_iter = spinCount;
14865
14866 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14867 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14868 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14869 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14870
14871 /**
14872 * esalt
14873 */
14874
14875 office2010->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14876 office2010->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14877 office2010->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14878 office2010->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14879
14880 office2010->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14881 office2010->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14882 office2010->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14883 office2010->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14884 office2010->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14885 office2010->encryptedVerifierHash[5] = hex_to_uint (&encryptedVerifierHash_pos[40]);
14886 office2010->encryptedVerifierHash[6] = hex_to_uint (&encryptedVerifierHash_pos[48]);
14887 office2010->encryptedVerifierHash[7] = hex_to_uint (&encryptedVerifierHash_pos[56]);
14888
14889 /**
14890 * digest
14891 */
14892
14893 digest[0] = office2010->encryptedVerifierHash[0];
14894 digest[1] = office2010->encryptedVerifierHash[1];
14895 digest[2] = office2010->encryptedVerifierHash[2];
14896 digest[3] = office2010->encryptedVerifierHash[3];
14897
14898 return (PARSER_OK);
14899 }
14900
14901 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14902 {
14903 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
14904
14905 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14906
14907 uint32_t *digest = (uint32_t *) hash_buf->digest;
14908
14909 salt_t *salt = hash_buf->salt;
14910
14911 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
14912
14913 /**
14914 * parse line
14915 */
14916
14917 char *version_pos = input_buf + 8 + 1;
14918
14919 char *spinCount_pos = strchr (version_pos, '*');
14920
14921 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14922
14923 uint32_t version_len = spinCount_pos - version_pos;
14924
14925 if (version_len != 4) return (PARSER_SALT_LENGTH);
14926
14927 spinCount_pos++;
14928
14929 char *keySize_pos = strchr (spinCount_pos, '*');
14930
14931 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14932
14933 uint32_t spinCount_len = keySize_pos - spinCount_pos;
14934
14935 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14936
14937 keySize_pos++;
14938
14939 char *saltSize_pos = strchr (keySize_pos, '*');
14940
14941 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14942
14943 uint32_t keySize_len = saltSize_pos - keySize_pos;
14944
14945 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14946
14947 saltSize_pos++;
14948
14949 char *osalt_pos = strchr (saltSize_pos, '*');
14950
14951 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14952
14953 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14954
14955 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14956
14957 osalt_pos++;
14958
14959 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14960
14961 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14962
14963 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14964
14965 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14966
14967 encryptedVerifier_pos++;
14968
14969 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14970
14971 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14972
14973 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14974
14975 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14976
14977 encryptedVerifierHash_pos++;
14978
14979 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;
14980
14981 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14982
14983 const uint version = atoi (version_pos);
14984
14985 if (version != 2013) return (PARSER_SALT_VALUE);
14986
14987 const uint spinCount = atoi (spinCount_pos);
14988
14989 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14990
14991 const uint keySize = atoi (keySize_pos);
14992
14993 if (keySize != 256) return (PARSER_SALT_VALUE);
14994
14995 const uint saltSize = atoi (saltSize_pos);
14996
14997 if (saltSize != 16) return (PARSER_SALT_VALUE);
14998
14999 /**
15000 * salt
15001 */
15002
15003 salt->salt_len = 16;
15004 salt->salt_iter = spinCount;
15005
15006 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15007 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15008 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15009 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15010
15011 /**
15012 * esalt
15013 */
15014
15015 office2013->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15016 office2013->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15017 office2013->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15018 office2013->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15019
15020 office2013->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15021 office2013->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15022 office2013->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15023 office2013->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15024 office2013->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15025 office2013->encryptedVerifierHash[5] = hex_to_uint (&encryptedVerifierHash_pos[40]);
15026 office2013->encryptedVerifierHash[6] = hex_to_uint (&encryptedVerifierHash_pos[48]);
15027 office2013->encryptedVerifierHash[7] = hex_to_uint (&encryptedVerifierHash_pos[56]);
15028
15029 /**
15030 * digest
15031 */
15032
15033 digest[0] = office2013->encryptedVerifierHash[0];
15034 digest[1] = office2013->encryptedVerifierHash[1];
15035 digest[2] = office2013->encryptedVerifierHash[2];
15036 digest[3] = office2013->encryptedVerifierHash[3];
15037
15038 return (PARSER_OK);
15039 }
15040
15041 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15042 {
15043 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15044
15045 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15046
15047 uint32_t *digest = (uint32_t *) hash_buf->digest;
15048
15049 salt_t *salt = hash_buf->salt;
15050
15051 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15052
15053 /**
15054 * parse line
15055 */
15056
15057 char *version_pos = input_buf + 11;
15058
15059 char *osalt_pos = strchr (version_pos, '*');
15060
15061 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15062
15063 uint32_t version_len = osalt_pos - version_pos;
15064
15065 if (version_len != 1) return (PARSER_SALT_LENGTH);
15066
15067 osalt_pos++;
15068
15069 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15070
15071 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15072
15073 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15074
15075 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15076
15077 encryptedVerifier_pos++;
15078
15079 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15080
15081 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15082
15083 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15084
15085 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15086
15087 encryptedVerifierHash_pos++;
15088
15089 uint32_t encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15090
15091 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15092
15093 const uint version = *version_pos - 0x30;
15094
15095 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15096
15097 /**
15098 * esalt
15099 */
15100
15101 oldoffice01->version = version;
15102
15103 oldoffice01->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15104 oldoffice01->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15105 oldoffice01->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15106 oldoffice01->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15107
15108 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15109 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15110 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15111 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15112
15113 oldoffice01->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15114 oldoffice01->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15115 oldoffice01->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15116 oldoffice01->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15117
15118 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15119 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15120 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15121 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15122
15123 /**
15124 * salt
15125 */
15126
15127 salt->salt_len = 16;
15128
15129 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15130 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15131 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15132 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15133
15134 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15135 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15136 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15137 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15138
15139 // this is a workaround as office produces multiple documents with the same salt
15140
15141 salt->salt_len += 32;
15142
15143 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15144 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15145 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15146 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15147 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15148 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15149 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15150 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15151
15152 /**
15153 * digest
15154 */
15155
15156 digest[0] = oldoffice01->encryptedVerifierHash[0];
15157 digest[1] = oldoffice01->encryptedVerifierHash[1];
15158 digest[2] = oldoffice01->encryptedVerifierHash[2];
15159 digest[3] = oldoffice01->encryptedVerifierHash[3];
15160
15161 return (PARSER_OK);
15162 }
15163
15164 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15165 {
15166 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15167 }
15168
15169 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15170 {
15171 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15172
15173 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15174
15175 uint32_t *digest = (uint32_t *) hash_buf->digest;
15176
15177 salt_t *salt = hash_buf->salt;
15178
15179 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15180
15181 /**
15182 * parse line
15183 */
15184
15185 char *version_pos = input_buf + 11;
15186
15187 char *osalt_pos = strchr (version_pos, '*');
15188
15189 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15190
15191 uint32_t version_len = osalt_pos - version_pos;
15192
15193 if (version_len != 1) return (PARSER_SALT_LENGTH);
15194
15195 osalt_pos++;
15196
15197 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15198
15199 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15200
15201 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15202
15203 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15204
15205 encryptedVerifier_pos++;
15206
15207 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15208
15209 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15210
15211 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15212
15213 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15214
15215 encryptedVerifierHash_pos++;
15216
15217 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15218
15219 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15220
15221 uint32_t encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15222
15223 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15224
15225 rc4key_pos++;
15226
15227 uint32_t rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15228
15229 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15230
15231 const uint version = *version_pos - 0x30;
15232
15233 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15234
15235 /**
15236 * esalt
15237 */
15238
15239 oldoffice01->version = version;
15240
15241 oldoffice01->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15242 oldoffice01->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15243 oldoffice01->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15244 oldoffice01->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15245
15246 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15247 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15248 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15249 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15250
15251 oldoffice01->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15252 oldoffice01->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15253 oldoffice01->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15254 oldoffice01->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15255
15256 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15257 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15258 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15259 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15260
15261 oldoffice01->rc4key[1] = 0;
15262 oldoffice01->rc4key[0] = 0;
15263
15264 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15265 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15266 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15267 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15268 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15269 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15270 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15271 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15272 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15273 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15274
15275 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15276 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15277
15278 /**
15279 * salt
15280 */
15281
15282 salt->salt_len = 16;
15283
15284 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15285 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15286 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15287 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15288
15289 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15290 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15291 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15292 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15293
15294 // this is a workaround as office produces multiple documents with the same salt
15295
15296 salt->salt_len += 32;
15297
15298 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15299 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15300 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15301 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15302 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15303 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15304 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15305 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15306
15307 /**
15308 * digest
15309 */
15310
15311 digest[0] = oldoffice01->rc4key[0];
15312 digest[1] = oldoffice01->rc4key[1];
15313 digest[2] = 0;
15314 digest[3] = 0;
15315
15316 return (PARSER_OK);
15317 }
15318
15319 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15320 {
15321 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15322
15323 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15324
15325 uint32_t *digest = (uint32_t *) hash_buf->digest;
15326
15327 salt_t *salt = hash_buf->salt;
15328
15329 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15330
15331 /**
15332 * parse line
15333 */
15334
15335 char *version_pos = input_buf + 11;
15336
15337 char *osalt_pos = strchr (version_pos, '*');
15338
15339 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15340
15341 uint32_t version_len = osalt_pos - version_pos;
15342
15343 if (version_len != 1) return (PARSER_SALT_LENGTH);
15344
15345 osalt_pos++;
15346
15347 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15348
15349 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15350
15351 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15352
15353 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15354
15355 encryptedVerifier_pos++;
15356
15357 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15358
15359 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15360
15361 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15362
15363 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15364
15365 encryptedVerifierHash_pos++;
15366
15367 uint32_t encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15368
15369 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15370
15371 const uint version = *version_pos - 0x30;
15372
15373 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15374
15375 /**
15376 * esalt
15377 */
15378
15379 oldoffice34->version = version;
15380
15381 oldoffice34->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15382 oldoffice34->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15383 oldoffice34->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15384 oldoffice34->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15385
15386 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15387 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15388 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15389 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15390
15391 oldoffice34->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15392 oldoffice34->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15393 oldoffice34->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15394 oldoffice34->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15395 oldoffice34->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15396
15397 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15398 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15399 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15400 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15401 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15402
15403 /**
15404 * salt
15405 */
15406
15407 salt->salt_len = 16;
15408
15409 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15410 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15411 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15412 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15413
15414 // this is a workaround as office produces multiple documents with the same salt
15415
15416 salt->salt_len += 32;
15417
15418 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15419 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15420 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15421 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15422 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15423 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15424 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15425 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15426
15427 /**
15428 * digest
15429 */
15430
15431 digest[0] = oldoffice34->encryptedVerifierHash[0];
15432 digest[1] = oldoffice34->encryptedVerifierHash[1];
15433 digest[2] = oldoffice34->encryptedVerifierHash[2];
15434 digest[3] = oldoffice34->encryptedVerifierHash[3];
15435
15436 return (PARSER_OK);
15437 }
15438
15439 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15440 {
15441 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15442
15443 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15444 }
15445
15446 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15447 {
15448 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15449
15450 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15451
15452 uint32_t *digest = (uint32_t *) hash_buf->digest;
15453
15454 salt_t *salt = hash_buf->salt;
15455
15456 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15457
15458 /**
15459 * parse line
15460 */
15461
15462 char *version_pos = input_buf + 11;
15463
15464 char *osalt_pos = strchr (version_pos, '*');
15465
15466 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15467
15468 uint32_t version_len = osalt_pos - version_pos;
15469
15470 if (version_len != 1) return (PARSER_SALT_LENGTH);
15471
15472 osalt_pos++;
15473
15474 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15475
15476 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15477
15478 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15479
15480 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15481
15482 encryptedVerifier_pos++;
15483
15484 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15485
15486 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15487
15488 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15489
15490 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15491
15492 encryptedVerifierHash_pos++;
15493
15494 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15495
15496 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15497
15498 uint32_t encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15499
15500 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15501
15502 rc4key_pos++;
15503
15504 uint32_t rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15505
15506 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15507
15508 const uint version = *version_pos - 0x30;
15509
15510 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15511
15512 /**
15513 * esalt
15514 */
15515
15516 oldoffice34->version = version;
15517
15518 oldoffice34->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15519 oldoffice34->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15520 oldoffice34->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15521 oldoffice34->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15522
15523 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15524 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15525 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15526 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15527
15528 oldoffice34->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15529 oldoffice34->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15530 oldoffice34->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15531 oldoffice34->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15532 oldoffice34->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15533
15534 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15535 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15536 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15537 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15538 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15539
15540 oldoffice34->rc4key[1] = 0;
15541 oldoffice34->rc4key[0] = 0;
15542
15543 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15544 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15545 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15546 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15547 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15548 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15549 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15550 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15551 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15552 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15553
15554 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15555 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15556
15557 /**
15558 * salt
15559 */
15560
15561 salt->salt_len = 16;
15562
15563 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15564 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15565 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15566 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15567
15568 // this is a workaround as office produces multiple documents with the same salt
15569
15570 salt->salt_len += 32;
15571
15572 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15573 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15574 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15575 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15576 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15577 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15578 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15579 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15580
15581 /**
15582 * digest
15583 */
15584
15585 digest[0] = oldoffice34->rc4key[0];
15586 digest[1] = oldoffice34->rc4key[1];
15587 digest[2] = 0;
15588 digest[3] = 0;
15589
15590 return (PARSER_OK);
15591 }
15592
15593 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15594 {
15595 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15596
15597 uint32_t *digest = (uint32_t *) hash_buf->digest;
15598
15599 digest[0] = hex_to_uint (&input_buf[ 0]);
15600 digest[1] = hex_to_uint (&input_buf[ 8]);
15601 digest[2] = hex_to_uint (&input_buf[16]);
15602 digest[3] = hex_to_uint (&input_buf[24]);
15603
15604 digest[0] = byte_swap_32 (digest[0]);
15605 digest[1] = byte_swap_32 (digest[1]);
15606 digest[2] = byte_swap_32 (digest[2]);
15607 digest[3] = byte_swap_32 (digest[3]);
15608
15609 return (PARSER_OK);
15610 }
15611
15612 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15613 {
15614 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15615
15616 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15617
15618 uint32_t *digest = (uint32_t *) hash_buf->digest;
15619
15620 salt_t *salt = hash_buf->salt;
15621
15622 char *signature_pos = input_buf;
15623
15624 char *salt_pos = strchr (signature_pos, '$');
15625
15626 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15627
15628 uint32_t signature_len = salt_pos - signature_pos;
15629
15630 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15631
15632 salt_pos++;
15633
15634 char *hash_pos = strchr (salt_pos, '$');
15635
15636 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15637
15638 uint32_t salt_len = hash_pos - salt_pos;
15639
15640 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15641
15642 hash_pos++;
15643
15644 uint32_t hash_len = input_len - signature_len - 1 - salt_len - 1;
15645
15646 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15647
15648 digest[0] = hex_to_uint (&hash_pos[ 0]);
15649 digest[1] = hex_to_uint (&hash_pos[ 8]);
15650 digest[2] = hex_to_uint (&hash_pos[16]);
15651 digest[3] = hex_to_uint (&hash_pos[24]);
15652 digest[4] = hex_to_uint (&hash_pos[32]);
15653
15654 digest[0] -= SHA1M_A;
15655 digest[1] -= SHA1M_B;
15656 digest[2] -= SHA1M_C;
15657 digest[3] -= SHA1M_D;
15658 digest[4] -= SHA1M_E;
15659
15660 char *salt_buf_ptr = (char *) salt->salt_buf;
15661
15662 memcpy (salt_buf_ptr, salt_pos, salt_len);
15663
15664 salt->salt_len = salt_len;
15665
15666 return (PARSER_OK);
15667 }
15668
15669 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15670 {
15671 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15672
15673 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15674
15675 uint32_t *digest = (uint32_t *) hash_buf->digest;
15676
15677 salt_t *salt = hash_buf->salt;
15678
15679 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15680
15681 /**
15682 * parse line
15683 */
15684
15685 char *iter_pos = input_buf + 14;
15686
15687 const int iter = atoi (iter_pos);
15688
15689 if (iter < 1) return (PARSER_SALT_ITERATION);
15690
15691 salt->salt_iter = iter - 1;
15692
15693 char *salt_pos = strchr (iter_pos, '$');
15694
15695 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15696
15697 salt_pos++;
15698
15699 char *hash_pos = strchr (salt_pos, '$');
15700
15701 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15702
15703 const uint salt_len = hash_pos - salt_pos;
15704
15705 hash_pos++;
15706
15707 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15708
15709 memcpy (salt_buf_ptr, salt_pos, salt_len);
15710
15711 salt->salt_len = salt_len;
15712
15713 salt_buf_ptr[salt_len + 3] = 0x01;
15714 salt_buf_ptr[salt_len + 4] = 0x80;
15715
15716 // add some stuff to normal salt to make sorted happy
15717
15718 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15719 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15720 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15721 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15722 salt->salt_buf[4] = salt->salt_iter;
15723
15724 // base64 decode hash
15725
15726 char tmp_buf[100];
15727
15728 memset (tmp_buf, 0, sizeof (tmp_buf));
15729
15730 uint hash_len = input_len - (hash_pos - input_buf);
15731
15732 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15733
15734 base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf);
15735
15736 memcpy (digest, tmp_buf, 32);
15737
15738 digest[0] = byte_swap_32 (digest[0]);
15739 digest[1] = byte_swap_32 (digest[1]);
15740 digest[2] = byte_swap_32 (digest[2]);
15741 digest[3] = byte_swap_32 (digest[3]);
15742 digest[4] = byte_swap_32 (digest[4]);
15743 digest[5] = byte_swap_32 (digest[5]);
15744 digest[6] = byte_swap_32 (digest[6]);
15745 digest[7] = byte_swap_32 (digest[7]);
15746
15747 return (PARSER_OK);
15748 }
15749
15750 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15751 {
15752 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15753
15754 uint32_t *digest = (uint32_t *) hash_buf->digest;
15755
15756 salt_t *salt = hash_buf->salt;
15757
15758 digest[0] = hex_to_uint (&input_buf[ 0]);
15759 digest[1] = hex_to_uint (&input_buf[ 8]);
15760 digest[2] = 0;
15761 digest[3] = 0;
15762
15763 digest[0] = byte_swap_32 (digest[0]);
15764 digest[1] = byte_swap_32 (digest[1]);
15765
15766 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15767 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15768 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15769
15770 char iter_c = input_buf[17];
15771 char iter_d = input_buf[19];
15772
15773 // atm only defaults, let's see if there's more request
15774 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15775 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15776
15777 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15778
15779 salt->salt_buf[0] = hex_to_uint (&salt_buf[ 0]);
15780 salt->salt_buf[1] = hex_to_uint (&salt_buf[ 8]);
15781 salt->salt_buf[2] = hex_to_uint (&salt_buf[16]);
15782 salt->salt_buf[3] = hex_to_uint (&salt_buf[24]);
15783
15784 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15785 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15786 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15787 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15788
15789 salt->salt_len = 16;
15790
15791 return (PARSER_OK);
15792 }
15793
15794 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15795 {
15796 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
15797
15798 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15799
15800 uint32_t *digest = (uint32_t *) hash_buf->digest;
15801
15802 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
15803
15804 salt_t *salt = hash_buf->salt;
15805
15806 char *salt_pos = input_buf + 10;
15807
15808 char *hash_pos = strchr (salt_pos, '$');
15809
15810 uint salt_len = hash_pos - salt_pos;
15811
15812 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15813
15814 hash_pos++;
15815
15816 uint hash_len = input_len - 10 - salt_len - 1;
15817
15818 // base64 decode salt
15819
15820 char tmp_buf[100];
15821
15822 memset (tmp_buf, 0, sizeof (tmp_buf));
15823
15824 salt_len = base64_decode (base64_to_int, salt_pos, salt_len, tmp_buf);
15825
15826 if (salt_len > 55) return (PARSER_SALT_LENGTH);
15827
15828 tmp_buf[salt_len] = 0x80;
15829
15830 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
15831
15832 salt->salt_len = salt_len;
15833
15834 // base64 decode salt
15835
15836 memset (tmp_buf, 0, sizeof (tmp_buf));
15837
15838 hash_len = base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf);
15839
15840 uint user_len = hash_len - 32;
15841
15842 char *tmp_hash = tmp_buf + user_len;
15843
15844 user_len--; // skip the trailing space
15845
15846 digest[0] = hex_to_uint (&tmp_hash[ 0]);
15847 digest[1] = hex_to_uint (&tmp_hash[ 8]);
15848 digest[2] = hex_to_uint (&tmp_hash[16]);
15849 digest[3] = hex_to_uint (&tmp_hash[24]);
15850
15851 digest[0] = byte_swap_32 (digest[0]);
15852 digest[1] = byte_swap_32 (digest[1]);
15853 digest[2] = byte_swap_32 (digest[2]);
15854 digest[3] = byte_swap_32 (digest[3]);
15855
15856 // store username for host only (output hash if cracked)
15857
15858 memset (cram_md5->user, 0, sizeof (cram_md5->user));
15859 memcpy (cram_md5->user, tmp_buf, user_len);
15860
15861 return (PARSER_OK);
15862 }
15863
15864 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15865 {
15866 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
15867
15868 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15869
15870 uint32_t *digest = (uint32_t *) hash_buf->digest;
15871
15872 salt_t *salt = hash_buf->salt;
15873
15874 char *iter_pos = input_buf + 10;
15875
15876 uint32_t iter = atoi (iter_pos);
15877
15878 if (iter < 1)
15879 {
15880 return (PARSER_SALT_ITERATION);
15881 }
15882
15883 iter--; // first iteration is special
15884
15885 salt->salt_iter = iter;
15886
15887 char *base64_pos = strchr (iter_pos, '}');
15888
15889 if (base64_pos == NULL)
15890 {
15891 return (PARSER_SIGNATURE_UNMATCHED);
15892 }
15893
15894 base64_pos++;
15895
15896 // base64 decode salt
15897
15898 uint32_t base64_len = input_len - (base64_pos - input_buf);
15899
15900 char tmp_buf[100];
15901
15902 memset (tmp_buf, 0, sizeof (tmp_buf));
15903
15904 uint32_t decoded_len = base64_decode (base64_to_int, base64_pos, base64_len, tmp_buf);
15905
15906 if (decoded_len < 24)
15907 {
15908 return (PARSER_SALT_LENGTH);
15909 }
15910
15911 // copy the salt
15912
15913 uint salt_len = decoded_len - 20;
15914
15915 if (salt_len < 4) return (PARSER_SALT_LENGTH);
15916 if (salt_len > 16) return (PARSER_SALT_LENGTH);
15917
15918 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
15919
15920 salt->salt_len = salt_len;
15921
15922 // set digest
15923
15924 uint32_t *digest_ptr = (uint32_t*) tmp_buf;
15925
15926 digest[0] = byte_swap_32 (digest_ptr[0]);
15927 digest[1] = byte_swap_32 (digest_ptr[1]);
15928 digest[2] = byte_swap_32 (digest_ptr[2]);
15929 digest[3] = byte_swap_32 (digest_ptr[3]);
15930 digest[4] = byte_swap_32 (digest_ptr[4]);
15931
15932 return (PARSER_OK);
15933 }
15934
15935 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15936 {
15937 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
15938
15939 uint32_t *digest = (uint32_t *) hash_buf->digest;
15940
15941 salt_t *salt = hash_buf->salt;
15942
15943 digest[0] = hex_to_uint (&input_buf[ 0]);
15944 digest[1] = hex_to_uint (&input_buf[ 8]);
15945 digest[2] = hex_to_uint (&input_buf[16]);
15946 digest[3] = hex_to_uint (&input_buf[24]);
15947 digest[4] = hex_to_uint (&input_buf[32]);
15948
15949 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15950
15951 uint salt_len = input_len - 40 - 1;
15952
15953 char *salt_buf = input_buf + 40 + 1;
15954
15955 char *salt_buf_ptr = (char *) salt->salt_buf;
15956
15957 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15958
15959 if (salt_len != 32) return (PARSER_SALT_LENGTH);
15960
15961 salt->salt_len = salt_len;
15962
15963 return (PARSER_OK);
15964 }
15965
15966 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15967 {
15968 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
15969
15970 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15971
15972 uint32_t *digest = (uint32_t *) hash_buf->digest;
15973
15974 salt_t *salt = hash_buf->salt;
15975
15976 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
15977
15978 /**
15979 * parse line
15980 */
15981
15982 char *V_pos = input_buf + 5;
15983
15984 char *R_pos = strchr (V_pos, '*');
15985
15986 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15987
15988 uint32_t V_len = R_pos - V_pos;
15989
15990 R_pos++;
15991
15992 char *bits_pos = strchr (R_pos, '*');
15993
15994 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15995
15996 uint32_t R_len = bits_pos - R_pos;
15997
15998 bits_pos++;
15999
16000 char *P_pos = strchr (bits_pos, '*');
16001
16002 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16003
16004 uint32_t bits_len = P_pos - bits_pos;
16005
16006 P_pos++;
16007
16008 char *enc_md_pos = strchr (P_pos, '*');
16009
16010 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16011
16012 uint32_t P_len = enc_md_pos - P_pos;
16013
16014 enc_md_pos++;
16015
16016 char *id_len_pos = strchr (enc_md_pos, '*');
16017
16018 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16019
16020 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16021
16022 id_len_pos++;
16023
16024 char *id_buf_pos = strchr (id_len_pos, '*');
16025
16026 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16027
16028 uint32_t id_len_len = id_buf_pos - id_len_pos;
16029
16030 id_buf_pos++;
16031
16032 char *u_len_pos = strchr (id_buf_pos, '*');
16033
16034 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16035
16036 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16037
16038 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16039
16040 u_len_pos++;
16041
16042 char *u_buf_pos = strchr (u_len_pos, '*');
16043
16044 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16045
16046 uint32_t u_len_len = u_buf_pos - u_len_pos;
16047
16048 u_buf_pos++;
16049
16050 char *o_len_pos = strchr (u_buf_pos, '*');
16051
16052 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16053
16054 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16055
16056 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16057
16058 o_len_pos++;
16059
16060 char *o_buf_pos = strchr (o_len_pos, '*');
16061
16062 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16063
16064 uint32_t o_len_len = o_buf_pos - o_len_pos;
16065
16066 o_buf_pos++;
16067
16068 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;
16069
16070 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16071
16072 // validate data
16073
16074 const int V = atoi (V_pos);
16075 const int R = atoi (R_pos);
16076 const int P = atoi (P_pos);
16077
16078 if (V != 1) return (PARSER_SALT_VALUE);
16079 if (R != 2) return (PARSER_SALT_VALUE);
16080
16081 const int enc_md = atoi (enc_md_pos);
16082
16083 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16084
16085 const int id_len = atoi (id_len_pos);
16086 const int u_len = atoi (u_len_pos);
16087 const int o_len = atoi (o_len_pos);
16088
16089 if (id_len != 16) return (PARSER_SALT_VALUE);
16090 if (u_len != 32) return (PARSER_SALT_VALUE);
16091 if (o_len != 32) return (PARSER_SALT_VALUE);
16092
16093 const int bits = atoi (bits_pos);
16094
16095 if (bits != 40) return (PARSER_SALT_VALUE);
16096
16097 // copy data to esalt
16098
16099 pdf->V = V;
16100 pdf->R = R;
16101 pdf->P = P;
16102
16103 pdf->enc_md = enc_md;
16104
16105 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16106 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16107 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16108 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16109 pdf->id_len = id_len;
16110
16111 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16112 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16113 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16114 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16115 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16116 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16117 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16118 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16119 pdf->u_len = u_len;
16120
16121 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16122 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16123 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16124 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16125 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16126 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16127 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16128 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16129 pdf->o_len = o_len;
16130
16131 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16132 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16133 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16134 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16135
16136 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16137 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16138 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16139 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16140 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16141 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16142 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16143 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16144
16145 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16146 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16147 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16148 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16149 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16150 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16151 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16152 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16153
16154 // we use ID for salt, maybe needs to change, we will see...
16155
16156 salt->salt_buf[0] = pdf->id_buf[0];
16157 salt->salt_buf[1] = pdf->id_buf[1];
16158 salt->salt_buf[2] = pdf->id_buf[2];
16159 salt->salt_buf[3] = pdf->id_buf[3];
16160 salt->salt_len = pdf->id_len;
16161
16162 digest[0] = pdf->u_buf[0];
16163 digest[1] = pdf->u_buf[1];
16164 digest[2] = pdf->u_buf[2];
16165 digest[3] = pdf->u_buf[3];
16166
16167 return (PARSER_OK);
16168 }
16169
16170 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16171 {
16172 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16173 }
16174
16175 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16176 {
16177 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16178
16179 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16180
16181 uint32_t *digest = (uint32_t *) hash_buf->digest;
16182
16183 salt_t *salt = hash_buf->salt;
16184
16185 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16186
16187 /**
16188 * parse line
16189 */
16190
16191 char *V_pos = input_buf + 5;
16192
16193 char *R_pos = strchr (V_pos, '*');
16194
16195 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16196
16197 uint32_t V_len = R_pos - V_pos;
16198
16199 R_pos++;
16200
16201 char *bits_pos = strchr (R_pos, '*');
16202
16203 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16204
16205 uint32_t R_len = bits_pos - R_pos;
16206
16207 bits_pos++;
16208
16209 char *P_pos = strchr (bits_pos, '*');
16210
16211 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16212
16213 uint32_t bits_len = P_pos - bits_pos;
16214
16215 P_pos++;
16216
16217 char *enc_md_pos = strchr (P_pos, '*');
16218
16219 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16220
16221 uint32_t P_len = enc_md_pos - P_pos;
16222
16223 enc_md_pos++;
16224
16225 char *id_len_pos = strchr (enc_md_pos, '*');
16226
16227 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16228
16229 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16230
16231 id_len_pos++;
16232
16233 char *id_buf_pos = strchr (id_len_pos, '*');
16234
16235 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16236
16237 uint32_t id_len_len = id_buf_pos - id_len_pos;
16238
16239 id_buf_pos++;
16240
16241 char *u_len_pos = strchr (id_buf_pos, '*');
16242
16243 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16244
16245 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16246
16247 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16248
16249 u_len_pos++;
16250
16251 char *u_buf_pos = strchr (u_len_pos, '*');
16252
16253 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16254
16255 uint32_t u_len_len = u_buf_pos - u_len_pos;
16256
16257 u_buf_pos++;
16258
16259 char *o_len_pos = strchr (u_buf_pos, '*');
16260
16261 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16262
16263 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16264
16265 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16266
16267 o_len_pos++;
16268
16269 char *o_buf_pos = strchr (o_len_pos, '*');
16270
16271 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16272
16273 uint32_t o_len_len = o_buf_pos - o_len_pos;
16274
16275 o_buf_pos++;
16276
16277 char *rc4key_pos = strchr (o_buf_pos, ':');
16278
16279 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16280
16281 uint32_t o_buf_len = rc4key_pos - o_buf_pos;
16282
16283 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16284
16285 rc4key_pos++;
16286
16287 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;
16288
16289 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16290
16291 // validate data
16292
16293 const int V = atoi (V_pos);
16294 const int R = atoi (R_pos);
16295 const int P = atoi (P_pos);
16296
16297 if (V != 1) return (PARSER_SALT_VALUE);
16298 if (R != 2) return (PARSER_SALT_VALUE);
16299
16300 const int enc_md = atoi (enc_md_pos);
16301
16302 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16303
16304 const int id_len = atoi (id_len_pos);
16305 const int u_len = atoi (u_len_pos);
16306 const int o_len = atoi (o_len_pos);
16307
16308 if (id_len != 16) return (PARSER_SALT_VALUE);
16309 if (u_len != 32) return (PARSER_SALT_VALUE);
16310 if (o_len != 32) return (PARSER_SALT_VALUE);
16311
16312 const int bits = atoi (bits_pos);
16313
16314 if (bits != 40) return (PARSER_SALT_VALUE);
16315
16316 // copy data to esalt
16317
16318 pdf->V = V;
16319 pdf->R = R;
16320 pdf->P = P;
16321
16322 pdf->enc_md = enc_md;
16323
16324 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16325 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16326 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16327 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16328 pdf->id_len = id_len;
16329
16330 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16331 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16332 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16333 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16334 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16335 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16336 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16337 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16338 pdf->u_len = u_len;
16339
16340 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16341 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16342 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16343 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16344 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16345 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16346 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16347 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16348 pdf->o_len = o_len;
16349
16350 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16351 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16352 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16353 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16354
16355 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16356 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16357 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16358 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16359 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16360 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16361 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16362 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16363
16364 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16365 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16366 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16367 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16368 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16369 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16370 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16371 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16372
16373 pdf->rc4key[1] = 0;
16374 pdf->rc4key[0] = 0;
16375
16376 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16377 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16378 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16379 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16380 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16381 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16382 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16383 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16384 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16385 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16386
16387 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16388 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16389
16390 // we use ID for salt, maybe needs to change, we will see...
16391
16392 salt->salt_buf[0] = pdf->id_buf[0];
16393 salt->salt_buf[1] = pdf->id_buf[1];
16394 salt->salt_buf[2] = pdf->id_buf[2];
16395 salt->salt_buf[3] = pdf->id_buf[3];
16396 salt->salt_buf[4] = pdf->u_buf[0];
16397 salt->salt_buf[5] = pdf->u_buf[1];
16398 salt->salt_buf[6] = pdf->o_buf[0];
16399 salt->salt_buf[7] = pdf->o_buf[1];
16400 salt->salt_len = pdf->id_len + 16;
16401
16402 digest[0] = pdf->rc4key[0];
16403 digest[1] = pdf->rc4key[1];
16404 digest[2] = 0;
16405 digest[3] = 0;
16406
16407 return (PARSER_OK);
16408 }
16409
16410 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16411 {
16412 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16413
16414 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16415
16416 uint32_t *digest = (uint32_t *) hash_buf->digest;
16417
16418 salt_t *salt = hash_buf->salt;
16419
16420 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16421
16422 /**
16423 * parse line
16424 */
16425
16426 char *V_pos = input_buf + 5;
16427
16428 char *R_pos = strchr (V_pos, '*');
16429
16430 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16431
16432 uint32_t V_len = R_pos - V_pos;
16433
16434 R_pos++;
16435
16436 char *bits_pos = strchr (R_pos, '*');
16437
16438 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16439
16440 uint32_t R_len = bits_pos - R_pos;
16441
16442 bits_pos++;
16443
16444 char *P_pos = strchr (bits_pos, '*');
16445
16446 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16447
16448 uint32_t bits_len = P_pos - bits_pos;
16449
16450 P_pos++;
16451
16452 char *enc_md_pos = strchr (P_pos, '*');
16453
16454 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16455
16456 uint32_t P_len = enc_md_pos - P_pos;
16457
16458 enc_md_pos++;
16459
16460 char *id_len_pos = strchr (enc_md_pos, '*');
16461
16462 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16463
16464 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16465
16466 id_len_pos++;
16467
16468 char *id_buf_pos = strchr (id_len_pos, '*');
16469
16470 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16471
16472 uint32_t id_len_len = id_buf_pos - id_len_pos;
16473
16474 id_buf_pos++;
16475
16476 char *u_len_pos = strchr (id_buf_pos, '*');
16477
16478 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16479
16480 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16481
16482 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16483
16484 u_len_pos++;
16485
16486 char *u_buf_pos = strchr (u_len_pos, '*');
16487
16488 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16489
16490 uint32_t u_len_len = u_buf_pos - u_len_pos;
16491
16492 u_buf_pos++;
16493
16494 char *o_len_pos = strchr (u_buf_pos, '*');
16495
16496 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16497
16498 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16499
16500 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16501
16502 o_len_pos++;
16503
16504 char *o_buf_pos = strchr (o_len_pos, '*');
16505
16506 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16507
16508 uint32_t o_len_len = o_buf_pos - o_len_pos;
16509
16510 o_buf_pos++;
16511
16512 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;
16513
16514 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16515
16516 // validate data
16517
16518 const int V = atoi (V_pos);
16519 const int R = atoi (R_pos);
16520 const int P = atoi (P_pos);
16521
16522 int vr_ok = 0;
16523
16524 if ((V == 2) && (R == 3)) vr_ok = 1;
16525 if ((V == 4) && (R == 4)) vr_ok = 1;
16526
16527 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16528
16529 const int id_len = atoi (id_len_pos);
16530 const int u_len = atoi (u_len_pos);
16531 const int o_len = atoi (o_len_pos);
16532
16533 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16534
16535 if (u_len != 32) return (PARSER_SALT_VALUE);
16536 if (o_len != 32) return (PARSER_SALT_VALUE);
16537
16538 const int bits = atoi (bits_pos);
16539
16540 if (bits != 128) return (PARSER_SALT_VALUE);
16541
16542 int enc_md = 1;
16543
16544 if (R >= 4)
16545 {
16546 enc_md = atoi (enc_md_pos);
16547 }
16548
16549 // copy data to esalt
16550
16551 pdf->V = V;
16552 pdf->R = R;
16553 pdf->P = P;
16554
16555 pdf->enc_md = enc_md;
16556
16557 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16558 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16559 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16560 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16561
16562 if (id_len == 32)
16563 {
16564 pdf->id_buf[4] = hex_to_uint (&id_buf_pos[32]);
16565 pdf->id_buf[5] = hex_to_uint (&id_buf_pos[40]);
16566 pdf->id_buf[6] = hex_to_uint (&id_buf_pos[48]);
16567 pdf->id_buf[7] = hex_to_uint (&id_buf_pos[56]);
16568 }
16569
16570 pdf->id_len = id_len;
16571
16572 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16573 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16574 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16575 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16576 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16577 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16578 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16579 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16580 pdf->u_len = u_len;
16581
16582 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16583 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16584 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16585 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16586 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16587 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16588 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16589 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16590 pdf->o_len = o_len;
16591
16592 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16593 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16594 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16595 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16596
16597 if (id_len == 32)
16598 {
16599 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16600 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16601 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16602 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16603 }
16604
16605 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16606 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16607 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16608 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16609 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16610 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16611 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16612 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16613
16614 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16615 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16616 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16617 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16618 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16619 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16620 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16621 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16622
16623 // precompute rc4 data for later use
16624
16625 uint padding[8] =
16626 {
16627 0x5e4ebf28,
16628 0x418a754e,
16629 0x564e0064,
16630 0x0801faff,
16631 0xb6002e2e,
16632 0x803e68d0,
16633 0xfea90c2f,
16634 0x7a695364
16635 };
16636
16637 // md5
16638
16639 uint salt_pc_block[32];
16640
16641 char *salt_pc_ptr = (char *) salt_pc_block;
16642
16643 memcpy (salt_pc_ptr, padding, 32);
16644 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16645
16646 uint salt_pc_digest[4];
16647
16648 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16649
16650 pdf->rc4data[0] = salt_pc_digest[0];
16651 pdf->rc4data[1] = salt_pc_digest[1];
16652
16653 // we use ID for salt, maybe needs to change, we will see...
16654
16655 salt->salt_buf[0] = pdf->id_buf[0];
16656 salt->salt_buf[1] = pdf->id_buf[1];
16657 salt->salt_buf[2] = pdf->id_buf[2];
16658 salt->salt_buf[3] = pdf->id_buf[3];
16659 salt->salt_buf[4] = pdf->u_buf[0];
16660 salt->salt_buf[5] = pdf->u_buf[1];
16661 salt->salt_buf[6] = pdf->o_buf[0];
16662 salt->salt_buf[7] = pdf->o_buf[1];
16663 salt->salt_len = pdf->id_len + 16;
16664
16665 salt->salt_iter = ROUNDS_PDF14;
16666
16667 digest[0] = pdf->u_buf[0];
16668 digest[1] = pdf->u_buf[1];
16669 digest[2] = 0;
16670 digest[3] = 0;
16671
16672 return (PARSER_OK);
16673 }
16674
16675 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16676 {
16677 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16678
16679 if (ret != PARSER_OK)
16680 {
16681 return ret;
16682 }
16683
16684 uint32_t *digest = (uint32_t *) hash_buf->digest;
16685
16686 salt_t *salt = hash_buf->salt;
16687
16688 digest[0] -= SHA256M_A;
16689 digest[1] -= SHA256M_B;
16690 digest[2] -= SHA256M_C;
16691 digest[3] -= SHA256M_D;
16692 digest[4] -= SHA256M_E;
16693 digest[5] -= SHA256M_F;
16694 digest[6] -= SHA256M_G;
16695 digest[7] -= SHA256M_H;
16696
16697 salt->salt_buf[2] = 0x80;
16698
16699 return (PARSER_OK);
16700 }
16701
16702 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16703 {
16704 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16705
16706 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16707
16708 uint32_t *digest = (uint32_t *) hash_buf->digest;
16709
16710 salt_t *salt = hash_buf->salt;
16711
16712 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16713
16714 /**
16715 * parse line
16716 */
16717
16718 char *V_pos = input_buf + 5;
16719
16720 char *R_pos = strchr (V_pos, '*');
16721
16722 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16723
16724 uint32_t V_len = R_pos - V_pos;
16725
16726 R_pos++;
16727
16728 char *bits_pos = strchr (R_pos, '*');
16729
16730 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16731
16732 uint32_t R_len = bits_pos - R_pos;
16733
16734 bits_pos++;
16735
16736 char *P_pos = strchr (bits_pos, '*');
16737
16738 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16739
16740 uint32_t bits_len = P_pos - bits_pos;
16741
16742 P_pos++;
16743
16744 char *enc_md_pos = strchr (P_pos, '*');
16745
16746 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16747
16748 uint32_t P_len = enc_md_pos - P_pos;
16749
16750 enc_md_pos++;
16751
16752 char *id_len_pos = strchr (enc_md_pos, '*');
16753
16754 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16755
16756 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16757
16758 id_len_pos++;
16759
16760 char *id_buf_pos = strchr (id_len_pos, '*');
16761
16762 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16763
16764 uint32_t id_len_len = id_buf_pos - id_len_pos;
16765
16766 id_buf_pos++;
16767
16768 char *u_len_pos = strchr (id_buf_pos, '*');
16769
16770 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16771
16772 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16773
16774 u_len_pos++;
16775
16776 char *u_buf_pos = strchr (u_len_pos, '*');
16777
16778 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16779
16780 uint32_t u_len_len = u_buf_pos - u_len_pos;
16781
16782 u_buf_pos++;
16783
16784 char *o_len_pos = strchr (u_buf_pos, '*');
16785
16786 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16787
16788 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16789
16790 o_len_pos++;
16791
16792 char *o_buf_pos = strchr (o_len_pos, '*');
16793
16794 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16795
16796 uint32_t o_len_len = o_buf_pos - o_len_pos;
16797
16798 o_buf_pos++;
16799
16800 char *last = strchr (o_buf_pos, '*');
16801
16802 if (last == NULL) last = input_buf + input_len;
16803
16804 uint32_t o_buf_len = last - o_buf_pos;
16805
16806 // validate data
16807
16808 const int V = atoi (V_pos);
16809 const int R = atoi (R_pos);
16810
16811 int vr_ok = 0;
16812
16813 if ((V == 5) && (R == 5)) vr_ok = 1;
16814 if ((V == 5) && (R == 6)) vr_ok = 1;
16815
16816 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16817
16818 const int bits = atoi (bits_pos);
16819
16820 if (bits != 256) return (PARSER_SALT_VALUE);
16821
16822 int enc_md = atoi (enc_md_pos);
16823
16824 if (enc_md != 1) return (PARSER_SALT_VALUE);
16825
16826 const uint id_len = atoi (id_len_pos);
16827 const uint u_len = atoi (u_len_pos);
16828 const uint o_len = atoi (o_len_pos);
16829
16830 if (V_len > 6) return (PARSER_SALT_LENGTH);
16831 if (R_len > 6) return (PARSER_SALT_LENGTH);
16832 if (P_len > 6) return (PARSER_SALT_LENGTH);
16833 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
16834 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
16835 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
16836 if (bits_len > 6) return (PARSER_SALT_LENGTH);
16837 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
16838
16839 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
16840 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
16841 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
16842
16843 // copy data to esalt
16844
16845 if (u_len < 40) return (PARSER_SALT_VALUE);
16846
16847 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
16848 {
16849 pdf->u_buf[i] = hex_to_uint (&u_buf_pos[j]);
16850 }
16851
16852 salt->salt_buf[0] = pdf->u_buf[8];
16853 salt->salt_buf[1] = pdf->u_buf[9];
16854
16855 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16856 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16857
16858 salt->salt_len = 8;
16859 salt->salt_iter = ROUNDS_PDF17L8;
16860
16861 digest[0] = pdf->u_buf[0];
16862 digest[1] = pdf->u_buf[1];
16863 digest[2] = pdf->u_buf[2];
16864 digest[3] = pdf->u_buf[3];
16865 digest[4] = pdf->u_buf[4];
16866 digest[5] = pdf->u_buf[5];
16867 digest[6] = pdf->u_buf[6];
16868 digest[7] = pdf->u_buf[7];
16869
16870 return (PARSER_OK);
16871 }
16872
16873 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16874 {
16875 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
16876
16877 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
16878
16879 uint32_t *digest = (uint32_t *) hash_buf->digest;
16880
16881 salt_t *salt = hash_buf->salt;
16882
16883 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16884
16885 /**
16886 * parse line
16887 */
16888
16889 // iterations
16890
16891 char *iter_pos = input_buf + 7;
16892
16893 uint32_t iter = atoi (iter_pos);
16894
16895 if (iter < 1) return (PARSER_SALT_ITERATION);
16896 if (iter > 999999) return (PARSER_SALT_ITERATION);
16897
16898 // first is *raw* salt
16899
16900 char *salt_pos = strchr (iter_pos, ':');
16901
16902 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16903
16904 salt_pos++;
16905
16906 char *hash_pos = strchr (salt_pos, ':');
16907
16908 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16909
16910 uint32_t salt_len = hash_pos - salt_pos;
16911
16912 if (salt_len > 64) return (PARSER_SALT_LENGTH);
16913
16914 hash_pos++;
16915
16916 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
16917
16918 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
16919
16920 // decode salt
16921
16922 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16923
16924 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
16925
16926 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
16927
16928 salt_buf_ptr[salt_len + 3] = 0x01;
16929 salt_buf_ptr[salt_len + 4] = 0x80;
16930
16931 salt->salt_len = salt_len;
16932 salt->salt_iter = iter - 1;
16933
16934 // decode hash
16935
16936 char tmp_buf[100];
16937
16938 memset (tmp_buf, 0, sizeof (tmp_buf));
16939
16940 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
16941
16942 if (hash_len < 16) return (PARSER_HASH_LENGTH);
16943
16944 memcpy (digest, tmp_buf, 16);
16945
16946 digest[0] = byte_swap_32 (digest[0]);
16947 digest[1] = byte_swap_32 (digest[1]);
16948 digest[2] = byte_swap_32 (digest[2]);
16949 digest[3] = byte_swap_32 (digest[3]);
16950
16951 // add some stuff to normal salt to make sorted happy
16952
16953 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16954 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16955 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16956 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16957 salt->salt_buf[4] = salt->salt_iter;
16958
16959 return (PARSER_OK);
16960 }
16961
16962 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16963 {
16964 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
16965
16966 uint32_t *digest = (uint32_t *) hash_buf->digest;
16967
16968 salt_t *salt = hash_buf->salt;
16969
16970 digest[0] = hex_to_uint (&input_buf[ 0]);
16971 digest[1] = hex_to_uint (&input_buf[ 8]);
16972 digest[2] = hex_to_uint (&input_buf[16]);
16973 digest[3] = hex_to_uint (&input_buf[24]);
16974
16975 digest[0] = byte_swap_32 (digest[0]);
16976 digest[1] = byte_swap_32 (digest[1]);
16977 digest[2] = byte_swap_32 (digest[2]);
16978 digest[3] = byte_swap_32 (digest[3]);
16979
16980 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16981
16982 uint salt_len = input_len - 32 - 1;
16983
16984 char *salt_buf = input_buf + 32 + 1;
16985
16986 char *salt_buf_ptr = (char *) salt->salt_buf;
16987
16988 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16989
16990 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
16991
16992 salt->salt_len = salt_len;
16993
16994 return (PARSER_OK);
16995 }
16996
16997 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16998 {
16999 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17000
17001 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17002
17003 uint32_t *digest = (uint32_t *) hash_buf->digest;
17004
17005 salt_t *salt = hash_buf->salt;
17006
17007 char *user_pos = input_buf + 10;
17008
17009 char *salt_pos = strchr (user_pos, '*');
17010
17011 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17012
17013 salt_pos++;
17014
17015 char *hash_pos = strchr (salt_pos, '*');
17016
17017 hash_pos++;
17018
17019 uint hash_len = input_len - (hash_pos - input_buf);
17020
17021 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17022
17023 uint user_len = salt_pos - user_pos - 1;
17024
17025 uint salt_len = hash_pos - salt_pos - 1;
17026
17027 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17028
17029 /*
17030 * store digest
17031 */
17032
17033 digest[0] = hex_to_uint (&hash_pos[ 0]);
17034 digest[1] = hex_to_uint (&hash_pos[ 8]);
17035 digest[2] = hex_to_uint (&hash_pos[16]);
17036 digest[3] = hex_to_uint (&hash_pos[24]);
17037
17038 digest[0] = byte_swap_32 (digest[0]);
17039 digest[1] = byte_swap_32 (digest[1]);
17040 digest[2] = byte_swap_32 (digest[2]);
17041 digest[3] = byte_swap_32 (digest[3]);
17042
17043 digest[0] -= MD5M_A;
17044 digest[1] -= MD5M_B;
17045 digest[2] -= MD5M_C;
17046 digest[3] -= MD5M_D;
17047
17048 /*
17049 * store salt
17050 */
17051
17052 char *salt_buf_ptr = (char *) salt->salt_buf;
17053
17054 // first 4 bytes are the "challenge"
17055
17056 salt_buf_ptr[0] = hex_to_char (&salt_pos[0]);
17057 salt_buf_ptr[1] = hex_to_char (&salt_pos[2]);
17058 salt_buf_ptr[2] = hex_to_char (&salt_pos[4]);
17059 salt_buf_ptr[3] = hex_to_char (&salt_pos[6]);
17060
17061 // append the user name
17062
17063 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17064
17065 salt->salt_len = 4 + user_len;
17066
17067 return (PARSER_OK);
17068 }
17069
17070 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17071 {
17072 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17073
17074 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17075
17076 uint32_t *digest = (uint32_t *) hash_buf->digest;
17077
17078 salt_t *salt = hash_buf->salt;
17079
17080 char *salt_pos = input_buf + 9;
17081
17082 char *hash_pos = strchr (salt_pos, '*');
17083
17084 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17085
17086 hash_pos++;
17087
17088 uint hash_len = input_len - (hash_pos - input_buf);
17089
17090 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17091
17092 uint salt_len = hash_pos - salt_pos - 1;
17093
17094 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17095
17096 /*
17097 * store digest
17098 */
17099
17100 digest[0] = hex_to_uint (&hash_pos[ 0]);
17101 digest[1] = hex_to_uint (&hash_pos[ 8]);
17102 digest[2] = hex_to_uint (&hash_pos[16]);
17103 digest[3] = hex_to_uint (&hash_pos[24]);
17104 digest[4] = hex_to_uint (&hash_pos[32]);
17105
17106 /*
17107 * store salt
17108 */
17109
17110 char *salt_buf_ptr = (char *) salt->salt_buf;
17111
17112 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17113
17114 salt->salt_len = salt_len;
17115
17116 return (PARSER_OK);
17117 }
17118
17119 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17120 {
17121 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17122
17123 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17124
17125 uint32_t *digest = (uint32_t *) hash_buf->digest;
17126
17127 salt_t *salt = hash_buf->salt;
17128
17129 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17130
17131 /**
17132 * parse line
17133 */
17134
17135 char *cry_master_len_pos = input_buf + 9;
17136
17137 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17138
17139 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17140
17141 uint32_t cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17142
17143 cry_master_buf_pos++;
17144
17145 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17146
17147 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17148
17149 uint32_t cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17150
17151 cry_salt_len_pos++;
17152
17153 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17154
17155 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17156
17157 uint32_t cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17158
17159 cry_salt_buf_pos++;
17160
17161 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17162
17163 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17164
17165 uint32_t cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17166
17167 cry_rounds_pos++;
17168
17169 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17170
17171 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17172
17173 uint32_t cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17174
17175 ckey_len_pos++;
17176
17177 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17178
17179 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17180
17181 uint32_t ckey_len_len = ckey_buf_pos - ckey_len_pos;
17182
17183 ckey_buf_pos++;
17184
17185 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17186
17187 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17188
17189 uint32_t ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17190
17191 public_key_len_pos++;
17192
17193 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17194
17195 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17196
17197 uint32_t public_key_len_len = public_key_buf_pos - public_key_len_pos;
17198
17199 public_key_buf_pos++;
17200
17201 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;
17202
17203 const uint cry_master_len = atoi (cry_master_len_pos);
17204 const uint cry_salt_len = atoi (cry_salt_len_pos);
17205 const uint ckey_len = atoi (ckey_len_pos);
17206 const uint public_key_len = atoi (public_key_len_pos);
17207
17208 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17209 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17210 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17211 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17212
17213 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 8)
17214 {
17215 bitcoin_wallet->cry_master_buf[i] = hex_to_uint (&cry_master_buf_pos[j]);
17216
17217 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17218 }
17219
17220 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 8)
17221 {
17222 bitcoin_wallet->ckey_buf[i] = hex_to_uint (&ckey_buf_pos[j]);
17223
17224 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17225 }
17226
17227 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 8)
17228 {
17229 bitcoin_wallet->public_key_buf[i] = hex_to_uint (&public_key_buf_pos[j]);
17230
17231 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17232 }
17233
17234 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17235 bitcoin_wallet->ckey_len = ckey_len / 2;
17236 bitcoin_wallet->public_key_len = public_key_len / 2;
17237
17238 /*
17239 * store digest (should be unique enought, hopefully)
17240 */
17241
17242 digest[0] = bitcoin_wallet->cry_master_buf[0];
17243 digest[1] = bitcoin_wallet->cry_master_buf[1];
17244 digest[2] = bitcoin_wallet->cry_master_buf[2];
17245 digest[3] = bitcoin_wallet->cry_master_buf[3];
17246
17247 /*
17248 * store salt
17249 */
17250
17251 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17252
17253 const uint cry_rounds = atoi (cry_rounds_pos);
17254
17255 salt->salt_iter = cry_rounds - 1;
17256
17257 char *salt_buf_ptr = (char *) salt->salt_buf;
17258
17259 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17260
17261 salt->salt_len = salt_len;
17262
17263 return (PARSER_OK);
17264 }
17265
17266 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17267 {
17268 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17269
17270 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17271
17272 uint32_t *digest = (uint32_t *) hash_buf->digest;
17273
17274 salt_t *salt = hash_buf->salt;
17275
17276 sip_t *sip = (sip_t *) hash_buf->esalt;
17277
17278 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17279
17280 char temp_input_buf[input_len + 1];
17281
17282 memset (temp_input_buf, 0, sizeof (temp_input_buf));
17283 memcpy (temp_input_buf, input_buf, input_len);
17284
17285 // URI_server:
17286
17287 char *URI_server_pos = temp_input_buf + 6;
17288
17289 char *URI_client_pos = strchr (URI_server_pos, '*');
17290
17291 if (URI_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17292
17293 URI_client_pos[0] = 0;
17294 URI_client_pos++;
17295
17296 uint URI_server_len = strlen (URI_server_pos);
17297
17298 if (URI_server_len > 512) return (PARSER_SALT_LENGTH);
17299
17300 // URI_client:
17301
17302 char *user_pos = strchr (URI_client_pos, '*');
17303
17304 if (user_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17305
17306 user_pos[0] = 0;
17307 user_pos++;
17308
17309 uint URI_client_len = strlen (URI_client_pos);
17310
17311 if (URI_client_len > 512) return (PARSER_SALT_LENGTH);
17312
17313 // user:
17314
17315 char *realm_pos = strchr (user_pos, '*');
17316
17317 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17318
17319 realm_pos[0] = 0;
17320 realm_pos++;
17321
17322 uint user_len = strlen (user_pos);
17323
17324 if (user_len > 116) return (PARSER_SALT_LENGTH);
17325
17326 // realm:
17327
17328 char *method_pos = strchr (realm_pos, '*');
17329
17330 if (method_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17331
17332 method_pos[0] = 0;
17333 method_pos++;
17334
17335 uint realm_len = strlen (realm_pos);
17336
17337 if (realm_len > 116) return (PARSER_SALT_LENGTH);
17338
17339 // method:
17340
17341 char *URI_prefix_pos = strchr (method_pos, '*');
17342
17343 if (URI_prefix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17344
17345 URI_prefix_pos[0] = 0;
17346 URI_prefix_pos++;
17347
17348 uint method_len = strlen (method_pos);
17349
17350 if (method_len > 246) return (PARSER_SALT_LENGTH);
17351
17352 // URI_prefix:
17353
17354 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17355
17356 if (URI_resource_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17357
17358 URI_resource_pos[0] = 0;
17359 URI_resource_pos++;
17360
17361 uint URI_prefix_len = strlen (URI_prefix_pos);
17362
17363 if (URI_prefix_len > 245) return (PARSER_SALT_LENGTH);
17364
17365 // URI_resource:
17366
17367 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17368
17369 if (URI_suffix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17370
17371 URI_suffix_pos[0] = 0;
17372 URI_suffix_pos++;
17373
17374 uint URI_resource_len = strlen (URI_resource_pos);
17375
17376 if (URI_resource_len < 1) return (PARSER_SALT_LENGTH);
17377 if (URI_resource_len > 246) return (PARSER_SALT_LENGTH);
17378
17379 // URI_suffix:
17380
17381 char *nonce_pos = strchr (URI_suffix_pos, '*');
17382
17383 if (nonce_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17384
17385 nonce_pos[0] = 0;
17386 nonce_pos++;
17387
17388 uint URI_suffix_len = strlen (URI_suffix_pos);
17389
17390 if (URI_suffix_len > 245) return (PARSER_SALT_LENGTH);
17391
17392 // nonce:
17393
17394 char *nonce_client_pos = strchr (nonce_pos, '*');
17395
17396 if (nonce_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17397
17398 nonce_client_pos[0] = 0;
17399 nonce_client_pos++;
17400
17401 uint nonce_len = strlen (nonce_pos);
17402
17403 if (nonce_len < 1) return (PARSER_SALT_LENGTH);
17404 if (nonce_len > 50) return (PARSER_SALT_LENGTH);
17405
17406 // nonce_client:
17407
17408 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17409
17410 if (nonce_count_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17411
17412 nonce_count_pos[0] = 0;
17413 nonce_count_pos++;
17414
17415 uint nonce_client_len = strlen (nonce_client_pos);
17416
17417 if (nonce_client_len > 50) return (PARSER_SALT_LENGTH);
17418
17419 // nonce_count:
17420
17421 char *qop_pos = strchr (nonce_count_pos, '*');
17422
17423 if (qop_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17424
17425 qop_pos[0] = 0;
17426 qop_pos++;
17427
17428 uint nonce_count_len = strlen (nonce_count_pos);
17429
17430 if (nonce_count_len > 50) return (PARSER_SALT_LENGTH);
17431
17432 // qop:
17433
17434 char *directive_pos = strchr (qop_pos, '*');
17435
17436 if (directive_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17437
17438 directive_pos[0] = 0;
17439 directive_pos++;
17440
17441 uint qop_len = strlen (qop_pos);
17442
17443 if (qop_len > 50) return (PARSER_SALT_LENGTH);
17444
17445 // directive
17446
17447 char *digest_pos = strchr (directive_pos, '*');
17448
17449 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17450
17451 digest_pos[0] = 0;
17452 digest_pos++;
17453
17454 uint directive_len = strlen (directive_pos);
17455
17456 if (directive_len != 3) return (PARSER_SALT_LENGTH);
17457
17458 if (memcmp (directive_pos, "MD5", 3))
17459 {
17460 log_info ("ERROR: only the MD5 directive is currently supported\n");
17461
17462 return (PARSER_SIP_AUTH_DIRECTIVE);
17463 }
17464
17465 /*
17466 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17467 */
17468
17469 uint md5_len = 0;
17470
17471 uint md5_max_len = 4 * 64;
17472
17473 uint md5_remaining_len = md5_max_len;
17474
17475 uint tmp_md5_buf[md5_max_len / 4];
17476
17477 memset (tmp_md5_buf, 0, sizeof (tmp_md5_buf));
17478
17479 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17480
17481 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17482
17483 md5_len += method_len + 1;
17484 tmp_md5_ptr += method_len + 1;
17485
17486 if (URI_prefix_len > 0)
17487 {
17488 md5_remaining_len = md5_max_len - md5_len;
17489
17490 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17491
17492 md5_len += URI_prefix_len + 1;
17493 tmp_md5_ptr += URI_prefix_len + 1;
17494 }
17495
17496 md5_remaining_len = md5_max_len - md5_len;
17497
17498 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17499
17500 md5_len += URI_resource_len;
17501 tmp_md5_ptr += URI_resource_len;
17502
17503 if (URI_suffix_len > 0)
17504 {
17505 md5_remaining_len = md5_max_len - md5_len;
17506
17507 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17508
17509 md5_len += 1 + URI_suffix_len;
17510 }
17511
17512 uint tmp_digest[4];
17513
17514 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17515
17516 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17517 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17518 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17519 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17520
17521 /*
17522 * esalt
17523 */
17524
17525 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17526
17527 uint esalt_len = 0;
17528
17529 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17530
17531 // there are 2 possibilities for the esalt:
17532
17533 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17534 {
17535 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17536
17537 if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH);
17538
17539 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17540 nonce_pos,
17541 nonce_count_pos,
17542 nonce_client_pos,
17543 qop_pos,
17544 tmp_digest[0],
17545 tmp_digest[1],
17546 tmp_digest[2],
17547 tmp_digest[3]);
17548 }
17549 else
17550 {
17551 esalt_len = 1 + nonce_len + 1 + 32;
17552
17553 if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH);
17554
17555 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17556 nonce_pos,
17557 tmp_digest[0],
17558 tmp_digest[1],
17559 tmp_digest[2],
17560 tmp_digest[3]);
17561 }
17562
17563 // add 0x80 to esalt
17564
17565 esalt_buf_ptr[esalt_len] = 0x80;
17566
17567 sip->esalt_len = esalt_len;
17568
17569 /*
17570 * actual salt
17571 */
17572
17573 char *sip_salt_ptr = (char *) sip->salt_buf;
17574
17575 uint salt_len = user_len + 1 + realm_len + 1;
17576
17577 uint max_salt_len = 119;
17578
17579 if (salt_len > max_salt_len) return (PARSER_SALT_LENGTH);
17580
17581 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17582
17583 sip->salt_len = salt_len;
17584
17585 /*
17586 * fake salt (for sorting)
17587 */
17588
17589 char *salt_buf_ptr = (char *) salt->salt_buf;
17590
17591 max_salt_len = 55;
17592
17593 uint fake_salt_len = salt_len;
17594
17595 if (fake_salt_len > max_salt_len)
17596 {
17597 fake_salt_len = max_salt_len;
17598 }
17599
17600 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17601
17602 salt->salt_len = fake_salt_len;
17603
17604 /*
17605 * digest
17606 */
17607
17608 digest[0] = hex_to_uint (&digest_pos[ 0]);
17609 digest[1] = hex_to_uint (&digest_pos[ 8]);
17610 digest[2] = hex_to_uint (&digest_pos[16]);
17611 digest[3] = hex_to_uint (&digest_pos[24]);
17612
17613 digest[0] = byte_swap_32 (digest[0]);
17614 digest[1] = byte_swap_32 (digest[1]);
17615 digest[2] = byte_swap_32 (digest[2]);
17616 digest[3] = byte_swap_32 (digest[3]);
17617
17618 return (PARSER_OK);
17619 }
17620
17621 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17622 {
17623 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17624
17625 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17626
17627 uint32_t *digest = (uint32_t *) hash_buf->digest;
17628
17629 salt_t *salt = hash_buf->salt;
17630
17631 // digest
17632
17633 char *digest_pos = input_buf;
17634
17635 digest[0] = hex_to_uint (&digest_pos[0]);
17636 digest[1] = 0;
17637 digest[2] = 0;
17638 digest[3] = 0;
17639
17640 // salt
17641
17642 char *salt_buf = input_buf + 8 + 1;
17643
17644 uint salt_len = 8;
17645
17646 char *salt_buf_ptr = (char *) salt->salt_buf;
17647
17648 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17649
17650 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17651
17652 salt->salt_len = salt_len;
17653
17654 return (PARSER_OK);
17655 }
17656
17657 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17658 {
17659 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
17660
17661 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17662
17663 uint32_t *digest = (uint32_t *) hash_buf->digest;
17664
17665 salt_t *salt = hash_buf->salt;
17666
17667 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
17668
17669 /**
17670 * parse line
17671 */
17672
17673 char *p_buf_pos = input_buf + 4;
17674
17675 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
17676
17677 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17678
17679 uint32_t p_buf_len = NumCyclesPower_pos - p_buf_pos;
17680
17681 NumCyclesPower_pos++;
17682
17683 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
17684
17685 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17686
17687 uint32_t NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
17688
17689 salt_len_pos++;
17690
17691 char *salt_buf_pos = strchr (salt_len_pos, '$');
17692
17693 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17694
17695 uint32_t salt_len_len = salt_buf_pos - salt_len_pos;
17696
17697 salt_buf_pos++;
17698
17699 char *iv_len_pos = strchr (salt_buf_pos, '$');
17700
17701 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17702
17703 uint32_t salt_buf_len = iv_len_pos - salt_buf_pos;
17704
17705 iv_len_pos++;
17706
17707 char *iv_buf_pos = strchr (iv_len_pos, '$');
17708
17709 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17710
17711 uint32_t iv_len_len = iv_buf_pos - iv_len_pos;
17712
17713 iv_buf_pos++;
17714
17715 char *crc_buf_pos = strchr (iv_buf_pos, '$');
17716
17717 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17718
17719 uint32_t iv_buf_len = crc_buf_pos - iv_buf_pos;
17720
17721 crc_buf_pos++;
17722
17723 char *data_len_pos = strchr (crc_buf_pos, '$');
17724
17725 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17726
17727 uint32_t crc_buf_len = data_len_pos - crc_buf_pos;
17728
17729 data_len_pos++;
17730
17731 char *unpack_size_pos = strchr (data_len_pos, '$');
17732
17733 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17734
17735 uint32_t data_len_len = unpack_size_pos - data_len_pos;
17736
17737 unpack_size_pos++;
17738
17739 char *data_buf_pos = strchr (unpack_size_pos, '$');
17740
17741 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17742
17743 uint32_t unpack_size_len = data_buf_pos - unpack_size_pos;
17744
17745 data_buf_pos++;
17746
17747 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;
17748
17749 const uint iter = atoi (NumCyclesPower_pos);
17750 const uint crc = atoi (crc_buf_pos);
17751 const uint p_buf = atoi (p_buf_pos);
17752 const uint salt_len = atoi (salt_len_pos);
17753 const uint iv_len = atoi (iv_len_pos);
17754 const uint unpack_size = atoi (unpack_size_pos);
17755 const uint data_len = atoi (data_len_pos);
17756
17757 /**
17758 * verify some data
17759 */
17760
17761 if (p_buf != 0) return (PARSER_SALT_VALUE);
17762 if (salt_len != 0) return (PARSER_SALT_VALUE);
17763
17764 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
17765
17766 if (data_len > 384) return (PARSER_SALT_VALUE);
17767
17768 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
17769
17770 /**
17771 * store data
17772 */
17773
17774 seven_zip->iv_buf[0] = hex_to_uint (&iv_buf_pos[ 0]);
17775 seven_zip->iv_buf[1] = hex_to_uint (&iv_buf_pos[ 8]);
17776 seven_zip->iv_buf[2] = hex_to_uint (&iv_buf_pos[16]);
17777 seven_zip->iv_buf[3] = hex_to_uint (&iv_buf_pos[24]);
17778
17779 seven_zip->iv_len = iv_len;
17780
17781 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
17782
17783 seven_zip->salt_len = 0;
17784
17785 seven_zip->crc = crc;
17786
17787 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
17788 {
17789 seven_zip->data_buf[i] = hex_to_uint (&data_buf_pos[j]);
17790
17791 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
17792 }
17793
17794 seven_zip->data_len = data_len;
17795
17796 seven_zip->unpack_size = unpack_size;
17797
17798 // real salt
17799
17800 salt->salt_buf[0] = seven_zip->data_buf[0];
17801 salt->salt_buf[1] = seven_zip->data_buf[1];
17802 salt->salt_buf[2] = seven_zip->data_buf[2];
17803 salt->salt_buf[3] = seven_zip->data_buf[3];
17804
17805 salt->salt_len = 16;
17806
17807 salt->salt_sign[0] = iter;
17808
17809 salt->salt_iter = 1 << iter;
17810
17811 /**
17812 * digest
17813 */
17814
17815 digest[0] = crc;
17816 digest[1] = 0;
17817 digest[2] = 0;
17818 digest[3] = 0;
17819
17820 return (PARSER_OK);
17821 }
17822
17823 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17824 {
17825 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
17826
17827 uint32_t *digest = (uint32_t *) hash_buf->digest;
17828
17829 digest[0] = hex_to_uint (&input_buf[ 0]);
17830 digest[1] = hex_to_uint (&input_buf[ 8]);
17831 digest[2] = hex_to_uint (&input_buf[16]);
17832 digest[3] = hex_to_uint (&input_buf[24]);
17833 digest[4] = hex_to_uint (&input_buf[32]);
17834 digest[5] = hex_to_uint (&input_buf[40]);
17835 digest[6] = hex_to_uint (&input_buf[48]);
17836 digest[7] = hex_to_uint (&input_buf[56]);
17837
17838 digest[0] = byte_swap_32 (digest[0]);
17839 digest[1] = byte_swap_32 (digest[1]);
17840 digest[2] = byte_swap_32 (digest[2]);
17841 digest[3] = byte_swap_32 (digest[3]);
17842 digest[4] = byte_swap_32 (digest[4]);
17843 digest[5] = byte_swap_32 (digest[5]);
17844 digest[6] = byte_swap_32 (digest[6]);
17845 digest[7] = byte_swap_32 (digest[7]);
17846
17847 return (PARSER_OK);
17848 }
17849
17850 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17851 {
17852 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
17853
17854 uint32_t *digest = (uint32_t *) hash_buf->digest;
17855
17856 digest[ 0] = hex_to_uint (&input_buf[ 0]);
17857 digest[ 1] = hex_to_uint (&input_buf[ 8]);
17858 digest[ 2] = hex_to_uint (&input_buf[ 16]);
17859 digest[ 3] = hex_to_uint (&input_buf[ 24]);
17860 digest[ 4] = hex_to_uint (&input_buf[ 32]);
17861 digest[ 5] = hex_to_uint (&input_buf[ 40]);
17862 digest[ 6] = hex_to_uint (&input_buf[ 48]);
17863 digest[ 7] = hex_to_uint (&input_buf[ 56]);
17864 digest[ 8] = hex_to_uint (&input_buf[ 64]);
17865 digest[ 9] = hex_to_uint (&input_buf[ 72]);
17866 digest[10] = hex_to_uint (&input_buf[ 80]);
17867 digest[11] = hex_to_uint (&input_buf[ 88]);
17868 digest[12] = hex_to_uint (&input_buf[ 96]);
17869 digest[13] = hex_to_uint (&input_buf[104]);
17870 digest[14] = hex_to_uint (&input_buf[112]);
17871 digest[15] = hex_to_uint (&input_buf[120]);
17872
17873 digest[ 0] = byte_swap_32 (digest[ 0]);
17874 digest[ 1] = byte_swap_32 (digest[ 1]);
17875 digest[ 2] = byte_swap_32 (digest[ 2]);
17876 digest[ 3] = byte_swap_32 (digest[ 3]);
17877 digest[ 4] = byte_swap_32 (digest[ 4]);
17878 digest[ 5] = byte_swap_32 (digest[ 5]);
17879 digest[ 6] = byte_swap_32 (digest[ 6]);
17880 digest[ 7] = byte_swap_32 (digest[ 7]);
17881 digest[ 8] = byte_swap_32 (digest[ 8]);
17882 digest[ 9] = byte_swap_32 (digest[ 9]);
17883 digest[10] = byte_swap_32 (digest[10]);
17884 digest[11] = byte_swap_32 (digest[11]);
17885 digest[12] = byte_swap_32 (digest[12]);
17886 digest[13] = byte_swap_32 (digest[13]);
17887 digest[14] = byte_swap_32 (digest[14]);
17888 digest[15] = byte_swap_32 (digest[15]);
17889
17890 return (PARSER_OK);
17891 }
17892
17893 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17894 {
17895 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
17896
17897 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17898
17899 uint32_t *digest = (uint32_t *) hash_buf->digest;
17900
17901 salt_t *salt = hash_buf->salt;
17902
17903 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
17904
17905 /**
17906 * parse line
17907 */
17908
17909 // iterations
17910
17911 char *iter_pos = input_buf + 4;
17912
17913 uint32_t iter = atoi (iter_pos);
17914
17915 if (iter < 1) return (PARSER_SALT_ITERATION);
17916 if (iter > 999999) return (PARSER_SALT_ITERATION);
17917
17918 // first is *raw* salt
17919
17920 char *salt_pos = strchr (iter_pos, ':');
17921
17922 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17923
17924 salt_pos++;
17925
17926 char *hash_pos = strchr (salt_pos, ':');
17927
17928 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17929
17930 uint32_t salt_len = hash_pos - salt_pos;
17931
17932 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17933
17934 hash_pos++;
17935
17936 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
17937
17938 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17939
17940 // decode salt
17941
17942 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
17943
17944 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17945
17946 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17947
17948 salt_buf_ptr[salt_len + 3] = 0x01;
17949 salt_buf_ptr[salt_len + 4] = 0x80;
17950
17951 salt->salt_len = salt_len;
17952 salt->salt_iter = iter - 1;
17953
17954 // decode hash
17955
17956 char tmp_buf[100];
17957
17958 memset (tmp_buf, 0, sizeof (tmp_buf));
17959
17960 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
17961
17962 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17963
17964 memcpy (digest, tmp_buf, 16);
17965
17966 // add some stuff to normal salt to make sorted happy
17967
17968 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
17969 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
17970 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
17971 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
17972 salt->salt_buf[4] = salt->salt_iter;
17973
17974 return (PARSER_OK);
17975 }
17976
17977 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17978 {
17979 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
17980
17981 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
17982
17983 uint32_t *digest = (uint32_t *) hash_buf->digest;
17984
17985 salt_t *salt = hash_buf->salt;
17986
17987 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
17988
17989 /**
17990 * parse line
17991 */
17992
17993 // iterations
17994
17995 char *iter_pos = input_buf + 5;
17996
17997 uint32_t iter = atoi (iter_pos);
17998
17999 if (iter < 1) return (PARSER_SALT_ITERATION);
18000 if (iter > 999999) return (PARSER_SALT_ITERATION);
18001
18002 // first is *raw* salt
18003
18004 char *salt_pos = strchr (iter_pos, ':');
18005
18006 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18007
18008 salt_pos++;
18009
18010 char *hash_pos = strchr (salt_pos, ':');
18011
18012 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18013
18014 uint32_t salt_len = hash_pos - salt_pos;
18015
18016 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18017
18018 hash_pos++;
18019
18020 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
18021
18022 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18023
18024 // decode salt
18025
18026 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18027
18028 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18029
18030 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18031
18032 salt_buf_ptr[salt_len + 3] = 0x01;
18033 salt_buf_ptr[salt_len + 4] = 0x80;
18034
18035 salt->salt_len = salt_len;
18036 salt->salt_iter = iter - 1;
18037
18038 // decode hash
18039
18040 char tmp_buf[100];
18041
18042 memset (tmp_buf, 0, sizeof (tmp_buf));
18043
18044 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
18045
18046 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18047
18048 memcpy (digest, tmp_buf, 16);
18049
18050 digest[0] = byte_swap_32 (digest[0]);
18051 digest[1] = byte_swap_32 (digest[1]);
18052 digest[2] = byte_swap_32 (digest[2]);
18053 digest[3] = byte_swap_32 (digest[3]);
18054
18055 // add some stuff to normal salt to make sorted happy
18056
18057 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18058 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18059 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18060 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18061 salt->salt_buf[4] = salt->salt_iter;
18062
18063 return (PARSER_OK);
18064 }
18065
18066 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18067 {
18068 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18069
18070 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18071
18072 uint64_t *digest = (uint64_t *) hash_buf->digest;
18073
18074 salt_t *salt = hash_buf->salt;
18075
18076 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18077
18078 /**
18079 * parse line
18080 */
18081
18082 // iterations
18083
18084 char *iter_pos = input_buf + 7;
18085
18086 uint32_t iter = atoi (iter_pos);
18087
18088 if (iter < 1) return (PARSER_SALT_ITERATION);
18089 if (iter > 999999) return (PARSER_SALT_ITERATION);
18090
18091 // first is *raw* salt
18092
18093 char *salt_pos = strchr (iter_pos, ':');
18094
18095 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18096
18097 salt_pos++;
18098
18099 char *hash_pos = strchr (salt_pos, ':');
18100
18101 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18102
18103 uint32_t salt_len = hash_pos - salt_pos;
18104
18105 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18106
18107 hash_pos++;
18108
18109 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
18110
18111 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18112
18113 // decode salt
18114
18115 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18116
18117 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18118
18119 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18120
18121 salt_buf_ptr[salt_len + 3] = 0x01;
18122 salt_buf_ptr[salt_len + 4] = 0x80;
18123
18124 salt->salt_len = salt_len;
18125 salt->salt_iter = iter - 1;
18126
18127 // decode hash
18128
18129 char tmp_buf[100];
18130
18131 memset (tmp_buf, 0, sizeof (tmp_buf));
18132
18133 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
18134
18135 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18136
18137 memcpy (digest, tmp_buf, 64);
18138
18139 digest[0] = byte_swap_64 (digest[0]);
18140 digest[1] = byte_swap_64 (digest[1]);
18141 digest[2] = byte_swap_64 (digest[2]);
18142 digest[3] = byte_swap_64 (digest[3]);
18143 digest[4] = byte_swap_64 (digest[4]);
18144 digest[5] = byte_swap_64 (digest[5]);
18145 digest[6] = byte_swap_64 (digest[6]);
18146 digest[7] = byte_swap_64 (digest[7]);
18147
18148 // add some stuff to normal salt to make sorted happy
18149
18150 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18151 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18152 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18153 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18154 salt->salt_buf[4] = salt->salt_iter;
18155
18156 return (PARSER_OK);
18157 }
18158
18159 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18160 {
18161 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18162
18163 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18164
18165 uint *digest = (uint *) hash_buf->digest;
18166
18167 salt_t *salt = hash_buf->salt;
18168
18169 /**
18170 * parse line
18171 */
18172
18173 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18174
18175 char *hash_pos = strchr (salt_pos, '$');
18176
18177 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18178
18179 uint32_t salt_len = hash_pos - salt_pos;
18180
18181 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18182
18183 hash_pos++;
18184
18185 uint32_t hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18186
18187 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18188
18189 // decode hash
18190
18191 digest[ 0] = hex_to_uint (&hash_pos[0]);
18192 digest[ 1] = hex_to_uint (&hash_pos[8]);
18193 digest[ 2] = 0;
18194 digest[ 3] = 0;
18195 digest[ 4] = 0;
18196 digest[ 5] = 0;
18197 digest[ 6] = 0;
18198 digest[ 7] = 0;
18199 digest[ 8] = 0;
18200 digest[ 9] = 0;
18201 digest[10] = 0;
18202 digest[11] = 0;
18203 digest[12] = 0;
18204 digest[13] = 0;
18205 digest[14] = 0;
18206 digest[15] = 0;
18207
18208 // decode salt
18209
18210 salt->salt_buf[0] = hex_to_uint (&salt_pos[0]);
18211 salt->salt_buf[1] = hex_to_uint (&salt_pos[8]);
18212
18213 salt->salt_iter = ROUNDS_ECRYPTFS;
18214 salt->salt_len = 8;
18215
18216 return (PARSER_OK);
18217 }
18218
18219 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18220 {
18221 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18222
18223 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18224
18225 unsigned char c19 = itoa64_to_int (input_buf[19]);
18226
18227 if (c19 & 3) return (PARSER_HASH_VALUE);
18228
18229 salt_t *salt = hash_buf->salt;
18230
18231 uint32_t *digest = (uint32_t *) hash_buf->digest;
18232
18233 // iteration count
18234
18235 salt->salt_iter = itoa64_to_int (input_buf[1])
18236 | itoa64_to_int (input_buf[2]) << 6
18237 | itoa64_to_int (input_buf[3]) << 12
18238 | itoa64_to_int (input_buf[4]) << 18;
18239
18240 // set salt
18241
18242 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18243 | itoa64_to_int (input_buf[6]) << 6
18244 | itoa64_to_int (input_buf[7]) << 12
18245 | itoa64_to_int (input_buf[8]) << 18;
18246
18247 salt->salt_len = 4;
18248
18249 char tmp_buf[100];
18250
18251 memset (tmp_buf, 0, sizeof (tmp_buf));
18252
18253 base64_decode (itoa64_to_int, input_buf + 9, 11, tmp_buf);
18254
18255 memcpy (digest, tmp_buf, 8);
18256
18257 uint tt;
18258
18259 IP (digest[0], digest[1], tt);
18260
18261 digest[0] = ROTATE_RIGHT (digest[0], 31);
18262 digest[1] = ROTATE_RIGHT (digest[1], 31);
18263 digest[2] = 0;
18264 digest[3] = 0;
18265
18266 return (PARSER_OK);
18267 }
18268
18269 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18270 {
18271 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18272
18273 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18274
18275 uint32_t *digest = (uint32_t *) hash_buf->digest;
18276
18277 salt_t *salt = hash_buf->salt;
18278
18279 /**
18280 * parse line
18281 */
18282
18283 char *type_pos = input_buf + 6 + 1;
18284
18285 char *salt_pos = strchr (type_pos, '*');
18286
18287 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18288
18289 uint32_t type_len = salt_pos - type_pos;
18290
18291 if (type_len != 1) return (PARSER_SALT_LENGTH);
18292
18293 salt_pos++;
18294
18295 char *crypted_pos = strchr (salt_pos, '*');
18296
18297 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18298
18299 uint32_t salt_len = crypted_pos - salt_pos;
18300
18301 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18302
18303 crypted_pos++;
18304
18305 uint32_t crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18306
18307 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18308
18309 /**
18310 * copy data
18311 */
18312
18313 salt->salt_buf[0] = hex_to_uint (&salt_pos[0]);
18314 salt->salt_buf[1] = hex_to_uint (&salt_pos[8]);
18315
18316 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18317 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18318
18319 salt->salt_buf[2] = hex_to_uint (&crypted_pos[ 0]);
18320 salt->salt_buf[3] = hex_to_uint (&crypted_pos[ 8]);
18321 salt->salt_buf[4] = hex_to_uint (&crypted_pos[16]);
18322 salt->salt_buf[5] = hex_to_uint (&crypted_pos[24]);
18323
18324 salt->salt_len = 24;
18325 salt->salt_iter = ROUNDS_RAR3;
18326
18327 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18328 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18329
18330 digest[0] = 0xc43d7b00;
18331 digest[1] = 0x40070000;
18332 digest[2] = 0;
18333 digest[3] = 0;
18334
18335 return (PARSER_OK);
18336 }
18337
18338 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18339 {
18340 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18341
18342 uint32_t *digest = (uint32_t *) hash_buf->digest;
18343
18344 salt_t *salt = hash_buf->salt;
18345
18346 digest[0] = hex_to_uint (&input_buf[ 0]);
18347 digest[1] = hex_to_uint (&input_buf[ 8]);
18348 digest[2] = hex_to_uint (&input_buf[16]);
18349 digest[3] = hex_to_uint (&input_buf[24]);
18350 digest[4] = hex_to_uint (&input_buf[32]);
18351 digest[5] = hex_to_uint (&input_buf[40]);
18352 digest[6] = hex_to_uint (&input_buf[48]);
18353 digest[7] = hex_to_uint (&input_buf[56]);
18354
18355 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18356
18357 uint salt_len = input_len - 64 - 1;
18358
18359 char *salt_buf = input_buf + 64 + 1;
18360
18361 char *salt_buf_ptr = (char *) salt->salt_buf;
18362
18363 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18364
18365 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18366
18367 salt->salt_len = salt_len;
18368
18369 /**
18370 * we can precompute the first sha256 transform
18371 */
18372
18373 uint w[16];
18374
18375 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18376 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18377 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18378 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18379 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18380 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18381 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18382 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18383 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18384 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18385 w[10] = byte_swap_32 (salt->salt_buf[10]);
18386 w[11] = byte_swap_32 (salt->salt_buf[11]);
18387 w[12] = byte_swap_32 (salt->salt_buf[12]);
18388 w[13] = byte_swap_32 (salt->salt_buf[13]);
18389 w[14] = byte_swap_32 (salt->salt_buf[14]);
18390 w[15] = byte_swap_32 (salt->salt_buf[15]);
18391
18392 uint pc256[8];
18393
18394 pc256[0] = SHA256M_A;
18395 pc256[1] = SHA256M_B;
18396 pc256[2] = SHA256M_C;
18397 pc256[3] = SHA256M_D;
18398 pc256[4] = SHA256M_E;
18399 pc256[5] = SHA256M_F;
18400 pc256[6] = SHA256M_G;
18401 pc256[7] = SHA256M_H;
18402
18403 sha256_64 (w, pc256);
18404
18405 salt->salt_buf_pc[0] = pc256[0];
18406 salt->salt_buf_pc[1] = pc256[1];
18407 salt->salt_buf_pc[2] = pc256[2];
18408 salt->salt_buf_pc[3] = pc256[3];
18409 salt->salt_buf_pc[4] = pc256[4];
18410 salt->salt_buf_pc[5] = pc256[5];
18411 salt->salt_buf_pc[6] = pc256[6];
18412 salt->salt_buf_pc[7] = pc256[7];
18413
18414 digest[0] -= pc256[0];
18415 digest[1] -= pc256[1];
18416 digest[2] -= pc256[2];
18417 digest[3] -= pc256[3];
18418 digest[4] -= pc256[4];
18419 digest[5] -= pc256[5];
18420 digest[6] -= pc256[6];
18421 digest[7] -= pc256[7];
18422
18423 return (PARSER_OK);
18424 }
18425
18426 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18427 {
18428 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18429
18430 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18431
18432 uint32_t *digest = (uint32_t *) hash_buf->digest;
18433
18434 salt_t *salt = hash_buf->salt;
18435
18436 /**
18437 * parse line
18438 */
18439
18440 char *data_len_pos = input_buf + 1 + 10 + 1;
18441
18442 char *data_buf_pos = strchr (data_len_pos, '$');
18443
18444 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18445
18446 uint32_t data_len_len = data_buf_pos - data_len_pos;
18447
18448 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18449 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18450
18451 data_buf_pos++;
18452
18453 uint32_t data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18454
18455 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18456
18457 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18458
18459 uint32_t data_len = atoi (data_len_pos);
18460
18461 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18462
18463 /**
18464 * salt
18465 */
18466
18467 char *salt_pos = data_buf_pos;
18468
18469 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
18470 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
18471 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]);
18472 salt->salt_buf[3] = hex_to_uint (&salt_pos[24]);
18473
18474 // this is actually the CT, which is also the hash later (if matched)
18475
18476 salt->salt_buf[4] = hex_to_uint (&salt_pos[32]);
18477 salt->salt_buf[5] = hex_to_uint (&salt_pos[40]);
18478 salt->salt_buf[6] = hex_to_uint (&salt_pos[48]);
18479 salt->salt_buf[7] = hex_to_uint (&salt_pos[56]);
18480
18481 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18482
18483 salt->salt_iter = 10 - 1;
18484
18485 /**
18486 * digest buf
18487 */
18488
18489 digest[0] = salt->salt_buf[4];
18490 digest[1] = salt->salt_buf[5];
18491 digest[2] = salt->salt_buf[6];
18492 digest[3] = salt->salt_buf[7];
18493
18494 return (PARSER_OK);
18495 }
18496
18497 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18498 {
18499 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
18500
18501 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18502
18503 uint32_t *digest = (uint32_t *) hash_buf->digest;
18504
18505 salt_t *salt = hash_buf->salt;
18506
18507 /**
18508 * parse line
18509 */
18510
18511 char *salt_pos = input_buf + 11 + 1;
18512
18513 char *iter_pos = strchr (salt_pos, ',');
18514
18515 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18516
18517 uint32_t salt_len = iter_pos - salt_pos;
18518
18519 if (salt_len != 20) return (PARSER_SALT_LENGTH);
18520
18521 iter_pos++;
18522
18523 char *hash_pos = strchr (iter_pos, ',');
18524
18525 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18526
18527 uint32_t iter_len = hash_pos - iter_pos;
18528
18529 if (iter_len > 5) return (PARSER_SALT_LENGTH);
18530
18531 hash_pos++;
18532
18533 uint32_t hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
18534
18535 if (hash_len != 64) return (PARSER_HASH_LENGTH);
18536
18537 /**
18538 * salt
18539 */
18540
18541 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
18542 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
18543 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]) & 0xffff0000;
18544 salt->salt_buf[3] = 0x00018000;
18545
18546 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18547 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18548 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
18549 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
18550
18551 salt->salt_len = salt_len / 2;
18552
18553 salt->salt_iter = atoi (iter_pos) - 1;
18554
18555 /**
18556 * digest buf
18557 */
18558
18559 digest[0] = hex_to_uint (&hash_pos[ 0]);
18560 digest[1] = hex_to_uint (&hash_pos[ 8]);
18561 digest[2] = hex_to_uint (&hash_pos[16]);
18562 digest[3] = hex_to_uint (&hash_pos[24]);
18563 digest[4] = hex_to_uint (&hash_pos[32]);
18564 digest[5] = hex_to_uint (&hash_pos[40]);
18565 digest[6] = hex_to_uint (&hash_pos[48]);
18566 digest[7] = hex_to_uint (&hash_pos[56]);
18567
18568 return (PARSER_OK);
18569 }
18570
18571 /**
18572 * parallel running threads
18573 */
18574
18575 #ifdef WIN
18576
18577 BOOL WINAPI sigHandler_default (DWORD sig)
18578 {
18579 switch (sig)
18580 {
18581 case CTRL_CLOSE_EVENT:
18582
18583 /*
18584 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
18585 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
18586 * function otherwise it is to late (e.g. after returning from this function)
18587 */
18588
18589 myabort ();
18590
18591 SetConsoleCtrlHandler (NULL, TRUE);
18592
18593 hc_sleep (10);
18594
18595 return TRUE;
18596
18597 case CTRL_C_EVENT:
18598 case CTRL_LOGOFF_EVENT:
18599 case CTRL_SHUTDOWN_EVENT:
18600
18601 myabort ();
18602
18603 SetConsoleCtrlHandler (NULL, TRUE);
18604
18605 return TRUE;
18606 }
18607
18608 return FALSE;
18609 }
18610
18611 BOOL WINAPI sigHandler_benchmark (DWORD sig)
18612 {
18613 switch (sig)
18614 {
18615 case CTRL_CLOSE_EVENT:
18616
18617 myabort ();
18618
18619 SetConsoleCtrlHandler (NULL, TRUE);
18620
18621 hc_sleep (10);
18622
18623 return TRUE;
18624
18625 case CTRL_C_EVENT:
18626 case CTRL_LOGOFF_EVENT:
18627 case CTRL_SHUTDOWN_EVENT:
18628
18629 myquit ();
18630
18631 SetConsoleCtrlHandler (NULL, TRUE);
18632
18633 return TRUE;
18634 }
18635
18636 return FALSE;
18637 }
18638
18639 void hc_signal (BOOL WINAPI (callback) (DWORD))
18640 {
18641 if (callback == NULL)
18642 {
18643 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
18644 }
18645 else
18646 {
18647 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
18648 }
18649 }
18650
18651 #else
18652
18653 void sigHandler_default (int sig)
18654 {
18655 myabort ();
18656
18657 signal (sig, NULL);
18658 }
18659
18660 void sigHandler_benchmark (int sig)
18661 {
18662 myquit ();
18663
18664 signal (sig, NULL);
18665 }
18666
18667 void hc_signal (void (callback) (int))
18668 {
18669 if (callback == NULL) callback = SIG_DFL;
18670
18671 signal (SIGINT, callback);
18672 signal (SIGTERM, callback);
18673 signal (SIGABRT, callback);
18674 }
18675
18676 #endif
18677
18678 void status_display ();
18679
18680 void *thread_keypress (void *p)
18681 {
18682 int benchmark = *((int *) p);
18683
18684 uint quiet = data.quiet;
18685
18686 tty_break();
18687
18688 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
18689 {
18690 int ch = tty_getchar();
18691
18692 if (ch == -1) break;
18693
18694 if (ch == 0) continue;
18695
18696 #ifdef _POSIX
18697 if (ch != '\n')
18698 #endif
18699
18700 hc_thread_mutex_lock (mux_display);
18701
18702 log_info ("");
18703
18704 switch (ch)
18705 {
18706 case 's':
18707 case '\n':
18708
18709 log_info ("");
18710
18711 status_display ();
18712
18713 log_info ("");
18714
18715 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18716 if (quiet == 0) fflush (stdout);
18717
18718 break;
18719
18720 case 'b':
18721
18722 log_info ("");
18723
18724 bypass ();
18725
18726 log_info ("");
18727
18728 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18729 if (quiet == 0) fflush (stdout);
18730
18731 break;
18732
18733 case 'p':
18734
18735 log_info ("");
18736
18737 SuspendThreads ();
18738
18739 log_info ("");
18740
18741 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18742 if (quiet == 0) fflush (stdout);
18743
18744 break;
18745
18746 case 'r':
18747
18748 log_info ("");
18749
18750 ResumeThreads ();
18751
18752 log_info ("");
18753
18754 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18755 if (quiet == 0) fflush (stdout);
18756
18757 break;
18758
18759 case 'c':
18760
18761 log_info ("");
18762
18763 if (benchmark == 1) break;
18764
18765 stop_at_checkpoint ();
18766
18767 log_info ("");
18768
18769 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18770 if (quiet == 0) fflush (stdout);
18771
18772 break;
18773
18774 case 'q':
18775
18776 log_info ("");
18777
18778 if (benchmark == 1)
18779 {
18780 myquit ();
18781 }
18782 else
18783 {
18784 myabort ();
18785 }
18786
18787 break;
18788 }
18789
18790 hc_thread_mutex_unlock (mux_display);
18791 }
18792
18793 tty_fix();
18794
18795 return (p);
18796 }
18797
18798 /**
18799 * rules common
18800 */
18801
18802 bool class_num (char c)
18803 {
18804 return ((c >= '0') && (c <= '9'));
18805 }
18806
18807 bool class_lower (char c)
18808 {
18809 return ((c >= 'a') && (c <= 'z'));
18810 }
18811
18812 bool class_upper (char c)
18813 {
18814 return ((c >= 'A') && (c <= 'Z'));
18815 }
18816
18817 bool class_alpha (char c)
18818 {
18819 return (class_lower (c) || class_upper (c));
18820 }
18821
18822 char conv_ctoi (char c)
18823 {
18824 if (class_num (c))
18825 {
18826 return c - '0';
18827 }
18828 else if (class_upper (c))
18829 {
18830 return c - 'A' + (char) 10;
18831 }
18832
18833 return (char) (-1);
18834 }
18835
18836 char conv_itoc (char c)
18837 {
18838 if (c < 10)
18839 {
18840 return c + '0';
18841 }
18842 else if (c < 37)
18843 {
18844 return c + 'A' - (char) 10;
18845 }
18846
18847 return (char) (-1);
18848 }
18849
18850 /**
18851 * GPU rules
18852 */
18853
18854 #define INCR_POS if (++rule_pos == rule_len) return (-1)
18855 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
18856 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
18857 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
18858 #define MAX_GPU_RULES 14
18859 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
18860 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
18861 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
18862
18863 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
18864 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
18865 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
18866 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
18867
18868 int cpu_rule_to_gpu_rule (char rule_buf[BUFSIZ], uint rule_len, gpu_rule_t *rule)
18869 {
18870 uint rule_pos;
18871 uint rule_cnt;
18872
18873 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_GPU_RULES; rule_pos++, rule_cnt++)
18874 {
18875 switch (rule_buf[rule_pos])
18876 {
18877 case ' ':
18878 rule_cnt--;
18879 break;
18880
18881 case RULE_OP_MANGLE_NOOP:
18882 SET_NAME (rule, rule_buf[rule_pos]);
18883 break;
18884
18885 case RULE_OP_MANGLE_LREST:
18886 SET_NAME (rule, rule_buf[rule_pos]);
18887 break;
18888
18889 case RULE_OP_MANGLE_UREST:
18890 SET_NAME (rule, rule_buf[rule_pos]);
18891 break;
18892
18893 case RULE_OP_MANGLE_LREST_UFIRST:
18894 SET_NAME (rule, rule_buf[rule_pos]);
18895 break;
18896
18897 case RULE_OP_MANGLE_UREST_LFIRST:
18898 SET_NAME (rule, rule_buf[rule_pos]);
18899 break;
18900
18901 case RULE_OP_MANGLE_TREST:
18902 SET_NAME (rule, rule_buf[rule_pos]);
18903 break;
18904
18905 case RULE_OP_MANGLE_TOGGLE_AT:
18906 SET_NAME (rule, rule_buf[rule_pos]);
18907 SET_P0_CONV (rule, rule_buf[rule_pos]);
18908 break;
18909
18910 case RULE_OP_MANGLE_REVERSE:
18911 SET_NAME (rule, rule_buf[rule_pos]);
18912 break;
18913
18914 case RULE_OP_MANGLE_DUPEWORD:
18915 SET_NAME (rule, rule_buf[rule_pos]);
18916 break;
18917
18918 case RULE_OP_MANGLE_DUPEWORD_TIMES:
18919 SET_NAME (rule, rule_buf[rule_pos]);
18920 SET_P0_CONV (rule, rule_buf[rule_pos]);
18921 break;
18922
18923 case RULE_OP_MANGLE_REFLECT:
18924 SET_NAME (rule, rule_buf[rule_pos]);
18925 break;
18926
18927 case RULE_OP_MANGLE_ROTATE_LEFT:
18928 SET_NAME (rule, rule_buf[rule_pos]);
18929 break;
18930
18931 case RULE_OP_MANGLE_ROTATE_RIGHT:
18932 SET_NAME (rule, rule_buf[rule_pos]);
18933 break;
18934
18935 case RULE_OP_MANGLE_APPEND:
18936 SET_NAME (rule, rule_buf[rule_pos]);
18937 SET_P0 (rule, rule_buf[rule_pos]);
18938 break;
18939
18940 case RULE_OP_MANGLE_PREPEND:
18941 SET_NAME (rule, rule_buf[rule_pos]);
18942 SET_P0 (rule, rule_buf[rule_pos]);
18943 break;
18944
18945 case RULE_OP_MANGLE_DELETE_FIRST:
18946 SET_NAME (rule, rule_buf[rule_pos]);
18947 break;
18948
18949 case RULE_OP_MANGLE_DELETE_LAST:
18950 SET_NAME (rule, rule_buf[rule_pos]);
18951 break;
18952
18953 case RULE_OP_MANGLE_DELETE_AT:
18954 SET_NAME (rule, rule_buf[rule_pos]);
18955 SET_P0_CONV (rule, rule_buf[rule_pos]);
18956 break;
18957
18958 case RULE_OP_MANGLE_EXTRACT:
18959 SET_NAME (rule, rule_buf[rule_pos]);
18960 SET_P0_CONV (rule, rule_buf[rule_pos]);
18961 SET_P1_CONV (rule, rule_buf[rule_pos]);
18962 break;
18963
18964 case RULE_OP_MANGLE_OMIT:
18965 SET_NAME (rule, rule_buf[rule_pos]);
18966 SET_P0_CONV (rule, rule_buf[rule_pos]);
18967 SET_P1_CONV (rule, rule_buf[rule_pos]);
18968 break;
18969
18970 case RULE_OP_MANGLE_INSERT:
18971 SET_NAME (rule, rule_buf[rule_pos]);
18972 SET_P0_CONV (rule, rule_buf[rule_pos]);
18973 SET_P1 (rule, rule_buf[rule_pos]);
18974 break;
18975
18976 case RULE_OP_MANGLE_OVERSTRIKE:
18977 SET_NAME (rule, rule_buf[rule_pos]);
18978 SET_P0_CONV (rule, rule_buf[rule_pos]);
18979 SET_P1 (rule, rule_buf[rule_pos]);
18980 break;
18981
18982 case RULE_OP_MANGLE_TRUNCATE_AT:
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_REPLACE:
18988 SET_NAME (rule, rule_buf[rule_pos]);
18989 SET_P0 (rule, rule_buf[rule_pos]);
18990 SET_P1 (rule, rule_buf[rule_pos]);
18991 break;
18992
18993 case RULE_OP_MANGLE_PURGECHAR:
18994 return (-1);
18995 break;
18996
18997 case RULE_OP_MANGLE_TOGGLECASE_REC:
18998 return (-1);
18999 break;
19000
19001 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19002 SET_NAME (rule, rule_buf[rule_pos]);
19003 SET_P0_CONV (rule, rule_buf[rule_pos]);
19004 break;
19005
19006 case RULE_OP_MANGLE_DUPECHAR_LAST:
19007 SET_NAME (rule, rule_buf[rule_pos]);
19008 SET_P0_CONV (rule, rule_buf[rule_pos]);
19009 break;
19010
19011 case RULE_OP_MANGLE_DUPECHAR_ALL:
19012 SET_NAME (rule, rule_buf[rule_pos]);
19013 break;
19014
19015 case RULE_OP_MANGLE_SWITCH_FIRST:
19016 SET_NAME (rule, rule_buf[rule_pos]);
19017 break;
19018
19019 case RULE_OP_MANGLE_SWITCH_LAST:
19020 SET_NAME (rule, rule_buf[rule_pos]);
19021 break;
19022
19023 case RULE_OP_MANGLE_SWITCH_AT:
19024 SET_NAME (rule, rule_buf[rule_pos]);
19025 SET_P0_CONV (rule, rule_buf[rule_pos]);
19026 SET_P1_CONV (rule, rule_buf[rule_pos]);
19027 break;
19028
19029 case RULE_OP_MANGLE_CHR_SHIFTL:
19030 SET_NAME (rule, rule_buf[rule_pos]);
19031 SET_P0_CONV (rule, rule_buf[rule_pos]);
19032 break;
19033
19034 case RULE_OP_MANGLE_CHR_SHIFTR:
19035 SET_NAME (rule, rule_buf[rule_pos]);
19036 SET_P0_CONV (rule, rule_buf[rule_pos]);
19037 break;
19038
19039 case RULE_OP_MANGLE_CHR_INCR:
19040 SET_NAME (rule, rule_buf[rule_pos]);
19041 SET_P0_CONV (rule, rule_buf[rule_pos]);
19042 break;
19043
19044 case RULE_OP_MANGLE_CHR_DECR:
19045 SET_NAME (rule, rule_buf[rule_pos]);
19046 SET_P0_CONV (rule, rule_buf[rule_pos]);
19047 break;
19048
19049 case RULE_OP_MANGLE_REPLACE_NP1:
19050 SET_NAME (rule, rule_buf[rule_pos]);
19051 SET_P0_CONV (rule, rule_buf[rule_pos]);
19052 break;
19053
19054 case RULE_OP_MANGLE_REPLACE_NM1:
19055 SET_NAME (rule, rule_buf[rule_pos]);
19056 SET_P0_CONV (rule, rule_buf[rule_pos]);
19057 break;
19058
19059 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19060 SET_NAME (rule, rule_buf[rule_pos]);
19061 SET_P0_CONV (rule, rule_buf[rule_pos]);
19062 break;
19063
19064 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19065 SET_NAME (rule, rule_buf[rule_pos]);
19066 SET_P0_CONV (rule, rule_buf[rule_pos]);
19067 break;
19068
19069 case RULE_OP_MANGLE_TITLE:
19070 SET_NAME (rule, rule_buf[rule_pos]);
19071 break;
19072
19073 default:
19074 return (-1);
19075 break;
19076 }
19077 }
19078
19079 if (rule_pos < rule_len) return (-1);
19080
19081 return (0);
19082 }
19083
19084 int gpu_rule_to_cpu_rule (char rule_buf[BUFSIZ], gpu_rule_t *rule)
19085 {
19086 uint rule_cnt;
19087 uint rule_pos;
19088 uint rule_len = BUFSIZ - 1; // maximum possible len
19089
19090 char rule_cmd;
19091
19092 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_GPU_RULES; rule_pos++, rule_cnt++)
19093 {
19094 GET_NAME (rule);
19095
19096 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19097
19098 switch (rule_cmd)
19099 {
19100 case RULE_OP_MANGLE_NOOP:
19101 rule_buf[rule_pos] = rule_cmd;
19102 break;
19103
19104 case RULE_OP_MANGLE_LREST:
19105 rule_buf[rule_pos] = rule_cmd;
19106 break;
19107
19108 case RULE_OP_MANGLE_UREST:
19109 rule_buf[rule_pos] = rule_cmd;
19110 break;
19111
19112 case RULE_OP_MANGLE_LREST_UFIRST:
19113 rule_buf[rule_pos] = rule_cmd;
19114 break;
19115
19116 case RULE_OP_MANGLE_UREST_LFIRST:
19117 rule_buf[rule_pos] = rule_cmd;
19118 break;
19119
19120 case RULE_OP_MANGLE_TREST:
19121 rule_buf[rule_pos] = rule_cmd;
19122 break;
19123
19124 case RULE_OP_MANGLE_TOGGLE_AT:
19125 rule_buf[rule_pos] = rule_cmd;
19126 GET_P0_CONV (rule);
19127 break;
19128
19129 case RULE_OP_MANGLE_REVERSE:
19130 rule_buf[rule_pos] = rule_cmd;
19131 break;
19132
19133 case RULE_OP_MANGLE_DUPEWORD:
19134 rule_buf[rule_pos] = rule_cmd;
19135 break;
19136
19137 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19138 rule_buf[rule_pos] = rule_cmd;
19139 GET_P0_CONV (rule);
19140 break;
19141
19142 case RULE_OP_MANGLE_REFLECT:
19143 rule_buf[rule_pos] = rule_cmd;
19144 break;
19145
19146 case RULE_OP_MANGLE_ROTATE_LEFT:
19147 rule_buf[rule_pos] = rule_cmd;
19148 break;
19149
19150 case RULE_OP_MANGLE_ROTATE_RIGHT:
19151 rule_buf[rule_pos] = rule_cmd;
19152 break;
19153
19154 case RULE_OP_MANGLE_APPEND:
19155 rule_buf[rule_pos] = rule_cmd;
19156 GET_P0 (rule);
19157 break;
19158
19159 case RULE_OP_MANGLE_PREPEND:
19160 rule_buf[rule_pos] = rule_cmd;
19161 GET_P0 (rule);
19162 break;
19163
19164 case RULE_OP_MANGLE_DELETE_FIRST:
19165 rule_buf[rule_pos] = rule_cmd;
19166 break;
19167
19168 case RULE_OP_MANGLE_DELETE_LAST:
19169 rule_buf[rule_pos] = rule_cmd;
19170 break;
19171
19172 case RULE_OP_MANGLE_DELETE_AT:
19173 rule_buf[rule_pos] = rule_cmd;
19174 GET_P0_CONV (rule);
19175 break;
19176
19177 case RULE_OP_MANGLE_EXTRACT:
19178 rule_buf[rule_pos] = rule_cmd;
19179 GET_P0_CONV (rule);
19180 GET_P1_CONV (rule);
19181 break;
19182
19183 case RULE_OP_MANGLE_OMIT:
19184 rule_buf[rule_pos] = rule_cmd;
19185 GET_P0_CONV (rule);
19186 GET_P1_CONV (rule);
19187 break;
19188
19189 case RULE_OP_MANGLE_INSERT:
19190 rule_buf[rule_pos] = rule_cmd;
19191 GET_P0_CONV (rule);
19192 GET_P1 (rule);
19193 break;
19194
19195 case RULE_OP_MANGLE_OVERSTRIKE:
19196 rule_buf[rule_pos] = rule_cmd;
19197 GET_P0_CONV (rule);
19198 GET_P1 (rule);
19199 break;
19200
19201 case RULE_OP_MANGLE_TRUNCATE_AT:
19202 rule_buf[rule_pos] = rule_cmd;
19203 GET_P0_CONV (rule);
19204 break;
19205
19206 case RULE_OP_MANGLE_REPLACE:
19207 rule_buf[rule_pos] = rule_cmd;
19208 GET_P0 (rule);
19209 GET_P1 (rule);
19210 break;
19211
19212 case RULE_OP_MANGLE_PURGECHAR:
19213 return (-1);
19214 break;
19215
19216 case RULE_OP_MANGLE_TOGGLECASE_REC:
19217 return (-1);
19218 break;
19219
19220 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19221 rule_buf[rule_pos] = rule_cmd;
19222 GET_P0_CONV (rule);
19223 break;
19224
19225 case RULE_OP_MANGLE_DUPECHAR_LAST:
19226 rule_buf[rule_pos] = rule_cmd;
19227 GET_P0_CONV (rule);
19228 break;
19229
19230 case RULE_OP_MANGLE_DUPECHAR_ALL:
19231 rule_buf[rule_pos] = rule_cmd;
19232 break;
19233
19234 case RULE_OP_MANGLE_SWITCH_FIRST:
19235 rule_buf[rule_pos] = rule_cmd;
19236 break;
19237
19238 case RULE_OP_MANGLE_SWITCH_LAST:
19239 rule_buf[rule_pos] = rule_cmd;
19240 break;
19241
19242 case RULE_OP_MANGLE_SWITCH_AT:
19243 rule_buf[rule_pos] = rule_cmd;
19244 GET_P0_CONV (rule);
19245 GET_P1_CONV (rule);
19246 break;
19247
19248 case RULE_OP_MANGLE_CHR_SHIFTL:
19249 rule_buf[rule_pos] = rule_cmd;
19250 GET_P0_CONV (rule);
19251 break;
19252
19253 case RULE_OP_MANGLE_CHR_SHIFTR:
19254 rule_buf[rule_pos] = rule_cmd;
19255 GET_P0_CONV (rule);
19256 break;
19257
19258 case RULE_OP_MANGLE_CHR_INCR:
19259 rule_buf[rule_pos] = rule_cmd;
19260 GET_P0_CONV (rule);
19261 break;
19262
19263 case RULE_OP_MANGLE_CHR_DECR:
19264 rule_buf[rule_pos] = rule_cmd;
19265 GET_P0_CONV (rule);
19266 break;
19267
19268 case RULE_OP_MANGLE_REPLACE_NP1:
19269 rule_buf[rule_pos] = rule_cmd;
19270 GET_P0_CONV (rule);
19271 break;
19272
19273 case RULE_OP_MANGLE_REPLACE_NM1:
19274 rule_buf[rule_pos] = rule_cmd;
19275 GET_P0_CONV (rule);
19276 break;
19277
19278 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19279 rule_buf[rule_pos] = rule_cmd;
19280 GET_P0_CONV (rule);
19281 break;
19282
19283 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19284 rule_buf[rule_pos] = rule_cmd;
19285 GET_P0_CONV (rule);
19286 break;
19287
19288 case RULE_OP_MANGLE_TITLE:
19289 rule_buf[rule_pos] = rule_cmd;
19290 break;
19291
19292 case 0:
19293 return rule_pos - 1;
19294 break;
19295
19296 default:
19297 return (-1);
19298 break;
19299 }
19300 }
19301
19302 if (rule_cnt > 0)
19303 {
19304 return rule_pos;
19305 }
19306
19307 return (-1);
19308 }
19309
19310 /**
19311 * CPU rules : this is from hashcat sources, cpu based rules
19312 */
19313
19314 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19315 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19316
19317 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19318 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19319 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19320
19321 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19322 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19323 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19324
19325 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19326 {
19327 int pos;
19328
19329 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19330
19331 return (arr_len);
19332 }
19333
19334 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19335 {
19336 int pos;
19337
19338 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19339
19340 return (arr_len);
19341 }
19342
19343 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19344 {
19345 int pos;
19346
19347 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19348
19349 return (arr_len);
19350 }
19351
19352 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19353 {
19354 int l;
19355 int r;
19356
19357 for (l = 0; l < arr_len; l++)
19358 {
19359 r = arr_len - 1 - l;
19360
19361 if (l >= r) break;
19362
19363 MANGLE_SWITCH (arr, l, r);
19364 }
19365
19366 return (arr_len);
19367 }
19368
19369 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19370 {
19371 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19372
19373 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19374
19375 return (arr_len * 2);
19376 }
19377
19378 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19379 {
19380 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19381
19382 int orig_len = arr_len;
19383
19384 int i;
19385
19386 for (i = 0; i < times; i++)
19387 {
19388 memcpy (&arr[arr_len], arr, orig_len);
19389
19390 arr_len += orig_len;
19391 }
19392
19393 return (arr_len);
19394 }
19395
19396 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19397 {
19398 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19399
19400 mangle_double (arr, arr_len);
19401
19402 mangle_reverse (arr + arr_len, arr_len);
19403
19404 return (arr_len * 2);
19405 }
19406
19407 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19408 {
19409 int l;
19410 int r;
19411
19412 for (l = 0, r = arr_len - 1; r > 0; r--)
19413 {
19414 MANGLE_SWITCH (arr, l, r);
19415 }
19416
19417 return (arr_len);
19418 }
19419
19420 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19421 {
19422 int l;
19423 int r;
19424
19425 for (l = 0, r = arr_len - 1; l < r; l++)
19426 {
19427 MANGLE_SWITCH (arr, l, r);
19428 }
19429
19430 return (arr_len);
19431 }
19432
19433 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19434 {
19435 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19436
19437 arr[arr_len] = c;
19438
19439 return (arr_len + 1);
19440 }
19441
19442 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19443 {
19444 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19445
19446 int arr_pos;
19447
19448 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19449 {
19450 arr[arr_pos + 1] = arr[arr_pos];
19451 }
19452
19453 arr[0] = c;
19454
19455 return (arr_len + 1);
19456 }
19457
19458 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19459 {
19460 if (upos >= arr_len) return (arr_len);
19461
19462 int arr_pos;
19463
19464 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
19465 {
19466 arr[arr_pos] = arr[arr_pos + 1];
19467 }
19468
19469 return (arr_len - 1);
19470 }
19471
19472 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19473 {
19474 if (upos >= arr_len) return (arr_len);
19475
19476 if ((upos + ulen) > arr_len) return (arr_len);
19477
19478 int arr_pos;
19479
19480 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
19481 {
19482 arr[arr_pos] = arr[upos + arr_pos];
19483 }
19484
19485 return (ulen);
19486 }
19487
19488 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19489 {
19490 if (upos >= arr_len) return (arr_len);
19491
19492 if ((upos + ulen) >= arr_len) return (arr_len);
19493
19494 int arr_pos;
19495
19496 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
19497 {
19498 arr[arr_pos] = arr[arr_pos + ulen];
19499 }
19500
19501 return (arr_len - ulen);
19502 }
19503
19504 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19505 {
19506 if (upos >= arr_len) return (arr_len);
19507
19508 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19509
19510 int arr_pos;
19511
19512 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
19513 {
19514 arr[arr_pos + 1] = arr[arr_pos];
19515 }
19516
19517 arr[upos] = c;
19518
19519 return (arr_len + 1);
19520 }
19521
19522 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)
19523 {
19524 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
19525
19526 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
19527
19528 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
19529
19530 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
19531
19532 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
19533
19534 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
19535
19536 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
19537
19538 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
19539
19540 return (arr_len + arr2_cpy);
19541 }
19542
19543 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19544 {
19545 if (upos >= arr_len) return (arr_len);
19546
19547 arr[upos] = c;
19548
19549 return (arr_len);
19550 }
19551
19552 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19553 {
19554 if (upos >= arr_len) return (arr_len);
19555
19556 memset (arr + upos, 0, arr_len - upos);
19557
19558 return (upos);
19559 }
19560
19561 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
19562 {
19563 int arr_pos;
19564
19565 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
19566 {
19567 if (arr[arr_pos] != oldc) continue;
19568
19569 arr[arr_pos] = newc;
19570 }
19571
19572 return (arr_len);
19573 }
19574
19575 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
19576 {
19577 int arr_pos;
19578
19579 int ret_len;
19580
19581 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
19582 {
19583 if (arr[arr_pos] == c) continue;
19584
19585 arr[ret_len] = arr[arr_pos];
19586
19587 ret_len++;
19588 }
19589
19590 return (ret_len);
19591 }
19592
19593 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
19594 {
19595 if (ulen > arr_len) return (arr_len);
19596
19597 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19598
19599 char cs[100];
19600
19601 memcpy (cs, arr, ulen);
19602
19603 int i;
19604
19605 for (i = 0; i < ulen; i++)
19606 {
19607 char c = cs[i];
19608
19609 arr_len = mangle_insert (arr, arr_len, i, c);
19610 }
19611
19612 return (arr_len);
19613 }
19614
19615 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
19616 {
19617 if (ulen > arr_len) return (arr_len);
19618
19619 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19620
19621 int upos = arr_len - ulen;
19622
19623 int i;
19624
19625 for (i = 0; i < ulen; i++)
19626 {
19627 char c = arr[upos + i];
19628
19629 arr_len = mangle_append (arr, arr_len, c);
19630 }
19631
19632 return (arr_len);
19633 }
19634
19635 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19636 {
19637 if ( arr_len == 0) return (arr_len);
19638 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19639
19640 char c = arr[upos];
19641
19642 int i;
19643
19644 for (i = 0; i < ulen; i++)
19645 {
19646 arr_len = mangle_insert (arr, arr_len, upos, c);
19647 }
19648
19649 return (arr_len);
19650 }
19651
19652 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
19653 {
19654 if ( arr_len == 0) return (arr_len);
19655 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
19656
19657 int arr_pos;
19658
19659 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19660 {
19661 int new_pos = arr_pos * 2;
19662
19663 arr[new_pos] = arr[arr_pos];
19664
19665 arr[new_pos + 1] = arr[arr_pos];
19666 }
19667
19668 return (arr_len * 2);
19669 }
19670
19671 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
19672 {
19673 if (upos >= arr_len) return (arr_len);
19674 if (upos2 >= arr_len) return (arr_len);
19675
19676 MANGLE_SWITCH (arr, upos, upos2);
19677
19678 return (arr_len);
19679 }
19680
19681 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
19682 {
19683 MANGLE_SWITCH (arr, upos, upos2);
19684
19685 return (arr_len);
19686 }
19687
19688 int mangle_chr_shiftl (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19689 {
19690 if (upos >= arr_len) return (arr_len);
19691
19692 arr[upos] <<= 1;
19693
19694 return (arr_len);
19695 }
19696
19697 int mangle_chr_shiftr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19698 {
19699 if (upos >= arr_len) return (arr_len);
19700
19701 arr[upos] >>= 1;
19702
19703 return (arr_len);
19704 }
19705
19706 int mangle_chr_incr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19707 {
19708 if (upos >= arr_len) return (arr_len);
19709
19710 arr[upos] += 1;
19711
19712 return (arr_len);
19713 }
19714
19715 int mangle_chr_decr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19716 {
19717 if (upos >= arr_len) return (arr_len);
19718
19719 arr[upos] -= 1;
19720
19721 return (arr_len);
19722 }
19723
19724 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
19725 {
19726 int upper_next = 1;
19727
19728 int pos;
19729
19730 for (pos = 0; pos < arr_len; pos++)
19731 {
19732 if (arr[pos] == ' ')
19733 {
19734 upper_next = 1;
19735
19736 continue;
19737 }
19738
19739 if (upper_next)
19740 {
19741 upper_next = 0;
19742
19743 MANGLE_UPPER_AT (arr, pos);
19744 }
19745 else
19746 {
19747 MANGLE_LOWER_AT (arr, pos);
19748 }
19749 }
19750
19751 return (arr_len);
19752 }
19753
19754 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], uint32_t rp_gen_func_min, uint32_t rp_gen_func_max)
19755 {
19756 uint32_t rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
19757
19758 uint32_t j;
19759
19760 uint32_t rule_pos = 0;
19761
19762 for (j = 0; j < rp_gen_num; j++)
19763 {
19764 uint32_t r = 0;
19765 uint32_t p1 = 0;
19766 uint32_t p2 = 0;
19767 uint32_t p3 = 0;
19768
19769 switch ((char) get_random_num (0, 9))
19770 {
19771 case 0:
19772 r = get_random_num (0, sizeof (grp_op_nop));
19773 rule_buf[rule_pos++] = grp_op_nop[r];
19774 break;
19775
19776 case 1:
19777 r = get_random_num (0, sizeof (grp_op_pos_p0));
19778 rule_buf[rule_pos++] = grp_op_pos_p0[r];
19779 p1 = get_random_num (0, sizeof (grp_pos));
19780 rule_buf[rule_pos++] = grp_pos[p1];
19781 break;
19782
19783 case 2:
19784 r = get_random_num (0, sizeof (grp_op_pos_p1));
19785 rule_buf[rule_pos++] = grp_op_pos_p1[r];
19786 p1 = get_random_num (1, 6);
19787 rule_buf[rule_pos++] = grp_pos[p1];
19788 break;
19789
19790 case 3:
19791 r = get_random_num (0, sizeof (grp_op_chr));
19792 rule_buf[rule_pos++] = grp_op_chr[r];
19793 p1 = get_random_num (0x20, 0x7e);
19794 rule_buf[rule_pos++] = (char) p1;
19795 break;
19796
19797 case 4:
19798 r = get_random_num (0, sizeof (grp_op_chr_chr));
19799 rule_buf[rule_pos++] = grp_op_chr_chr[r];
19800 p1 = get_random_num (0x20, 0x7e);
19801 rule_buf[rule_pos++] = (char) p1;
19802 p2 = get_random_num (0x20, 0x7e);
19803 while (p1 == p2)
19804 p2 = get_random_num (0x20, 0x7e);
19805 rule_buf[rule_pos++] = (char) p2;
19806 break;
19807
19808 case 5:
19809 r = get_random_num (0, sizeof (grp_op_pos_chr));
19810 rule_buf[rule_pos++] = grp_op_pos_chr[r];
19811 p1 = get_random_num (0, sizeof (grp_pos));
19812 rule_buf[rule_pos++] = grp_pos[p1];
19813 p2 = get_random_num (0x20, 0x7e);
19814 rule_buf[rule_pos++] = (char) p2;
19815 break;
19816
19817 case 6:
19818 r = get_random_num (0, sizeof (grp_op_pos_pos0));
19819 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
19820 p1 = get_random_num (0, sizeof (grp_pos));
19821 rule_buf[rule_pos++] = grp_pos[p1];
19822 p2 = get_random_num (0, sizeof (grp_pos));
19823 while (p1 == p2)
19824 p2 = get_random_num (0, sizeof (grp_pos));
19825 rule_buf[rule_pos++] = grp_pos[p2];
19826 break;
19827
19828 case 7:
19829 r = get_random_num (0, sizeof (grp_op_pos_pos1));
19830 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
19831 p1 = get_random_num (0, sizeof (grp_pos));
19832 rule_buf[rule_pos++] = grp_pos[p1];
19833 p2 = get_random_num (1, sizeof (grp_pos));
19834 while (p1 == p2)
19835 p2 = get_random_num (1, sizeof (grp_pos));
19836 rule_buf[rule_pos++] = grp_pos[p2];
19837 break;
19838
19839 case 8:
19840 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
19841 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
19842 p1 = get_random_num (0, sizeof (grp_pos));
19843 rule_buf[rule_pos++] = grp_pos[p1];
19844 p2 = get_random_num (1, sizeof (grp_pos));
19845 rule_buf[rule_pos++] = grp_pos[p1];
19846 p3 = get_random_num (0, sizeof (grp_pos));
19847 rule_buf[rule_pos++] = grp_pos[p3];
19848 break;
19849 }
19850 }
19851
19852 return (rule_pos);
19853 }
19854
19855 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
19856 {
19857 char mem[BLOCK_SIZE];
19858
19859 if (in == NULL) return (RULE_RC_REJECT_ERROR);
19860
19861 if (out == NULL) return (RULE_RC_REJECT_ERROR);
19862
19863 if (in_len < 1) return (RULE_RC_REJECT_ERROR);
19864
19865 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
19866
19867 int out_len = in_len;
19868 int mem_len = in_len;
19869
19870 memcpy (out, in, out_len);
19871
19872 int rule_pos;
19873
19874 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
19875 {
19876 int upos; int upos2;
19877 int ulen;
19878
19879 switch (rule[rule_pos])
19880 {
19881 case ' ':
19882 break;
19883
19884 case RULE_OP_MANGLE_NOOP:
19885 break;
19886
19887 case RULE_OP_MANGLE_LREST:
19888 out_len = mangle_lrest (out, out_len);
19889 break;
19890
19891 case RULE_OP_MANGLE_UREST:
19892 out_len = mangle_urest (out, out_len);
19893 break;
19894
19895 case RULE_OP_MANGLE_LREST_UFIRST:
19896 out_len = mangle_lrest (out, out_len);
19897 if (out_len) MANGLE_UPPER_AT (out, 0);
19898 break;
19899
19900 case RULE_OP_MANGLE_UREST_LFIRST:
19901 out_len = mangle_urest (out, out_len);
19902 if (out_len) MANGLE_LOWER_AT (out, 0);
19903 break;
19904
19905 case RULE_OP_MANGLE_TREST:
19906 out_len = mangle_trest (out, out_len);
19907 break;
19908
19909 case RULE_OP_MANGLE_TOGGLE_AT:
19910 NEXT_RULEPOS (rule_pos);
19911 NEXT_RPTOI (rule, rule_pos, upos);
19912 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
19913 break;
19914
19915 case RULE_OP_MANGLE_REVERSE:
19916 out_len = mangle_reverse (out, out_len);
19917 break;
19918
19919 case RULE_OP_MANGLE_DUPEWORD:
19920 out_len = mangle_double (out, out_len);
19921 break;
19922
19923 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19924 NEXT_RULEPOS (rule_pos);
19925 NEXT_RPTOI (rule, rule_pos, ulen);
19926 out_len = mangle_double_times (out, out_len, ulen);
19927 break;
19928
19929 case RULE_OP_MANGLE_REFLECT:
19930 out_len = mangle_reflect (out, out_len);
19931 break;
19932
19933 case RULE_OP_MANGLE_ROTATE_LEFT:
19934 mangle_rotate_left (out, out_len);
19935 break;
19936
19937 case RULE_OP_MANGLE_ROTATE_RIGHT:
19938 mangle_rotate_right (out, out_len);
19939 break;
19940
19941 case RULE_OP_MANGLE_APPEND:
19942 NEXT_RULEPOS (rule_pos);
19943 out_len = mangle_append (out, out_len, rule[rule_pos]);
19944 break;
19945
19946 case RULE_OP_MANGLE_PREPEND:
19947 NEXT_RULEPOS (rule_pos);
19948 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
19949 break;
19950
19951 case RULE_OP_MANGLE_DELETE_FIRST:
19952 out_len = mangle_delete_at (out, out_len, 0);
19953 break;
19954
19955 case RULE_OP_MANGLE_DELETE_LAST:
19956 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
19957 break;
19958
19959 case RULE_OP_MANGLE_DELETE_AT:
19960 NEXT_RULEPOS (rule_pos);
19961 NEXT_RPTOI (rule, rule_pos, upos);
19962 out_len = mangle_delete_at (out, out_len, upos);
19963 break;
19964
19965 case RULE_OP_MANGLE_EXTRACT:
19966 NEXT_RULEPOS (rule_pos);
19967 NEXT_RPTOI (rule, rule_pos, upos);
19968 NEXT_RULEPOS (rule_pos);
19969 NEXT_RPTOI (rule, rule_pos, ulen);
19970 out_len = mangle_extract (out, out_len, upos, ulen);
19971 break;
19972
19973 case RULE_OP_MANGLE_OMIT:
19974 NEXT_RULEPOS (rule_pos);
19975 NEXT_RPTOI (rule, rule_pos, upos);
19976 NEXT_RULEPOS (rule_pos);
19977 NEXT_RPTOI (rule, rule_pos, ulen);
19978 out_len = mangle_omit (out, out_len, upos, ulen);
19979 break;
19980
19981 case RULE_OP_MANGLE_INSERT:
19982 NEXT_RULEPOS (rule_pos);
19983 NEXT_RPTOI (rule, rule_pos, upos);
19984 NEXT_RULEPOS (rule_pos);
19985 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
19986 break;
19987
19988 case RULE_OP_MANGLE_OVERSTRIKE:
19989 NEXT_RULEPOS (rule_pos);
19990 NEXT_RPTOI (rule, rule_pos, upos);
19991 NEXT_RULEPOS (rule_pos);
19992 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
19993 break;
19994
19995 case RULE_OP_MANGLE_TRUNCATE_AT:
19996 NEXT_RULEPOS (rule_pos);
19997 NEXT_RPTOI (rule, rule_pos, upos);
19998 out_len = mangle_truncate_at (out, out_len, upos);
19999 break;
20000
20001 case RULE_OP_MANGLE_REPLACE:
20002 NEXT_RULEPOS (rule_pos);
20003 NEXT_RULEPOS (rule_pos);
20004 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
20005 break;
20006
20007 case RULE_OP_MANGLE_PURGECHAR:
20008 NEXT_RULEPOS (rule_pos);
20009 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
20010 break;
20011
20012 case RULE_OP_MANGLE_TOGGLECASE_REC:
20013 /* todo */
20014 break;
20015
20016 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20017 NEXT_RULEPOS (rule_pos);
20018 NEXT_RPTOI (rule, rule_pos, ulen);
20019 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
20020 break;
20021
20022 case RULE_OP_MANGLE_DUPECHAR_LAST:
20023 NEXT_RULEPOS (rule_pos);
20024 NEXT_RPTOI (rule, rule_pos, ulen);
20025 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
20026 break;
20027
20028 case RULE_OP_MANGLE_DUPECHAR_ALL:
20029 out_len = mangle_dupechar (out, out_len);
20030 break;
20031
20032 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20033 NEXT_RULEPOS (rule_pos);
20034 NEXT_RPTOI (rule, rule_pos, ulen);
20035 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20036 break;
20037
20038 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20039 NEXT_RULEPOS (rule_pos);
20040 NEXT_RPTOI (rule, rule_pos, ulen);
20041 out_len = mangle_dupeblock_append (out, out_len, ulen);
20042 break;
20043
20044 case RULE_OP_MANGLE_SWITCH_FIRST:
20045 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20046 break;
20047
20048 case RULE_OP_MANGLE_SWITCH_LAST:
20049 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20050 break;
20051
20052 case RULE_OP_MANGLE_SWITCH_AT:
20053 NEXT_RULEPOS (rule_pos);
20054 NEXT_RPTOI (rule, rule_pos, upos);
20055 NEXT_RULEPOS (rule_pos);
20056 NEXT_RPTOI (rule, rule_pos, upos2);
20057 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20058 break;
20059
20060 case RULE_OP_MANGLE_CHR_SHIFTL:
20061 NEXT_RULEPOS (rule_pos);
20062 NEXT_RPTOI (rule, rule_pos, upos);
20063 mangle_chr_shiftl ((uint8_t *) out, out_len, upos);
20064 break;
20065
20066 case RULE_OP_MANGLE_CHR_SHIFTR:
20067 NEXT_RULEPOS (rule_pos);
20068 NEXT_RPTOI (rule, rule_pos, upos);
20069 mangle_chr_shiftr ((uint8_t *) out, out_len, upos);
20070 break;
20071
20072 case RULE_OP_MANGLE_CHR_INCR:
20073 NEXT_RULEPOS (rule_pos);
20074 NEXT_RPTOI (rule, rule_pos, upos);
20075 mangle_chr_incr ((uint8_t *) out, out_len, upos);
20076 break;
20077
20078 case RULE_OP_MANGLE_CHR_DECR:
20079 NEXT_RULEPOS (rule_pos);
20080 NEXT_RPTOI (rule, rule_pos, upos);
20081 mangle_chr_decr ((uint8_t *) out, out_len, upos);
20082 break;
20083
20084 case RULE_OP_MANGLE_REPLACE_NP1:
20085 NEXT_RULEPOS (rule_pos);
20086 NEXT_RPTOI (rule, rule_pos, upos);
20087 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20088 break;
20089
20090 case RULE_OP_MANGLE_REPLACE_NM1:
20091 NEXT_RULEPOS (rule_pos);
20092 NEXT_RPTOI (rule, rule_pos, upos);
20093 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20094 break;
20095
20096 case RULE_OP_MANGLE_TITLE:
20097 out_len = mangle_title (out, out_len);
20098 break;
20099
20100 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20101 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20102 NEXT_RULEPOS (rule_pos);
20103 NEXT_RPTOI (rule, rule_pos, upos);
20104 NEXT_RULEPOS (rule_pos);
20105 NEXT_RPTOI (rule, rule_pos, ulen);
20106 NEXT_RULEPOS (rule_pos);
20107 NEXT_RPTOI (rule, rule_pos, upos2);
20108 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20109 break;
20110
20111 case RULE_OP_MANGLE_APPEND_MEMORY:
20112 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20113 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20114 memcpy (out + out_len, mem, mem_len);
20115 out_len += mem_len;
20116 break;
20117
20118 case RULE_OP_MANGLE_PREPEND_MEMORY:
20119 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20120 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20121 memcpy (mem + mem_len, out, out_len);
20122 out_len += mem_len;
20123 memcpy (out, mem, out_len);
20124 break;
20125
20126 case RULE_OP_MEMORIZE_WORD:
20127 memcpy (mem, out, out_len);
20128 mem_len = out_len;
20129 break;
20130
20131 case RULE_OP_REJECT_LESS:
20132 NEXT_RULEPOS (rule_pos);
20133 NEXT_RPTOI (rule, rule_pos, upos);
20134 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20135 break;
20136
20137 case RULE_OP_REJECT_GREATER:
20138 NEXT_RULEPOS (rule_pos);
20139 NEXT_RPTOI (rule, rule_pos, upos);
20140 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20141 break;
20142
20143 case RULE_OP_REJECT_CONTAIN:
20144 NEXT_RULEPOS (rule_pos);
20145 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20146 break;
20147
20148 case RULE_OP_REJECT_NOT_CONTAIN:
20149 NEXT_RULEPOS (rule_pos);
20150 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20151 break;
20152
20153 case RULE_OP_REJECT_EQUAL_FIRST:
20154 NEXT_RULEPOS (rule_pos);
20155 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20156 break;
20157
20158 case RULE_OP_REJECT_EQUAL_LAST:
20159 NEXT_RULEPOS (rule_pos);
20160 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20161 break;
20162
20163 case RULE_OP_REJECT_EQUAL_AT:
20164 NEXT_RULEPOS (rule_pos);
20165 NEXT_RPTOI (rule, rule_pos, upos);
20166 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20167 NEXT_RULEPOS (rule_pos);
20168 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20169 break;
20170
20171 case RULE_OP_REJECT_CONTAINS:
20172 NEXT_RULEPOS (rule_pos);
20173 NEXT_RPTOI (rule, rule_pos, upos);
20174 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20175 NEXT_RULEPOS (rule_pos);
20176 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20177 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20178 break;
20179
20180 case RULE_OP_REJECT_MEMORY:
20181 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20182 break;
20183
20184 default:
20185 return (RULE_RC_SYNTAX_ERROR);
20186 break;
20187 }
20188 }
20189
20190 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20191
20192 return (out_len);
20193 }