265357abd10112793f80f95f2c85c968814f8acd
[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 *install_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", install_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_install_dir (const char *progname)
4076 {
4077 char *install_dir = mystrdup (progname);
4078 char *last_slash = NULL;
4079
4080 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4081 {
4082 *last_slash = 0;
4083 }
4084 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4085 {
4086 *last_slash = 0;
4087 }
4088 else
4089 {
4090 install_dir[0] = '.';
4091 install_dir[1] = 0;
4092 }
4093
4094 return (install_dir);
4095 }
4096
4097 char *get_profile_dir (const char *homedir)
4098 {
4099 #define DOT_HASHCAT ".hashcat"
4100
4101 char *profile_dir = (char *) mymalloc (strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1);
4102
4103 sprintf (profile_dir, "%s/%s", homedir, DOT_HASHCAT);
4104
4105 return profile_dir;
4106 }
4107
4108 char *get_session_dir (const char *profile_dir, const char *session)
4109 {
4110 char *session_dir = (char *) mymalloc (strlen (profile_dir) + 1 + strlen (session) + 1);
4111
4112 sprintf (session_dir, "%s/%s", profile_dir, session);
4113
4114 return session_dir;
4115 }
4116
4117 void truecrypt_crc32 (char *file, unsigned char keytab[64])
4118 {
4119 uint crc = ~0;
4120
4121 FILE *fd = fopen (file, "rb");
4122
4123 if (fd == NULL)
4124 {
4125 log_error ("%s: %s", file, strerror (errno));
4126
4127 exit (-1);
4128 }
4129
4130 #define MAX_KEY_SIZE (1024 * 1024)
4131
4132 char *buf = (char *) mymalloc (MAX_KEY_SIZE);
4133
4134 int nread = fread (buf, 1, MAX_KEY_SIZE, fd);
4135
4136 int kpos = 0;
4137
4138 for (int fpos = 0; fpos < nread; fpos++)
4139 {
4140 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4141
4142 keytab[kpos++] += (crc >> 24) & 0xff;
4143 keytab[kpos++] += (crc >> 16) & 0xff;
4144 keytab[kpos++] += (crc >> 8) & 0xff;
4145 keytab[kpos++] += (crc >> 0) & 0xff;
4146
4147 if (kpos >= 64) kpos = 0;
4148 }
4149
4150 myfree (buf);
4151
4152 fclose(fd);
4153 }
4154
4155 void set_cpu_affinity (char *cpu_affinity)
4156 {
4157 #ifdef WIN
4158 DWORD_PTR aff_mask = 0;
4159 #endif
4160
4161 #ifdef LINUX
4162 cpu_set_t cpuset;
4163
4164 CPU_ZERO (&cpuset);
4165 #endif
4166
4167 if (cpu_affinity)
4168 {
4169 char *devices = strdup (cpu_affinity);
4170
4171 char *next = strtok (devices, ",");
4172
4173 do
4174 {
4175 uint cpu_id = atoi (next);
4176
4177 if (cpu_id == 0)
4178 {
4179 #ifdef WIN
4180 aff_mask = 0;
4181 #endif
4182
4183 #ifdef LINUX
4184 CPU_ZERO (&cpuset);
4185 #endif
4186
4187 break;
4188 }
4189
4190 if (cpu_id > 32)
4191 {
4192 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4193
4194 exit (-1);
4195 }
4196
4197 #ifdef WIN
4198 aff_mask |= 1 << (cpu_id - 1);
4199 #endif
4200
4201 #ifdef LINUX
4202 CPU_SET ((cpu_id - 1), &cpuset);
4203 #endif
4204
4205 } while ((next = strtok (NULL, ",")) != NULL);
4206
4207 free (devices);
4208 }
4209
4210 #ifdef WIN
4211 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4212 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4213 #endif
4214
4215 #ifdef LINUX
4216 pthread_t thread = pthread_self ();
4217 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4218 #endif
4219 }
4220
4221 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4222 {
4223 char *element, *end;
4224
4225 end = (char *) base + nmemb * size;
4226
4227 for (element = (char *) base; element < end; element += size)
4228 if (!compar (element, key))
4229 return element;
4230
4231 return NULL;
4232 }
4233
4234 int sort_by_salt (const void *v1, const void *v2)
4235 {
4236 const salt_t *s1 = (const salt_t *) v1;
4237 const salt_t *s2 = (const salt_t *) v2;
4238
4239 const int res1 = s1->salt_len - s2->salt_len;
4240
4241 if (res1 != 0) return (res1);
4242
4243 const int res2 = s1->salt_iter - s2->salt_iter;
4244
4245 if (res2 != 0) return (res2);
4246
4247 uint n;
4248
4249 n = 12;
4250
4251 while (n--)
4252 {
4253 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4254 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4255 }
4256
4257 n = 8;
4258
4259 while (n--)
4260 {
4261 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4262 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4263 }
4264
4265 return (0);
4266 }
4267
4268 int sort_by_salt_buf (const void *v1, const void *v2)
4269 {
4270 const pot_t *p1 = (const pot_t *) v1;
4271 const pot_t *p2 = (const pot_t *) v2;
4272
4273 const hash_t *h1 = &p1->hash;
4274 const hash_t *h2 = &p2->hash;
4275
4276 const salt_t *s1 = h1->salt;
4277 const salt_t *s2 = h2->salt;
4278
4279 uint n = 12;
4280
4281 while (n--)
4282 {
4283 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4284 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4285 }
4286
4287 return 0;
4288 }
4289
4290 int sort_by_hash_t_salt (const void *v1, const void *v2)
4291 {
4292 const hash_t *h1 = (const hash_t *) v1;
4293 const hash_t *h2 = (const hash_t *) v2;
4294
4295 const salt_t *s1 = h1->salt;
4296 const salt_t *s2 = h2->salt;
4297
4298 // testphase: this should work
4299 uint n = 12;
4300
4301 while (n--)
4302 {
4303 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4304 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4305 }
4306
4307 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4308 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4309 if (s1->salt_len > s2->salt_len) return ( 1);
4310 if (s1->salt_len < s2->salt_len) return (-1);
4311
4312 uint n = s1->salt_len;
4313
4314 while (n--)
4315 {
4316 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4317 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4318 }
4319 */
4320
4321 return 0;
4322 }
4323
4324 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4325 {
4326 const hash_t *h1 = (const hash_t *) v1;
4327 const hash_t *h2 = (const hash_t *) v2;
4328
4329 const salt_t *s1 = h1->salt;
4330 const salt_t *s2 = h2->salt;
4331
4332 // 12 - 2 (since last 2 uints contain the digest)
4333 uint n = 10;
4334
4335 while (n--)
4336 {
4337 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4338 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4339 }
4340
4341 return 0;
4342 }
4343
4344 int sort_by_hash_no_salt (const void *v1, const void *v2)
4345 {
4346 const hash_t *h1 = (const hash_t *) v1;
4347 const hash_t *h2 = (const hash_t *) v2;
4348
4349 const void *d1 = h1->digest;
4350 const void *d2 = h2->digest;
4351
4352 return data.sort_by_digest (d1, d2);
4353 }
4354
4355 int sort_by_hash (const void *v1, const void *v2)
4356 {
4357 const hash_t *h1 = (const hash_t *) v1;
4358 const hash_t *h2 = (const hash_t *) v2;
4359
4360 if (data.isSalted)
4361 {
4362 const salt_t *s1 = h1->salt;
4363 const salt_t *s2 = h2->salt;
4364
4365 int res = sort_by_salt (s1, s2);
4366
4367 if (res != 0) return (res);
4368 }
4369
4370 const void *d1 = h1->digest;
4371 const void *d2 = h2->digest;
4372
4373 return data.sort_by_digest (d1, d2);
4374 }
4375
4376 int sort_by_pot (const void *v1, const void *v2)
4377 {
4378 const pot_t *p1 = (const pot_t *) v1;
4379 const pot_t *p2 = (const pot_t *) v2;
4380
4381 const hash_t *h1 = &p1->hash;
4382 const hash_t *h2 = &p2->hash;
4383
4384 return sort_by_hash (h1, h2);
4385 }
4386
4387 int sort_by_mtime (const void *p1, const void *p2)
4388 {
4389 const char **f1 = (const char **) p1;
4390 const char **f2 = (const char **) p2;
4391
4392 struct stat s1; stat (*f1, &s1);
4393 struct stat s2; stat (*f2, &s2);
4394
4395 return s2.st_mtime - s1.st_mtime;
4396 }
4397
4398 int sort_by_cpu_rule (const void *p1, const void *p2)
4399 {
4400 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4401 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4402
4403 return memcmp (r1, r2, sizeof (cpu_rule_t));
4404 }
4405
4406 int sort_by_gpu_rule (const void *p1, const void *p2)
4407 {
4408 const gpu_rule_t *r1 = (const gpu_rule_t *) p1;
4409 const gpu_rule_t *r2 = (const gpu_rule_t *) p2;
4410
4411 return memcmp (r1, r2, sizeof (gpu_rule_t));
4412 }
4413
4414 int sort_by_stringptr (const void *p1, const void *p2)
4415 {
4416 const char **s1 = (const char **) p1;
4417 const char **s2 = (const char **) p2;
4418
4419 return strcmp (*s1, *s2);
4420 }
4421
4422 int sort_by_dictstat (const void *s1, const void *s2)
4423 {
4424 dictstat_t *d1 = (dictstat_t *) s1;
4425 dictstat_t *d2 = (dictstat_t *) s2;
4426
4427 #ifdef _POSIX
4428 d2->stat.st_atim = d1->stat.st_atim;
4429 #else
4430 d2->stat.st_atime = d1->stat.st_atime;
4431 #endif
4432
4433 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4434 }
4435
4436 int sort_by_bitmap (const void *p1, const void *p2)
4437 {
4438 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4439 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4440
4441 return b1->collisions - b2->collisions;
4442 }
4443
4444 int sort_by_digest_4_2 (const void *v1, const void *v2)
4445 {
4446 const uint32_t *d1 = (const uint32_t *) v1;
4447 const uint32_t *d2 = (const uint32_t *) v2;
4448
4449 uint n = 2;
4450
4451 while (n--)
4452 {
4453 if (d1[n] > d2[n]) return ( 1);
4454 if (d1[n] < d2[n]) return (-1);
4455 }
4456
4457 return (0);
4458 }
4459
4460 int sort_by_digest_4_4 (const void *v1, const void *v2)
4461 {
4462 const uint32_t *d1 = (const uint32_t *) v1;
4463 const uint32_t *d2 = (const uint32_t *) v2;
4464
4465 uint n = 4;
4466
4467 while (n--)
4468 {
4469 if (d1[n] > d2[n]) return ( 1);
4470 if (d1[n] < d2[n]) return (-1);
4471 }
4472
4473 return (0);
4474 }
4475
4476 int sort_by_digest_4_5 (const void *v1, const void *v2)
4477 {
4478 const uint32_t *d1 = (const uint32_t *) v1;
4479 const uint32_t *d2 = (const uint32_t *) v2;
4480
4481 uint n = 5;
4482
4483 while (n--)
4484 {
4485 if (d1[n] > d2[n]) return ( 1);
4486 if (d1[n] < d2[n]) return (-1);
4487 }
4488
4489 return (0);
4490 }
4491
4492 int sort_by_digest_4_6 (const void *v1, const void *v2)
4493 {
4494 const uint32_t *d1 = (const uint32_t *) v1;
4495 const uint32_t *d2 = (const uint32_t *) v2;
4496
4497 uint n = 6;
4498
4499 while (n--)
4500 {
4501 if (d1[n] > d2[n]) return ( 1);
4502 if (d1[n] < d2[n]) return (-1);
4503 }
4504
4505 return (0);
4506 }
4507
4508 int sort_by_digest_4_8 (const void *v1, const void *v2)
4509 {
4510 const uint32_t *d1 = (const uint32_t *) v1;
4511 const uint32_t *d2 = (const uint32_t *) v2;
4512
4513 uint n = 8;
4514
4515 while (n--)
4516 {
4517 if (d1[n] > d2[n]) return ( 1);
4518 if (d1[n] < d2[n]) return (-1);
4519 }
4520
4521 return (0);
4522 }
4523
4524 int sort_by_digest_4_16 (const void *v1, const void *v2)
4525 {
4526 const uint32_t *d1 = (const uint32_t *) v1;
4527 const uint32_t *d2 = (const uint32_t *) v2;
4528
4529 uint n = 16;
4530
4531 while (n--)
4532 {
4533 if (d1[n] > d2[n]) return ( 1);
4534 if (d1[n] < d2[n]) return (-1);
4535 }
4536
4537 return (0);
4538 }
4539
4540 int sort_by_digest_4_32 (const void *v1, const void *v2)
4541 {
4542 const uint32_t *d1 = (const uint32_t *) v1;
4543 const uint32_t *d2 = (const uint32_t *) v2;
4544
4545 uint n = 32;
4546
4547 while (n--)
4548 {
4549 if (d1[n] > d2[n]) return ( 1);
4550 if (d1[n] < d2[n]) return (-1);
4551 }
4552
4553 return (0);
4554 }
4555
4556 int sort_by_digest_4_64 (const void *v1, const void *v2)
4557 {
4558 const uint32_t *d1 = (const uint32_t *) v1;
4559 const uint32_t *d2 = (const uint32_t *) v2;
4560
4561 uint n = 64;
4562
4563 while (n--)
4564 {
4565 if (d1[n] > d2[n]) return ( 1);
4566 if (d1[n] < d2[n]) return (-1);
4567 }
4568
4569 return (0);
4570 }
4571
4572 int sort_by_digest_8_8 (const void *v1, const void *v2)
4573 {
4574 const uint64_t *d1 = (const uint64_t *) v1;
4575 const uint64_t *d2 = (const uint64_t *) v2;
4576
4577 uint n = 8;
4578
4579 while (n--)
4580 {
4581 if (d1[n] > d2[n]) return ( 1);
4582 if (d1[n] < d2[n]) return (-1);
4583 }
4584
4585 return (0);
4586 }
4587
4588 int sort_by_digest_8_16 (const void *v1, const void *v2)
4589 {
4590 const uint64_t *d1 = (const uint64_t *) v1;
4591 const uint64_t *d2 = (const uint64_t *) v2;
4592
4593 uint n = 16;
4594
4595 while (n--)
4596 {
4597 if (d1[n] > d2[n]) return ( 1);
4598 if (d1[n] < d2[n]) return (-1);
4599 }
4600
4601 return (0);
4602 }
4603
4604 int sort_by_digest_8_25 (const void *v1, const void *v2)
4605 {
4606 const uint64_t *d1 = (const uint64_t *) v1;
4607 const uint64_t *d2 = (const uint64_t *) v2;
4608
4609 uint n = 25;
4610
4611 while (n--)
4612 {
4613 if (d1[n] > d2[n]) return ( 1);
4614 if (d1[n] < d2[n]) return (-1);
4615 }
4616
4617 return (0);
4618 }
4619
4620 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4621 {
4622 const uint32_t *d1 = (const uint32_t *) v1;
4623 const uint32_t *d2 = (const uint32_t *) v2;
4624
4625 const uint dgst_pos0 = data.dgst_pos0;
4626 const uint dgst_pos1 = data.dgst_pos1;
4627 const uint dgst_pos2 = data.dgst_pos2;
4628 const uint dgst_pos3 = data.dgst_pos3;
4629
4630 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4631 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4632 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4633 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4634 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4635 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4636 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4637 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4638
4639 return (0);
4640 }
4641
4642 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)
4643 {
4644 uint outfile_autohex = data.outfile_autohex;
4645
4646 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4647
4648 FILE *debug_fp = NULL;
4649
4650 if (debug_file != NULL)
4651 {
4652 debug_fp = fopen (debug_file, "ab");
4653 }
4654 else
4655 {
4656 debug_fp = stderr;
4657 }
4658
4659 if (debug_fp == NULL)
4660 {
4661 log_info ("WARNING: Could not open debug-file for writing");
4662 }
4663 else
4664 {
4665 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4666 {
4667 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4668
4669 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4670 }
4671
4672 fwrite (rule_ptr, rule_len, 1, debug_fp);
4673
4674 if (debug_mode == 4)
4675 {
4676 fputc (':', debug_fp);
4677
4678 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4679 }
4680
4681 fputc ('\n', debug_fp);
4682
4683 if (debug_file != NULL) fclose (debug_fp);
4684 }
4685 }
4686
4687 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4688 {
4689 int needs_hexify = 0;
4690
4691 if (outfile_autohex == 1)
4692 {
4693 for (uint i = 0; i < plain_len; i++)
4694 {
4695 if (plain_ptr[i] < 0x20)
4696 {
4697 needs_hexify = 1;
4698
4699 break;
4700 }
4701
4702 if (plain_ptr[i] > 0x7f)
4703 {
4704 needs_hexify = 1;
4705
4706 break;
4707 }
4708 }
4709 }
4710
4711 if (needs_hexify == 1)
4712 {
4713 fprintf (fp, "$HEX[");
4714
4715 for (uint i = 0; i < plain_len; i++)
4716 {
4717 fprintf (fp, "%02x", plain_ptr[i]);
4718 }
4719
4720 fprintf (fp, "]");
4721 }
4722 else
4723 {
4724 fwrite (plain_ptr, plain_len, 1, fp);
4725 }
4726 }
4727
4728 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)
4729 {
4730 uint outfile_format = data.outfile_format;
4731
4732 char separator = data.separator;
4733
4734 if (outfile_format & OUTFILE_FMT_HASH)
4735 {
4736 fprintf (out_fp, "%s", out_buf);
4737
4738 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4739 {
4740 fputc (separator, out_fp);
4741 }
4742 }
4743 else if (data.username)
4744 {
4745 if (username != NULL)
4746 {
4747 for (uint i = 0; i < user_len; i++)
4748 {
4749 fprintf (out_fp, "%c", username[i]);
4750 }
4751
4752 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4753 {
4754 fputc (separator, out_fp);
4755 }
4756 }
4757 }
4758
4759 if (outfile_format & OUTFILE_FMT_PLAIN)
4760 {
4761 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4762
4763 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4764 {
4765 fputc (separator, out_fp);
4766 }
4767 }
4768
4769 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4770 {
4771 for (uint i = 0; i < plain_len; i++)
4772 {
4773 fprintf (out_fp, "%02x", plain_ptr[i]);
4774 }
4775
4776 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4777 {
4778 fputc (separator, out_fp);
4779 }
4780 }
4781
4782 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4783 {
4784 #ifdef _WIN
4785 __mingw_fprintf (out_fp, "%llu", crackpos);
4786 #endif
4787
4788 #ifdef _POSIX
4789 #ifdef __x86_64__
4790 fprintf (out_fp, "%lu", crackpos);
4791 #else
4792 fprintf (out_fp, "%llu", crackpos);
4793 #endif
4794 #endif
4795 }
4796
4797 fputc ('\n', out_fp);
4798 }
4799
4800 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)
4801 {
4802 pot_t pot_key;
4803
4804 pot_key.hash.salt = hashes_buf->salt;
4805 pot_key.hash.digest = hashes_buf->digest;
4806
4807 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4808
4809 if (pot_ptr)
4810 {
4811 log_info_nn ("");
4812
4813 input_buf[input_len] = 0;
4814
4815 // user
4816 unsigned char *username = NULL;
4817 uint user_len = 0;
4818
4819 if (data.username)
4820 {
4821 user_t *user = hashes_buf->hash_info->user;
4822
4823 if (user)
4824 {
4825 username = (unsigned char *) (user->user_name);
4826
4827 user_len = user->user_len;
4828 }
4829 }
4830
4831 // do output the line
4832 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
4833 }
4834 }
4835
4836 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
4837 #define LM_MASKED_PLAIN "[notfound]"
4838
4839 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)
4840 {
4841 // left
4842
4843 pot_t pot_left_key;
4844
4845 pot_left_key.hash.salt = hash_left->salt;
4846 pot_left_key.hash.digest = hash_left->digest;
4847
4848 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4849
4850 // right
4851
4852 uint weak_hash_found = 0;
4853
4854 pot_t pot_right_key;
4855
4856 pot_right_key.hash.salt = hash_right->salt;
4857 pot_right_key.hash.digest = hash_right->digest;
4858
4859 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4860
4861 if (pot_right_ptr == NULL)
4862 {
4863 // special case, if "weak hash"
4864
4865 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
4866 {
4867 weak_hash_found = 1;
4868
4869 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4870
4871 // in theory this is not needed, but we are paranoia:
4872
4873 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4874 pot_right_ptr->plain_len = 0;
4875 }
4876 }
4877
4878 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
4879 {
4880 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
4881
4882 return;
4883 }
4884
4885 // at least one half was found:
4886
4887 log_info_nn ("");
4888
4889 input_buf[input_len] = 0;
4890
4891 // user
4892
4893 unsigned char *username = NULL;
4894 uint user_len = 0;
4895
4896 if (data.username)
4897 {
4898 user_t *user = hash_left->hash_info->user;
4899
4900 if (user)
4901 {
4902 username = (unsigned char *) (user->user_name);
4903
4904 user_len = user->user_len;
4905 }
4906 }
4907
4908 // mask the part which was not found
4909
4910 uint left_part_masked = 0;
4911 uint right_part_masked = 0;
4912
4913 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
4914
4915 if (pot_left_ptr == NULL)
4916 {
4917 left_part_masked = 1;
4918
4919 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4920
4921 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
4922
4923 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
4924 pot_left_ptr->plain_len = mask_plain_len;
4925 }
4926
4927 if (pot_right_ptr == NULL)
4928 {
4929 right_part_masked = 1;
4930
4931 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4932
4933 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4934
4935 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
4936 pot_right_ptr->plain_len = mask_plain_len;
4937 }
4938
4939 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
4940
4941 pot_t pot_ptr;
4942
4943 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
4944
4945 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
4946
4947 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
4948
4949 // do output the line
4950
4951 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
4952
4953 if (weak_hash_found == 1) myfree (pot_right_ptr);
4954
4955 if (left_part_masked == 1) myfree (pot_left_ptr);
4956 if (right_part_masked == 1) myfree (pot_right_ptr);
4957 }
4958
4959 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)
4960 {
4961 pot_t pot_key;
4962
4963 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
4964
4965 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4966
4967 if (pot_ptr == NULL)
4968 {
4969 log_info_nn ("");
4970
4971 input_buf[input_len] = 0;
4972
4973 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
4974 }
4975 }
4976
4977 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)
4978 {
4979 // left
4980
4981 pot_t pot_left_key;
4982
4983 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
4984
4985 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4986
4987 // right
4988
4989 pot_t pot_right_key;
4990
4991 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
4992
4993 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4994
4995 uint weak_hash_found = 0;
4996
4997 if (pot_right_ptr == NULL)
4998 {
4999 // special case, if "weak hash"
5000
5001 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5002 {
5003 weak_hash_found = 1;
5004
5005 // we just need that pot_right_ptr is not a NULL pointer
5006
5007 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5008 }
5009 }
5010
5011 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5012 {
5013 if (weak_hash_found == 1) myfree (pot_right_ptr);
5014
5015 return;
5016 }
5017
5018 // ... at least one part was not cracked
5019
5020 log_info_nn ("");
5021
5022 input_buf[input_len] = 0;
5023
5024 // only show the hash part which is still not cracked
5025
5026 uint user_len = input_len - 32;
5027
5028 char hash_output[user_len + 33];
5029
5030 memset (hash_output, 0, sizeof (hash_output));
5031
5032 memcpy (hash_output, input_buf, input_len);
5033
5034 if (pot_left_ptr != NULL)
5035 {
5036 // only show right part (because left part was already found)
5037
5038 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5039
5040 hash_output[user_len + 16] = 0;
5041 }
5042
5043 if (pot_right_ptr != NULL)
5044 {
5045 // only show left part (because right part was already found)
5046
5047 memcpy (hash_output + user_len, input_buf + user_len, 16);
5048
5049 hash_output[user_len + 16] = 0;
5050 }
5051
5052 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5053
5054 if (weak_hash_found == 1) myfree (pot_right_ptr);
5055 }
5056
5057 uint devices_to_devicemask (char *gpu_devices)
5058 {
5059 uint gpu_devicemask = 0;
5060
5061 if (gpu_devices)
5062 {
5063 char *devices = strdup (gpu_devices);
5064
5065 char *next = strtok (devices, ",");
5066
5067 do
5068 {
5069 uint gpu_id = atoi (next);
5070
5071 if (gpu_id < 1 || gpu_id > 8)
5072 {
5073 log_error ("ERROR: invalid gpu_id %u specified", gpu_id);
5074
5075 exit (-1);
5076 }
5077
5078 gpu_devicemask |= 1 << (gpu_id - 1);
5079
5080 } while ((next = strtok (NULL, ",")) != NULL);
5081
5082 free (devices);
5083 }
5084
5085 return gpu_devicemask;
5086 }
5087
5088 uint get_random_num (uint min, uint max)
5089 {
5090 if (min == max) return (min);
5091
5092 return (uint) ((rand () % (max - min)) + min);
5093 }
5094
5095 uint32_t mydivc32 (const uint32_t dividend, const uint32_t divisor)
5096 {
5097 uint32_t quotient = dividend / divisor;
5098
5099 if (dividend % divisor) quotient++;
5100
5101 return quotient;
5102 }
5103
5104 uint64_t mydivc64 (const uint64_t dividend, const uint64_t divisor)
5105 {
5106 uint64_t quotient = dividend / divisor;
5107
5108 if (dividend % divisor) quotient++;
5109
5110 return quotient;
5111 }
5112
5113 void format_timer_display (struct tm *tm, char *buf, size_t len)
5114 {
5115 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5116 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5117
5118 if (tm->tm_year - 70)
5119 {
5120 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5121 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5122
5123 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5124 }
5125 else if (tm->tm_yday)
5126 {
5127 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5128 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5129
5130 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5131 }
5132 else if (tm->tm_hour)
5133 {
5134 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5135 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5136
5137 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5138 }
5139 else if (tm->tm_min)
5140 {
5141 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5142 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5143
5144 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5145 }
5146 else
5147 {
5148 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5149
5150 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5151 }
5152 }
5153
5154 void format_speed_display (float val, char *buf, size_t len)
5155 {
5156 if (val <= 0)
5157 {
5158 buf[0] = '0';
5159 buf[1] = ' ';
5160 buf[2] = 0;
5161
5162 return;
5163 }
5164
5165 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5166
5167 uint level = 0;
5168
5169 while (val > 99999)
5170 {
5171 val /= 1000;
5172
5173 level++;
5174 }
5175
5176 /* generate output */
5177
5178 if (level == 0)
5179 {
5180 snprintf (buf, len - 1, "%.0f ", val);
5181 }
5182 else
5183 {
5184 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5185 }
5186 }
5187
5188 void lowercase (char *buf, int len)
5189 {
5190 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5191 }
5192
5193 void uppercase (char *buf, int len)
5194 {
5195 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5196 }
5197
5198 int fgetl (FILE *fp, char *line_buf)
5199 {
5200 int line_len = 0;
5201
5202 while (!feof (fp))
5203 {
5204 const int c = fgetc (fp);
5205
5206 if (c == EOF) break;
5207
5208 line_buf[line_len] = (char) c;
5209
5210 line_len++;
5211
5212 if (line_len == BUFSIZ) line_len--;
5213
5214 if (c == '\n') break;
5215 }
5216
5217 if (line_len == 0) return 0;
5218
5219 if (line_buf[line_len - 1] == '\n')
5220 {
5221 line_len--;
5222
5223 line_buf[line_len] = 0;
5224 }
5225
5226 if (line_len == 0) return 0;
5227
5228 if (line_buf[line_len - 1] == '\r')
5229 {
5230 line_len--;
5231
5232 line_buf[line_len] = 0;
5233 }
5234
5235 return (line_len);
5236 }
5237
5238 int in_superchop (char *buf)
5239 {
5240 int len = strlen (buf);
5241
5242 while (len)
5243 {
5244 if (buf[len - 1] == '\n')
5245 {
5246 len--;
5247
5248 continue;
5249 }
5250
5251 if (buf[len - 1] == '\r')
5252 {
5253 len--;
5254
5255 continue;
5256 }
5257
5258 break;
5259 }
5260
5261 buf[len] = 0;
5262
5263 return len;
5264 }
5265
5266 char **scan_directory (const char *path)
5267 {
5268 char *tmp_path = mystrdup (path);
5269
5270 size_t tmp_path_len = strlen (tmp_path);
5271
5272 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5273 {
5274 tmp_path[tmp_path_len - 1] = 0;
5275
5276 tmp_path_len = strlen (tmp_path);
5277 }
5278
5279 char **files = NULL;
5280
5281 int num_files = 0;
5282
5283 DIR *d;
5284
5285 if ((d = opendir (tmp_path)) != NULL)
5286 {
5287 struct dirent *de;
5288
5289 while ((de = readdir (d)) != NULL)
5290 {
5291 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5292
5293 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5294
5295 char *path_file = (char *) mymalloc (path_size + 1);
5296
5297 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5298
5299 path_file[path_size] = 0;
5300
5301 DIR *d_test;
5302
5303 if ((d_test = opendir (path_file)) != NULL)
5304 {
5305 closedir (d_test);
5306
5307 myfree (path_file);
5308 }
5309 else
5310 {
5311 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5312
5313 num_files++;
5314
5315 files[num_files - 1] = path_file;
5316 }
5317 }
5318
5319 closedir (d);
5320 }
5321 else if (errno == ENOTDIR)
5322 {
5323 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5324
5325 num_files++;
5326
5327 files[num_files - 1] = mystrdup (path);
5328 }
5329
5330 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5331
5332 num_files++;
5333
5334 files[num_files - 1] = NULL;
5335
5336 myfree (tmp_path);
5337
5338 return (files);
5339 }
5340
5341 int count_dictionaries (char **dictionary_files)
5342 {
5343 if (dictionary_files == NULL) return 0;
5344
5345 int cnt = 0;
5346
5347 for (int d = 0; dictionary_files[d] != NULL; d++)
5348 {
5349 cnt++;
5350 }
5351
5352 return (cnt);
5353 }
5354
5355 char *stroptitype (const uint opti_type)
5356 {
5357 switch (opti_type)
5358 {
5359 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5360 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5361 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5362 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5363 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5364 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5365 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5366 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5367 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5368 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5369 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5370 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5371 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5372 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5373 }
5374
5375 return (NULL);
5376 }
5377
5378 char *strparser (const uint parser_status)
5379 {
5380 switch (parser_status)
5381 {
5382 case PARSER_OK: return ((char *) PA_000); break;
5383 case PARSER_COMMENT: return ((char *) PA_001); break;
5384 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5385 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5386 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5387 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5388 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5389 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5390 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5391 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5392 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5393 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5394 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5395 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5396 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5397 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5398 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5399 }
5400
5401 return ((char *) PA_255);
5402 }
5403
5404 char *strhashtype (const uint hash_mode)
5405 {
5406 switch (hash_mode)
5407 {
5408 case 0: return ((char *) HT_00000); break;
5409 case 10: return ((char *) HT_00010); break;
5410 case 11: return ((char *) HT_00011); break;
5411 case 12: return ((char *) HT_00012); break;
5412 case 20: return ((char *) HT_00020); break;
5413 case 21: return ((char *) HT_00021); break;
5414 case 22: return ((char *) HT_00022); break;
5415 case 23: return ((char *) HT_00023); break;
5416 case 30: return ((char *) HT_00030); break;
5417 case 40: return ((char *) HT_00040); break;
5418 case 50: return ((char *) HT_00050); break;
5419 case 60: return ((char *) HT_00060); break;
5420 case 100: return ((char *) HT_00100); break;
5421 case 101: return ((char *) HT_00101); break;
5422 case 110: return ((char *) HT_00110); break;
5423 case 111: return ((char *) HT_00111); break;
5424 case 112: return ((char *) HT_00112); break;
5425 case 120: return ((char *) HT_00120); break;
5426 case 121: return ((char *) HT_00121); break;
5427 case 122: return ((char *) HT_00122); break;
5428 case 124: return ((char *) HT_00124); break;
5429 case 130: return ((char *) HT_00130); break;
5430 case 131: return ((char *) HT_00131); break;
5431 case 132: return ((char *) HT_00132); break;
5432 case 133: return ((char *) HT_00133); break;
5433 case 140: return ((char *) HT_00140); break;
5434 case 141: return ((char *) HT_00141); break;
5435 case 150: return ((char *) HT_00150); break;
5436 case 160: return ((char *) HT_00160); break;
5437 case 190: return ((char *) HT_00190); break;
5438 case 200: return ((char *) HT_00200); break;
5439 case 300: return ((char *) HT_00300); break;
5440 case 400: return ((char *) HT_00400); break;
5441 case 500: return ((char *) HT_00500); break;
5442 case 501: return ((char *) HT_00501); break;
5443 case 900: return ((char *) HT_00900); break;
5444 case 910: return ((char *) HT_00910); break;
5445 case 1000: return ((char *) HT_01000); break;
5446 case 1100: return ((char *) HT_01100); break;
5447 case 1400: return ((char *) HT_01400); break;
5448 case 1410: return ((char *) HT_01410); break;
5449 case 1420: return ((char *) HT_01420); break;
5450 case 1421: return ((char *) HT_01421); break;
5451 case 1430: return ((char *) HT_01430); break;
5452 case 1440: return ((char *) HT_01440); break;
5453 case 1441: return ((char *) HT_01441); break;
5454 case 1450: return ((char *) HT_01450); break;
5455 case 1460: return ((char *) HT_01460); break;
5456 case 1500: return ((char *) HT_01500); break;
5457 case 1600: return ((char *) HT_01600); break;
5458 case 1700: return ((char *) HT_01700); break;
5459 case 1710: return ((char *) HT_01710); break;
5460 case 1711: return ((char *) HT_01711); break;
5461 case 1720: return ((char *) HT_01720); break;
5462 case 1722: return ((char *) HT_01722); break;
5463 case 1730: return ((char *) HT_01730); break;
5464 case 1731: return ((char *) HT_01731); break;
5465 case 1740: return ((char *) HT_01740); break;
5466 case 1750: return ((char *) HT_01750); break;
5467 case 1760: return ((char *) HT_01760); break;
5468 case 1800: return ((char *) HT_01800); break;
5469 case 2100: return ((char *) HT_02100); break;
5470 case 2400: return ((char *) HT_02400); break;
5471 case 2410: return ((char *) HT_02410); break;
5472 case 2500: return ((char *) HT_02500); break;
5473 case 2600: return ((char *) HT_02600); break;
5474 case 2611: return ((char *) HT_02611); break;
5475 case 2612: return ((char *) HT_02612); break;
5476 case 2711: return ((char *) HT_02711); break;
5477 case 2811: return ((char *) HT_02811); break;
5478 case 3000: return ((char *) HT_03000); break;
5479 case 3100: return ((char *) HT_03100); break;
5480 case 3200: return ((char *) HT_03200); break;
5481 case 3710: return ((char *) HT_03710); break;
5482 case 3711: return ((char *) HT_03711); break;
5483 case 3800: return ((char *) HT_03800); break;
5484 case 4300: return ((char *) HT_04300); break;
5485 case 4400: return ((char *) HT_04400); break;
5486 case 4500: return ((char *) HT_04500); break;
5487 case 4700: return ((char *) HT_04700); break;
5488 case 4800: return ((char *) HT_04800); break;
5489 case 4900: return ((char *) HT_04900); break;
5490 case 5000: return ((char *) HT_05000); break;
5491 case 5100: return ((char *) HT_05100); break;
5492 case 5200: return ((char *) HT_05200); break;
5493 case 5300: return ((char *) HT_05300); break;
5494 case 5400: return ((char *) HT_05400); break;
5495 case 5500: return ((char *) HT_05500); break;
5496 case 5600: return ((char *) HT_05600); break;
5497 case 5700: return ((char *) HT_05700); break;
5498 case 5800: return ((char *) HT_05800); break;
5499 case 6000: return ((char *) HT_06000); break;
5500 case 6100: return ((char *) HT_06100); break;
5501 case 6211: return ((char *) HT_06211); break;
5502 case 6212: return ((char *) HT_06212); break;
5503 case 6213: return ((char *) HT_06213); break;
5504 case 6221: return ((char *) HT_06221); break;
5505 case 6222: return ((char *) HT_06222); break;
5506 case 6223: return ((char *) HT_06223); break;
5507 case 6231: return ((char *) HT_06231); break;
5508 case 6232: return ((char *) HT_06232); break;
5509 case 6233: return ((char *) HT_06233); break;
5510 case 6241: return ((char *) HT_06241); break;
5511 case 6242: return ((char *) HT_06242); break;
5512 case 6243: return ((char *) HT_06243); break;
5513 case 6300: return ((char *) HT_06300); break;
5514 case 6400: return ((char *) HT_06400); break;
5515 case 6500: return ((char *) HT_06500); break;
5516 case 6600: return ((char *) HT_06600); break;
5517 case 6700: return ((char *) HT_06700); break;
5518 case 6800: return ((char *) HT_06800); break;
5519 case 6900: return ((char *) HT_06900); break;
5520 case 7100: return ((char *) HT_07100); break;
5521 case 7200: return ((char *) HT_07200); break;
5522 case 7300: return ((char *) HT_07300); break;
5523 case 7400: return ((char *) HT_07400); break;
5524 case 7500: return ((char *) HT_07500); break;
5525 case 7600: return ((char *) HT_07600); break;
5526 case 7700: return ((char *) HT_07700); break;
5527 case 7800: return ((char *) HT_07800); break;
5528 case 7900: return ((char *) HT_07900); break;
5529 case 8000: return ((char *) HT_08000); break;
5530 case 8100: return ((char *) HT_08100); break;
5531 case 8200: return ((char *) HT_08200); break;
5532 case 8300: return ((char *) HT_08300); break;
5533 case 8400: return ((char *) HT_08400); break;
5534 case 8500: return ((char *) HT_08500); break;
5535 case 8600: return ((char *) HT_08600); break;
5536 case 8700: return ((char *) HT_08700); break;
5537 case 8800: return ((char *) HT_08800); break;
5538 case 8900: return ((char *) HT_08900); break;
5539 case 9000: return ((char *) HT_09000); break;
5540 case 9100: return ((char *) HT_09100); break;
5541 case 9200: return ((char *) HT_09200); break;
5542 case 9300: return ((char *) HT_09300); break;
5543 case 9400: return ((char *) HT_09400); break;
5544 case 9500: return ((char *) HT_09500); break;
5545 case 9600: return ((char *) HT_09600); break;
5546 case 9700: return ((char *) HT_09700); break;
5547 case 9710: return ((char *) HT_09710); break;
5548 case 9720: return ((char *) HT_09720); break;
5549 case 9800: return ((char *) HT_09800); break;
5550 case 9810: return ((char *) HT_09810); break;
5551 case 9820: return ((char *) HT_09820); break;
5552 case 9900: return ((char *) HT_09900); break;
5553 case 10000: return ((char *) HT_10000); break;
5554 case 10100: return ((char *) HT_10100); break;
5555 case 10200: return ((char *) HT_10200); break;
5556 case 10300: return ((char *) HT_10300); break;
5557 case 10400: return ((char *) HT_10400); break;
5558 case 10410: return ((char *) HT_10410); break;
5559 case 10420: return ((char *) HT_10420); break;
5560 case 10500: return ((char *) HT_10500); break;
5561 case 10600: return ((char *) HT_10600); break;
5562 case 10700: return ((char *) HT_10700); break;
5563 case 10800: return ((char *) HT_10800); break;
5564 case 10900: return ((char *) HT_10900); break;
5565 case 11000: return ((char *) HT_11000); break;
5566 case 11100: return ((char *) HT_11100); break;
5567 case 11200: return ((char *) HT_11200); break;
5568 case 11300: return ((char *) HT_11300); break;
5569 case 11400: return ((char *) HT_11400); break;
5570 case 11500: return ((char *) HT_11500); break;
5571 case 11600: return ((char *) HT_11600); break;
5572 case 11700: return ((char *) HT_11700); break;
5573 case 11800: return ((char *) HT_11800); break;
5574 case 11900: return ((char *) HT_11900); break;
5575 case 12000: return ((char *) HT_12000); break;
5576 case 12100: return ((char *) HT_12100); break;
5577 case 12200: return ((char *) HT_12200); break;
5578 case 12300: return ((char *) HT_12300); break;
5579 case 12400: return ((char *) HT_12400); break;
5580 case 12500: return ((char *) HT_12500); break;
5581 case 12600: return ((char *) HT_12600); break;
5582 case 12700: return ((char *) HT_12700); break;
5583 case 12800: return ((char *) HT_12800); break;
5584 }
5585
5586 return ((char *) "Unknown");
5587 }
5588
5589 char *strstatus (const uint devices_status)
5590 {
5591 switch (devices_status)
5592 {
5593 case STATUS_INIT: return ((char *) ST_0000); break;
5594 case STATUS_STARTING: return ((char *) ST_0001); break;
5595 case STATUS_RUNNING: return ((char *) ST_0002); break;
5596 case STATUS_PAUSED: return ((char *) ST_0003); break;
5597 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5598 case STATUS_CRACKED: return ((char *) ST_0005); break;
5599 case STATUS_ABORTED: return ((char *) ST_0006); break;
5600 case STATUS_QUIT: return ((char *) ST_0007); break;
5601 case STATUS_BYPASS: return ((char *) ST_0008); break;
5602 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5603 }
5604
5605 return ((char *) "Unknown");
5606 }
5607
5608 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5609 {
5610 uint hash_type = data.hash_type;
5611 uint hash_mode = data.hash_mode;
5612 uint salt_type = data.salt_type;
5613 uint opts_type = data.opts_type;
5614 uint opti_type = data.opti_type;
5615 uint dgst_size = data.dgst_size;
5616
5617 char *hashfile = data.hashfile;
5618
5619 uint len = 4096;
5620
5621 uint digest_buf[64];
5622
5623 uint64_t *digest_buf64 = (uint64_t *) digest_buf;
5624
5625 char *digests_buf_ptr = (char *) data.digests_buf;
5626
5627 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5628
5629 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5630 {
5631 uint tt;
5632
5633 switch (hash_type)
5634 {
5635 case HASH_TYPE_DESCRYPT:
5636 FP (digest_buf[1], digest_buf[0], tt);
5637 break;
5638
5639 case HASH_TYPE_DESRACF:
5640 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 29);
5641 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 29);
5642
5643 FP (digest_buf[1], digest_buf[0], tt);
5644 break;
5645
5646 case HASH_TYPE_LM:
5647 FP (digest_buf[1], digest_buf[0], tt);
5648 break;
5649
5650 case HASH_TYPE_NETNTLM:
5651 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 29);
5652 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 29);
5653 digest_buf[2] = ROTATE_LEFT (digest_buf[2], 29);
5654 digest_buf[3] = ROTATE_LEFT (digest_buf[3], 29);
5655
5656 FP (digest_buf[1], digest_buf[0], tt);
5657 FP (digest_buf[3], digest_buf[2], tt);
5658 break;
5659
5660 case HASH_TYPE_BSDICRYPT:
5661 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 31);
5662 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 31);
5663
5664 FP (digest_buf[1], digest_buf[0], tt);
5665 break;
5666 }
5667 }
5668
5669 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5670 {
5671 switch (hash_type)
5672 {
5673 case HASH_TYPE_MD4:
5674 digest_buf[0] += MD4M_A;
5675 digest_buf[1] += MD4M_B;
5676 digest_buf[2] += MD4M_C;
5677 digest_buf[3] += MD4M_D;
5678 break;
5679
5680 case HASH_TYPE_MD5:
5681 digest_buf[0] += MD5M_A;
5682 digest_buf[1] += MD5M_B;
5683 digest_buf[2] += MD5M_C;
5684 digest_buf[3] += MD5M_D;
5685 break;
5686
5687 case HASH_TYPE_SHA1:
5688 digest_buf[0] += SHA1M_A;
5689 digest_buf[1] += SHA1M_B;
5690 digest_buf[2] += SHA1M_C;
5691 digest_buf[3] += SHA1M_D;
5692 digest_buf[4] += SHA1M_E;
5693 break;
5694
5695 case HASH_TYPE_SHA256:
5696 digest_buf[0] += SHA256M_A;
5697 digest_buf[1] += SHA256M_B;
5698 digest_buf[2] += SHA256M_C;
5699 digest_buf[3] += SHA256M_D;
5700 digest_buf[4] += SHA256M_E;
5701 digest_buf[5] += SHA256M_F;
5702 digest_buf[6] += SHA256M_G;
5703 digest_buf[7] += SHA256M_H;
5704 break;
5705
5706 case HASH_TYPE_SHA384:
5707 digest_buf64[0] += SHA384M_A;
5708 digest_buf64[1] += SHA384M_B;
5709 digest_buf64[2] += SHA384M_C;
5710 digest_buf64[3] += SHA384M_D;
5711 digest_buf64[4] += SHA384M_E;
5712 digest_buf64[5] += SHA384M_F;
5713 digest_buf64[6] += 0;
5714 digest_buf64[7] += 0;
5715 break;
5716
5717 case HASH_TYPE_SHA512:
5718 digest_buf64[0] += SHA512M_A;
5719 digest_buf64[1] += SHA512M_B;
5720 digest_buf64[2] += SHA512M_C;
5721 digest_buf64[3] += SHA512M_D;
5722 digest_buf64[4] += SHA512M_E;
5723 digest_buf64[5] += SHA512M_F;
5724 digest_buf64[6] += SHA512M_G;
5725 digest_buf64[7] += SHA512M_H;
5726 break;
5727 }
5728 }
5729
5730 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
5731 {
5732 if (dgst_size == DGST_SIZE_4_2)
5733 {
5734 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5735 }
5736 else if (dgst_size == DGST_SIZE_4_4)
5737 {
5738 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5739 }
5740 else if (dgst_size == DGST_SIZE_4_5)
5741 {
5742 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5743 }
5744 else if (dgst_size == DGST_SIZE_4_6)
5745 {
5746 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5747 }
5748 else if (dgst_size == DGST_SIZE_4_8)
5749 {
5750 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5751 }
5752 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
5753 {
5754 if (hash_type == HASH_TYPE_WHIRLPOOL)
5755 {
5756 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5757 }
5758 else if (hash_type == HASH_TYPE_SHA384)
5759 {
5760 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5761 }
5762 else if (hash_type == HASH_TYPE_SHA512)
5763 {
5764 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5765 }
5766 else if (hash_type == HASH_TYPE_GOST)
5767 {
5768 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5769 }
5770 }
5771 else if (dgst_size == DGST_SIZE_4_64)
5772 {
5773 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5774 }
5775 else if (dgst_size == DGST_SIZE_8_25)
5776 {
5777 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5778 }
5779 }
5780
5781 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
5782 | (data.salt_type == SALT_TYPE_EXTERN)
5783 | (data.salt_type == SALT_TYPE_EMBEDDED));
5784
5785 salt_t salt;
5786
5787 if (isSalted)
5788 {
5789 memset (&salt, 0, sizeof (salt_t));
5790
5791 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
5792
5793 char *ptr = (char *) salt.salt_buf;
5794
5795 uint len = salt.salt_len;
5796
5797 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5798 {
5799 uint tt;
5800
5801 switch (hash_type)
5802 {
5803 case HASH_TYPE_NETNTLM:
5804
5805 salt.salt_buf[0] = ROTATE_RIGHT (salt.salt_buf[0], 3);
5806 salt.salt_buf[1] = ROTATE_RIGHT (salt.salt_buf[1], 3);
5807
5808 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
5809
5810 break;
5811 }
5812 }
5813
5814 if (opts_type & OPTS_TYPE_ST_UNICODE)
5815 {
5816 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5817 {
5818 ptr[i] = ptr[j];
5819 }
5820
5821 len = len / 2;
5822 }
5823
5824 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
5825 {
5826 uint max = salt.salt_len / 4;
5827
5828 if (len % 4) max++;
5829
5830 for (uint i = 0; i < max; i++)
5831 {
5832 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
5833 }
5834 }
5835
5836 if (opts_type & OPTS_TYPE_ST_HEX)
5837 {
5838 char tmp[64];
5839
5840 memset (tmp, 0, sizeof (tmp));
5841
5842 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5843 {
5844 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
5845 }
5846
5847 len = len * 2;
5848
5849 memcpy (ptr, tmp, len);
5850 }
5851
5852 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
5853
5854 memset (ptr + len, 0, memset_size);
5855
5856 salt.salt_len = len;
5857 }
5858
5859 //
5860 // some modes require special encoding
5861 //
5862
5863 uint out_buf_plain[256];
5864 uint out_buf_salt[256];
5865
5866 char tmp_buf[1024];
5867
5868 memset (out_buf_plain, 0, sizeof (out_buf_plain));
5869 memset (out_buf_salt, 0, sizeof (out_buf_salt));
5870
5871 memset (tmp_buf, 0, sizeof (tmp_buf));
5872
5873 char *ptr_plain = (char *) out_buf_plain;
5874 char *ptr_salt = (char *) out_buf_salt;
5875
5876 if (hash_mode == 22)
5877 {
5878 char username[30];
5879
5880 memset (username, 0, sizeof (username));
5881
5882 memcpy (username, salt.salt_buf, salt.salt_len - 22);
5883
5884 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
5885
5886 uint16_t *ptr = (uint16_t *) digest_buf;
5887
5888 tmp_buf[ 0] = sig[0];
5889 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
5890 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
5891 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
5892 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
5893 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
5894 tmp_buf[ 6] = sig[1];
5895 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
5896 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
5897 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
5898 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
5899 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
5900 tmp_buf[12] = sig[2];
5901 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
5902 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
5903 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
5904 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
5905 tmp_buf[17] = sig[3];
5906 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
5907 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
5908 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
5909 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
5910 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
5911 tmp_buf[23] = sig[4];
5912 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
5913 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
5914 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
5915 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
5916 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
5917 tmp_buf[29] = sig[5];
5918
5919 snprintf (out_buf, len-1, "%s:%s",
5920 tmp_buf,
5921 username);
5922 }
5923 else if (hash_mode == 23)
5924 {
5925 // do not show the \nskyper\n part in output
5926
5927 char *salt_buf_ptr = (char *) salt.salt_buf;
5928
5929 salt_buf_ptr[salt.salt_len - 8] = 0;
5930
5931 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
5932 digest_buf[0],
5933 digest_buf[1],
5934 digest_buf[2],
5935 digest_buf[3],
5936 salt_buf_ptr);
5937 }
5938 else if (hash_mode == 101)
5939 {
5940 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
5941
5942 digest_buf[0] = byte_swap_32 (digest_buf[0]);
5943 digest_buf[1] = byte_swap_32 (digest_buf[1]);
5944 digest_buf[2] = byte_swap_32 (digest_buf[2]);
5945 digest_buf[3] = byte_swap_32 (digest_buf[3]);
5946 digest_buf[4] = byte_swap_32 (digest_buf[4]);
5947
5948 memcpy (tmp_buf, digest_buf, 20);
5949
5950 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
5951
5952 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
5953 }
5954 else if (hash_mode == 111)
5955 {
5956 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
5957
5958 digest_buf[0] = byte_swap_32 (digest_buf[0]);
5959 digest_buf[1] = byte_swap_32 (digest_buf[1]);
5960 digest_buf[2] = byte_swap_32 (digest_buf[2]);
5961 digest_buf[3] = byte_swap_32 (digest_buf[3]);
5962 digest_buf[4] = byte_swap_32 (digest_buf[4]);
5963
5964 memcpy (tmp_buf, digest_buf, 20);
5965 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
5966
5967 base64_encode (int_to_base64, tmp_buf, 20 + salt.salt_len, ptr_plain);
5968
5969 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
5970 }
5971 else if (hash_mode == 122)
5972 {
5973 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
5974 (unsigned char *) salt.salt_buf,
5975 digest_buf[0],
5976 digest_buf[1],
5977 digest_buf[2],
5978 digest_buf[3],
5979 digest_buf[4]);
5980 }
5981 else if (hash_mode == 124)
5982 {
5983 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
5984 (unsigned char *) salt.salt_buf,
5985 digest_buf[0],
5986 digest_buf[1],
5987 digest_buf[2],
5988 digest_buf[3],
5989 digest_buf[4]);
5990 }
5991 else if (hash_mode == 131)
5992 {
5993 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
5994 (unsigned char *) salt.salt_buf,
5995 0, 0, 0, 0, 0,
5996 digest_buf[0],
5997 digest_buf[1],
5998 digest_buf[2],
5999 digest_buf[3],
6000 digest_buf[4]);
6001 }
6002 else if (hash_mode == 132)
6003 {
6004 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6005 (unsigned char *) salt.salt_buf,
6006 digest_buf[0],
6007 digest_buf[1],
6008 digest_buf[2],
6009 digest_buf[3],
6010 digest_buf[4]);
6011 }
6012 else if (hash_mode == 133)
6013 {
6014 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6015
6016 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6017 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6018 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6019 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6020 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6021
6022 memcpy (tmp_buf, digest_buf, 20);
6023
6024 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
6025
6026 snprintf (out_buf, len-1, "%s", ptr_plain);
6027 }
6028 else if (hash_mode == 141)
6029 {
6030 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6031
6032 base64_encode (int_to_base64, tmp_buf, salt.salt_len, ptr_salt);
6033
6034 memset (tmp_buf, 0, sizeof (tmp_buf));
6035
6036 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6037
6038 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6039 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6040 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6041 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6042 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6043
6044 memcpy (tmp_buf, digest_buf, 20);
6045
6046 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
6047
6048 ptr_plain[27] = 0;
6049
6050 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6051 }
6052 else if (hash_mode == 400)
6053 {
6054 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6055
6056 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6057 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6058 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6059 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6060
6061 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6062
6063 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6064 }
6065 else if (hash_mode == 500)
6066 {
6067 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6068
6069 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6070 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6071 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6072 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6073
6074 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6075
6076 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6077 {
6078 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6079 }
6080 else
6081 {
6082 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6083 }
6084 }
6085 else if (hash_mode == 501)
6086 {
6087 uint digest_idx = salt.digests_offset + digest_pos;
6088
6089 hashinfo_t **hashinfo_ptr = data.hash_info;
6090 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6091
6092 snprintf (out_buf, len-1, "%s", hash_buf);
6093 }
6094 else if (hash_mode == 1421)
6095 {
6096 uint8_t *salt_ptr = (uint8_t *) salt.salt_buf;
6097
6098 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6099 salt_ptr[0],
6100 salt_ptr[1],
6101 salt_ptr[2],
6102 salt_ptr[3],
6103 salt_ptr[4],
6104 salt_ptr[5],
6105 digest_buf[0],
6106 digest_buf[1],
6107 digest_buf[2],
6108 digest_buf[3],
6109 digest_buf[4],
6110 digest_buf[5],
6111 digest_buf[6],
6112 digest_buf[7]);
6113 }
6114 else if (hash_mode == 1441)
6115 {
6116 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6117
6118 base64_encode (int_to_base64, tmp_buf, salt.salt_len, ptr_salt);
6119
6120 memset (tmp_buf, 0, sizeof (tmp_buf));
6121
6122 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6123
6124 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6125 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6126 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6127 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6128 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6129 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6130 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6131 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6132
6133 memcpy (tmp_buf, digest_buf, 32);
6134
6135 base64_encode (int_to_base64, tmp_buf, 32, ptr_plain);
6136
6137 ptr_plain[43] = 0;
6138
6139 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6140 }
6141 else if (hash_mode == 1500)
6142 {
6143 out_buf[0] = salt.salt_sign[0] & 0xff;
6144 out_buf[1] = salt.salt_sign[1] & 0xff;
6145 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6146 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6147 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6148
6149 memset (tmp_buf, 0, sizeof (tmp_buf));
6150
6151 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6152
6153 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6154 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6155
6156 memcpy (tmp_buf, digest_buf, 8);
6157
6158 base64_encode (int_to_itoa64, tmp_buf, 8, ptr_plain);
6159
6160 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6161
6162 out_buf[13] = 0;
6163 }
6164 else if (hash_mode == 1600)
6165 {
6166 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6167
6168 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6169 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6170 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6171 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6172
6173 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6174
6175 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6176 {
6177 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6178 }
6179 else
6180 {
6181 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6182 }
6183 }
6184 else if (hash_mode == 1711)
6185 {
6186 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6187
6188 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6189 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6190 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6191 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6192 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6193 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6194 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6195 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6196
6197 memcpy (tmp_buf, digest_buf, 64);
6198 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6199
6200 base64_encode (int_to_base64, tmp_buf, 64 + salt.salt_len, ptr_plain);
6201
6202 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6203 }
6204 else if (hash_mode == 1722)
6205 {
6206 uint *ptr = digest_buf;
6207
6208 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6209 (unsigned char *) salt.salt_buf,
6210 ptr[ 1], ptr[ 0],
6211 ptr[ 3], ptr[ 2],
6212 ptr[ 5], ptr[ 4],
6213 ptr[ 7], ptr[ 6],
6214 ptr[ 9], ptr[ 8],
6215 ptr[11], ptr[10],
6216 ptr[13], ptr[12],
6217 ptr[15], ptr[14]);
6218 }
6219 else if (hash_mode == 1731)
6220 {
6221 uint *ptr = digest_buf;
6222
6223 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6224 (unsigned char *) salt.salt_buf,
6225 ptr[ 1], ptr[ 0],
6226 ptr[ 3], ptr[ 2],
6227 ptr[ 5], ptr[ 4],
6228 ptr[ 7], ptr[ 6],
6229 ptr[ 9], ptr[ 8],
6230 ptr[11], ptr[10],
6231 ptr[13], ptr[12],
6232 ptr[15], ptr[14]);
6233 }
6234 else if (hash_mode == 1800)
6235 {
6236 // temp workaround
6237
6238 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6239 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6240 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6241 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6242 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6243 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6244 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6245 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6246
6247 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6248
6249 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6250 {
6251 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6252 }
6253 else
6254 {
6255 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6256 }
6257 }
6258 else if (hash_mode == 2100)
6259 {
6260 uint pos = 0;
6261
6262 snprintf (out_buf + pos, len-1, "%s%i#",
6263 SIGNATURE_DCC2,
6264 salt.salt_iter + 1);
6265
6266 uint signature_len = strlen (out_buf);
6267
6268 pos += signature_len;
6269 len -= signature_len;
6270
6271 char *salt_ptr = (char *) salt.salt_buf;
6272
6273 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6274
6275 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6276 byte_swap_32 (digest_buf[0]),
6277 byte_swap_32 (digest_buf[1]),
6278 byte_swap_32 (digest_buf[2]),
6279 byte_swap_32 (digest_buf[3]));
6280 }
6281 else if ((hash_mode == 2400) || (hash_mode == 2410))
6282 {
6283 memcpy (tmp_buf, digest_buf, 16);
6284
6285 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6286
6287 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6288 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6289 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6290 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6291
6292 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6293 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6294 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6295 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6296
6297 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6298 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6299 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6300 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6301
6302 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6303 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6304 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6305 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6306
6307 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6308 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6309 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6310 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6311
6312 out_buf[16] = 0;
6313 }
6314 else if (hash_mode == 2500)
6315 {
6316 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6317
6318 wpa_t *wpa = &wpas[salt_pos];
6319
6320 uint pke[25];
6321
6322 char *pke_ptr = (char *) pke;
6323
6324 for (uint i = 0; i < 25; i++)
6325 {
6326 pke[i] = byte_swap_32 (wpa->pke[i]);
6327 }
6328
6329 unsigned char mac1[6];
6330 unsigned char mac2[6];
6331
6332 memcpy (mac1, pke_ptr + 23, 6);
6333 memcpy (mac2, pke_ptr + 29, 6);
6334
6335 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6336 (char *) salt.salt_buf,
6337 mac1[0],
6338 mac1[1],
6339 mac1[2],
6340 mac1[3],
6341 mac1[4],
6342 mac1[5],
6343 mac2[0],
6344 mac2[1],
6345 mac2[2],
6346 mac2[3],
6347 mac2[4],
6348 mac2[5]);
6349 }
6350 else if (hash_mode == 4400)
6351 {
6352 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6353 byte_swap_32 (digest_buf[0]),
6354 byte_swap_32 (digest_buf[1]),
6355 byte_swap_32 (digest_buf[2]),
6356 byte_swap_32 (digest_buf[3]));
6357 }
6358 else if (hash_mode == 4700)
6359 {
6360 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6361 byte_swap_32 (digest_buf[0]),
6362 byte_swap_32 (digest_buf[1]),
6363 byte_swap_32 (digest_buf[2]),
6364 byte_swap_32 (digest_buf[3]),
6365 byte_swap_32 (digest_buf[4]));
6366 }
6367 else if (hash_mode == 4800)
6368 {
6369 uint8_t chap_id_byte = (uint8_t) salt.salt_buf[4];
6370
6371 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6372 digest_buf[0],
6373 digest_buf[1],
6374 digest_buf[2],
6375 digest_buf[3],
6376 byte_swap_32 (salt.salt_buf[0]),
6377 byte_swap_32 (salt.salt_buf[1]),
6378 byte_swap_32 (salt.salt_buf[2]),
6379 byte_swap_32 (salt.salt_buf[3]),
6380 chap_id_byte);
6381 }
6382 else if (hash_mode == 4900)
6383 {
6384 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6385 byte_swap_32 (digest_buf[0]),
6386 byte_swap_32 (digest_buf[1]),
6387 byte_swap_32 (digest_buf[2]),
6388 byte_swap_32 (digest_buf[3]),
6389 byte_swap_32 (digest_buf[4]));
6390 }
6391 else if (hash_mode == 5100)
6392 {
6393 snprintf (out_buf, len-1, "%08x%08x",
6394 digest_buf[0],
6395 digest_buf[1]);
6396 }
6397 else if (hash_mode == 5200)
6398 {
6399 snprintf (out_buf, len-1, "%s", hashfile);
6400 }
6401 else if (hash_mode == 5300)
6402 {
6403 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6404
6405 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6406
6407 int buf_len = len -1;
6408
6409 // msg_buf
6410
6411 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6412
6413 for (uint i = 0; i < ikepsk_msg_len; i++)
6414 {
6415 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6416 {
6417 snprintf (out_buf, buf_len, ":");
6418
6419 buf_len--;
6420 out_buf++;
6421 }
6422
6423 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6424
6425 buf_len -= 8;
6426 out_buf += 8;
6427 }
6428
6429 // nr_buf
6430
6431 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6432
6433 for (uint i = 0; i < ikepsk_nr_len; i++)
6434 {
6435 if ((i == 0) || (i == 5))
6436 {
6437 snprintf (out_buf, buf_len, ":");
6438
6439 buf_len--;
6440 out_buf++;
6441 }
6442
6443 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6444
6445 buf_len -= 8;
6446 out_buf += 8;
6447 }
6448
6449 // digest_buf
6450
6451 for (uint i = 0; i < 4; i++)
6452 {
6453 if (i == 0)
6454 {
6455 snprintf (out_buf, buf_len, ":");
6456
6457 buf_len--;
6458 out_buf++;
6459 }
6460
6461 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6462
6463 buf_len -= 8;
6464 out_buf += 8;
6465 }
6466 }
6467 else if (hash_mode == 5400)
6468 {
6469 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6470
6471 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6472
6473 int buf_len = len -1;
6474
6475 // msg_buf
6476
6477 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6478
6479 for (uint i = 0; i < ikepsk_msg_len; i++)
6480 {
6481 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6482 {
6483 snprintf (out_buf, buf_len, ":");
6484
6485 buf_len--;
6486 out_buf++;
6487 }
6488
6489 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6490
6491 buf_len -= 8;
6492 out_buf += 8;
6493 }
6494
6495 // nr_buf
6496
6497 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6498
6499 for (uint i = 0; i < ikepsk_nr_len; i++)
6500 {
6501 if ((i == 0) || (i == 5))
6502 {
6503 snprintf (out_buf, buf_len, ":");
6504
6505 buf_len--;
6506 out_buf++;
6507 }
6508
6509 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6510
6511 buf_len -= 8;
6512 out_buf += 8;
6513 }
6514
6515 // digest_buf
6516
6517 for (uint i = 0; i < 5; i++)
6518 {
6519 if (i == 0)
6520 {
6521 snprintf (out_buf, buf_len, ":");
6522
6523 buf_len--;
6524 out_buf++;
6525 }
6526
6527 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6528
6529 buf_len -= 8;
6530 out_buf += 8;
6531 }
6532 }
6533 else if (hash_mode == 5500)
6534 {
6535 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6536
6537 netntlm_t *netntlm = &netntlms[salt_pos];
6538
6539 char user_buf[64];
6540 char domain_buf[64];
6541 char srvchall_buf[1024];
6542 char clichall_buf[1024];
6543
6544 memset (user_buf, 0, sizeof (user_buf));
6545 memset (domain_buf, 0, sizeof (domain_buf));
6546 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6547 memset (clichall_buf, 0, sizeof (clichall_buf));
6548
6549 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6550 {
6551 char *ptr = (char *) netntlm->userdomain_buf;
6552
6553 user_buf[i] = ptr[j];
6554 }
6555
6556 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6557 {
6558 char *ptr = (char *) netntlm->userdomain_buf;
6559
6560 domain_buf[i] = ptr[netntlm->user_len + j];
6561 }
6562
6563 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6564 {
6565 char *ptr = (char *) netntlm->chall_buf;
6566
6567 sprintf (srvchall_buf + j, "%02x", (uint8_t) ptr[i]);
6568 }
6569
6570 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6571 {
6572 char *ptr = (char *) netntlm->chall_buf;
6573
6574 sprintf (clichall_buf + j, "%02x", (uint8_t) ptr[netntlm->srvchall_len + i]);
6575 }
6576
6577 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6578 user_buf,
6579 domain_buf,
6580 srvchall_buf,
6581 digest_buf[0],
6582 digest_buf[1],
6583 digest_buf[2],
6584 digest_buf[3],
6585 byte_swap_32 (salt.salt_buf_pc[0]),
6586 byte_swap_32 (salt.salt_buf_pc[1]),
6587 clichall_buf);
6588 }
6589 else if (hash_mode == 5600)
6590 {
6591 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6592
6593 netntlm_t *netntlm = &netntlms[salt_pos];
6594
6595 char user_buf[64];
6596 char domain_buf[64];
6597 char srvchall_buf[1024];
6598 char clichall_buf[1024];
6599
6600 memset (user_buf, 0, sizeof (user_buf));
6601 memset (domain_buf, 0, sizeof (domain_buf));
6602 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6603 memset (clichall_buf, 0, sizeof (clichall_buf));
6604
6605 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6606 {
6607 char *ptr = (char *) netntlm->userdomain_buf;
6608
6609 user_buf[i] = ptr[j];
6610 }
6611
6612 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6613 {
6614 char *ptr = (char *) netntlm->userdomain_buf;
6615
6616 domain_buf[i] = ptr[netntlm->user_len + j];
6617 }
6618
6619 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6620 {
6621 char *ptr = (char *) netntlm->chall_buf;
6622
6623 sprintf (srvchall_buf + j, "%02x", (uint8_t) ptr[i]);
6624 }
6625
6626 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6627 {
6628 char *ptr = (char *) netntlm->chall_buf;
6629
6630 sprintf (clichall_buf + j, "%02x", (uint8_t) ptr[netntlm->srvchall_len + i]);
6631 }
6632
6633 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6634 user_buf,
6635 domain_buf,
6636 srvchall_buf,
6637 digest_buf[0],
6638 digest_buf[1],
6639 digest_buf[2],
6640 digest_buf[3],
6641 clichall_buf);
6642 }
6643 else if (hash_mode == 5700)
6644 {
6645 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6646
6647 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6648 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6649 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6650 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6651 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6652 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6653 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6654 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6655
6656 memcpy (tmp_buf, digest_buf, 32);
6657
6658 base64_encode (int_to_itoa64, tmp_buf, 32, ptr_plain);
6659
6660 ptr_plain[43] = 0;
6661
6662 snprintf (out_buf, len-1, "%s", ptr_plain);
6663 }
6664 else if (hash_mode == 5800)
6665 {
6666 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6667 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6668 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6669 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6670 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6671
6672 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6673 digest_buf[0],
6674 digest_buf[1],
6675 digest_buf[2],
6676 digest_buf[3],
6677 digest_buf[4]);
6678 }
6679 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6680 {
6681 snprintf (out_buf, len-1, "%s", hashfile);
6682 }
6683 else if (hash_mode == 6300)
6684 {
6685 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6686
6687 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6688 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6689 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6690 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6691
6692 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6693
6694 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6695 }
6696 else if (hash_mode == 6400)
6697 {
6698 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6699
6700 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6701 }
6702 else if (hash_mode == 6500)
6703 {
6704 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6705
6706 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6707 }
6708 else if (hash_mode == 6600)
6709 {
6710 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6711
6712 agilekey_t *agilekey = &agilekeys[salt_pos];
6713
6714 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6715 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6716
6717 uint buf_len = len - 1;
6718
6719 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6720 buf_len -= 22;
6721
6722 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6723 {
6724 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6725
6726 buf_len -= 2;
6727 }
6728 }
6729 else if (hash_mode == 6700)
6730 {
6731 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6732
6733 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6734 }
6735 else if (hash_mode == 6800)
6736 {
6737 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6738 }
6739 else if (hash_mode == 7100)
6740 {
6741 uint *ptr = digest_buf;
6742
6743 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6744
6745 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6746
6747 uint esalt[16];
6748
6749 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6750 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6751 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6752 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6753 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6754 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6755 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6756 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6757
6758 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",
6759 SIGNATURE_SHA512OSX,
6760 salt.salt_iter + 1,
6761 esalt[ 0], esalt[ 1],
6762 esalt[ 2], esalt[ 3],
6763 esalt[ 4], esalt[ 5],
6764 esalt[ 6], esalt[ 7],
6765 ptr [ 1], ptr [ 0],
6766 ptr [ 3], ptr [ 2],
6767 ptr [ 5], ptr [ 4],
6768 ptr [ 7], ptr [ 6],
6769 ptr [ 9], ptr [ 8],
6770 ptr [11], ptr [10],
6771 ptr [13], ptr [12],
6772 ptr [15], ptr [14]);
6773 }
6774 else if (hash_mode == 7200)
6775 {
6776 uint *ptr = digest_buf;
6777
6778 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6779
6780 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6781
6782 uint len_used = 0;
6783
6784 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
6785
6786 len_used = strlen (out_buf);
6787
6788 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
6789
6790 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
6791 {
6792 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
6793 }
6794
6795 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",
6796 ptr [ 1], ptr [ 0],
6797 ptr [ 3], ptr [ 2],
6798 ptr [ 5], ptr [ 4],
6799 ptr [ 7], ptr [ 6],
6800 ptr [ 9], ptr [ 8],
6801 ptr [11], ptr [10],
6802 ptr [13], ptr [12],
6803 ptr [15], ptr [14]);
6804 }
6805 else if (hash_mode == 7300)
6806 {
6807 rakp_t *rakps = (rakp_t *) data.esalts_buf;
6808
6809 rakp_t *rakp = &rakps[salt_pos];
6810
6811 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
6812 {
6813 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
6814 }
6815
6816 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
6817 digest_buf[0],
6818 digest_buf[1],
6819 digest_buf[2],
6820 digest_buf[3],
6821 digest_buf[4]);
6822 }
6823 else if (hash_mode == 7400)
6824 {
6825 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6826
6827 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6828 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6829 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6830 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6831 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6832 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6833 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6834 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6835
6836 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6837
6838 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
6839 {
6840 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6841 }
6842 else
6843 {
6844 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6845 }
6846 }
6847 else if (hash_mode == 7500)
6848 {
6849 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
6850
6851 krb5pa_t *krb5pa = &krb5pas[salt_pos];
6852
6853 uint8_t *ptr_timestamp = (uint8_t *) krb5pa->timestamp;
6854 uint8_t *ptr_checksum = (uint8_t *) krb5pa->checksum;
6855
6856 char data[128];
6857
6858 char *ptr_data = data;
6859
6860 for (uint i = 0; i < 36; i++, ptr_data += 2)
6861 {
6862 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
6863 }
6864
6865 for (uint i = 0; i < 16; i++, ptr_data += 2)
6866 {
6867 sprintf (ptr_data, "%02x", ptr_checksum[i]);
6868 }
6869
6870 *ptr_data = 0;
6871
6872 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
6873 SIGNATURE_KRB5PA,
6874 (char *) krb5pa->user,
6875 (char *) krb5pa->realm,
6876 (char *) krb5pa->salt,
6877 data);
6878 }
6879 else if (hash_mode == 7700)
6880 {
6881 snprintf (out_buf, len-1, "%s$%08X%08X",
6882 (char *) salt.salt_buf,
6883 digest_buf[0],
6884 digest_buf[1]);
6885 }
6886 else if (hash_mode == 7800)
6887 {
6888 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
6889 (char *) salt.salt_buf,
6890 digest_buf[0],
6891 digest_buf[1],
6892 digest_buf[2],
6893 digest_buf[3],
6894 digest_buf[4]);
6895 }
6896 else if (hash_mode == 7900)
6897 {
6898 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6899
6900 // ugly hack start
6901
6902 char *tmp = (char *) salt.salt_buf_pc;
6903
6904 ptr_plain[42] = tmp[0];
6905
6906 // ugly hack end
6907
6908 ptr_plain[43] = 0;
6909
6910 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6911 }
6912 else if (hash_mode == 8000)
6913 {
6914 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
6915 (unsigned char *) salt.salt_buf,
6916 digest_buf[0],
6917 digest_buf[1],
6918 digest_buf[2],
6919 digest_buf[3],
6920 digest_buf[4],
6921 digest_buf[5],
6922 digest_buf[6],
6923 digest_buf[7]);
6924 }
6925 else if (hash_mode == 8100)
6926 {
6927 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6928 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6929
6930 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
6931 (unsigned char *) salt.salt_buf,
6932 digest_buf[0],
6933 digest_buf[1],
6934 digest_buf[2],
6935 digest_buf[3],
6936 digest_buf[4]);
6937 }
6938 else if (hash_mode == 8200)
6939 {
6940 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
6941
6942 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
6943
6944 char data_buf[4096];
6945
6946 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
6947 {
6948 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
6949 }
6950
6951 data_buf[cloudkey->data_len * 2] = 0;
6952
6953 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6954 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6955 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6956 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6957 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6958 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6959 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6960 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6961
6962 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6963 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6964 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
6965 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
6966
6967 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
6968 digest_buf[0],
6969 digest_buf[1],
6970 digest_buf[2],
6971 digest_buf[3],
6972 digest_buf[4],
6973 digest_buf[5],
6974 digest_buf[6],
6975 digest_buf[7],
6976 salt.salt_buf[0],
6977 salt.salt_buf[1],
6978 salt.salt_buf[2],
6979 salt.salt_buf[3],
6980 salt.salt_iter + 1,
6981 data_buf);
6982 }
6983 else if (hash_mode == 8300)
6984 {
6985 // todo
6986
6987 char digest_buf_c[33];
6988
6989 base32_encode (int_to_itoa32, (char *) digest_buf, 32, digest_buf_c);
6990
6991 digest_buf_c[32] = 0;
6992
6993 // domain
6994
6995 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
6996
6997 char domain_buf_c[33];
6998
6999 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7000
7001 for (uint i = 0; i < salt_pc_len; i++)
7002 {
7003 const char next = domain_buf_c[i];
7004
7005 domain_buf_c[i] = '.';
7006
7007 i += next;
7008 }
7009
7010 domain_buf_c[salt_pc_len] = 0;
7011
7012 // final
7013
7014 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7015 }
7016 else if (hash_mode == 8500)
7017 {
7018 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7019 }
7020 else if (hash_mode == 2612)
7021 {
7022 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7023 SIGNATURE_PHPS,
7024 (char *) salt.salt_buf,
7025 digest_buf[0],
7026 digest_buf[1],
7027 digest_buf[2],
7028 digest_buf[3]);
7029 }
7030 else if (hash_mode == 3711)
7031 {
7032 char *salt_ptr = (char *) salt.salt_buf;
7033
7034 salt_ptr[salt.salt_len - 1] = 0;
7035
7036 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7037 SIGNATURE_MEDIAWIKI_B,
7038 salt_ptr,
7039 digest_buf[0],
7040 digest_buf[1],
7041 digest_buf[2],
7042 digest_buf[3]);
7043 }
7044 else if (hash_mode == 8800)
7045 {
7046 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7047
7048 androidfde_t *androidfde = &androidfdes[salt_pos];
7049
7050 char tmp[3073];
7051
7052 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7053 {
7054 sprintf (tmp + j, "%08x", androidfde->data[i]);
7055 }
7056
7057 tmp[3072] = 0;
7058
7059 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7060 SIGNATURE_ANDROIDFDE,
7061 byte_swap_32 (salt.salt_buf[0]),
7062 byte_swap_32 (salt.salt_buf[1]),
7063 byte_swap_32 (salt.salt_buf[2]),
7064 byte_swap_32 (salt.salt_buf[3]),
7065 byte_swap_32 (digest_buf[0]),
7066 byte_swap_32 (digest_buf[1]),
7067 byte_swap_32 (digest_buf[2]),
7068 byte_swap_32 (digest_buf[3]),
7069 tmp);
7070 }
7071 else if (hash_mode == 8900)
7072 {
7073 uint N = salt.scrypt_N;
7074 uint r = salt.scrypt_r;
7075 uint p = salt.scrypt_p;
7076
7077 char base64_salt[32];
7078
7079 memset (base64_salt, 0, 32);
7080
7081 base64_encode (int_to_base64, (char *) salt.salt_buf, salt.salt_len, base64_salt + 0);
7082
7083 memset (tmp_buf, 0, 46);
7084
7085 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7086 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7087 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7088 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7089 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7090 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7091 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7092 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7093 digest_buf[8] = 0; // needed for base64_encode ()
7094
7095 base64_encode (int_to_base64, (char *) digest_buf, 32, tmp_buf + 0);
7096
7097 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7098 SIGNATURE_SCRYPT,
7099 N,
7100 r,
7101 p,
7102 base64_salt,
7103 tmp_buf);
7104 }
7105 else if (hash_mode == 9000)
7106 {
7107 snprintf (out_buf, len-1, "%s", hashfile);
7108 }
7109 else if (hash_mode == 9200)
7110 {
7111 // salt
7112
7113 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7114
7115 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7116
7117 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7118
7119 // hash
7120
7121 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7122 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7123 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7124 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7125 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7126 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7127 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7128 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7129 digest_buf[8] = 0; // needed for base64_encode ()
7130
7131 char tmp_buf[64];
7132 memset (tmp_buf, 0, sizeof (tmp_buf));
7133
7134 base64_encode (int_to_itoa64, (char *) digest_buf, 32, tmp_buf);
7135 tmp_buf[43] = 0; // cut it here
7136
7137 // output
7138
7139 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7140 }
7141 else if (hash_mode == 9300)
7142 {
7143 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7144 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7145 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7146 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7147 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7148 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7149 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7150 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7151 digest_buf[8] = 0; // needed for base64_encode ()
7152
7153 char tmp_buf[64];
7154 memset (tmp_buf, 0, sizeof (tmp_buf));
7155
7156 base64_encode (int_to_itoa64, (char *) digest_buf, 32, tmp_buf);
7157 tmp_buf[43] = 0; // cut it here
7158
7159 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7160
7161 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7162 }
7163 else if (hash_mode == 9400)
7164 {
7165 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7166
7167 office2007_t *office2007 = &office2007s[salt_pos];
7168
7169 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7170 SIGNATURE_OFFICE2007,
7171 2007,
7172 20,
7173 office2007->keySize,
7174 16,
7175 salt.salt_buf[0],
7176 salt.salt_buf[1],
7177 salt.salt_buf[2],
7178 salt.salt_buf[3],
7179 office2007->encryptedVerifier[0],
7180 office2007->encryptedVerifier[1],
7181 office2007->encryptedVerifier[2],
7182 office2007->encryptedVerifier[3],
7183 office2007->encryptedVerifierHash[0],
7184 office2007->encryptedVerifierHash[1],
7185 office2007->encryptedVerifierHash[2],
7186 office2007->encryptedVerifierHash[3],
7187 office2007->encryptedVerifierHash[4]);
7188 }
7189 else if (hash_mode == 9500)
7190 {
7191 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7192
7193 office2010_t *office2010 = &office2010s[salt_pos];
7194
7195 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,
7196
7197 salt.salt_buf[0],
7198 salt.salt_buf[1],
7199 salt.salt_buf[2],
7200 salt.salt_buf[3],
7201 office2010->encryptedVerifier[0],
7202 office2010->encryptedVerifier[1],
7203 office2010->encryptedVerifier[2],
7204 office2010->encryptedVerifier[3],
7205 office2010->encryptedVerifierHash[0],
7206 office2010->encryptedVerifierHash[1],
7207 office2010->encryptedVerifierHash[2],
7208 office2010->encryptedVerifierHash[3],
7209 office2010->encryptedVerifierHash[4],
7210 office2010->encryptedVerifierHash[5],
7211 office2010->encryptedVerifierHash[6],
7212 office2010->encryptedVerifierHash[7]);
7213 }
7214 else if (hash_mode == 9600)
7215 {
7216 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7217
7218 office2013_t *office2013 = &office2013s[salt_pos];
7219
7220 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,
7221
7222 salt.salt_buf[0],
7223 salt.salt_buf[1],
7224 salt.salt_buf[2],
7225 salt.salt_buf[3],
7226 office2013->encryptedVerifier[0],
7227 office2013->encryptedVerifier[1],
7228 office2013->encryptedVerifier[2],
7229 office2013->encryptedVerifier[3],
7230 office2013->encryptedVerifierHash[0],
7231 office2013->encryptedVerifierHash[1],
7232 office2013->encryptedVerifierHash[2],
7233 office2013->encryptedVerifierHash[3],
7234 office2013->encryptedVerifierHash[4],
7235 office2013->encryptedVerifierHash[5],
7236 office2013->encryptedVerifierHash[6],
7237 office2013->encryptedVerifierHash[7]);
7238 }
7239 else if (hash_mode == 9700)
7240 {
7241 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7242
7243 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7244
7245 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7246 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7247 byte_swap_32 (salt.salt_buf[0]),
7248 byte_swap_32 (salt.salt_buf[1]),
7249 byte_swap_32 (salt.salt_buf[2]),
7250 byte_swap_32 (salt.salt_buf[3]),
7251 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7252 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7253 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7254 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7255 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7256 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7257 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7258 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7259 }
7260 else if (hash_mode == 9710)
7261 {
7262 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7263
7264 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7265
7266 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7267 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7268 byte_swap_32 (salt.salt_buf[0]),
7269 byte_swap_32 (salt.salt_buf[1]),
7270 byte_swap_32 (salt.salt_buf[2]),
7271 byte_swap_32 (salt.salt_buf[3]),
7272 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7273 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7274 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7275 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7276 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7277 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7278 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7279 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7280 }
7281 else if (hash_mode == 9720)
7282 {
7283 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7284
7285 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7286
7287 uint8_t *rc4key = (uint8_t *) oldoffice01->rc4key;
7288
7289 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7290 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7291 byte_swap_32 (salt.salt_buf[0]),
7292 byte_swap_32 (salt.salt_buf[1]),
7293 byte_swap_32 (salt.salt_buf[2]),
7294 byte_swap_32 (salt.salt_buf[3]),
7295 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7296 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7297 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7298 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7299 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7300 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7301 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7302 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7303 rc4key[0],
7304 rc4key[1],
7305 rc4key[2],
7306 rc4key[3],
7307 rc4key[4]);
7308 }
7309 else if (hash_mode == 9800)
7310 {
7311 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7312
7313 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7314
7315 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7316 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7317 salt.salt_buf[0],
7318 salt.salt_buf[1],
7319 salt.salt_buf[2],
7320 salt.salt_buf[3],
7321 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7322 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7323 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7324 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7325 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7326 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7327 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7328 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7329 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7330 }
7331 else if (hash_mode == 9810)
7332 {
7333 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7334
7335 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7336
7337 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7338 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7339 salt.salt_buf[0],
7340 salt.salt_buf[1],
7341 salt.salt_buf[2],
7342 salt.salt_buf[3],
7343 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7344 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7345 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7346 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7347 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7348 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7349 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7350 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7351 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7352 }
7353 else if (hash_mode == 9820)
7354 {
7355 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7356
7357 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7358
7359 uint8_t *rc4key = (uint8_t *) oldoffice34->rc4key;
7360
7361 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7362 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7363 salt.salt_buf[0],
7364 salt.salt_buf[1],
7365 salt.salt_buf[2],
7366 salt.salt_buf[3],
7367 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7368 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7369 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7370 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7371 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7372 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7373 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7374 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7375 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7376 rc4key[0],
7377 rc4key[1],
7378 rc4key[2],
7379 rc4key[3],
7380 rc4key[4]);
7381 }
7382 else if (hash_mode == 10000)
7383 {
7384 // salt
7385
7386 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7387
7388 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7389
7390 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7391
7392 // hash
7393
7394 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7395 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7396 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7397 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7398 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7399 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7400 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7401 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7402 digest_buf[8] = 0; // needed for base64_encode ()
7403
7404 char tmp_buf[64];
7405 memset (tmp_buf, 0, sizeof (tmp_buf));
7406
7407 base64_encode (int_to_base64, (char *) digest_buf, 32, tmp_buf);
7408
7409 // output
7410
7411 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7412 }
7413 else if (hash_mode == 10100)
7414 {
7415 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7416 digest_buf[0],
7417 digest_buf[1],
7418 2,
7419 4,
7420 byte_swap_32 (salt.salt_buf[0]),
7421 byte_swap_32 (salt.salt_buf[1]),
7422 byte_swap_32 (salt.salt_buf[2]),
7423 byte_swap_32 (salt.salt_buf[3]));
7424 }
7425 else if (hash_mode == 10200)
7426 {
7427 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7428
7429 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7430
7431 // challenge
7432
7433 char challenge[100];
7434
7435 memset (challenge, 0, sizeof (challenge));
7436
7437 base64_encode (int_to_base64, (char *) salt.salt_buf, salt.salt_len, challenge);
7438
7439 // response
7440
7441 char tmp_buf[100];
7442
7443 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7444 (char *) cram_md5->user,
7445 digest_buf[0],
7446 digest_buf[1],
7447 digest_buf[2],
7448 digest_buf[3]);
7449
7450 char response[100];
7451
7452 memset (response, 0, sizeof (response));
7453
7454 base64_encode (int_to_base64, (char *) tmp_buf, tmp_len, response);
7455
7456 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7457 }
7458 else if (hash_mode == 10300)
7459 {
7460 char tmp_buf[100];
7461
7462 memset (tmp_buf, 0, sizeof (tmp_buf));
7463
7464 memcpy (tmp_buf + 0, digest_buf, 20);
7465 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7466
7467 uint tmp_len = 20 + salt.salt_len;
7468
7469 // base64 encode it
7470
7471 char base64_encoded[100];
7472
7473 memset (base64_encoded, 0, sizeof (base64_encoded));
7474
7475 base64_encode (int_to_base64, (char *) tmp_buf, tmp_len, base64_encoded);
7476
7477 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7478 }
7479 else if (hash_mode == 10400)
7480 {
7481 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7482
7483 pdf_t *pdf = &pdfs[salt_pos];
7484
7485 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",
7486
7487 pdf->V,
7488 pdf->R,
7489 40,
7490 pdf->P,
7491 pdf->enc_md,
7492 pdf->id_len,
7493 byte_swap_32 (pdf->id_buf[0]),
7494 byte_swap_32 (pdf->id_buf[1]),
7495 byte_swap_32 (pdf->id_buf[2]),
7496 byte_swap_32 (pdf->id_buf[3]),
7497 pdf->u_len,
7498 byte_swap_32 (pdf->u_buf[0]),
7499 byte_swap_32 (pdf->u_buf[1]),
7500 byte_swap_32 (pdf->u_buf[2]),
7501 byte_swap_32 (pdf->u_buf[3]),
7502 byte_swap_32 (pdf->u_buf[4]),
7503 byte_swap_32 (pdf->u_buf[5]),
7504 byte_swap_32 (pdf->u_buf[6]),
7505 byte_swap_32 (pdf->u_buf[7]),
7506 pdf->o_len,
7507 byte_swap_32 (pdf->o_buf[0]),
7508 byte_swap_32 (pdf->o_buf[1]),
7509 byte_swap_32 (pdf->o_buf[2]),
7510 byte_swap_32 (pdf->o_buf[3]),
7511 byte_swap_32 (pdf->o_buf[4]),
7512 byte_swap_32 (pdf->o_buf[5]),
7513 byte_swap_32 (pdf->o_buf[6]),
7514 byte_swap_32 (pdf->o_buf[7])
7515 );
7516 }
7517 else if (hash_mode == 10410)
7518 {
7519 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7520
7521 pdf_t *pdf = &pdfs[salt_pos];
7522
7523 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",
7524
7525 pdf->V,
7526 pdf->R,
7527 40,
7528 pdf->P,
7529 pdf->enc_md,
7530 pdf->id_len,
7531 byte_swap_32 (pdf->id_buf[0]),
7532 byte_swap_32 (pdf->id_buf[1]),
7533 byte_swap_32 (pdf->id_buf[2]),
7534 byte_swap_32 (pdf->id_buf[3]),
7535 pdf->u_len,
7536 byte_swap_32 (pdf->u_buf[0]),
7537 byte_swap_32 (pdf->u_buf[1]),
7538 byte_swap_32 (pdf->u_buf[2]),
7539 byte_swap_32 (pdf->u_buf[3]),
7540 byte_swap_32 (pdf->u_buf[4]),
7541 byte_swap_32 (pdf->u_buf[5]),
7542 byte_swap_32 (pdf->u_buf[6]),
7543 byte_swap_32 (pdf->u_buf[7]),
7544 pdf->o_len,
7545 byte_swap_32 (pdf->o_buf[0]),
7546 byte_swap_32 (pdf->o_buf[1]),
7547 byte_swap_32 (pdf->o_buf[2]),
7548 byte_swap_32 (pdf->o_buf[3]),
7549 byte_swap_32 (pdf->o_buf[4]),
7550 byte_swap_32 (pdf->o_buf[5]),
7551 byte_swap_32 (pdf->o_buf[6]),
7552 byte_swap_32 (pdf->o_buf[7])
7553 );
7554 }
7555 else if (hash_mode == 10420)
7556 {
7557 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7558
7559 pdf_t *pdf = &pdfs[salt_pos];
7560
7561 uint8_t *rc4key = (uint8_t *) pdf->rc4key;
7562
7563 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",
7564
7565 pdf->V,
7566 pdf->R,
7567 40,
7568 pdf->P,
7569 pdf->enc_md,
7570 pdf->id_len,
7571 byte_swap_32 (pdf->id_buf[0]),
7572 byte_swap_32 (pdf->id_buf[1]),
7573 byte_swap_32 (pdf->id_buf[2]),
7574 byte_swap_32 (pdf->id_buf[3]),
7575 pdf->u_len,
7576 byte_swap_32 (pdf->u_buf[0]),
7577 byte_swap_32 (pdf->u_buf[1]),
7578 byte_swap_32 (pdf->u_buf[2]),
7579 byte_swap_32 (pdf->u_buf[3]),
7580 byte_swap_32 (pdf->u_buf[4]),
7581 byte_swap_32 (pdf->u_buf[5]),
7582 byte_swap_32 (pdf->u_buf[6]),
7583 byte_swap_32 (pdf->u_buf[7]),
7584 pdf->o_len,
7585 byte_swap_32 (pdf->o_buf[0]),
7586 byte_swap_32 (pdf->o_buf[1]),
7587 byte_swap_32 (pdf->o_buf[2]),
7588 byte_swap_32 (pdf->o_buf[3]),
7589 byte_swap_32 (pdf->o_buf[4]),
7590 byte_swap_32 (pdf->o_buf[5]),
7591 byte_swap_32 (pdf->o_buf[6]),
7592 byte_swap_32 (pdf->o_buf[7]),
7593 rc4key[0],
7594 rc4key[1],
7595 rc4key[2],
7596 rc4key[3],
7597 rc4key[4]
7598 );
7599 }
7600 else if (hash_mode == 10500)
7601 {
7602 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7603
7604 pdf_t *pdf = &pdfs[salt_pos];
7605
7606 if (pdf->id_len == 32)
7607 {
7608 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",
7609
7610 pdf->V,
7611 pdf->R,
7612 128,
7613 pdf->P,
7614 pdf->enc_md,
7615 pdf->id_len,
7616 byte_swap_32 (pdf->id_buf[0]),
7617 byte_swap_32 (pdf->id_buf[1]),
7618 byte_swap_32 (pdf->id_buf[2]),
7619 byte_swap_32 (pdf->id_buf[3]),
7620 byte_swap_32 (pdf->id_buf[4]),
7621 byte_swap_32 (pdf->id_buf[5]),
7622 byte_swap_32 (pdf->id_buf[6]),
7623 byte_swap_32 (pdf->id_buf[7]),
7624 pdf->u_len,
7625 byte_swap_32 (pdf->u_buf[0]),
7626 byte_swap_32 (pdf->u_buf[1]),
7627 byte_swap_32 (pdf->u_buf[2]),
7628 byte_swap_32 (pdf->u_buf[3]),
7629 byte_swap_32 (pdf->u_buf[4]),
7630 byte_swap_32 (pdf->u_buf[5]),
7631 byte_swap_32 (pdf->u_buf[6]),
7632 byte_swap_32 (pdf->u_buf[7]),
7633 pdf->o_len,
7634 byte_swap_32 (pdf->o_buf[0]),
7635 byte_swap_32 (pdf->o_buf[1]),
7636 byte_swap_32 (pdf->o_buf[2]),
7637 byte_swap_32 (pdf->o_buf[3]),
7638 byte_swap_32 (pdf->o_buf[4]),
7639 byte_swap_32 (pdf->o_buf[5]),
7640 byte_swap_32 (pdf->o_buf[6]),
7641 byte_swap_32 (pdf->o_buf[7])
7642 );
7643 }
7644 else
7645 {
7646 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",
7647
7648 pdf->V,
7649 pdf->R,
7650 128,
7651 pdf->P,
7652 pdf->enc_md,
7653 pdf->id_len,
7654 byte_swap_32 (pdf->id_buf[0]),
7655 byte_swap_32 (pdf->id_buf[1]),
7656 byte_swap_32 (pdf->id_buf[2]),
7657 byte_swap_32 (pdf->id_buf[3]),
7658 pdf->u_len,
7659 byte_swap_32 (pdf->u_buf[0]),
7660 byte_swap_32 (pdf->u_buf[1]),
7661 byte_swap_32 (pdf->u_buf[2]),
7662 byte_swap_32 (pdf->u_buf[3]),
7663 byte_swap_32 (pdf->u_buf[4]),
7664 byte_swap_32 (pdf->u_buf[5]),
7665 byte_swap_32 (pdf->u_buf[6]),
7666 byte_swap_32 (pdf->u_buf[7]),
7667 pdf->o_len,
7668 byte_swap_32 (pdf->o_buf[0]),
7669 byte_swap_32 (pdf->o_buf[1]),
7670 byte_swap_32 (pdf->o_buf[2]),
7671 byte_swap_32 (pdf->o_buf[3]),
7672 byte_swap_32 (pdf->o_buf[4]),
7673 byte_swap_32 (pdf->o_buf[5]),
7674 byte_swap_32 (pdf->o_buf[6]),
7675 byte_swap_32 (pdf->o_buf[7])
7676 );
7677 }
7678 }
7679 else if (hash_mode == 10600)
7680 {
7681 uint digest_idx = salt.digests_offset + digest_pos;
7682
7683 hashinfo_t **hashinfo_ptr = data.hash_info;
7684 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7685
7686 snprintf (out_buf, len-1, "%s", hash_buf);
7687 }
7688 else if (hash_mode == 10700)
7689 {
7690 uint digest_idx = salt.digests_offset + digest_pos;
7691
7692 hashinfo_t **hashinfo_ptr = data.hash_info;
7693 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7694
7695 snprintf (out_buf, len-1, "%s", hash_buf);
7696 }
7697 else if (hash_mode == 10900)
7698 {
7699 uint digest_idx = salt.digests_offset + digest_pos;
7700
7701 hashinfo_t **hashinfo_ptr = data.hash_info;
7702 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7703
7704 snprintf (out_buf, len-1, "%s", hash_buf);
7705 }
7706 else if (hash_mode == 11100)
7707 {
7708 uint32_t salt_challenge = salt.salt_buf[0];
7709
7710 salt_challenge = byte_swap_32 (salt_challenge);
7711
7712 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7713
7714 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7715 SIGNATURE_POSTGRESQL_AUTH,
7716 user_name,
7717 salt_challenge,
7718 digest_buf[0],
7719 digest_buf[1],
7720 digest_buf[2],
7721 digest_buf[3]);
7722 }
7723 else if (hash_mode == 11200)
7724 {
7725 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7726 SIGNATURE_MYSQL_AUTH,
7727 (unsigned char *) salt.salt_buf,
7728 digest_buf[0],
7729 digest_buf[1],
7730 digest_buf[2],
7731 digest_buf[3],
7732 digest_buf[4]);
7733 }
7734 else if (hash_mode == 11300)
7735 {
7736 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7737
7738 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7739
7740 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7741 const uint ckey_len = bitcoin_wallet->ckey_len;
7742 const uint public_key_len = bitcoin_wallet->public_key_len;
7743
7744 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7745 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7746 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7747
7748 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7749 {
7750 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->cry_master_buf;
7751
7752 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7753 }
7754
7755 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7756 {
7757 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->ckey_buf;
7758
7759 sprintf (ckey_buf + j, "%02x", ptr[i]);
7760 }
7761
7762 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7763 {
7764 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->public_key_buf;
7765
7766 sprintf (public_key_buf + j, "%02x", ptr[i]);
7767 }
7768
7769 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
7770 SIGNATURE_BITCOIN_WALLET,
7771 cry_master_len * 2,
7772 cry_master_buf,
7773 salt.salt_len,
7774 (unsigned char *) salt.salt_buf,
7775 salt.salt_iter + 1,
7776 ckey_len * 2,
7777 ckey_buf,
7778 public_key_len * 2,
7779 public_key_buf
7780 );
7781
7782 free (cry_master_buf);
7783 free (ckey_buf);
7784 free (public_key_buf);
7785 }
7786 else if (hash_mode == 11400)
7787 {
7788 uint digest_idx = salt.digests_offset + digest_pos;
7789
7790 hashinfo_t **hashinfo_ptr = data.hash_info;
7791 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7792
7793 snprintf (out_buf, len-1, "%s", hash_buf);
7794 }
7795 else if (hash_mode == 11600)
7796 {
7797 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
7798
7799 seven_zip_t *seven_zip = &seven_zips[salt_pos];
7800
7801 const uint data_len = seven_zip->data_len;
7802
7803 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
7804
7805 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
7806 {
7807 const uint8_t *ptr = (const uint8_t *) seven_zip->data_buf;
7808
7809 sprintf (data_buf + j, "%02x", ptr[i]);
7810 }
7811
7812 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
7813 SIGNATURE_SEVEN_ZIP,
7814 0,
7815 salt.salt_sign[0],
7816 0,
7817 (char *) seven_zip->salt_buf,
7818 seven_zip->iv_len,
7819 seven_zip->iv_buf[0],
7820 seven_zip->iv_buf[1],
7821 seven_zip->iv_buf[2],
7822 seven_zip->iv_buf[3],
7823 seven_zip->crc,
7824 seven_zip->data_len,
7825 seven_zip->unpack_size,
7826 data_buf);
7827
7828 free (data_buf);
7829 }
7830 else if (hash_mode == 11700)
7831 {
7832 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7833 digest_buf[0],
7834 digest_buf[1],
7835 digest_buf[2],
7836 digest_buf[3],
7837 digest_buf[4],
7838 digest_buf[5],
7839 digest_buf[6],
7840 digest_buf[7]);
7841 }
7842 else if (hash_mode == 11800)
7843 {
7844 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
7845 digest_buf[ 0],
7846 digest_buf[ 1],
7847 digest_buf[ 2],
7848 digest_buf[ 3],
7849 digest_buf[ 4],
7850 digest_buf[ 5],
7851 digest_buf[ 6],
7852 digest_buf[ 7],
7853 digest_buf[ 8],
7854 digest_buf[ 9],
7855 digest_buf[10],
7856 digest_buf[11],
7857 digest_buf[12],
7858 digest_buf[13],
7859 digest_buf[14],
7860 digest_buf[15]);
7861 }
7862 else if (hash_mode == 11900)
7863 {
7864 uint digest_idx = salt.digests_offset + digest_pos;
7865
7866 hashinfo_t **hashinfo_ptr = data.hash_info;
7867 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7868
7869 snprintf (out_buf, len-1, "%s", hash_buf);
7870 }
7871 else if (hash_mode == 12000)
7872 {
7873 uint digest_idx = salt.digests_offset + digest_pos;
7874
7875 hashinfo_t **hashinfo_ptr = data.hash_info;
7876 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7877
7878 snprintf (out_buf, len-1, "%s", hash_buf);
7879 }
7880 else if (hash_mode == 12100)
7881 {
7882 uint digest_idx = salt.digests_offset + digest_pos;
7883
7884 hashinfo_t **hashinfo_ptr = data.hash_info;
7885 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7886
7887 snprintf (out_buf, len-1, "%s", hash_buf);
7888 }
7889 else if (hash_mode == 12200)
7890 {
7891 uint *ptr_digest = digest_buf;
7892 uint *ptr_salt = salt.salt_buf;
7893
7894 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
7895 SIGNATURE_ECRYPTFS,
7896 ptr_salt[0],
7897 ptr_salt[1],
7898 ptr_digest[0],
7899 ptr_digest[1]);
7900 }
7901 else if (hash_mode == 12300)
7902 {
7903 uint *ptr_digest = digest_buf;
7904 uint *ptr_salt = salt.salt_buf;
7905
7906 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",
7907 ptr_digest[ 0], ptr_digest[ 1],
7908 ptr_digest[ 2], ptr_digest[ 3],
7909 ptr_digest[ 4], ptr_digest[ 5],
7910 ptr_digest[ 6], ptr_digest[ 7],
7911 ptr_digest[ 8], ptr_digest[ 9],
7912 ptr_digest[10], ptr_digest[11],
7913 ptr_digest[12], ptr_digest[13],
7914 ptr_digest[14], ptr_digest[15],
7915 ptr_salt[0],
7916 ptr_salt[1],
7917 ptr_salt[2],
7918 ptr_salt[3]);
7919 }
7920 else if (hash_mode == 12400)
7921 {
7922 // encode iteration count
7923
7924 char salt_iter[5];
7925
7926 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
7927 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
7928 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
7929 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
7930 salt_iter[4] = 0;
7931
7932 // encode salt
7933
7934 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
7935 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
7936 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
7937 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
7938 ptr_salt[4] = 0;
7939
7940 // encode digest
7941
7942 memset (tmp_buf, 0, sizeof (tmp_buf));
7943
7944 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7945 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7946
7947 memcpy (tmp_buf, digest_buf, 8);
7948
7949 base64_encode (int_to_itoa64, tmp_buf, 8, ptr_plain);
7950
7951 ptr_plain[11] = 0;
7952
7953 // fill the resulting buffer
7954
7955 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
7956 }
7957 else if (hash_mode == 12500)
7958 {
7959 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
7960 SIGNATURE_RAR3,
7961 byte_swap_32 (salt.salt_buf[0]),
7962 byte_swap_32 (salt.salt_buf[1]),
7963 salt.salt_buf[2],
7964 salt.salt_buf[3],
7965 salt.salt_buf[4],
7966 salt.salt_buf[5]);
7967 }
7968 else if (hash_mode == 12600)
7969 {
7970 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7971 digest_buf[0] + salt.salt_buf_pc[0],
7972 digest_buf[1] + salt.salt_buf_pc[1],
7973 digest_buf[2] + salt.salt_buf_pc[2],
7974 digest_buf[3] + salt.salt_buf_pc[3],
7975 digest_buf[4] + salt.salt_buf_pc[4],
7976 digest_buf[5] + salt.salt_buf_pc[5],
7977 digest_buf[6] + salt.salt_buf_pc[6],
7978 digest_buf[7] + salt.salt_buf_pc[7]);
7979 }
7980 else if (hash_mode == 12700)
7981 {
7982 uint digest_idx = salt.digests_offset + digest_pos;
7983
7984 hashinfo_t **hashinfo_ptr = data.hash_info;
7985 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7986
7987 snprintf (out_buf, len-1, "%s", hash_buf);
7988 }
7989 else if (hash_mode == 12800)
7990 {
7991 const uint8_t *ptr = (const uint8_t *) salt.salt_buf;
7992
7993 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",
7994 SIGNATURE_MS_DRSR,
7995 ptr[0],
7996 ptr[1],
7997 ptr[2],
7998 ptr[3],
7999 ptr[4],
8000 ptr[5],
8001 ptr[6],
8002 ptr[7],
8003 ptr[8],
8004 ptr[9],
8005 salt.salt_iter + 1,
8006 byte_swap_32 (digest_buf[0]),
8007 byte_swap_32 (digest_buf[1]),
8008 byte_swap_32 (digest_buf[2]),
8009 byte_swap_32 (digest_buf[3]),
8010 byte_swap_32 (digest_buf[4]),
8011 byte_swap_32 (digest_buf[5]),
8012 byte_swap_32 (digest_buf[6]),
8013 byte_swap_32 (digest_buf[7])
8014 );
8015 }
8016 else
8017 {
8018 if (hash_type == HASH_TYPE_MD4)
8019 {
8020 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8021 digest_buf[0],
8022 digest_buf[1],
8023 digest_buf[2],
8024 digest_buf[3]);
8025 }
8026 else if (hash_type == HASH_TYPE_MD5)
8027 {
8028 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8029 digest_buf[0],
8030 digest_buf[1],
8031 digest_buf[2],
8032 digest_buf[3]);
8033 }
8034 else if (hash_type == HASH_TYPE_SHA1)
8035 {
8036 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8037 digest_buf[0],
8038 digest_buf[1],
8039 digest_buf[2],
8040 digest_buf[3],
8041 digest_buf[4]);
8042 }
8043 else if (hash_type == HASH_TYPE_SHA256)
8044 {
8045 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8046 digest_buf[0],
8047 digest_buf[1],
8048 digest_buf[2],
8049 digest_buf[3],
8050 digest_buf[4],
8051 digest_buf[5],
8052 digest_buf[6],
8053 digest_buf[7]);
8054 }
8055 else if (hash_type == HASH_TYPE_SHA384)
8056 {
8057 uint *ptr = digest_buf;
8058
8059 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8060 ptr[ 1], ptr[ 0],
8061 ptr[ 3], ptr[ 2],
8062 ptr[ 5], ptr[ 4],
8063 ptr[ 7], ptr[ 6],
8064 ptr[ 9], ptr[ 8],
8065 ptr[11], ptr[10]);
8066 }
8067 else if (hash_type == HASH_TYPE_SHA512)
8068 {
8069 uint *ptr = digest_buf;
8070
8071 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8072 ptr[ 1], ptr[ 0],
8073 ptr[ 3], ptr[ 2],
8074 ptr[ 5], ptr[ 4],
8075 ptr[ 7], ptr[ 6],
8076 ptr[ 9], ptr[ 8],
8077 ptr[11], ptr[10],
8078 ptr[13], ptr[12],
8079 ptr[15], ptr[14]);
8080 }
8081 else if (hash_type == HASH_TYPE_LM)
8082 {
8083 snprintf (out_buf, len-1, "%08x%08x",
8084 digest_buf[0],
8085 digest_buf[1]);
8086 }
8087 else if (hash_type == HASH_TYPE_ORACLEH)
8088 {
8089 snprintf (out_buf, len-1, "%08X%08X",
8090 digest_buf[0],
8091 digest_buf[1]);
8092 }
8093 else if (hash_type == HASH_TYPE_BCRYPT)
8094 {
8095 base64_encode (int_to_bf64, (char *) salt.salt_buf, 16, tmp_buf + 0);
8096 base64_encode (int_to_bf64, (char *) digest_buf, 23, tmp_buf + 22);
8097
8098 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8099
8100 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8101 }
8102 else if (hash_type == HASH_TYPE_KECCAK)
8103 {
8104 uint *ptr = digest_buf;
8105
8106 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",
8107 ptr[ 1], ptr[ 0],
8108 ptr[ 3], ptr[ 2],
8109 ptr[ 5], ptr[ 4],
8110 ptr[ 7], ptr[ 6],
8111 ptr[ 9], ptr[ 8],
8112 ptr[11], ptr[10],
8113 ptr[13], ptr[12],
8114 ptr[15], ptr[14],
8115 ptr[17], ptr[16],
8116 ptr[19], ptr[18],
8117 ptr[21], ptr[20],
8118 ptr[23], ptr[22],
8119 ptr[25], ptr[24],
8120 ptr[27], ptr[26],
8121 ptr[29], ptr[28],
8122 ptr[31], ptr[30],
8123 ptr[33], ptr[32],
8124 ptr[35], ptr[34],
8125 ptr[37], ptr[36],
8126 ptr[39], ptr[38],
8127 ptr[41], ptr[30],
8128 ptr[43], ptr[42],
8129 ptr[45], ptr[44],
8130 ptr[47], ptr[46],
8131 ptr[49], ptr[48]
8132 );
8133
8134 out_buf[salt.keccak_mdlen * 2] = 0;
8135 }
8136 else if (hash_type == HASH_TYPE_RIPEMD160)
8137 {
8138 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8139 digest_buf[0],
8140 digest_buf[1],
8141 digest_buf[2],
8142 digest_buf[3],
8143 digest_buf[4]);
8144 }
8145 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8146 {
8147 digest_buf[ 0] = digest_buf[ 0];
8148 digest_buf[ 1] = digest_buf[ 1];
8149 digest_buf[ 2] = digest_buf[ 2];
8150 digest_buf[ 3] = digest_buf[ 3];
8151 digest_buf[ 4] = digest_buf[ 4];
8152 digest_buf[ 5] = digest_buf[ 5];
8153 digest_buf[ 6] = digest_buf[ 6];
8154 digest_buf[ 7] = digest_buf[ 7];
8155 digest_buf[ 8] = digest_buf[ 8];
8156 digest_buf[ 9] = digest_buf[ 9];
8157 digest_buf[10] = digest_buf[10];
8158 digest_buf[11] = digest_buf[11];
8159 digest_buf[12] = digest_buf[12];
8160 digest_buf[13] = digest_buf[13];
8161 digest_buf[14] = digest_buf[14];
8162 digest_buf[15] = digest_buf[15];
8163
8164 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8165 digest_buf[ 0],
8166 digest_buf[ 1],
8167 digest_buf[ 2],
8168 digest_buf[ 3],
8169 digest_buf[ 4],
8170 digest_buf[ 5],
8171 digest_buf[ 6],
8172 digest_buf[ 7],
8173 digest_buf[ 8],
8174 digest_buf[ 9],
8175 digest_buf[10],
8176 digest_buf[11],
8177 digest_buf[12],
8178 digest_buf[13],
8179 digest_buf[14],
8180 digest_buf[15]);
8181 }
8182 else if (hash_type == HASH_TYPE_GOST)
8183 {
8184 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8185 digest_buf[0],
8186 digest_buf[1],
8187 digest_buf[2],
8188 digest_buf[3],
8189 digest_buf[4],
8190 digest_buf[5],
8191 digest_buf[6],
8192 digest_buf[7]);
8193 }
8194 else if (hash_type == HASH_TYPE_MYSQL)
8195 {
8196 snprintf (out_buf, len-1, "%08x%08x",
8197 digest_buf[0],
8198 digest_buf[1]);
8199 }
8200 else if (hash_type == HASH_TYPE_LOTUS5)
8201 {
8202 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8203 digest_buf[0],
8204 digest_buf[1],
8205 digest_buf[2],
8206 digest_buf[3]);
8207 }
8208 else if (hash_type == HASH_TYPE_LOTUS6)
8209 {
8210 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8211 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8212 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8213 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8214
8215 char buf[16];
8216
8217 memcpy (buf + 0, salt.salt_buf, 5);
8218 memcpy (buf + 5, digest_buf, 9);
8219
8220 buf[3] -= -4;
8221
8222 base64_encode (int_to_lotus64, buf, 14, tmp_buf);
8223
8224 tmp_buf[18] = salt.salt_buf_pc[7];
8225 tmp_buf[19] = 0;
8226
8227 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8228 }
8229 else if (hash_type == HASH_TYPE_LOTUS8)
8230 {
8231 char buf[52];
8232
8233 memset (buf, 0, sizeof (buf));
8234
8235 // salt
8236
8237 memcpy (buf + 0, salt.salt_buf, 16);
8238
8239 buf[3] -= -4;
8240
8241 // iteration
8242
8243 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8244
8245 // chars
8246
8247 buf[26] = salt.salt_buf_pc[0];
8248 buf[27] = salt.salt_buf_pc[1];
8249
8250 // digest
8251
8252 memcpy (buf + 28, digest_buf, 8);
8253
8254 base64_encode (int_to_lotus64, buf, 36, tmp_buf);
8255
8256 tmp_buf[49] = 0;
8257
8258 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8259 }
8260 else if (hash_type == HASH_TYPE_CRC32)
8261 {
8262 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8263 }
8264 }
8265
8266 if (salt_type == SALT_TYPE_INTERN)
8267 {
8268 size_t pos = strlen (out_buf);
8269
8270 out_buf[pos] = data.separator;
8271
8272 char *ptr = (char *) salt.salt_buf;
8273
8274 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8275
8276 out_buf[pos + 1 + salt.salt_len] = 0;
8277 }
8278 }
8279
8280 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8281 {
8282 memset (hccap, 0, sizeof (hccap_t));
8283
8284 salt_t *salt = &data.salts_buf[salt_pos];
8285
8286 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8287
8288 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8289 wpa_t *wpa = &wpas[salt_pos];
8290
8291 hccap->keyver = wpa->keyver;
8292
8293 hccap->eapol_size = wpa->eapol_size;
8294
8295 if (wpa->keyver != 1)
8296 {
8297 uint eapol_tmp[64];
8298
8299 for (uint i = 0; i < 64; i++)
8300 {
8301 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8302 }
8303
8304 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8305 }
8306 else
8307 {
8308 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8309 }
8310
8311 uint pke_tmp[25];
8312
8313 for (int i = 5; i < 25; i++)
8314 {
8315 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8316 }
8317
8318 char *pke_ptr = (char *) pke_tmp;
8319
8320 memcpy (hccap->mac1, pke_ptr + 23, 6);
8321 memcpy (hccap->mac2, pke_ptr + 29, 6);
8322 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8323 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8324
8325 char *digests_buf_ptr = (char *) data.digests_buf;
8326
8327 uint dgst_size = data.dgst_size;
8328
8329 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8330
8331 if (wpa->keyver != 1)
8332 {
8333 uint digest_tmp[4];
8334
8335 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8336 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8337 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8338 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8339
8340 memcpy (hccap->keymic, digest_tmp, 16);
8341 }
8342 else
8343 {
8344 memcpy (hccap->keymic, digest_ptr, 16);
8345 }
8346 }
8347
8348 void SuspendThreads ()
8349 {
8350 if (data.devices_status == STATUS_RUNNING)
8351 {
8352 hc_timer_set (&data.timer_paused);
8353
8354 data.devices_status = STATUS_PAUSED;
8355
8356 log_info ("Paused");
8357 }
8358 }
8359
8360 void ResumeThreads ()
8361 {
8362 if (data.devices_status == STATUS_PAUSED)
8363 {
8364 float ms_paused;
8365
8366 hc_timer_get (data.timer_paused, ms_paused);
8367
8368 data.ms_paused += ms_paused;
8369
8370 data.devices_status = STATUS_RUNNING;
8371
8372 log_info ("Resumed");
8373 }
8374 }
8375
8376 void bypass ()
8377 {
8378 if (data.devices_status != STATUS_RUNNING) return;
8379
8380 data.devices_status = STATUS_BYPASS;
8381
8382 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8383 }
8384
8385 void stop_at_checkpoint ()
8386 {
8387 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8388 {
8389 if (data.devices_status != STATUS_RUNNING) return;
8390 }
8391
8392 // this feature only makes sense if --restore-disable was not specified
8393
8394 if (data.restore_disable == 1)
8395 {
8396 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8397
8398 return;
8399 }
8400
8401 // check if monitoring of Restore Point updates should be enabled or disabled
8402
8403 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8404 {
8405 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8406
8407 // save the current restore point value
8408
8409 data.checkpoint_cur_words = get_lowest_words_done ();
8410
8411 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8412 }
8413 else
8414 {
8415 data.devices_status = STATUS_RUNNING;
8416
8417 // reset the global value for checkpoint checks
8418
8419 data.checkpoint_cur_words = 0;
8420
8421 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8422 }
8423 }
8424
8425 void myabort ()
8426 {
8427 if (data.devices_status == STATUS_INIT) return;
8428 if (data.devices_status == STATUS_STARTING) return;
8429
8430 data.devices_status = STATUS_ABORTED;
8431 }
8432
8433 void myquit ()
8434 {
8435 if (data.devices_status == STATUS_INIT) return;
8436 if (data.devices_status == STATUS_STARTING) return;
8437
8438 data.devices_status = STATUS_QUIT;
8439 }
8440
8441 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const unsigned char **kernel_sources)
8442 {
8443 FILE *fp;
8444
8445 if ((fp = fopen (kernel_file, "rb")) != NULL)
8446 {
8447 struct stat st;
8448
8449 memset (&st, 0, sizeof (st));
8450
8451 stat (kernel_file, &st);
8452
8453 unsigned char *buf = (unsigned char *) mymalloc (st.st_size + 1);
8454
8455 size_t num_read = fread (buf, sizeof (unsigned char), st.st_size, fp);
8456
8457 if (num_read != (size_t) st.st_size)
8458 {
8459 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8460
8461 exit (-1);
8462 }
8463
8464 fclose (fp);
8465
8466 buf[st.st_size] = 0;
8467
8468 for (int i = 0; i < num_devices; i++)
8469 {
8470 kernel_lengths[i] = (size_t) st.st_size;
8471
8472 kernel_sources[i] = buf;
8473 }
8474 }
8475 else
8476 {
8477 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8478
8479 exit (-1);
8480 }
8481
8482 return;
8483 }
8484
8485 void writeProgramBin (char *dst, unsigned char *binary, size_t binary_size)
8486 {
8487 FILE *fp = fopen (dst, "wb");
8488
8489 fwrite (binary, sizeof (unsigned char), binary_size, fp);
8490
8491 fflush (fp);
8492 fclose (fp);
8493 }
8494
8495 /**
8496 * restore
8497 */
8498
8499 restore_data_t *init_restore (int argc, char **argv)
8500 {
8501 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8502
8503 if (data.restore_disable == 0)
8504 {
8505 FILE *fp = fopen (data.eff_restore_file, "rb");
8506
8507 if (fp)
8508 {
8509 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8510
8511 if (nread != 1)
8512 {
8513 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8514
8515 exit (-1);
8516 }
8517
8518 fclose (fp);
8519
8520 if (rd->pid)
8521 {
8522 char pidbin[BUFSIZ];
8523
8524 int pidbin_len;
8525
8526 #ifdef _POSIX
8527 memset (pidbin, 0, sizeof (pidbin));
8528
8529 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8530
8531 FILE *fd = fopen (pidbin, "rb");
8532
8533 if (fd)
8534 {
8535 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8536
8537 pidbin[pidbin_len] = 0;
8538
8539 fclose (fd);
8540
8541 char *argv0_r = strrchr (argv[0], '/');
8542
8543 char *pidbin_r = strrchr (pidbin, '/');
8544
8545 if (argv0_r == NULL) argv0_r = argv[0];
8546
8547 if (pidbin_r == NULL) pidbin_r = pidbin;
8548
8549 if (strcmp (argv0_r, pidbin_r) == 0)
8550 {
8551 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8552
8553 exit (-1);
8554 }
8555 }
8556
8557 #elif _WIN
8558 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8559
8560 char pidbin2[BUFSIZ];
8561
8562 int pidbin2_len;
8563
8564 memset (pidbin2, 0, sizeof (pidbin2));
8565
8566 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8567 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8568
8569 pidbin[pidbin_len] = 0;
8570 pidbin2[pidbin2_len] = 0;
8571
8572 if (pidbin2_len)
8573 {
8574 if (strcmp (pidbin, pidbin2) == 0)
8575 {
8576 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8577
8578 exit (-1);
8579 }
8580 }
8581 #endif
8582 }
8583
8584 if (rd->version_bin < RESTORE_MIN)
8585 {
8586 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8587
8588 exit (-1);
8589 }
8590 }
8591 }
8592
8593 memset (rd, 0, sizeof (restore_data_t));
8594
8595 rd->version_bin = VERSION_BIN;
8596
8597 #ifdef _POSIX
8598 rd->pid = getpid ();
8599 #elif _WIN
8600 rd->pid = GetCurrentProcessId ();
8601 #endif
8602
8603 if (getcwd (rd->cwd, 255) == NULL)
8604 {
8605 myfree (rd);
8606
8607 return (NULL);
8608 }
8609
8610 rd->argc = argc;
8611 rd->argv = argv;
8612
8613 return (rd);
8614 }
8615
8616 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8617 {
8618 FILE *fp = fopen (eff_restore_file, "rb");
8619
8620 if (fp == NULL)
8621 {
8622 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8623
8624 exit (-1);
8625 }
8626
8627 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8628 {
8629 log_error ("ERROR: cannot read %s", eff_restore_file);
8630
8631 exit (-1);
8632 }
8633
8634 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8635
8636 for (uint i = 0; i < rd->argc; i++)
8637 {
8638 char buf[BUFSIZ];
8639
8640 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8641 {
8642 log_error ("ERROR: cannot read %s", eff_restore_file);
8643
8644 exit (-1);
8645 }
8646
8647 size_t len = strlen (buf);
8648
8649 if (len) buf[len - 1] = 0;
8650
8651 rd->argv[i] = mystrdup (buf);
8652 }
8653
8654 fclose (fp);
8655
8656 char new_cwd[256];
8657
8658 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8659
8660 if (nwd == NULL)
8661 {
8662 log_error ("Restore file is corrupted");
8663 }
8664
8665 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8666 {
8667 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8668 {
8669 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8670
8671 exit (-1);
8672 }
8673
8674 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8675 }
8676
8677
8678 if (chdir (rd->cwd))
8679 {
8680 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8681
8682 exit (-1);
8683 }
8684 }
8685
8686 uint64_t get_lowest_words_done ()
8687 {
8688 uint64_t words_cur = -1;
8689
8690 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8691 {
8692 hc_device_param_t *device_param = &data.devices_param[device_id];
8693
8694 const uint64_t words_done = device_param->words_done;
8695
8696 if (words_done < words_cur) words_cur = words_done;
8697 }
8698
8699 // It's possible that a GPU's workload isn't finished right after a restore-case.
8700 // In that case, this function would return 0 and overwrite the real restore point
8701 // There's also data.words_cur which is set to rd->words_cur but it changes while
8702 // the attack is running therefore we should stick to rd->words_cur.
8703 // Note that -s influences rd->words_cur we should keep a close look on that.
8704
8705 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
8706
8707 return words_cur;
8708 }
8709
8710 void write_restore (const char *new_restore_file, restore_data_t *rd)
8711 {
8712 uint64_t words_cur = get_lowest_words_done ();
8713
8714 rd->words_cur = words_cur;
8715
8716 FILE *fp = fopen (new_restore_file, "wb");
8717
8718 if (fp == NULL)
8719 {
8720 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
8721
8722 exit (-1);
8723 }
8724
8725 if (setvbuf (fp, NULL, _IONBF, 0))
8726 {
8727 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
8728
8729 exit (-1);
8730 }
8731
8732 fwrite (rd, sizeof (restore_data_t), 1, fp);
8733
8734 for (uint i = 0; i < rd->argc; i++)
8735 {
8736 fprintf (fp, "%s", rd->argv[i]);
8737 fputc ('\n', fp);
8738 }
8739
8740 fflush (fp);
8741
8742 fsync (fileno (fp));
8743
8744 fclose (fp);
8745 }
8746
8747 void cycle_restore ()
8748 {
8749 const char *eff_restore_file = data.eff_restore_file;
8750 const char *new_restore_file = data.new_restore_file;
8751
8752 restore_data_t *rd = data.rd;
8753
8754 write_restore (new_restore_file, rd);
8755
8756 struct stat st;
8757
8758 memset (&st, 0, sizeof(st));
8759
8760 if (stat (eff_restore_file, &st) == 0)
8761 {
8762 if (unlink (eff_restore_file))
8763 {
8764 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
8765 }
8766 }
8767
8768 if (rename (new_restore_file, eff_restore_file))
8769 {
8770 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
8771 }
8772 }
8773
8774 void check_checkpoint ()
8775 {
8776 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
8777
8778 uint64_t words_cur = get_lowest_words_done ();
8779
8780 if (words_cur != data.checkpoint_cur_words)
8781 {
8782 myabort ();
8783 }
8784 }
8785
8786 /**
8787 * adjustments
8788 */
8789
8790 uint set_gpu_accel (uint hash_mode)
8791 {
8792 switch (hash_mode)
8793 {
8794 case 0: return GET_ACCEL (0);
8795 case 10: return GET_ACCEL (10);
8796 case 11: return GET_ACCEL (11);
8797 case 12: return GET_ACCEL (12);
8798 case 20: return GET_ACCEL (20);
8799 case 21: return GET_ACCEL (21);
8800 case 22: return GET_ACCEL (22);
8801 case 23: return GET_ACCEL (23);
8802 case 30: return GET_ACCEL (30);
8803 case 40: return GET_ACCEL (40);
8804 case 50: return GET_ACCEL (50);
8805 case 60: return GET_ACCEL (60);
8806 case 100: return GET_ACCEL (100);
8807 case 101: return GET_ACCEL (101);
8808 case 110: return GET_ACCEL (110);
8809 case 111: return GET_ACCEL (111);
8810 case 112: return GET_ACCEL (112);
8811 case 120: return GET_ACCEL (120);
8812 case 121: return GET_ACCEL (121);
8813 case 122: return GET_ACCEL (122);
8814 case 124: return GET_ACCEL (124);
8815 case 130: return GET_ACCEL (130);
8816 case 131: return GET_ACCEL (131);
8817 case 132: return GET_ACCEL (132);
8818 case 133: return GET_ACCEL (133);
8819 case 140: return GET_ACCEL (140);
8820 case 141: return GET_ACCEL (141);
8821 case 150: return GET_ACCEL (150);
8822 case 160: return GET_ACCEL (160);
8823 case 190: return GET_ACCEL (190);
8824 case 200: return GET_ACCEL (200);
8825 case 300: return GET_ACCEL (300);
8826 case 400: return GET_ACCEL (400);
8827 case 500: return GET_ACCEL (500);
8828 case 501: return GET_ACCEL (501);
8829 case 900: return GET_ACCEL (900);
8830 case 910: return GET_ACCEL (910);
8831 case 1000: return GET_ACCEL (1000);
8832 case 1100: return GET_ACCEL (1100);
8833 case 1400: return GET_ACCEL (1400);
8834 case 1410: return GET_ACCEL (1410);
8835 case 1420: return GET_ACCEL (1420);
8836 case 1421: return GET_ACCEL (1421);
8837 case 1430: return GET_ACCEL (1430);
8838 case 1440: return GET_ACCEL (1440);
8839 case 1441: return GET_ACCEL (1441);
8840 case 1450: return GET_ACCEL (1450);
8841 case 1460: return GET_ACCEL (1460);
8842 case 1500: return GET_ACCEL (1500);
8843 case 1600: return GET_ACCEL (1600);
8844 case 1700: return GET_ACCEL (1700);
8845 case 1710: return GET_ACCEL (1710);
8846 case 1711: return GET_ACCEL (1711);
8847 case 1720: return GET_ACCEL (1720);
8848 case 1722: return GET_ACCEL (1722);
8849 case 1730: return GET_ACCEL (1730);
8850 case 1731: return GET_ACCEL (1731);
8851 case 1740: return GET_ACCEL (1740);
8852 case 1750: return GET_ACCEL (1750);
8853 case 1760: return GET_ACCEL (1760);
8854 case 1800: return GET_ACCEL (1800);
8855 case 2100: return GET_ACCEL (2100);
8856 case 2400: return GET_ACCEL (2400);
8857 case 2410: return GET_ACCEL (2410);
8858 case 2500: return GET_ACCEL (2500);
8859 case 2600: return GET_ACCEL (2600);
8860 case 2611: return GET_ACCEL (2611);
8861 case 2612: return GET_ACCEL (2612);
8862 case 2711: return GET_ACCEL (2711);
8863 case 2811: return GET_ACCEL (2811);
8864 case 3000: return GET_ACCEL (3000);
8865 case 3100: return GET_ACCEL (3100);
8866 case 3200: return GET_ACCEL (3200);
8867 case 3710: return GET_ACCEL (3710);
8868 case 3711: return GET_ACCEL (3711);
8869 case 3800: return GET_ACCEL (3800);
8870 case 4300: return GET_ACCEL (4300);
8871 case 4400: return GET_ACCEL (4400);
8872 case 4500: return GET_ACCEL (4500);
8873 case 4700: return GET_ACCEL (4700);
8874 case 4800: return GET_ACCEL (4800);
8875 case 4900: return GET_ACCEL (4900);
8876 case 5000: return GET_ACCEL (5000);
8877 case 5100: return GET_ACCEL (5100);
8878 case 5200: return GET_ACCEL (5200);
8879 case 5300: return GET_ACCEL (5300);
8880 case 5400: return GET_ACCEL (5400);
8881 case 5500: return GET_ACCEL (5500);
8882 case 5600: return GET_ACCEL (5600);
8883 case 5700: return GET_ACCEL (5700);
8884 case 5800: return GET_ACCEL (5800);
8885 case 6000: return GET_ACCEL (6000);
8886 case 6100: return GET_ACCEL (6100);
8887 case 6211: return GET_ACCEL (6211);
8888 case 6212: return GET_ACCEL (6212);
8889 case 6213: return GET_ACCEL (6213);
8890 case 6221: return GET_ACCEL (6221);
8891 case 6222: return GET_ACCEL (6222);
8892 case 6223: return GET_ACCEL (6223);
8893 case 6231: return GET_ACCEL (6231);
8894 case 6232: return GET_ACCEL (6232);
8895 case 6233: return GET_ACCEL (6233);
8896 case 6241: return GET_ACCEL (6241);
8897 case 6242: return GET_ACCEL (6242);
8898 case 6243: return GET_ACCEL (6243);
8899 case 6300: return GET_ACCEL (6300);
8900 case 6400: return GET_ACCEL (6400);
8901 case 6500: return GET_ACCEL (6500);
8902 case 6600: return GET_ACCEL (6600);
8903 case 6700: return GET_ACCEL (6700);
8904 case 6800: return GET_ACCEL (6800);
8905 case 6900: return GET_ACCEL (6900);
8906 case 7100: return GET_ACCEL (7100);
8907 case 7200: return GET_ACCEL (7200);
8908 case 7300: return GET_ACCEL (7300);
8909 case 7400: return GET_ACCEL (7400);
8910 case 7500: return GET_ACCEL (7500);
8911 case 7600: return GET_ACCEL (7600);
8912 case 7700: return GET_ACCEL (7700);
8913 case 7800: return GET_ACCEL (7800);
8914 case 7900: return GET_ACCEL (7900);
8915 case 8000: return GET_ACCEL (8000);
8916 case 8100: return GET_ACCEL (8100);
8917 case 8200: return GET_ACCEL (8200);
8918 case 8300: return GET_ACCEL (8300);
8919 case 8400: return GET_ACCEL (8400);
8920 case 8500: return GET_ACCEL (8500);
8921 case 8600: return GET_ACCEL (8600);
8922 case 8700: return GET_ACCEL (8700);
8923 case 8800: return GET_ACCEL (8800);
8924 case 8900: return GET_ACCEL (8900);
8925 case 9000: return GET_ACCEL (9000);
8926 case 9100: return GET_ACCEL (9100);
8927 case 9200: return GET_ACCEL (9200);
8928 case 9300: return GET_ACCEL (9300);
8929 case 9400: return GET_ACCEL (9400);
8930 case 9500: return GET_ACCEL (9500);
8931 case 9600: return GET_ACCEL (9600);
8932 case 9700: return GET_ACCEL (9700);
8933 case 9710: return GET_ACCEL (9710);
8934 case 9720: return GET_ACCEL (9720);
8935 case 9800: return GET_ACCEL (9800);
8936 case 9810: return GET_ACCEL (9810);
8937 case 9820: return GET_ACCEL (9820);
8938 case 9900: return GET_ACCEL (9900);
8939 case 10000: return GET_ACCEL (10000);
8940 case 10100: return GET_ACCEL (10100);
8941 case 10200: return GET_ACCEL (10200);
8942 case 10300: return GET_ACCEL (10300);
8943 case 10400: return GET_ACCEL (10400);
8944 case 10410: return GET_ACCEL (10410);
8945 case 10420: return GET_ACCEL (10420);
8946 case 10500: return GET_ACCEL (10500);
8947 case 10600: return GET_ACCEL (10600);
8948 case 10700: return GET_ACCEL (10700);
8949 case 10800: return GET_ACCEL (10800);
8950 case 10900: return GET_ACCEL (10900);
8951 case 11000: return GET_ACCEL (11000);
8952 case 11100: return GET_ACCEL (11100);
8953 case 11200: return GET_ACCEL (11200);
8954 case 11300: return GET_ACCEL (11300);
8955 case 11400: return GET_ACCEL (11400);
8956 case 11500: return GET_ACCEL (11500);
8957 case 11600: return GET_ACCEL (11600);
8958 case 11700: return GET_ACCEL (11700);
8959 case 11800: return GET_ACCEL (11800);
8960 case 11900: return GET_ACCEL (11900);
8961 case 12000: return GET_ACCEL (12000);
8962 case 12100: return GET_ACCEL (12100);
8963 case 12200: return GET_ACCEL (12200);
8964 case 12300: return GET_ACCEL (12300);
8965 case 12400: return GET_ACCEL (12400);
8966 case 12500: return GET_ACCEL (12500);
8967 case 12600: return GET_ACCEL (12600);
8968 case 12700: return GET_ACCEL (12700);
8969 case 12800: return GET_ACCEL (12800);
8970 }
8971
8972 return 0;
8973 }
8974
8975 uint set_gpu_loops (uint hash_mode)
8976 {
8977 switch (hash_mode)
8978 {
8979 case 0: return GET_LOOPS (0);
8980 case 10: return GET_LOOPS (10);
8981 case 11: return GET_LOOPS (11);
8982 case 12: return GET_LOOPS (12);
8983 case 20: return GET_LOOPS (20);
8984 case 21: return GET_LOOPS (21);
8985 case 22: return GET_LOOPS (22);
8986 case 23: return GET_LOOPS (23);
8987 case 30: return GET_LOOPS (30);
8988 case 40: return GET_LOOPS (40);
8989 case 50: return GET_LOOPS (50);
8990 case 60: return GET_LOOPS (60);
8991 case 100: return GET_LOOPS (100);
8992 case 101: return GET_LOOPS (101);
8993 case 110: return GET_LOOPS (110);
8994 case 111: return GET_LOOPS (111);
8995 case 112: return GET_LOOPS (112);
8996 case 120: return GET_LOOPS (120);
8997 case 121: return GET_LOOPS (121);
8998 case 122: return GET_LOOPS (122);
8999 case 124: return GET_LOOPS (124);
9000 case 130: return GET_LOOPS (130);
9001 case 131: return GET_LOOPS (131);
9002 case 132: return GET_LOOPS (132);
9003 case 133: return GET_LOOPS (133);
9004 case 140: return GET_LOOPS (140);
9005 case 141: return GET_LOOPS (141);
9006 case 150: return GET_LOOPS (150);
9007 case 160: return GET_LOOPS (160);
9008 case 190: return GET_LOOPS (190);
9009 case 200: return GET_LOOPS (200);
9010 case 300: return GET_LOOPS (300);
9011 case 400: return GET_LOOPS (400);
9012 case 500: return GET_LOOPS (500);
9013 case 501: return GET_LOOPS (501);
9014 case 900: return GET_LOOPS (900);
9015 case 910: return GET_LOOPS (910);
9016 case 1000: return GET_LOOPS (1000);
9017 case 1100: return GET_LOOPS (1100);
9018 case 1400: return GET_LOOPS (1400);
9019 case 1410: return GET_LOOPS (1410);
9020 case 1420: return GET_LOOPS (1420);
9021 case 1421: return GET_LOOPS (1421);
9022 case 1430: return GET_LOOPS (1430);
9023 case 1440: return GET_LOOPS (1440);
9024 case 1441: return GET_LOOPS (1441);
9025 case 1450: return GET_LOOPS (1450);
9026 case 1460: return GET_LOOPS (1460);
9027 case 1500: return GET_LOOPS (1500);
9028 case 1600: return GET_LOOPS (1600);
9029 case 1700: return GET_LOOPS (1700);
9030 case 1710: return GET_LOOPS (1710);
9031 case 1711: return GET_LOOPS (1711);
9032 case 1720: return GET_LOOPS (1720);
9033 case 1722: return GET_LOOPS (1722);
9034 case 1730: return GET_LOOPS (1730);
9035 case 1731: return GET_LOOPS (1731);
9036 case 1740: return GET_LOOPS (1740);
9037 case 1750: return GET_LOOPS (1750);
9038 case 1760: return GET_LOOPS (1760);
9039 case 1800: return GET_LOOPS (1800);
9040 case 2100: return GET_LOOPS (2100);
9041 case 2400: return GET_LOOPS (2400);
9042 case 2410: return GET_LOOPS (2410);
9043 case 2500: return GET_LOOPS (2500);
9044 case 2600: return GET_LOOPS (2600);
9045 case 2611: return GET_LOOPS (2611);
9046 case 2612: return GET_LOOPS (2612);
9047 case 2711: return GET_LOOPS (2711);
9048 case 2811: return GET_LOOPS (2811);
9049 case 3000: return GET_LOOPS (3000);
9050 case 3100: return GET_LOOPS (3100);
9051 case 3200: return GET_LOOPS (3200);
9052 case 3710: return GET_LOOPS (3710);
9053 case 3711: return GET_LOOPS (3711);
9054 case 3800: return GET_LOOPS (3800);
9055 case 4300: return GET_LOOPS (4300);
9056 case 4400: return GET_LOOPS (4400);
9057 case 4500: return GET_LOOPS (4500);
9058 case 4700: return GET_LOOPS (4700);
9059 case 4800: return GET_LOOPS (4800);
9060 case 4900: return GET_LOOPS (4900);
9061 case 5000: return GET_LOOPS (5000);
9062 case 5100: return GET_LOOPS (5100);
9063 case 5200: return GET_LOOPS (5200);
9064 case 5300: return GET_LOOPS (5300);
9065 case 5400: return GET_LOOPS (5400);
9066 case 5500: return GET_LOOPS (5500);
9067 case 5600: return GET_LOOPS (5600);
9068 case 5700: return GET_LOOPS (5700);
9069 case 5800: return GET_LOOPS (5800);
9070 case 6000: return GET_LOOPS (6000);
9071 case 6100: return GET_LOOPS (6100);
9072 case 6211: return GET_LOOPS (6211);
9073 case 6212: return GET_LOOPS (6212);
9074 case 6213: return GET_LOOPS (6213);
9075 case 6221: return GET_LOOPS (6221);
9076 case 6222: return GET_LOOPS (6222);
9077 case 6223: return GET_LOOPS (6223);
9078 case 6231: return GET_LOOPS (6231);
9079 case 6232: return GET_LOOPS (6232);
9080 case 6233: return GET_LOOPS (6233);
9081 case 6241: return GET_LOOPS (6241);
9082 case 6242: return GET_LOOPS (6242);
9083 case 6243: return GET_LOOPS (6243);
9084 case 6300: return GET_LOOPS (6300);
9085 case 6400: return GET_LOOPS (6400);
9086 case 6500: return GET_LOOPS (6500);
9087 case 6600: return GET_LOOPS (6600);
9088 case 6700: return GET_LOOPS (6700);
9089 case 6800: return GET_LOOPS (6800);
9090 case 6900: return GET_LOOPS (6900);
9091 case 7100: return GET_LOOPS (7100);
9092 case 7200: return GET_LOOPS (7200);
9093 case 7300: return GET_LOOPS (7300);
9094 case 7400: return GET_LOOPS (7400);
9095 case 7500: return GET_LOOPS (7500);
9096 case 7600: return GET_LOOPS (7600);
9097 case 7700: return GET_LOOPS (7700);
9098 case 7800: return GET_LOOPS (7800);
9099 case 7900: return GET_LOOPS (7900);
9100 case 8000: return GET_LOOPS (8000);
9101 case 8100: return GET_LOOPS (8100);
9102 case 8200: return GET_LOOPS (8200);
9103 case 8300: return GET_LOOPS (8300);
9104 case 8400: return GET_LOOPS (8400);
9105 case 8500: return GET_LOOPS (8500);
9106 case 8600: return GET_LOOPS (8600);
9107 case 8700: return GET_LOOPS (8700);
9108 case 8800: return GET_LOOPS (8800);
9109 case 8900: return GET_LOOPS (8900);
9110 case 9000: return GET_LOOPS (9000);
9111 case 9100: return GET_LOOPS (9100);
9112 case 9200: return GET_LOOPS (9200);
9113 case 9300: return GET_LOOPS (9300);
9114 case 9400: return GET_LOOPS (9400);
9115 case 9500: return GET_LOOPS (9500);
9116 case 9600: return GET_LOOPS (9600);
9117 case 9700: return GET_LOOPS (9700);
9118 case 9710: return GET_LOOPS (9710);
9119 case 9720: return GET_LOOPS (9720);
9120 case 9800: return GET_LOOPS (9800);
9121 case 9810: return GET_LOOPS (9810);
9122 case 9820: return GET_LOOPS (9820);
9123 case 9900: return GET_LOOPS (9900);
9124 case 10000: return GET_LOOPS (10000);
9125 case 10100: return GET_LOOPS (10100);
9126 case 10200: return GET_LOOPS (10200);
9127 case 10300: return GET_LOOPS (10300);
9128 case 10400: return GET_LOOPS (10400);
9129 case 10410: return GET_LOOPS (10410);
9130 case 10420: return GET_LOOPS (10420);
9131 case 10500: return GET_LOOPS (10500);
9132 case 10600: return GET_LOOPS (10600);
9133 case 10700: return GET_LOOPS (10700);
9134 case 10800: return GET_LOOPS (10800);
9135 case 10900: return GET_LOOPS (10900);
9136 case 11000: return GET_LOOPS (11000);
9137 case 11100: return GET_LOOPS (11100);
9138 case 11200: return GET_LOOPS (11200);
9139 case 11300: return GET_LOOPS (11300);
9140 case 11400: return GET_LOOPS (11400);
9141 case 11500: return GET_LOOPS (11500);
9142 case 11600: return GET_LOOPS (11600);
9143 case 11700: return GET_LOOPS (11700);
9144 case 11800: return GET_LOOPS (11800);
9145 case 11900: return GET_LOOPS (11900);
9146 case 12000: return GET_LOOPS (12000);
9147 case 12100: return GET_LOOPS (12100);
9148 case 12200: return GET_LOOPS (12200);
9149 case 12300: return GET_LOOPS (12300);
9150 case 12400: return GET_LOOPS (12400);
9151 case 12500: return GET_LOOPS (12500);
9152 case 12600: return GET_LOOPS (12600);
9153 case 12700: return GET_LOOPS (12700);
9154 case 12800: return GET_LOOPS (12800);
9155 }
9156
9157 return 0;
9158 }
9159
9160 /**
9161 * parser
9162 */
9163
9164 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9165 {
9166 char tmp[256];
9167
9168 if (salt_len > sizeof(tmp))
9169 {
9170 return UINT_MAX;
9171 }
9172
9173 memset (tmp, 0, sizeof (tmp));
9174 memcpy (tmp, in, salt_len);
9175
9176 if (data.opts_type & OPTS_TYPE_ST_HEX)
9177 {
9178 if ((salt_len % 2) == 0)
9179 {
9180 uint new_salt_len = salt_len / 2;
9181
9182 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9183 {
9184 char p0 = tmp[j + 0];
9185 char p1 = tmp[j + 1];
9186
9187 tmp[i] = hex_convert (p1) << 0;
9188 tmp[i] |= hex_convert (p0) << 4;
9189 }
9190
9191 salt_len = new_salt_len;
9192 }
9193 else
9194 {
9195 return UINT_MAX;
9196 }
9197 }
9198 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9199 {
9200 salt_len = base64_decode (base64_to_int, in, salt_len, tmp);
9201 }
9202
9203 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9204
9205 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9206 {
9207 if (salt_len < 20)
9208 {
9209 uint *tmp_uint = (uint *) tmp;
9210
9211 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9212 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9213 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9214 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9215 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9216 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9217 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9218 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9219 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9220 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9221
9222 salt_len = salt_len * 2;
9223 }
9224 else
9225 {
9226 return UINT_MAX;
9227 }
9228 }
9229
9230 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9231 {
9232 lowercase (tmp, salt_len);
9233 }
9234
9235 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9236 {
9237 uppercase (tmp, salt_len);
9238 }
9239
9240 uint len = salt_len;
9241
9242 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9243 {
9244 tmp[len++] = 0x80;
9245 }
9246
9247 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9248 {
9249 tmp[len++] = 0x01;
9250 }
9251
9252 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9253 {
9254 uint *tmp_uint = (uint *) tmp;
9255
9256 uint max = len / 4;
9257
9258 if (len % 4) max++;
9259
9260 for (uint i = 0; i < max; i++)
9261 {
9262 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9263 }
9264
9265 // Important: we may need to increase the length of memcpy since
9266 // we don't want to "loose" some swapped bytes (could happen if
9267 // they do not perfectly fit in the 4-byte blocks)
9268 // Memcpy does always copy the bytes in the BE order, but since
9269 // we swapped them, some important bytes could be in positions
9270 // we normally skip with the original len
9271
9272 if (len % 4) len += 4 - (len % 4);
9273 }
9274
9275 memcpy (out, tmp, len);
9276
9277 return (salt_len);
9278 }
9279
9280 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9281 {
9282 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9283
9284 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9285
9286 uint32_t *digest = (uint32_t *) hash_buf->digest;
9287
9288 salt_t *salt = hash_buf->salt;
9289
9290 memcpy ((char *) salt->salt_sign, input_buf, 6);
9291
9292 char *iter_pos = input_buf + 4;
9293
9294 salt->salt_iter = 1 << atoi (iter_pos);
9295
9296 char *salt_pos = strchr (iter_pos, '$');
9297
9298 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9299
9300 salt_pos++;
9301
9302 uint salt_len = 16;
9303
9304 salt->salt_len = salt_len;
9305
9306 char tmp_buf[100];
9307
9308 memset (tmp_buf, 0, sizeof (tmp_buf));
9309
9310 base64_decode (bf64_to_int, salt_pos, 22, tmp_buf);
9311
9312 char *salt_buf_ptr = (char *) salt->salt_buf;
9313
9314 memcpy (salt_buf_ptr, tmp_buf, 16);
9315
9316 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9317 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9318 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9319 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9320
9321 char *hash_pos = salt_pos + 22;
9322
9323 memset (tmp_buf, 0, sizeof (tmp_buf));
9324
9325 base64_decode (bf64_to_int, hash_pos, 31, tmp_buf);
9326
9327 memcpy (digest, tmp_buf, 24);
9328
9329 digest[0] = byte_swap_32 (digest[0]);
9330 digest[1] = byte_swap_32 (digest[1]);
9331 digest[2] = byte_swap_32 (digest[2]);
9332 digest[3] = byte_swap_32 (digest[3]);
9333 digest[4] = byte_swap_32 (digest[4]);
9334 digest[5] = byte_swap_32 (digest[5]);
9335
9336 digest[5] &= ~0xff; // its just 23 not 24 !
9337
9338 return (PARSER_OK);
9339 }
9340
9341 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9342 {
9343 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9344
9345 uint32_t *digest = (uint32_t *) hash_buf->digest;
9346
9347 char tmp_buf[100];
9348
9349 memset (tmp_buf, 0, sizeof (tmp_buf));
9350
9351 base64_decode (itoa64_to_int, input_buf, 43, tmp_buf);
9352
9353 memcpy (digest, tmp_buf, 32);
9354
9355 digest[0] = byte_swap_32 (digest[0]);
9356 digest[1] = byte_swap_32 (digest[1]);
9357 digest[2] = byte_swap_32 (digest[2]);
9358 digest[3] = byte_swap_32 (digest[3]);
9359 digest[4] = byte_swap_32 (digest[4]);
9360 digest[5] = byte_swap_32 (digest[5]);
9361 digest[6] = byte_swap_32 (digest[6]);
9362 digest[7] = byte_swap_32 (digest[7]);
9363
9364 digest[0] -= SHA256M_A;
9365 digest[1] -= SHA256M_B;
9366 digest[2] -= SHA256M_C;
9367 digest[3] -= SHA256M_D;
9368 digest[4] -= SHA256M_E;
9369 digest[5] -= SHA256M_F;
9370 digest[6] -= SHA256M_G;
9371 digest[7] -= SHA256M_H;
9372
9373 return (PARSER_OK);
9374 }
9375
9376 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9377 {
9378 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9379
9380 uint32_t *digest = (uint32_t *) hash_buf->digest;
9381
9382 digest[0] = hex_to_uint (&input_buf[ 0]);
9383 digest[1] = hex_to_uint (&input_buf[ 8]);
9384
9385 digest[0] = byte_swap_32 (digest[0]);
9386 digest[1] = byte_swap_32 (digest[1]);
9387
9388 uint tt;
9389
9390 IP (digest[0], digest[1], tt);
9391
9392 digest[0] = digest[0];
9393 digest[1] = digest[1];
9394 digest[2] = 0;
9395 digest[3] = 0;
9396
9397 return (PARSER_OK);
9398 }
9399
9400 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9401 {
9402 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9403
9404 uint32_t *digest = (uint32_t *) hash_buf->digest;
9405
9406 salt_t *salt = hash_buf->salt;
9407
9408 char *hash_pos = input_buf + 8;
9409
9410 digest[0] = hex_to_uint (&hash_pos[ 0]);
9411 digest[1] = hex_to_uint (&hash_pos[ 8]);
9412 digest[2] = hex_to_uint (&hash_pos[16]);
9413 digest[3] = hex_to_uint (&hash_pos[24]);
9414 digest[4] = hex_to_uint (&hash_pos[32]);
9415
9416 digest[0] -= SHA1M_A;
9417 digest[1] -= SHA1M_B;
9418 digest[2] -= SHA1M_C;
9419 digest[3] -= SHA1M_D;
9420 digest[4] -= SHA1M_E;
9421
9422 uint salt_len = 8;
9423
9424 char *salt_buf_ptr = (char *) salt->salt_buf;
9425
9426 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9427
9428 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9429
9430 salt->salt_len = salt_len;
9431
9432 return (PARSER_OK);
9433 }
9434
9435 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9436 {
9437 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9438
9439 uint64_t *digest = (uint64_t *) hash_buf->digest;
9440
9441 salt_t *salt = hash_buf->salt;
9442
9443 char *hash_pos = input_buf + 8;
9444
9445 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
9446 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
9447 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
9448 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
9449 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
9450 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
9451 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
9452 digest[7] = hex_to_uint64_t (&hash_pos[112]);
9453
9454 digest[0] -= SHA512M_A;
9455 digest[1] -= SHA512M_B;
9456 digest[2] -= SHA512M_C;
9457 digest[3] -= SHA512M_D;
9458 digest[4] -= SHA512M_E;
9459 digest[5] -= SHA512M_F;
9460 digest[6] -= SHA512M_G;
9461 digest[7] -= SHA512M_H;
9462
9463 uint salt_len = 8;
9464
9465 char *salt_buf_ptr = (char *) salt->salt_buf;
9466
9467 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9468
9469 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9470
9471 salt->salt_len = salt_len;
9472
9473 return (PARSER_OK);
9474 }
9475
9476 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9477 {
9478 if (data.opts_type & OPTS_TYPE_ST_HEX)
9479 {
9480 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9481 }
9482 else
9483 {
9484 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9485 }
9486
9487 uint32_t *digest = (uint32_t *) hash_buf->digest;
9488
9489 salt_t *salt = hash_buf->salt;
9490
9491 digest[0] = hex_to_uint (&input_buf[ 0]);
9492 digest[1] = hex_to_uint (&input_buf[ 8]);
9493 digest[2] = hex_to_uint (&input_buf[16]);
9494 digest[3] = hex_to_uint (&input_buf[24]);
9495
9496 digest[0] = byte_swap_32 (digest[0]);
9497 digest[1] = byte_swap_32 (digest[1]);
9498 digest[2] = byte_swap_32 (digest[2]);
9499 digest[3] = byte_swap_32 (digest[3]);
9500
9501 digest[0] -= MD5M_A;
9502 digest[1] -= MD5M_B;
9503 digest[2] -= MD5M_C;
9504 digest[3] -= MD5M_D;
9505
9506 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9507
9508 uint salt_len = input_len - 32 - 1;
9509
9510 char *salt_buf = input_buf + 32 + 1;
9511
9512 char *salt_buf_ptr = (char *) salt->salt_buf;
9513
9514 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9515
9516 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9517
9518 salt->salt_len = salt_len;
9519
9520 return (PARSER_OK);
9521 }
9522
9523 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9524 {
9525 if (data.opts_type & OPTS_TYPE_ST_HEX)
9526 {
9527 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9528 }
9529 else
9530 {
9531 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9532 }
9533
9534 // unscramble
9535
9536 char clean_input_buf[32];
9537
9538 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9539 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9540
9541 for (int i = 0, j = 0, k = 0; i < 30; i++)
9542 {
9543 if (i == pos[j])
9544 {
9545 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9546
9547 j++;
9548 }
9549 else
9550 {
9551 clean_input_buf[k] = input_buf[i];
9552
9553 k++;
9554 }
9555 }
9556
9557 // base64 decode
9558
9559 uint32_t *digest = (uint32_t *) hash_buf->digest;
9560
9561 salt_t *salt = hash_buf->salt;
9562
9563 char a, b, c, d, e, f;
9564
9565 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9566 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9567 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9568 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9569 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9570 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9571
9572 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9573 | (((d << 12) | (e << 6) | (f)) << 0);
9574
9575 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9576 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9577 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9578 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9579 e = base64_to_int (clean_input_buf[10] & 0x7f);
9580 f = base64_to_int (clean_input_buf[11] & 0x7f);
9581
9582 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9583 | (((d << 12) | (e << 6) | (f)) << 0);
9584
9585 a = base64_to_int (clean_input_buf[12] & 0x7f);
9586 b = base64_to_int (clean_input_buf[13] & 0x7f);
9587 c = base64_to_int (clean_input_buf[14] & 0x7f);
9588 d = base64_to_int (clean_input_buf[15] & 0x7f);
9589 e = base64_to_int (clean_input_buf[16] & 0x7f);
9590 f = base64_to_int (clean_input_buf[17] & 0x7f);
9591
9592 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9593 | (((d << 12) | (e << 6) | (f)) << 0);
9594
9595 a = base64_to_int (clean_input_buf[18] & 0x7f);
9596 b = base64_to_int (clean_input_buf[19] & 0x7f);
9597 c = base64_to_int (clean_input_buf[20] & 0x7f);
9598 d = base64_to_int (clean_input_buf[21] & 0x7f);
9599 e = base64_to_int (clean_input_buf[22] & 0x7f);
9600 f = base64_to_int (clean_input_buf[23] & 0x7f);
9601
9602 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
9603 | (((d << 12) | (e << 6) | (f)) << 0);
9604
9605 digest[0] = byte_swap_32 (digest[0]);
9606 digest[1] = byte_swap_32 (digest[1]);
9607 digest[2] = byte_swap_32 (digest[2]);
9608 digest[3] = byte_swap_32 (digest[3]);
9609
9610 digest[0] -= MD5M_A;
9611 digest[1] -= MD5M_B;
9612 digest[2] -= MD5M_C;
9613 digest[3] -= MD5M_D;
9614
9615 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
9616
9617 uint salt_len = input_len - 30 - 1;
9618
9619 char *salt_buf = input_buf + 30 + 1;
9620
9621 char *salt_buf_ptr = (char *) salt->salt_buf;
9622
9623 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9624
9625 // max. salt length: salt_buf[32] => 32 - 22 (":Administration Tools:") = 10
9626 if (salt_len > 10) return (PARSER_SALT_LENGTH);
9627
9628 salt->salt_len = salt_len;
9629
9630 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9631
9632 salt->salt_len += 22;
9633
9634 return (PARSER_OK);
9635 }
9636
9637 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9638 {
9639 if (data.opts_type & OPTS_TYPE_ST_HEX)
9640 {
9641 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9642 }
9643 else
9644 {
9645 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9646 }
9647
9648 uint32_t *digest = (uint32_t *) hash_buf->digest;
9649
9650 salt_t *salt = hash_buf->salt;
9651
9652 digest[0] = hex_to_uint (&input_buf[ 0]);
9653 digest[1] = hex_to_uint (&input_buf[ 8]);
9654 digest[2] = hex_to_uint (&input_buf[16]);
9655 digest[3] = hex_to_uint (&input_buf[24]);
9656 digest[4] = hex_to_uint (&input_buf[32]);
9657
9658 digest[0] -= SHA1M_A;
9659 digest[1] -= SHA1M_B;
9660 digest[2] -= SHA1M_C;
9661 digest[3] -= SHA1M_D;
9662 digest[4] -= SHA1M_E;
9663
9664 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9665
9666 uint salt_len = input_len - 40 - 1;
9667
9668 char *salt_buf = input_buf + 40 + 1;
9669
9670 char *salt_buf_ptr = (char *) salt->salt_buf;
9671
9672 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9673
9674 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9675
9676 salt->salt_len = salt_len;
9677
9678 return (PARSER_OK);
9679 }
9680
9681 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9682 {
9683 if (data.opts_type & OPTS_TYPE_ST_HEX)
9684 {
9685 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9686 }
9687 else
9688 {
9689 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9690 }
9691
9692 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9693
9694 char *iter_pos = input_buf + 6;
9695
9696 salt_t *salt = hash_buf->salt;
9697
9698 salt->salt_iter = atoi (iter_pos) - 1;
9699
9700 char *salt_pos = strchr (iter_pos, '#');
9701
9702 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9703
9704 salt_pos++;
9705
9706 char *digest_pos = strchr (salt_pos, '#');
9707
9708 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9709
9710 digest_pos++;
9711
9712 uint salt_len = digest_pos - salt_pos - 1;
9713
9714 uint32_t *digest = (uint32_t *) hash_buf->digest;
9715
9716 digest[0] = hex_to_uint (&digest_pos[ 0]);
9717 digest[1] = hex_to_uint (&digest_pos[ 8]);
9718 digest[2] = hex_to_uint (&digest_pos[16]);
9719 digest[3] = hex_to_uint (&digest_pos[24]);
9720
9721 char *salt_buf_ptr = (char *) salt->salt_buf;
9722
9723 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9724
9725 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9726
9727 salt->salt_len = salt_len;
9728
9729 return (PARSER_OK);
9730 }
9731
9732 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9733 {
9734 uint32_t *digest = (uint32_t *) hash_buf->digest;
9735
9736 salt_t *salt = hash_buf->salt;
9737
9738 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9739
9740 hccap_t in;
9741
9742 memcpy (&in, input_buf, input_len);
9743
9744 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9745
9746 memcpy (digest, in.keymic, 16);
9747
9748 /*
9749 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9750 The phrase "Pairwise key expansion"
9751 Access Point Address (Referred to as Authenticator Address AA)
9752 Supplicant Address (referred to as Supplicant Address SA)
9753 Access Point Nonce (referred to as Authenticator Anonce)
9754 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9755 */
9756
9757 uint salt_len = strlen (in.essid);
9758
9759 memcpy (salt->salt_buf, in.essid, salt_len);
9760
9761 salt->salt_len = salt_len;
9762
9763 salt->salt_iter = ROUNDS_WPA2 - 1;
9764
9765 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
9766
9767 memcpy (pke_ptr, "Pairwise key expansion", 23);
9768
9769 if (memcmp (in.mac1, in.mac2, 6) < 0)
9770 {
9771 memcpy (pke_ptr + 23, in.mac1, 6);
9772 memcpy (pke_ptr + 29, in.mac2, 6);
9773 }
9774 else
9775 {
9776 memcpy (pke_ptr + 23, in.mac2, 6);
9777 memcpy (pke_ptr + 29, in.mac1, 6);
9778 }
9779
9780 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
9781 {
9782 memcpy (pke_ptr + 35, in.nonce1, 32);
9783 memcpy (pke_ptr + 67, in.nonce2, 32);
9784 }
9785 else
9786 {
9787 memcpy (pke_ptr + 35, in.nonce2, 32);
9788 memcpy (pke_ptr + 67, in.nonce1, 32);
9789 }
9790
9791 for (int i = 0; i < 25; i++)
9792 {
9793 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
9794 }
9795
9796 wpa->keyver = in.keyver;
9797
9798 if (wpa->keyver > 255)
9799 {
9800 log_info ("ATTENTION!");
9801 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
9802 log_info (" This could be due to a recent aircrack-ng bug.");
9803 log_info (" The key version was automatically reset to a reasonable value.");
9804 log_info ("");
9805
9806 wpa->keyver &= 0xff;
9807 }
9808
9809 wpa->eapol_size = in.eapol_size;
9810
9811 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
9812
9813 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
9814
9815 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
9816
9817 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
9818
9819 if (wpa->keyver == 1)
9820 {
9821 // nothing to do
9822 }
9823 else
9824 {
9825 digest[0] = byte_swap_32 (digest[0]);
9826 digest[1] = byte_swap_32 (digest[1]);
9827 digest[2] = byte_swap_32 (digest[2]);
9828 digest[3] = byte_swap_32 (digest[3]);
9829
9830 for (int i = 0; i < 64; i++)
9831 {
9832 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
9833 }
9834 }
9835
9836 salt->salt_buf[10] = digest[1];
9837 salt->salt_buf[11] = digest[2];
9838
9839 return (PARSER_OK);
9840 }
9841
9842 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9843 {
9844 uint32_t *digest = (uint32_t *) hash_buf->digest;
9845
9846 salt_t *salt = hash_buf->salt;
9847
9848 if (input_len == 0)
9849 {
9850 log_error ("Password Safe v2 container not specified");
9851
9852 exit (-1);
9853 }
9854
9855 FILE *fp = fopen (input_buf, "rb");
9856
9857 if (fp == NULL)
9858 {
9859 log_error ("%s: %s", input_buf, strerror (errno));
9860
9861 exit (-1);
9862 }
9863
9864 typedef struct
9865 {
9866 uint32_t random[2];
9867 uint32_t hash[5];
9868 uint32_t salt[5]; // unused, but makes better valid check
9869 uint32_t iv[2]; // unused, but makes better valid check
9870
9871 } psafe2_hdr;
9872
9873 psafe2_hdr buf;
9874
9875 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
9876
9877 fclose (fp);
9878
9879 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
9880
9881 salt->salt_buf[0] = buf.random[0];
9882 salt->salt_buf[1] = buf.random[1];
9883
9884 salt->salt_len = 8;
9885 salt->salt_iter = 1000;
9886
9887 digest[0] = byte_swap_32 (buf.hash[0]);
9888 digest[1] = byte_swap_32 (buf.hash[1]);
9889 digest[2] = byte_swap_32 (buf.hash[2]);
9890 digest[3] = byte_swap_32 (buf.hash[3]);
9891 digest[4] = byte_swap_32 (buf.hash[4]);
9892
9893 return (PARSER_OK);
9894 }
9895
9896 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9897 {
9898 uint32_t *digest = (uint32_t *) hash_buf->digest;
9899
9900 salt_t *salt = hash_buf->salt;
9901
9902 if (input_len == 0)
9903 {
9904 log_error (".psafe3 not specified");
9905
9906 exit (-1);
9907 }
9908
9909 FILE *fp = fopen (input_buf, "rb");
9910
9911 if (fp == NULL)
9912 {
9913 log_error ("%s: %s", input_buf, strerror (errno));
9914
9915 exit (-1);
9916 }
9917
9918 psafe3_t in;
9919
9920 int n = fread (&in, sizeof (psafe3_t), 1, fp);
9921
9922 fclose (fp);
9923
9924 data.hashfile = input_buf; // we will need this in case it gets cracked
9925
9926 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
9927
9928 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
9929
9930 salt->salt_iter = in.iterations + 1;
9931
9932 salt->salt_buf[0] = in.salt_buf[0];
9933 salt->salt_buf[1] = in.salt_buf[1];
9934 salt->salt_buf[2] = in.salt_buf[2];
9935 salt->salt_buf[3] = in.salt_buf[3];
9936 salt->salt_buf[4] = in.salt_buf[4];
9937 salt->salt_buf[5] = in.salt_buf[5];
9938 salt->salt_buf[6] = in.salt_buf[6];
9939 salt->salt_buf[7] = in.salt_buf[7];
9940
9941 salt->salt_len = 32;
9942
9943 digest[0] = in.hash_buf[0];
9944 digest[1] = in.hash_buf[1];
9945 digest[2] = in.hash_buf[2];
9946 digest[3] = in.hash_buf[3];
9947 digest[4] = in.hash_buf[4];
9948 digest[5] = in.hash_buf[5];
9949 digest[6] = in.hash_buf[6];
9950 digest[7] = in.hash_buf[7];
9951
9952 digest[0] = byte_swap_32 (digest[0]);
9953 digest[1] = byte_swap_32 (digest[1]);
9954 digest[2] = byte_swap_32 (digest[2]);
9955 digest[3] = byte_swap_32 (digest[3]);
9956 digest[4] = byte_swap_32 (digest[4]);
9957 digest[5] = byte_swap_32 (digest[5]);
9958 digest[6] = byte_swap_32 (digest[6]);
9959 digest[7] = byte_swap_32 (digest[7]);
9960
9961 return (PARSER_OK);
9962 }
9963
9964 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9965 {
9966 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
9967
9968 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
9969
9970 uint32_t *digest = (uint32_t *) hash_buf->digest;
9971
9972 salt_t *salt = hash_buf->salt;
9973
9974 char *iter_pos = input_buf + 3;
9975
9976 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
9977
9978 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
9979
9980 memcpy ((char *) salt->salt_sign, input_buf, 4);
9981
9982 salt->salt_iter = salt_iter;
9983
9984 char *salt_pos = iter_pos + 1;
9985
9986 uint salt_len = 8;
9987
9988 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
9989
9990 salt->salt_len = salt_len;
9991
9992 char *hash_pos = salt_pos + salt_len;
9993
9994 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
9995
9996 return (PARSER_OK);
9997 }
9998
9999 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10000 {
10001 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10002
10003 uint32_t *digest = (uint32_t *) hash_buf->digest;
10004
10005 salt_t *salt = hash_buf->salt;
10006
10007 char *salt_pos = input_buf + 3;
10008
10009 uint iterations_len = 0;
10010
10011 if (memcmp (salt_pos, "rounds=", 7) == 0)
10012 {
10013 salt_pos += 7;
10014
10015 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10016
10017 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10018 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10019
10020 salt_pos[0] = 0x0;
10021
10022 salt->salt_iter = atoi (salt_pos - iterations_len);
10023
10024 salt_pos += 1;
10025
10026 iterations_len += 8;
10027 }
10028 else
10029 {
10030 salt->salt_iter = ROUNDS_MD5CRYPT;
10031 }
10032
10033 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10034
10035 char *hash_pos = strchr (salt_pos, '$');
10036
10037 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10038
10039 uint salt_len = hash_pos - salt_pos;
10040
10041 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10042
10043 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10044
10045 salt->salt_len = salt_len;
10046
10047 hash_pos++;
10048
10049 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10050
10051 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10052
10053 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10054
10055 return (PARSER_OK);
10056 }
10057
10058 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10059 {
10060 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10061
10062 uint32_t *digest = (uint32_t *) hash_buf->digest;
10063
10064 salt_t *salt = hash_buf->salt;
10065
10066 char *salt_pos = input_buf + 6;
10067
10068 uint iterations_len = 0;
10069
10070 if (memcmp (salt_pos, "rounds=", 7) == 0)
10071 {
10072 salt_pos += 7;
10073
10074 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10075
10076 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10077 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10078
10079 salt_pos[0] = 0x0;
10080
10081 salt->salt_iter = atoi (salt_pos - iterations_len);
10082
10083 salt_pos += 1;
10084
10085 iterations_len += 8;
10086 }
10087 else
10088 {
10089 salt->salt_iter = ROUNDS_MD5CRYPT;
10090 }
10091
10092 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10093
10094 char *hash_pos = strchr (salt_pos, '$');
10095
10096 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10097
10098 uint salt_len = hash_pos - salt_pos;
10099
10100 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10101
10102 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10103
10104 salt->salt_len = salt_len;
10105
10106 hash_pos++;
10107
10108 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10109
10110 return (PARSER_OK);
10111 }
10112
10113 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10114 {
10115 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10116
10117 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10118
10119 uint32_t *digest = (uint32_t *) hash_buf->digest;
10120
10121 salt_t *salt = hash_buf->salt;
10122
10123 char *salt_pos = input_buf + 14;
10124
10125 char *hash_pos = strchr (salt_pos, '*');
10126
10127 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10128
10129 hash_pos++;
10130
10131 uint salt_len = hash_pos - salt_pos - 1;
10132
10133 char *salt_buf_ptr = (char *) salt->salt_buf;
10134
10135 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10136
10137 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10138
10139 salt->salt_len = salt_len;
10140
10141 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
10142
10143 base64_decode (base64_to_int, hash_pos, 27, tmp_buf);
10144
10145 memcpy (digest, tmp_buf, 20);
10146
10147 digest[0] = byte_swap_32 (digest[0]);
10148 digest[1] = byte_swap_32 (digest[1]);
10149 digest[2] = byte_swap_32 (digest[2]);
10150 digest[3] = byte_swap_32 (digest[3]);
10151 digest[4] = byte_swap_32 (digest[4]);
10152
10153 digest[0] -= SHA1M_A;
10154 digest[1] -= SHA1M_B;
10155 digest[2] -= SHA1M_C;
10156 digest[3] -= SHA1M_D;
10157 digest[4] -= SHA1M_E;
10158
10159 return (PARSER_OK);
10160 }
10161
10162 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10163 {
10164 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10165
10166 unsigned char c12 = itoa64_to_int (input_buf[12]);
10167
10168 if (c12 & 3) return (PARSER_HASH_VALUE);
10169
10170 uint32_t *digest = (uint32_t *) hash_buf->digest;
10171
10172 salt_t *salt = hash_buf->salt;
10173
10174 // for ascii_digest
10175 salt->salt_sign[0] = input_buf[0];
10176 salt->salt_sign[1] = input_buf[1];
10177
10178 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10179 | itoa64_to_int (input_buf[1]) << 6;
10180
10181 salt->salt_len = 2;
10182
10183 char tmp_buf[100];
10184
10185 memset (tmp_buf, 0, sizeof (tmp_buf));
10186
10187 base64_decode (itoa64_to_int, input_buf + 2, 11, tmp_buf);
10188
10189 memcpy (digest, tmp_buf, 8);
10190
10191 uint tt;
10192
10193 IP (digest[0], digest[1], tt);
10194
10195 digest[2] = 0;
10196 digest[3] = 0;
10197
10198 return (PARSER_OK);
10199 }
10200
10201 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10202 {
10203 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10204
10205 uint32_t *digest = (uint32_t *) hash_buf->digest;
10206
10207 digest[0] = hex_to_uint (&input_buf[ 0]);
10208 digest[1] = hex_to_uint (&input_buf[ 8]);
10209 digest[2] = hex_to_uint (&input_buf[16]);
10210 digest[3] = hex_to_uint (&input_buf[24]);
10211
10212 digest[0] = byte_swap_32 (digest[0]);
10213 digest[1] = byte_swap_32 (digest[1]);
10214 digest[2] = byte_swap_32 (digest[2]);
10215 digest[3] = byte_swap_32 (digest[3]);
10216
10217 digest[0] -= MD4M_A;
10218 digest[1] -= MD4M_B;
10219 digest[2] -= MD4M_C;
10220 digest[3] -= MD4M_D;
10221
10222 return (PARSER_OK);
10223 }
10224
10225 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10226 {
10227 if (data.opts_type & OPTS_TYPE_ST_HEX)
10228 {
10229 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10230 }
10231 else
10232 {
10233 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10234 }
10235
10236 uint32_t *digest = (uint32_t *) hash_buf->digest;
10237
10238 salt_t *salt = hash_buf->salt;
10239
10240 digest[0] = hex_to_uint (&input_buf[ 0]);
10241 digest[1] = hex_to_uint (&input_buf[ 8]);
10242 digest[2] = hex_to_uint (&input_buf[16]);
10243 digest[3] = hex_to_uint (&input_buf[24]);
10244
10245 digest[0] = byte_swap_32 (digest[0]);
10246 digest[1] = byte_swap_32 (digest[1]);
10247 digest[2] = byte_swap_32 (digest[2]);
10248 digest[3] = byte_swap_32 (digest[3]);
10249
10250 digest[0] -= MD4M_A;
10251 digest[1] -= MD4M_B;
10252 digest[2] -= MD4M_C;
10253 digest[3] -= MD4M_D;
10254
10255 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10256
10257 uint salt_len = input_len - 32 - 1;
10258
10259 char *salt_buf = input_buf + 32 + 1;
10260
10261 char *salt_buf_ptr = (char *) salt->salt_buf;
10262
10263 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10264
10265 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10266
10267 salt->salt_len = salt_len;
10268
10269 return (PARSER_OK);
10270 }
10271
10272 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10273 {
10274 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10275
10276 uint32_t *digest = (uint32_t *) hash_buf->digest;
10277
10278 digest[0] = hex_to_uint (&input_buf[ 0]);
10279 digest[1] = hex_to_uint (&input_buf[ 8]);
10280 digest[2] = hex_to_uint (&input_buf[16]);
10281 digest[3] = hex_to_uint (&input_buf[24]);
10282
10283 digest[0] = byte_swap_32 (digest[0]);
10284 digest[1] = byte_swap_32 (digest[1]);
10285 digest[2] = byte_swap_32 (digest[2]);
10286 digest[3] = byte_swap_32 (digest[3]);
10287
10288 digest[0] -= MD5M_A;
10289 digest[1] -= MD5M_B;
10290 digest[2] -= MD5M_C;
10291 digest[3] -= MD5M_D;
10292
10293 return (PARSER_OK);
10294 }
10295
10296 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10297 {
10298 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10299
10300 uint32_t *digest = (uint32_t *) hash_buf->digest;
10301
10302 digest[0] = hex_to_uint (&input_buf[0]);
10303 digest[1] = hex_to_uint (&input_buf[8]);
10304 digest[2] = 0;
10305 digest[3] = 0;
10306
10307 digest[0] = byte_swap_32 (digest[0]);
10308 digest[1] = byte_swap_32 (digest[1]);
10309
10310 return (PARSER_OK);
10311 }
10312
10313 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10314 {
10315 if (data.opts_type & OPTS_TYPE_ST_HEX)
10316 {
10317 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10318 }
10319 else
10320 {
10321 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10322 }
10323
10324 uint32_t *digest = (uint32_t *) hash_buf->digest;
10325
10326 salt_t *salt = hash_buf->salt;
10327
10328 digest[0] = hex_to_uint (&input_buf[ 0]);
10329 digest[1] = hex_to_uint (&input_buf[ 8]);
10330 digest[2] = hex_to_uint (&input_buf[16]);
10331 digest[3] = hex_to_uint (&input_buf[24]);
10332
10333 digest[0] = byte_swap_32 (digest[0]);
10334 digest[1] = byte_swap_32 (digest[1]);
10335 digest[2] = byte_swap_32 (digest[2]);
10336 digest[3] = byte_swap_32 (digest[3]);
10337
10338 digest[0] -= MD5M_A;
10339 digest[1] -= MD5M_B;
10340 digest[2] -= MD5M_C;
10341 digest[3] -= MD5M_D;
10342
10343 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10344
10345 uint salt_len = input_len - 32 - 1;
10346
10347 char *salt_buf = input_buf + 32 + 1;
10348
10349 char *salt_buf_ptr = (char *) salt->salt_buf;
10350
10351 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10352
10353 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10354
10355 salt->salt_len = salt_len;
10356
10357 return (PARSER_OK);
10358 }
10359
10360 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10361 {
10362 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10363
10364 uint32_t *digest = (uint32_t *) hash_buf->digest;
10365
10366 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10367 | itoa64_to_int (input_buf[ 1]) << 6
10368 | itoa64_to_int (input_buf[ 2]) << 12
10369 | itoa64_to_int (input_buf[ 3]) << 18;
10370 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10371 | itoa64_to_int (input_buf[ 5]) << 6
10372 | itoa64_to_int (input_buf[ 6]) << 12
10373 | itoa64_to_int (input_buf[ 7]) << 18;
10374 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10375 | itoa64_to_int (input_buf[ 9]) << 6
10376 | itoa64_to_int (input_buf[10]) << 12
10377 | itoa64_to_int (input_buf[11]) << 18;
10378 digest[3] = itoa64_to_int (input_buf[12]) << 0
10379 | itoa64_to_int (input_buf[13]) << 6
10380 | itoa64_to_int (input_buf[14]) << 12
10381 | itoa64_to_int (input_buf[15]) << 18;
10382
10383 digest[0] -= MD5M_A;
10384 digest[1] -= MD5M_B;
10385 digest[2] -= MD5M_C;
10386 digest[3] -= MD5M_D;
10387
10388 digest[0] &= 0x00ffffff;
10389 digest[1] &= 0x00ffffff;
10390 digest[2] &= 0x00ffffff;
10391 digest[3] &= 0x00ffffff;
10392
10393 return (PARSER_OK);
10394 }
10395
10396 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10397 {
10398 if (data.opts_type & OPTS_TYPE_ST_HEX)
10399 {
10400 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10401 }
10402 else
10403 {
10404 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10405 }
10406
10407 uint32_t *digest = (uint32_t *) hash_buf->digest;
10408
10409 salt_t *salt = hash_buf->salt;
10410
10411 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10412 | itoa64_to_int (input_buf[ 1]) << 6
10413 | itoa64_to_int (input_buf[ 2]) << 12
10414 | itoa64_to_int (input_buf[ 3]) << 18;
10415 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10416 | itoa64_to_int (input_buf[ 5]) << 6
10417 | itoa64_to_int (input_buf[ 6]) << 12
10418 | itoa64_to_int (input_buf[ 7]) << 18;
10419 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10420 | itoa64_to_int (input_buf[ 9]) << 6
10421 | itoa64_to_int (input_buf[10]) << 12
10422 | itoa64_to_int (input_buf[11]) << 18;
10423 digest[3] = itoa64_to_int (input_buf[12]) << 0
10424 | itoa64_to_int (input_buf[13]) << 6
10425 | itoa64_to_int (input_buf[14]) << 12
10426 | itoa64_to_int (input_buf[15]) << 18;
10427
10428 digest[0] -= MD5M_A;
10429 digest[1] -= MD5M_B;
10430 digest[2] -= MD5M_C;
10431 digest[3] -= MD5M_D;
10432
10433 digest[0] &= 0x00ffffff;
10434 digest[1] &= 0x00ffffff;
10435 digest[2] &= 0x00ffffff;
10436 digest[3] &= 0x00ffffff;
10437
10438 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10439
10440 uint salt_len = input_len - 16 - 1;
10441
10442 char *salt_buf = input_buf + 16 + 1;
10443
10444 char *salt_buf_ptr = (char *) salt->salt_buf;
10445
10446 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10447
10448 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10449
10450 salt->salt_len = salt_len;
10451
10452 return (PARSER_OK);
10453 }
10454
10455 void transform_netntlmv1_key (const uint8_t *nthash, uint8_t *key)
10456 {
10457 key[0] = (nthash[0] >> 0);
10458 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10459 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10460 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10461 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10462 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10463 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10464 key[7] = (nthash[6] << 1);
10465
10466 key[0] |= 0x01;
10467 key[1] |= 0x01;
10468 key[2] |= 0x01;
10469 key[3] |= 0x01;
10470 key[4] |= 0x01;
10471 key[5] |= 0x01;
10472 key[6] |= 0x01;
10473 key[7] |= 0x01;
10474 }
10475
10476 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10477 {
10478 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10479
10480 uint32_t *digest = (uint32_t *) hash_buf->digest;
10481
10482 salt_t *salt = hash_buf->salt;
10483
10484 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10485
10486 /**
10487 * parse line
10488 */
10489
10490 char *user_pos = input_buf;
10491
10492 char *unused_pos = strchr (user_pos, ':');
10493
10494 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10495
10496 uint user_len = unused_pos - user_pos;
10497
10498 if (user_len > 60) return (PARSER_SALT_LENGTH);
10499
10500 unused_pos++;
10501
10502 char *domain_pos = strchr (unused_pos, ':');
10503
10504 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10505
10506 uint unused_len = domain_pos - unused_pos;
10507
10508 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10509
10510 domain_pos++;
10511
10512 char *srvchall_pos = strchr (domain_pos, ':');
10513
10514 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10515
10516 uint domain_len = srvchall_pos - domain_pos;
10517
10518 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10519
10520 srvchall_pos++;
10521
10522 char *hash_pos = strchr (srvchall_pos, ':');
10523
10524 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10525
10526 uint srvchall_len = hash_pos - srvchall_pos;
10527
10528 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10529
10530 hash_pos++;
10531
10532 char *clichall_pos = strchr (hash_pos, ':');
10533
10534 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10535
10536 uint hash_len = clichall_pos - hash_pos;
10537
10538 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10539
10540 clichall_pos++;
10541
10542 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10543
10544 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10545
10546 /**
10547 * store some data for later use
10548 */
10549
10550 netntlm->user_len = user_len * 2;
10551 netntlm->domain_len = domain_len * 2;
10552 netntlm->srvchall_len = srvchall_len / 2;
10553 netntlm->clichall_len = clichall_len / 2;
10554
10555 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10556 char *chall_ptr = (char *) netntlm->chall_buf;
10557
10558 /**
10559 * handle username and domainname
10560 */
10561
10562 for (uint i = 0; i < user_len; i++)
10563 {
10564 *userdomain_ptr++ = user_pos[i];
10565 *userdomain_ptr++ = 0;
10566 }
10567
10568 for (uint i = 0; i < domain_len; i++)
10569 {
10570 *userdomain_ptr++ = domain_pos[i];
10571 *userdomain_ptr++ = 0;
10572 }
10573
10574 /**
10575 * handle server challenge encoding
10576 */
10577
10578 for (uint i = 0; i < srvchall_len; i += 2)
10579 {
10580 const char p0 = srvchall_pos[i + 0];
10581 const char p1 = srvchall_pos[i + 1];
10582
10583 *chall_ptr++ = hex_convert (p1) << 0
10584 | hex_convert (p0) << 4;
10585 }
10586
10587 /**
10588 * handle client challenge encoding
10589 */
10590
10591 for (uint i = 0; i < clichall_len; i += 2)
10592 {
10593 const char p0 = clichall_pos[i + 0];
10594 const char p1 = clichall_pos[i + 1];
10595
10596 *chall_ptr++ = hex_convert (p1) << 0
10597 | hex_convert (p0) << 4;
10598 }
10599
10600 /**
10601 * store data
10602 */
10603
10604 char *salt_buf_ptr = (char *) salt->salt_buf;
10605
10606 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10607
10608 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10609
10610 salt->salt_len = salt_len;
10611
10612 digest[0] = hex_to_uint (&hash_pos[ 0]);
10613 digest[1] = hex_to_uint (&hash_pos[ 8]);
10614 digest[2] = hex_to_uint (&hash_pos[16]);
10615 digest[3] = hex_to_uint (&hash_pos[24]);
10616
10617 digest[0] = byte_swap_32 (digest[0]);
10618 digest[1] = byte_swap_32 (digest[1]);
10619 digest[2] = byte_swap_32 (digest[2]);
10620 digest[3] = byte_swap_32 (digest[3]);
10621
10622 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10623
10624 uint digest_tmp[2];
10625
10626 digest_tmp[0] = hex_to_uint (&hash_pos[32]);
10627 digest_tmp[1] = hex_to_uint (&hash_pos[40]);
10628
10629 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10630 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10631
10632 /* special case 2: ESS */
10633
10634 if (srvchall_len == 48)
10635 {
10636 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10637 {
10638 uint w[16];
10639
10640 w[ 0] = netntlm->chall_buf[6];
10641 w[ 1] = netntlm->chall_buf[7];
10642 w[ 2] = netntlm->chall_buf[0];
10643 w[ 3] = netntlm->chall_buf[1];
10644 w[ 4] = 0x80;
10645 w[ 5] = 0;
10646 w[ 6] = 0;
10647 w[ 7] = 0;
10648 w[ 8] = 0;
10649 w[ 9] = 0;
10650 w[10] = 0;
10651 w[11] = 0;
10652 w[12] = 0;
10653 w[13] = 0;
10654 w[14] = 16 * 8;
10655 w[15] = 0;
10656
10657 uint dgst[4];
10658
10659 dgst[0] = MAGIC_A;
10660 dgst[1] = MAGIC_B;
10661 dgst[2] = MAGIC_C;
10662 dgst[3] = MAGIC_D;
10663
10664 md5_64 (w, dgst);
10665
10666 salt->salt_buf[0] = dgst[0];
10667 salt->salt_buf[1] = dgst[1];
10668 }
10669 }
10670
10671 /* precompute netntlmv1 exploit start */
10672
10673 for (uint i = 0; i < 0x10000; i++)
10674 {
10675 uint key_md4[2] = { i, 0 };
10676 uint key_des[2] = { 0, 0 };
10677
10678 transform_netntlmv1_key ((uint8_t *) key_md4, (uint8_t *) key_des);
10679
10680 uint Kc[16];
10681 uint Kd[16];
10682
10683 _des_keysetup (key_des, Kc, Kd, c_skb);
10684
10685 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10686
10687 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10688
10689 if (data3[0] != digest_tmp[0]) continue;
10690 if (data3[1] != digest_tmp[1]) continue;
10691
10692 salt->salt_buf[2] = i;
10693
10694 salt->salt_len = 24;
10695
10696 break;
10697 }
10698
10699 salt->salt_buf_pc[0] = digest_tmp[0];
10700 salt->salt_buf_pc[1] = digest_tmp[1];
10701
10702 /* precompute netntlmv1 exploit stop */
10703
10704 uint32_t tt;
10705
10706 IP (digest[0], digest[1], tt);
10707 IP (digest[2], digest[3], tt);
10708
10709 digest[0] = ROTATE_RIGHT (digest[0], 29);
10710 digest[1] = ROTATE_RIGHT (digest[1], 29);
10711 digest[2] = ROTATE_RIGHT (digest[2], 29);
10712 digest[3] = ROTATE_RIGHT (digest[3], 29);
10713
10714 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10715
10716 salt->salt_buf[0] = ROTATE_LEFT (salt->salt_buf[0], 3);
10717 salt->salt_buf[1] = ROTATE_LEFT (salt->salt_buf[1], 3);
10718
10719 return (PARSER_OK);
10720 }
10721
10722 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10723 {
10724 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10725
10726 uint32_t *digest = (uint32_t *) hash_buf->digest;
10727
10728 salt_t *salt = hash_buf->salt;
10729
10730 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10731
10732 /**
10733 * parse line
10734 */
10735
10736 char *user_pos = input_buf;
10737
10738 char *unused_pos = strchr (user_pos, ':');
10739
10740 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10741
10742 uint user_len = unused_pos - user_pos;
10743
10744 if (user_len > 60) return (PARSER_SALT_LENGTH);
10745
10746 unused_pos++;
10747
10748 char *domain_pos = strchr (unused_pos, ':');
10749
10750 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10751
10752 uint unused_len = domain_pos - unused_pos;
10753
10754 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10755
10756 domain_pos++;
10757
10758 char *srvchall_pos = strchr (domain_pos, ':');
10759
10760 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10761
10762 uint domain_len = srvchall_pos - domain_pos;
10763
10764 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10765
10766 srvchall_pos++;
10767
10768 char *hash_pos = strchr (srvchall_pos, ':');
10769
10770 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10771
10772 uint srvchall_len = hash_pos - srvchall_pos;
10773
10774 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
10775
10776 hash_pos++;
10777
10778 char *clichall_pos = strchr (hash_pos, ':');
10779
10780 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10781
10782 uint hash_len = clichall_pos - hash_pos;
10783
10784 if (hash_len != 32) return (PARSER_HASH_LENGTH);
10785
10786 clichall_pos++;
10787
10788 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10789
10790 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
10791
10792 if (clichall_len % 2) return (PARSER_SALT_VALUE);
10793
10794 /**
10795 * store some data for later use
10796 */
10797
10798 netntlm->user_len = user_len * 2;
10799 netntlm->domain_len = domain_len * 2;
10800 netntlm->srvchall_len = srvchall_len / 2;
10801 netntlm->clichall_len = clichall_len / 2;
10802
10803 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10804 char *chall_ptr = (char *) netntlm->chall_buf;
10805
10806 /**
10807 * handle username and domainname
10808 */
10809
10810 for (uint i = 0; i < user_len; i++)
10811 {
10812 *userdomain_ptr++ = toupper (user_pos[i]);
10813 *userdomain_ptr++ = 0;
10814 }
10815
10816 for (uint i = 0; i < domain_len; i++)
10817 {
10818 *userdomain_ptr++ = domain_pos[i];
10819 *userdomain_ptr++ = 0;
10820 }
10821
10822 *userdomain_ptr++ = 0x80;
10823
10824 /**
10825 * handle server challenge encoding
10826 */
10827
10828 for (uint i = 0; i < srvchall_len; i += 2)
10829 {
10830 const char p0 = srvchall_pos[i + 0];
10831 const char p1 = srvchall_pos[i + 1];
10832
10833 *chall_ptr++ = hex_convert (p1) << 0
10834 | hex_convert (p0) << 4;
10835 }
10836
10837 /**
10838 * handle client challenge encoding
10839 */
10840
10841 for (uint i = 0; i < clichall_len; i += 2)
10842 {
10843 const char p0 = clichall_pos[i + 0];
10844 const char p1 = clichall_pos[i + 1];
10845
10846 *chall_ptr++ = hex_convert (p1) << 0
10847 | hex_convert (p0) << 4;
10848 }
10849
10850 *chall_ptr++ = 0x80;
10851
10852 /**
10853 * handle hash itself
10854 */
10855
10856 digest[0] = hex_to_uint (&hash_pos[ 0]);
10857 digest[1] = hex_to_uint (&hash_pos[ 8]);
10858 digest[2] = hex_to_uint (&hash_pos[16]);
10859 digest[3] = hex_to_uint (&hash_pos[24]);
10860
10861 digest[0] = byte_swap_32 (digest[0]);
10862 digest[1] = byte_swap_32 (digest[1]);
10863 digest[2] = byte_swap_32 (digest[2]);
10864 digest[3] = byte_swap_32 (digest[3]);
10865
10866 /**
10867 * reuse challange data as salt_buf, its the buffer that is most likely unique
10868 */
10869
10870 salt->salt_buf[0] = 0;
10871 salt->salt_buf[1] = 0;
10872 salt->salt_buf[2] = 0;
10873 salt->salt_buf[3] = 0;
10874 salt->salt_buf[4] = 0;
10875 salt->salt_buf[5] = 0;
10876 salt->salt_buf[6] = 0;
10877 salt->salt_buf[7] = 0;
10878
10879 uint *uptr;
10880
10881 uptr = (uint *) netntlm->userdomain_buf;
10882
10883 for (uint i = 0; i < 16; i += 16)
10884 {
10885 md5_64 (uptr, salt->salt_buf);
10886 }
10887
10888 uptr = (uint *) netntlm->chall_buf;
10889
10890 for (uint i = 0; i < 256; i += 16)
10891 {
10892 md5_64 (uptr, salt->salt_buf);
10893 }
10894
10895 salt->salt_len = 16;
10896
10897 return (PARSER_OK);
10898 }
10899
10900 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10901 {
10902 if (data.opts_type & OPTS_TYPE_ST_HEX)
10903 {
10904 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
10905 }
10906 else
10907 {
10908 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
10909 }
10910
10911 uint32_t *digest = (uint32_t *) hash_buf->digest;
10912
10913 salt_t *salt = hash_buf->salt;
10914
10915 digest[0] = hex_to_uint (&input_buf[ 0]);
10916 digest[1] = hex_to_uint (&input_buf[ 8]);
10917 digest[2] = hex_to_uint (&input_buf[16]);
10918 digest[3] = hex_to_uint (&input_buf[24]);
10919
10920 digest[0] = byte_swap_32 (digest[0]);
10921 digest[1] = byte_swap_32 (digest[1]);
10922 digest[2] = byte_swap_32 (digest[2]);
10923 digest[3] = byte_swap_32 (digest[3]);
10924
10925 digest[0] -= MD5M_A;
10926 digest[1] -= MD5M_B;
10927 digest[2] -= MD5M_C;
10928 digest[3] -= MD5M_D;
10929
10930 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10931
10932 uint salt_len = input_len - 32 - 1;
10933
10934 char *salt_buf = input_buf + 32 + 1;
10935
10936 char *salt_buf_ptr = (char *) salt->salt_buf;
10937
10938 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10939
10940 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10941
10942 salt->salt_len = salt_len;
10943
10944 return (PARSER_OK);
10945 }
10946
10947 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10948 {
10949 if (data.opts_type & OPTS_TYPE_ST_HEX)
10950 {
10951 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
10952 }
10953 else
10954 {
10955 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
10956 }
10957
10958 uint32_t *digest = (uint32_t *) hash_buf->digest;
10959
10960 salt_t *salt = hash_buf->salt;
10961
10962 digest[0] = hex_to_uint (&input_buf[ 0]);
10963 digest[1] = hex_to_uint (&input_buf[ 8]);
10964 digest[2] = hex_to_uint (&input_buf[16]);
10965 digest[3] = hex_to_uint (&input_buf[24]);
10966
10967 digest[0] = byte_swap_32 (digest[0]);
10968 digest[1] = byte_swap_32 (digest[1]);
10969 digest[2] = byte_swap_32 (digest[2]);
10970 digest[3] = byte_swap_32 (digest[3]);
10971
10972 digest[0] -= MD5M_A;
10973 digest[1] -= MD5M_B;
10974 digest[2] -= MD5M_C;
10975 digest[3] -= MD5M_D;
10976
10977 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10978
10979 uint salt_len = input_len - 32 - 1;
10980
10981 char *salt_buf = input_buf + 32 + 1;
10982
10983 char *salt_buf_ptr = (char *) salt->salt_buf;
10984
10985 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10986
10987 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10988
10989 salt->salt_len = salt_len;
10990
10991 return (PARSER_OK);
10992 }
10993
10994 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10995 {
10996 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
10997
10998 uint32_t *digest = (uint32_t *) hash_buf->digest;
10999
11000 salt_t *salt = hash_buf->salt;
11001
11002 digest[0] = hex_to_uint (&input_buf[ 0]);
11003 digest[1] = hex_to_uint (&input_buf[ 8]);
11004 digest[2] = hex_to_uint (&input_buf[16]);
11005 digest[3] = hex_to_uint (&input_buf[24]);
11006
11007 digest[0] = byte_swap_32 (digest[0]);
11008 digest[1] = byte_swap_32 (digest[1]);
11009 digest[2] = byte_swap_32 (digest[2]);
11010 digest[3] = byte_swap_32 (digest[3]);
11011
11012 digest[0] -= MD5M_A;
11013 digest[1] -= MD5M_B;
11014 digest[2] -= MD5M_C;
11015 digest[3] -= MD5M_D;
11016
11017 /**
11018 * This is a virtual salt. While the algorithm is basically not salted
11019 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11020 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11021 */
11022
11023 char *salt_buf_ptr = (char *) salt->salt_buf;
11024
11025 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11026
11027 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11028
11029 salt->salt_len = salt_len;
11030
11031 return (PARSER_OK);
11032 }
11033
11034 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11035 {
11036 if (data.opts_type & OPTS_TYPE_ST_HEX)
11037 {
11038 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11039 }
11040 else
11041 {
11042 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11043 }
11044
11045 uint32_t *digest = (uint32_t *) hash_buf->digest;
11046
11047 salt_t *salt = hash_buf->salt;
11048
11049 digest[0] = hex_to_uint (&input_buf[ 0]);
11050 digest[1] = hex_to_uint (&input_buf[ 8]);
11051 digest[2] = hex_to_uint (&input_buf[16]);
11052 digest[3] = hex_to_uint (&input_buf[24]);
11053
11054 digest[0] = byte_swap_32 (digest[0]);
11055 digest[1] = byte_swap_32 (digest[1]);
11056 digest[2] = byte_swap_32 (digest[2]);
11057 digest[3] = byte_swap_32 (digest[3]);
11058
11059 digest[0] -= MD5M_A;
11060 digest[1] -= MD5M_B;
11061 digest[2] -= MD5M_C;
11062 digest[3] -= MD5M_D;
11063
11064 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11065
11066 uint salt_len = input_len - 32 - 1;
11067
11068 char *salt_buf = input_buf + 32 + 1;
11069
11070 char *salt_buf_ptr = (char *) salt->salt_buf;
11071
11072 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11073
11074 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11075
11076 salt->salt_len = salt_len;
11077
11078 return (PARSER_OK);
11079 }
11080
11081 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11082 {
11083 if (data.opts_type & OPTS_TYPE_ST_HEX)
11084 {
11085 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11086 }
11087 else
11088 {
11089 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11090 }
11091
11092 uint32_t *digest = (uint32_t *) hash_buf->digest;
11093
11094 salt_t *salt = hash_buf->salt;
11095
11096 digest[0] = hex_to_uint (&input_buf[ 0]);
11097 digest[1] = hex_to_uint (&input_buf[ 8]);
11098 digest[2] = hex_to_uint (&input_buf[16]);
11099 digest[3] = hex_to_uint (&input_buf[24]);
11100
11101 digest[0] = byte_swap_32 (digest[0]);
11102 digest[1] = byte_swap_32 (digest[1]);
11103 digest[2] = byte_swap_32 (digest[2]);
11104 digest[3] = byte_swap_32 (digest[3]);
11105
11106 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11107
11108 uint salt_len = input_len - 32 - 1;
11109
11110 char *salt_buf = input_buf + 32 + 1;
11111
11112 char *salt_buf_ptr = (char *) salt->salt_buf;
11113
11114 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11115
11116 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11117
11118 salt->salt_len = salt_len;
11119
11120 return (PARSER_OK);
11121 }
11122
11123 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11124 {
11125 if (data.opts_type & OPTS_TYPE_ST_HEX)
11126 {
11127 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11128 }
11129 else
11130 {
11131 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11132 }
11133
11134 uint32_t *digest = (uint32_t *) hash_buf->digest;
11135
11136 salt_t *salt = hash_buf->salt;
11137
11138 digest[0] = hex_to_uint (&input_buf[ 0]);
11139 digest[1] = hex_to_uint (&input_buf[ 8]);
11140 digest[2] = hex_to_uint (&input_buf[16]);
11141 digest[3] = hex_to_uint (&input_buf[24]);
11142
11143 digest[0] = byte_swap_32 (digest[0]);
11144 digest[1] = byte_swap_32 (digest[1]);
11145 digest[2] = byte_swap_32 (digest[2]);
11146 digest[3] = byte_swap_32 (digest[3]);
11147
11148 digest[0] -= MD4M_A;
11149 digest[1] -= MD4M_B;
11150 digest[2] -= MD4M_C;
11151 digest[3] -= MD4M_D;
11152
11153 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11154
11155 uint salt_len = input_len - 32 - 1;
11156
11157 char *salt_buf = input_buf + 32 + 1;
11158
11159 char *salt_buf_ptr = (char *) salt->salt_buf;
11160
11161 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11162
11163 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11164
11165 salt->salt_len = salt_len;
11166
11167 return (PARSER_OK);
11168 }
11169
11170 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11171 {
11172 if (data.opts_type & OPTS_TYPE_ST_HEX)
11173 {
11174 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11175 }
11176 else
11177 {
11178 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11179 }
11180
11181 uint32_t *digest = (uint32_t *) hash_buf->digest;
11182
11183 salt_t *salt = hash_buf->salt;
11184
11185 digest[0] = hex_to_uint (&input_buf[ 0]);
11186 digest[1] = hex_to_uint (&input_buf[ 8]);
11187 digest[2] = hex_to_uint (&input_buf[16]);
11188 digest[3] = hex_to_uint (&input_buf[24]);
11189
11190 digest[0] = byte_swap_32 (digest[0]);
11191 digest[1] = byte_swap_32 (digest[1]);
11192 digest[2] = byte_swap_32 (digest[2]);
11193 digest[3] = byte_swap_32 (digest[3]);
11194
11195 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11196
11197 uint salt_len = input_len - 32 - 1;
11198
11199 char *salt_buf = input_buf + 32 + 1;
11200
11201 uint salt_pc_block[16];
11202
11203 memset (salt_pc_block, 0, sizeof (salt_pc_block));
11204
11205 char *salt_pc_block_ptr = (char *) salt_pc_block;
11206
11207 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11208
11209 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11210
11211 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11212
11213 salt_pc_block[14] = salt_len * 8;
11214
11215 uint salt_pc_digest[4];
11216
11217 salt_pc_digest[0] = MAGIC_A;
11218 salt_pc_digest[1] = MAGIC_B;
11219 salt_pc_digest[2] = MAGIC_C;
11220 salt_pc_digest[3] = MAGIC_D;
11221
11222 md5_64 (salt_pc_block, salt_pc_digest);
11223
11224 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11225 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11226 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11227 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11228
11229 char *salt_buf_ptr = (char *) salt->salt_buf;
11230
11231 memcpy (salt_buf_ptr, salt_buf, salt_len);
11232
11233 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
11234
11235 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11236 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11237 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11238 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11239
11240 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11241
11242 return (PARSER_OK);
11243 }
11244
11245 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11246 {
11247 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11248
11249 uint32_t *digest = (uint32_t *) hash_buf->digest;
11250
11251 digest[0] = hex_to_uint (&input_buf[ 0]);
11252 digest[1] = hex_to_uint (&input_buf[ 8]);
11253 digest[2] = hex_to_uint (&input_buf[16]);
11254 digest[3] = hex_to_uint (&input_buf[24]);
11255 digest[4] = hex_to_uint (&input_buf[32]);
11256
11257 digest[0] -= SHA1M_A;
11258 digest[1] -= SHA1M_B;
11259 digest[2] -= SHA1M_C;
11260 digest[3] -= SHA1M_D;
11261 digest[4] -= SHA1M_E;
11262
11263 return (PARSER_OK);
11264 }
11265
11266 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11267 {
11268 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11269
11270 uint32_t *digest = (uint32_t *) hash_buf->digest;
11271
11272 digest[0] = hex_to_uint (&input_buf[ 0]);
11273 digest[1] = hex_to_uint (&input_buf[ 8]);
11274 digest[2] = hex_to_uint (&input_buf[16]);
11275 digest[3] = hex_to_uint (&input_buf[24]);
11276 digest[4] = hex_to_uint (&input_buf[32]);
11277
11278 return (PARSER_OK);
11279 }
11280
11281 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11282 {
11283 if (data.opts_type & OPTS_TYPE_ST_HEX)
11284 {
11285 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11286 }
11287 else
11288 {
11289 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11290 }
11291
11292 uint32_t *digest = (uint32_t *) hash_buf->digest;
11293
11294 salt_t *salt = hash_buf->salt;
11295
11296 digest[0] = hex_to_uint (&input_buf[ 0]);
11297 digest[1] = hex_to_uint (&input_buf[ 8]);
11298 digest[2] = hex_to_uint (&input_buf[16]);
11299 digest[3] = hex_to_uint (&input_buf[24]);
11300 digest[4] = hex_to_uint (&input_buf[32]);
11301
11302 digest[0] -= SHA1M_A;
11303 digest[1] -= SHA1M_B;
11304 digest[2] -= SHA1M_C;
11305 digest[3] -= SHA1M_D;
11306 digest[4] -= SHA1M_E;
11307
11308 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11309
11310 uint salt_len = input_len - 40 - 1;
11311
11312 char *salt_buf = input_buf + 40 + 1;
11313
11314 char *salt_buf_ptr = (char *) salt->salt_buf;
11315
11316 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11317
11318 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11319
11320 salt->salt_len = salt_len;
11321
11322 return (PARSER_OK);
11323 }
11324
11325 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11326 {
11327 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11328
11329 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11330
11331 uint32_t *digest = (uint32_t *) hash_buf->digest;
11332
11333 char tmp_buf[100];
11334
11335 memset (tmp_buf, 0, sizeof (tmp_buf));
11336
11337 base64_decode (base64_to_int, input_buf + 5, input_len - 5, tmp_buf);
11338
11339 memcpy (digest, tmp_buf, 20);
11340
11341 digest[0] = byte_swap_32 (digest[0]);
11342 digest[1] = byte_swap_32 (digest[1]);
11343 digest[2] = byte_swap_32 (digest[2]);
11344 digest[3] = byte_swap_32 (digest[3]);
11345 digest[4] = byte_swap_32 (digest[4]);
11346
11347 digest[0] -= SHA1M_A;
11348 digest[1] -= SHA1M_B;
11349 digest[2] -= SHA1M_C;
11350 digest[3] -= SHA1M_D;
11351 digest[4] -= SHA1M_E;
11352
11353 return (PARSER_OK);
11354 }
11355
11356 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11357 {
11358 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11359
11360 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11361
11362 uint32_t *digest = (uint32_t *) hash_buf->digest;
11363
11364 salt_t *salt = hash_buf->salt;
11365
11366 char tmp_buf[100];
11367
11368 memset (tmp_buf, 0, sizeof (tmp_buf));
11369
11370 int tmp_len = base64_decode (base64_to_int, input_buf + 6, input_len - 6, tmp_buf);
11371
11372 memcpy (digest, tmp_buf, 20);
11373
11374 salt->salt_len = tmp_len - 20;
11375
11376 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11377
11378 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11379 {
11380 char *ptr = (char *) salt->salt_buf;
11381
11382 ptr[salt->salt_len] = 0x80;
11383 }
11384
11385 digest[0] = byte_swap_32 (digest[0]);
11386 digest[1] = byte_swap_32 (digest[1]);
11387 digest[2] = byte_swap_32 (digest[2]);
11388 digest[3] = byte_swap_32 (digest[3]);
11389 digest[4] = byte_swap_32 (digest[4]);
11390
11391 digest[0] -= SHA1M_A;
11392 digest[1] -= SHA1M_B;
11393 digest[2] -= SHA1M_C;
11394 digest[3] -= SHA1M_D;
11395 digest[4] -= SHA1M_E;
11396
11397 return (PARSER_OK);
11398 }
11399
11400 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11401 {
11402 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11403
11404 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11405
11406 uint32_t *digest = (uint32_t *) hash_buf->digest;
11407
11408 salt_t *salt = hash_buf->salt;
11409
11410 char *salt_buf = input_buf + 6;
11411
11412 uint salt_len = 8;
11413
11414 char *salt_buf_ptr = (char *) salt->salt_buf;
11415
11416 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11417
11418 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11419
11420 salt->salt_len = salt_len;
11421
11422 char *hash_pos = input_buf + 6 + 8 + 40;
11423
11424 digest[0] = hex_to_uint (&hash_pos[ 0]);
11425 digest[1] = hex_to_uint (&hash_pos[ 8]);
11426 digest[2] = hex_to_uint (&hash_pos[16]);
11427 digest[3] = hex_to_uint (&hash_pos[24]);
11428 digest[4] = hex_to_uint (&hash_pos[32]);
11429
11430 digest[0] -= SHA1M_A;
11431 digest[1] -= SHA1M_B;
11432 digest[2] -= SHA1M_C;
11433 digest[3] -= SHA1M_D;
11434 digest[4] -= SHA1M_E;
11435
11436 return (PARSER_OK);
11437 }
11438
11439 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11440 {
11441 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11442
11443 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11444
11445 uint32_t *digest = (uint32_t *) hash_buf->digest;
11446
11447 salt_t *salt = hash_buf->salt;
11448
11449 char *salt_buf = input_buf + 6;
11450
11451 uint salt_len = 8;
11452
11453 char *salt_buf_ptr = (char *) salt->salt_buf;
11454
11455 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11456
11457 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11458
11459 salt->salt_len = salt_len;
11460
11461 char *hash_pos = input_buf + 6 + 8;
11462
11463 digest[0] = hex_to_uint (&hash_pos[ 0]);
11464 digest[1] = hex_to_uint (&hash_pos[ 8]);
11465 digest[2] = hex_to_uint (&hash_pos[16]);
11466 digest[3] = hex_to_uint (&hash_pos[24]);
11467 digest[4] = hex_to_uint (&hash_pos[32]);
11468
11469 digest[0] -= SHA1M_A;
11470 digest[1] -= SHA1M_B;
11471 digest[2] -= SHA1M_C;
11472 digest[3] -= SHA1M_D;
11473 digest[4] -= SHA1M_E;
11474
11475 return (PARSER_OK);
11476 }
11477
11478 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11479 {
11480 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11481
11482 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11483
11484 uint64_t *digest = (uint64_t *) hash_buf->digest;
11485
11486 salt_t *salt = hash_buf->salt;
11487
11488 char *salt_buf = input_buf + 6;
11489
11490 uint salt_len = 8;
11491
11492 char *salt_buf_ptr = (char *) salt->salt_buf;
11493
11494 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11495
11496 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11497
11498 salt->salt_len = salt_len;
11499
11500 char *hash_pos = input_buf + 6 + 8;
11501
11502 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
11503 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
11504 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
11505 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
11506 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
11507 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
11508 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
11509 digest[7] = hex_to_uint64_t (&hash_pos[112]);
11510
11511 digest[0] -= SHA512M_A;
11512 digest[1] -= SHA512M_B;
11513 digest[2] -= SHA512M_C;
11514 digest[3] -= SHA512M_D;
11515 digest[4] -= SHA512M_E;
11516 digest[5] -= SHA512M_F;
11517 digest[6] -= SHA512M_G;
11518 digest[7] -= SHA512M_H;
11519
11520 return (PARSER_OK);
11521 }
11522
11523 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11524 {
11525 if (data.opts_type & OPTS_TYPE_ST_HEX)
11526 {
11527 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11528 }
11529 else
11530 {
11531 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11532 }
11533
11534 uint32_t *digest = (uint32_t *) hash_buf->digest;
11535
11536 salt_t *salt = hash_buf->salt;
11537
11538 digest[0] = hex_to_uint (&input_buf[ 0]);
11539 digest[1] = hex_to_uint (&input_buf[ 8]);
11540 digest[2] = 0;
11541 digest[3] = 0;
11542
11543 digest[0] = byte_swap_32 (digest[0]);
11544 digest[1] = byte_swap_32 (digest[1]);
11545
11546 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11547
11548 uint salt_len = input_len - 16 - 1;
11549
11550 char *salt_buf = input_buf + 16 + 1;
11551
11552 char *salt_buf_ptr = (char *) salt->salt_buf;
11553
11554 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11555
11556 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11557
11558 salt->salt_len = salt_len;
11559
11560 return (PARSER_OK);
11561 }
11562
11563 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11564 {
11565 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11566
11567 uint32_t *digest = (uint32_t *) hash_buf->digest;
11568
11569 salt_t *salt = hash_buf->salt;
11570
11571 digest[0] = hex_to_uint (&input_buf[ 0]);
11572 digest[1] = hex_to_uint (&input_buf[ 8]);
11573 digest[2] = hex_to_uint (&input_buf[16]);
11574 digest[3] = hex_to_uint (&input_buf[24]);
11575 digest[4] = hex_to_uint (&input_buf[32]);
11576
11577 digest[0] -= SHA1M_A;
11578 digest[1] -= SHA1M_B;
11579 digest[2] -= SHA1M_C;
11580 digest[3] -= SHA1M_D;
11581 digest[4] -= SHA1M_E;
11582
11583 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11584
11585 uint salt_len = input_len - 40 - 1;
11586
11587 char *salt_buf = input_buf + 40 + 1;
11588
11589 char *salt_buf_ptr = (char *) salt->salt_buf;
11590
11591 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11592
11593 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11594
11595 salt->salt_len = salt_len;
11596
11597 return (PARSER_OK);
11598 }
11599
11600 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11601 {
11602 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11603
11604 uint32_t *digest = (uint32_t *) hash_buf->digest;
11605
11606 salt_t *salt = hash_buf->salt;
11607
11608 char *hash_pos = input_buf;
11609
11610 digest[ 0] = hex_to_uint (&hash_pos[ 0]);
11611 digest[ 1] = hex_to_uint (&hash_pos[ 8]);
11612 digest[ 2] = hex_to_uint (&hash_pos[ 16]);
11613 digest[ 3] = hex_to_uint (&hash_pos[ 24]);
11614 digest[ 4] = hex_to_uint (&hash_pos[ 32]);
11615 digest[ 5] = hex_to_uint (&hash_pos[ 40]);
11616 digest[ 6] = hex_to_uint (&hash_pos[ 48]);
11617 digest[ 7] = hex_to_uint (&hash_pos[ 56]);
11618 digest[ 8] = hex_to_uint (&hash_pos[ 64]);
11619 digest[ 9] = hex_to_uint (&hash_pos[ 72]);
11620 digest[10] = hex_to_uint (&hash_pos[ 80]);
11621 digest[11] = hex_to_uint (&hash_pos[ 88]);
11622 digest[12] = hex_to_uint (&hash_pos[ 96]);
11623 digest[13] = hex_to_uint (&hash_pos[104]);
11624 digest[14] = hex_to_uint (&hash_pos[112]);
11625 digest[15] = hex_to_uint (&hash_pos[120]);
11626
11627 char *salt_pos = input_buf + 128;
11628
11629 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
11630 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
11631 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]);
11632 salt->salt_buf[3] = hex_to_uint (&salt_pos[24]);
11633
11634 salt->salt_iter = ROUNDS_ORACLET - 1;
11635 salt->salt_len = 16;
11636
11637 return (PARSER_OK);
11638 }
11639
11640 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11641 {
11642 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11643
11644 uint32_t *digest = (uint32_t *) hash_buf->digest;
11645
11646 digest[0] = hex_to_uint (&input_buf[ 0]);
11647 digest[1] = hex_to_uint (&input_buf[ 8]);
11648 digest[2] = hex_to_uint (&input_buf[16]);
11649 digest[3] = hex_to_uint (&input_buf[24]);
11650 digest[4] = hex_to_uint (&input_buf[32]);
11651 digest[5] = hex_to_uint (&input_buf[40]);
11652 digest[6] = hex_to_uint (&input_buf[48]);
11653 digest[7] = hex_to_uint (&input_buf[56]);
11654
11655 digest[0] -= SHA256M_A;
11656 digest[1] -= SHA256M_B;
11657 digest[2] -= SHA256M_C;
11658 digest[3] -= SHA256M_D;
11659 digest[4] -= SHA256M_E;
11660 digest[5] -= SHA256M_F;
11661 digest[6] -= SHA256M_G;
11662 digest[7] -= SHA256M_H;
11663
11664 return (PARSER_OK);
11665 }
11666
11667 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11668 {
11669 if (data.opts_type & OPTS_TYPE_ST_HEX)
11670 {
11671 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11672 }
11673 else
11674 {
11675 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11676 }
11677
11678 uint32_t *digest = (uint32_t *) hash_buf->digest;
11679
11680 salt_t *salt = hash_buf->salt;
11681
11682 digest[0] = hex_to_uint (&input_buf[ 0]);
11683 digest[1] = hex_to_uint (&input_buf[ 8]);
11684 digest[2] = hex_to_uint (&input_buf[16]);
11685 digest[3] = hex_to_uint (&input_buf[24]);
11686 digest[4] = hex_to_uint (&input_buf[32]);
11687 digest[5] = hex_to_uint (&input_buf[40]);
11688 digest[6] = hex_to_uint (&input_buf[48]);
11689 digest[7] = hex_to_uint (&input_buf[56]);
11690
11691 digest[0] -= SHA256M_A;
11692 digest[1] -= SHA256M_B;
11693 digest[2] -= SHA256M_C;
11694 digest[3] -= SHA256M_D;
11695 digest[4] -= SHA256M_E;
11696 digest[5] -= SHA256M_F;
11697 digest[6] -= SHA256M_G;
11698 digest[7] -= SHA256M_H;
11699
11700 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11701
11702 uint salt_len = input_len - 64 - 1;
11703
11704 char *salt_buf = input_buf + 64 + 1;
11705
11706 char *salt_buf_ptr = (char *) salt->salt_buf;
11707
11708 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11709
11710 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11711
11712 salt->salt_len = salt_len;
11713
11714 return (PARSER_OK);
11715 }
11716
11717 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11718 {
11719 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11720
11721 uint64_t *digest = (uint64_t *) hash_buf->digest;
11722
11723 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11724 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11725 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11726 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11727 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11728 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11729 digest[6] = 0;
11730 digest[7] = 0;
11731
11732 digest[0] -= SHA384M_A;
11733 digest[1] -= SHA384M_B;
11734 digest[2] -= SHA384M_C;
11735 digest[3] -= SHA384M_D;
11736 digest[4] -= SHA384M_E;
11737 digest[5] -= SHA384M_F;
11738 digest[6] -= 0;
11739 digest[7] -= 0;
11740
11741 return (PARSER_OK);
11742 }
11743
11744 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11745 {
11746 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) 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] = hex_to_uint64_t (&input_buf[ 96]);
11757 digest[7] = hex_to_uint64_t (&input_buf[112]);
11758
11759 digest[0] -= SHA512M_A;
11760 digest[1] -= SHA512M_B;
11761 digest[2] -= SHA512M_C;
11762 digest[3] -= SHA512M_D;
11763 digest[4] -= SHA512M_E;
11764 digest[5] -= SHA512M_F;
11765 digest[6] -= SHA512M_G;
11766 digest[7] -= SHA512M_H;
11767
11768 return (PARSER_OK);
11769 }
11770
11771 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11772 {
11773 if (data.opts_type & OPTS_TYPE_ST_HEX)
11774 {
11775 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
11776 }
11777 else
11778 {
11779 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
11780 }
11781
11782 uint64_t *digest = (uint64_t *) hash_buf->digest;
11783
11784 salt_t *salt = hash_buf->salt;
11785
11786 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11787 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11788 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11789 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11790 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11791 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11792 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
11793 digest[7] = hex_to_uint64_t (&input_buf[112]);
11794
11795 digest[0] -= SHA512M_A;
11796 digest[1] -= SHA512M_B;
11797 digest[2] -= SHA512M_C;
11798 digest[3] -= SHA512M_D;
11799 digest[4] -= SHA512M_E;
11800 digest[5] -= SHA512M_F;
11801 digest[6] -= SHA512M_G;
11802 digest[7] -= SHA512M_H;
11803
11804 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11805
11806 uint salt_len = input_len - 128 - 1;
11807
11808 char *salt_buf = input_buf + 128 + 1;
11809
11810 char *salt_buf_ptr = (char *) salt->salt_buf;
11811
11812 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11813
11814 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11815
11816 salt->salt_len = salt_len;
11817
11818 return (PARSER_OK);
11819 }
11820
11821 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11822 {
11823 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
11824
11825 uint64_t *digest = (uint64_t *) hash_buf->digest;
11826
11827 salt_t *salt = hash_buf->salt;
11828
11829 char *salt_pos = input_buf + 3;
11830
11831 uint iterations_len = 0;
11832
11833 if (memcmp (salt_pos, "rounds=", 7) == 0)
11834 {
11835 salt_pos += 7;
11836
11837 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
11838
11839 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
11840 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
11841
11842 salt_pos[0] = 0x0;
11843
11844 salt->salt_iter = atoi (salt_pos - iterations_len);
11845
11846 salt_pos += 1;
11847
11848 iterations_len += 8;
11849 }
11850 else
11851 {
11852 salt->salt_iter = ROUNDS_SHA512CRYPT;
11853 }
11854
11855 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
11856
11857 char *hash_pos = strchr (salt_pos, '$');
11858
11859 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11860
11861 uint salt_len = hash_pos - salt_pos;
11862
11863 if (salt_len > 16) return (PARSER_SALT_LENGTH);
11864
11865 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
11866
11867 salt->salt_len = salt_len;
11868
11869 hash_pos++;
11870
11871 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
11872
11873 return (PARSER_OK);
11874 }
11875
11876 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11877 {
11878 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
11879
11880 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
11881
11882 uint64_t *digest = (uint64_t *) hash_buf->digest;
11883
11884 salt_t *salt = hash_buf->salt;
11885
11886 uint keccak_mdlen = input_len / 2;
11887
11888 for (uint i = 0; i < keccak_mdlen / 8; i++)
11889 {
11890 digest[i] = hex_to_uint64_t (&input_buf[i * 16]);
11891
11892 digest[i] = byte_swap_64 (digest[i]);
11893 }
11894
11895 salt->keccak_mdlen = keccak_mdlen;
11896
11897 return (PARSER_OK);
11898 }
11899
11900 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11901 {
11902 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
11903
11904 uint32_t *digest = (uint32_t *) hash_buf->digest;
11905
11906 salt_t *salt = hash_buf->salt;
11907
11908 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
11909
11910 /**
11911 * Parse that strange long line
11912 */
11913
11914 char *in_off[9];
11915
11916 size_t in_len[9];
11917
11918 in_off[0] = strtok (input_buf, ":");
11919
11920 in_len[0] = strlen (in_off[0]);
11921
11922 size_t i;
11923
11924 for (i = 1; i < 9; i++)
11925 {
11926 in_off[i] = strtok (NULL, ":");
11927
11928 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11929
11930 in_len[i] = strlen (in_off[i]);
11931 }
11932
11933 char *ptr;
11934
11935 ptr = (char *) ikepsk->msg_buf;
11936
11937 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_char (in_off[0] + i);
11938 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_char (in_off[1] + i);
11939 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_char (in_off[2] + i);
11940 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_char (in_off[3] + i);
11941 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_char (in_off[4] + i);
11942 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_char (in_off[5] + i);
11943
11944 *ptr = 0x80;
11945
11946 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
11947
11948 ptr = (char *) ikepsk->nr_buf;
11949
11950 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_char (in_off[6] + i);
11951 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_char (in_off[7] + i);
11952
11953 *ptr = 0x80;
11954
11955 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
11956
11957 /**
11958 * Store to database
11959 */
11960
11961 ptr = in_off[8];
11962
11963 digest[0] = hex_to_uint (&ptr[ 0]);
11964 digest[1] = hex_to_uint (&ptr[ 8]);
11965 digest[2] = hex_to_uint (&ptr[16]);
11966 digest[3] = hex_to_uint (&ptr[24]);
11967
11968 digest[0] = byte_swap_32 (digest[0]);
11969 digest[1] = byte_swap_32 (digest[1]);
11970 digest[2] = byte_swap_32 (digest[2]);
11971 digest[3] = byte_swap_32 (digest[3]);
11972
11973 salt->salt_len = 32;
11974
11975 salt->salt_buf[0] = ikepsk->nr_buf[0];
11976 salt->salt_buf[1] = ikepsk->nr_buf[1];
11977 salt->salt_buf[2] = ikepsk->nr_buf[2];
11978 salt->salt_buf[3] = ikepsk->nr_buf[3];
11979 salt->salt_buf[4] = ikepsk->nr_buf[4];
11980 salt->salt_buf[5] = ikepsk->nr_buf[5];
11981 salt->salt_buf[6] = ikepsk->nr_buf[6];
11982 salt->salt_buf[7] = ikepsk->nr_buf[7];
11983
11984 return (PARSER_OK);
11985 }
11986
11987 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11988 {
11989 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
11990
11991 uint32_t *digest = (uint32_t *) hash_buf->digest;
11992
11993 salt_t *salt = hash_buf->salt;
11994
11995 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
11996
11997 /**
11998 * Parse that strange long line
11999 */
12000
12001 char *in_off[9];
12002
12003 size_t in_len[9];
12004
12005 in_off[0] = strtok (input_buf, ":");
12006
12007 in_len[0] = strlen (in_off[0]);
12008
12009 size_t i;
12010
12011 for (i = 1; i < 9; i++)
12012 {
12013 in_off[i] = strtok (NULL, ":");
12014
12015 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12016
12017 in_len[i] = strlen (in_off[i]);
12018 }
12019
12020 char *ptr;
12021
12022 ptr = (char *) ikepsk->msg_buf;
12023
12024 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_char (in_off[0] + i);
12025 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_char (in_off[1] + i);
12026 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_char (in_off[2] + i);
12027 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_char (in_off[3] + i);
12028 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_char (in_off[4] + i);
12029 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_char (in_off[5] + i);
12030
12031 *ptr = 0x80;
12032
12033 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12034
12035 ptr = (char *) ikepsk->nr_buf;
12036
12037 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_char (in_off[6] + i);
12038 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_char (in_off[7] + i);
12039
12040 *ptr = 0x80;
12041
12042 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12043
12044 /**
12045 * Store to database
12046 */
12047
12048 ptr = in_off[8];
12049
12050 digest[0] = hex_to_uint (&ptr[ 0]);
12051 digest[1] = hex_to_uint (&ptr[ 8]);
12052 digest[2] = hex_to_uint (&ptr[16]);
12053 digest[3] = hex_to_uint (&ptr[24]);
12054 digest[4] = hex_to_uint (&ptr[32]);
12055
12056 salt->salt_len = 32;
12057
12058 salt->salt_buf[0] = ikepsk->nr_buf[0];
12059 salt->salt_buf[1] = ikepsk->nr_buf[1];
12060 salt->salt_buf[2] = ikepsk->nr_buf[2];
12061 salt->salt_buf[3] = ikepsk->nr_buf[3];
12062 salt->salt_buf[4] = ikepsk->nr_buf[4];
12063 salt->salt_buf[5] = ikepsk->nr_buf[5];
12064 salt->salt_buf[6] = ikepsk->nr_buf[6];
12065 salt->salt_buf[7] = ikepsk->nr_buf[7];
12066
12067 return (PARSER_OK);
12068 }
12069
12070 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12071 {
12072 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12073
12074 uint32_t *digest = (uint32_t *) hash_buf->digest;
12075
12076 digest[0] = hex_to_uint (&input_buf[ 0]);
12077 digest[1] = hex_to_uint (&input_buf[ 8]);
12078 digest[2] = hex_to_uint (&input_buf[16]);
12079 digest[3] = hex_to_uint (&input_buf[24]);
12080 digest[4] = hex_to_uint (&input_buf[32]);
12081
12082 digest[0] = byte_swap_32 (digest[0]);
12083 digest[1] = byte_swap_32 (digest[1]);
12084 digest[2] = byte_swap_32 (digest[2]);
12085 digest[3] = byte_swap_32 (digest[3]);
12086 digest[4] = byte_swap_32 (digest[4]);
12087
12088 return (PARSER_OK);
12089 }
12090
12091 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12092 {
12093 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12094
12095 uint32_t *digest = (uint32_t *) hash_buf->digest;
12096
12097 digest[ 0] = hex_to_uint (&input_buf[ 0]);
12098 digest[ 1] = hex_to_uint (&input_buf[ 8]);
12099 digest[ 2] = hex_to_uint (&input_buf[ 16]);
12100 digest[ 3] = hex_to_uint (&input_buf[ 24]);
12101 digest[ 4] = hex_to_uint (&input_buf[ 32]);
12102 digest[ 5] = hex_to_uint (&input_buf[ 40]);
12103 digest[ 6] = hex_to_uint (&input_buf[ 48]);
12104 digest[ 7] = hex_to_uint (&input_buf[ 56]);
12105 digest[ 8] = hex_to_uint (&input_buf[ 64]);
12106 digest[ 9] = hex_to_uint (&input_buf[ 72]);
12107 digest[10] = hex_to_uint (&input_buf[ 80]);
12108 digest[11] = hex_to_uint (&input_buf[ 88]);
12109 digest[12] = hex_to_uint (&input_buf[ 96]);
12110 digest[13] = hex_to_uint (&input_buf[104]);
12111 digest[14] = hex_to_uint (&input_buf[112]);
12112 digest[15] = hex_to_uint (&input_buf[120]);
12113
12114 return (PARSER_OK);
12115 }
12116
12117 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12118 {
12119 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12120
12121 uint32_t *digest = (uint32_t *) hash_buf->digest;
12122
12123 salt_t *salt = hash_buf->salt;
12124
12125 digest[0] = hex_to_uint (&input_buf[ 0]);
12126 digest[1] = hex_to_uint (&input_buf[ 8]);
12127 digest[2] = hex_to_uint (&input_buf[16]);
12128 digest[3] = hex_to_uint (&input_buf[24]);
12129 digest[4] = hex_to_uint (&input_buf[32]);
12130
12131 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12132
12133 uint salt_len = input_len - 40 - 1;
12134
12135 char *salt_buf = input_buf + 40 + 1;
12136
12137 char *salt_buf_ptr = (char *) salt->salt_buf;
12138
12139 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12140
12141 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12142
12143 salt->salt_len = salt_len;
12144
12145 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12146
12147 return (PARSER_OK);
12148 }
12149
12150 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12151 {
12152 uint32_t *digest = (uint32_t *) hash_buf->digest;
12153
12154 salt_t *salt = hash_buf->salt;
12155
12156 tc_t *tc = (tc_t *) hash_buf->esalt;
12157
12158 if (input_len == 0)
12159 {
12160 log_error ("TrueCrypt container not specified");
12161
12162 exit (-1);
12163 }
12164
12165 FILE *fp = fopen (input_buf, "rb");
12166
12167 if (fp == NULL)
12168 {
12169 log_error ("%s: %s", input_buf, strerror (errno));
12170
12171 exit (-1);
12172 }
12173
12174 char buf[512];
12175
12176 int n = fread (buf, 1, sizeof (buf), fp);
12177
12178 fclose (fp);
12179
12180 if (n != 512) return (PARSER_TC_FILE_SIZE);
12181
12182 memcpy (tc->salt_buf, buf, 64);
12183
12184 memcpy (tc->data_buf, buf + 64, 512 - 64);
12185
12186 salt->salt_buf[0] = tc->salt_buf[0];
12187
12188 salt->salt_len = 4;
12189
12190 salt->salt_iter = 1000 - 1;
12191
12192 digest[0] = tc->data_buf[0];
12193
12194 return (PARSER_OK);
12195 }
12196
12197 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12198 {
12199 uint32_t *digest = (uint32_t *) hash_buf->digest;
12200
12201 salt_t *salt = hash_buf->salt;
12202
12203 tc_t *tc = (tc_t *) hash_buf->esalt;
12204
12205 if (input_len == 0)
12206 {
12207 log_error ("TrueCrypt container not specified");
12208
12209 exit (-1);
12210 }
12211
12212 FILE *fp = fopen (input_buf, "rb");
12213
12214 if (fp == NULL)
12215 {
12216 log_error ("%s: %s", input_buf, strerror (errno));
12217
12218 exit (-1);
12219 }
12220
12221 char buf[512];
12222
12223 int n = fread (buf, 1, sizeof (buf), fp);
12224
12225 fclose (fp);
12226
12227 if (n != 512) return (PARSER_TC_FILE_SIZE);
12228
12229 memcpy (tc->salt_buf, buf, 64);
12230
12231 memcpy (tc->data_buf, buf + 64, 512 - 64);
12232
12233 salt->salt_buf[0] = tc->salt_buf[0];
12234
12235 salt->salt_len = 4;
12236
12237 salt->salt_iter = 2000 - 1;
12238
12239 digest[0] = tc->data_buf[0];
12240
12241 return (PARSER_OK);
12242 }
12243
12244 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12245 {
12246 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12247
12248 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12249
12250 uint32_t *digest = (uint32_t *) hash_buf->digest;
12251
12252 salt_t *salt = hash_buf->salt;
12253
12254 char *salt_pos = input_buf + 6;
12255
12256 char *hash_pos = strchr (salt_pos, '$');
12257
12258 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12259
12260 uint salt_len = hash_pos - salt_pos;
12261
12262 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12263
12264 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12265
12266 salt->salt_len = salt_len;
12267
12268 salt->salt_iter = 1000;
12269
12270 hash_pos++;
12271
12272 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12273
12274 return (PARSER_OK);
12275 }
12276
12277 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12278 {
12279 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12280
12281 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12282
12283 uint32_t *digest = (uint32_t *) hash_buf->digest;
12284
12285 salt_t *salt = hash_buf->salt;
12286
12287 char *iter_pos = input_buf + 7;
12288
12289 char *salt_pos = strchr (iter_pos, '$');
12290
12291 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12292
12293 salt_pos++;
12294
12295 char *hash_pos = strchr (salt_pos, '$');
12296
12297 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12298
12299 uint salt_len = hash_pos - salt_pos;
12300
12301 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12302
12303 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12304
12305 salt->salt_len = salt_len;
12306
12307 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12308
12309 salt->salt_sign[0] = atoi (salt_iter);
12310
12311 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12312
12313 hash_pos++;
12314
12315 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12316
12317 digest[0] = byte_swap_32 (digest[0]);
12318 digest[1] = byte_swap_32 (digest[1]);
12319 digest[2] = byte_swap_32 (digest[2]);
12320 digest[3] = byte_swap_32 (digest[3]);
12321 digest[4] = byte_swap_32 (digest[4]);
12322
12323 return (PARSER_OK);
12324 }
12325
12326 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12327 {
12328 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12329
12330 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12331
12332 uint32_t *digest = (uint32_t *) hash_buf->digest;
12333
12334 salt_t *salt = hash_buf->salt;
12335
12336 char *iter_pos = input_buf + 9;
12337
12338 char *salt_pos = strchr (iter_pos, '$');
12339
12340 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12341
12342 salt_pos++;
12343
12344 char *hash_pos = strchr (salt_pos, '$');
12345
12346 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12347
12348 uint salt_len = hash_pos - salt_pos;
12349
12350 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12351
12352 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12353
12354 salt->salt_len = salt_len;
12355
12356 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12357
12358 salt->salt_sign[0] = atoi (salt_iter);
12359
12360 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12361
12362 hash_pos++;
12363
12364 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12365
12366 digest[0] = byte_swap_32 (digest[0]);
12367 digest[1] = byte_swap_32 (digest[1]);
12368 digest[2] = byte_swap_32 (digest[2]);
12369 digest[3] = byte_swap_32 (digest[3]);
12370 digest[4] = byte_swap_32 (digest[4]);
12371 digest[5] = byte_swap_32 (digest[5]);
12372 digest[6] = byte_swap_32 (digest[6]);
12373 digest[7] = byte_swap_32 (digest[7]);
12374
12375 return (PARSER_OK);
12376 }
12377
12378 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12379 {
12380 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12381
12382 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12383
12384 uint64_t *digest = (uint64_t *) hash_buf->digest;
12385
12386 salt_t *salt = hash_buf->salt;
12387
12388 char *iter_pos = input_buf + 9;
12389
12390 char *salt_pos = strchr (iter_pos, '$');
12391
12392 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12393
12394 salt_pos++;
12395
12396 char *hash_pos = strchr (salt_pos, '$');
12397
12398 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12399
12400 uint salt_len = hash_pos - salt_pos;
12401
12402 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12403
12404 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12405
12406 salt->salt_len = salt_len;
12407
12408 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12409
12410 salt->salt_sign[0] = atoi (salt_iter);
12411
12412 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12413
12414 hash_pos++;
12415
12416 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12417
12418 digest[0] = byte_swap_64 (digest[0]);
12419 digest[1] = byte_swap_64 (digest[1]);
12420 digest[2] = byte_swap_64 (digest[2]);
12421 digest[3] = byte_swap_64 (digest[3]);
12422 digest[4] = byte_swap_64 (digest[4]);
12423 digest[5] = byte_swap_64 (digest[5]);
12424 digest[6] = byte_swap_64 (digest[6]);
12425 digest[7] = byte_swap_64 (digest[7]);
12426
12427 return (PARSER_OK);
12428 }
12429
12430 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12431 {
12432 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12433
12434 uint32_t *digest = (uint32_t *) hash_buf->digest;
12435
12436 salt_t *salt = hash_buf->salt;
12437
12438 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12439
12440 /**
12441 * parse line
12442 */
12443
12444 char *iterations_pos = input_buf;
12445
12446 char *saltbuf_pos = strchr (iterations_pos, ':');
12447
12448 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12449
12450 uint iterations_len = saltbuf_pos - iterations_pos;
12451
12452 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12453
12454 saltbuf_pos++;
12455
12456 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12457
12458 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12459
12460 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12461
12462 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12463
12464 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12465
12466 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12467
12468 cipherbuf_pos++;
12469
12470 /**
12471 * pbkdf2 iterations
12472 */
12473
12474 salt->salt_iter = atoi (iterations_pos) - 1;
12475
12476 /**
12477 * handle salt encoding
12478 */
12479
12480 char *saltbuf_ptr = (char *) salt->salt_buf;
12481
12482 for (uint i = 0; i < saltbuf_len; i += 2)
12483 {
12484 const char p0 = saltbuf_pos[i + 0];
12485 const char p1 = saltbuf_pos[i + 1];
12486
12487 *saltbuf_ptr++ = hex_convert (p1) << 0
12488 | hex_convert (p0) << 4;
12489 }
12490
12491 salt->salt_len = saltbuf_len / 2;
12492
12493 /**
12494 * handle cipher encoding
12495 */
12496
12497 uint *tmp = (uint *) mymalloc (32);
12498
12499 char *cipherbuf_ptr = (char *) tmp;
12500
12501 for (uint i = 2016; i < cipherbuf_len; i += 2)
12502 {
12503 const char p0 = cipherbuf_pos[i + 0];
12504 const char p1 = cipherbuf_pos[i + 1];
12505
12506 *cipherbuf_ptr++ = hex_convert (p1) << 0
12507 | hex_convert (p0) << 4;
12508 }
12509
12510 // iv is stored at salt_buf 4 (length 16)
12511 // data is stored at salt_buf 8 (length 16)
12512
12513 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12514 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12515 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12516 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12517
12518 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12519 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12520 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12521 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12522
12523 free (tmp);
12524
12525 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12526 {
12527 const char p0 = cipherbuf_pos[j + 0];
12528 const char p1 = cipherbuf_pos[j + 1];
12529
12530 agilekey->cipher[i] = hex_convert (p1) << 0
12531 | hex_convert (p0) << 4;
12532 }
12533
12534 /**
12535 * digest buf
12536 */
12537
12538 digest[0] = 0x10101010;
12539 digest[1] = 0x10101010;
12540 digest[2] = 0x10101010;
12541 digest[3] = 0x10101010;
12542
12543 return (PARSER_OK);
12544 }
12545
12546 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12547 {
12548 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12549
12550 uint32_t *digest = (uint32_t *) hash_buf->digest;
12551
12552 salt_t *salt = hash_buf->salt;
12553
12554 char *hashbuf_pos = input_buf;
12555
12556 char *iterations_pos = strchr (hashbuf_pos, ':');
12557
12558 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12559
12560 uint hash_len = iterations_pos - hashbuf_pos;
12561
12562 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12563
12564 iterations_pos++;
12565
12566 char *saltbuf_pos = strchr (iterations_pos, ':');
12567
12568 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12569
12570 uint iterations_len = saltbuf_pos - iterations_pos;
12571
12572 saltbuf_pos++;
12573
12574 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12575
12576 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12577
12578 char *salt_buf_ptr = (char *) salt->salt_buf;
12579
12580 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12581
12582 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12583
12584 salt->salt_len = salt_len;
12585
12586 salt->salt_iter = atoi (iterations_pos) - 1;
12587
12588 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
12589 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
12590 digest[2] = hex_to_uint (&hashbuf_pos[16]);
12591 digest[3] = hex_to_uint (&hashbuf_pos[24]);
12592
12593 return (PARSER_OK);
12594 }
12595
12596 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12597 {
12598 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12599
12600 uint32_t *digest = (uint32_t *) hash_buf->digest;
12601
12602 digest[0] = hex_to_uint (&input_buf[ 0]);
12603 digest[1] = hex_to_uint (&input_buf[ 8]);
12604 digest[2] = hex_to_uint (&input_buf[16]);
12605 digest[3] = hex_to_uint (&input_buf[24]);
12606 digest[4] = hex_to_uint (&input_buf[32]);
12607 digest[5] = hex_to_uint (&input_buf[40]);
12608 digest[6] = hex_to_uint (&input_buf[48]);
12609 digest[7] = hex_to_uint (&input_buf[56]);
12610
12611 digest[0] = byte_swap_32 (digest[0]);
12612 digest[1] = byte_swap_32 (digest[1]);
12613 digest[2] = byte_swap_32 (digest[2]);
12614 digest[3] = byte_swap_32 (digest[3]);
12615 digest[4] = byte_swap_32 (digest[4]);
12616 digest[5] = byte_swap_32 (digest[5]);
12617 digest[6] = byte_swap_32 (digest[6]);
12618 digest[7] = byte_swap_32 (digest[7]);
12619
12620 return (PARSER_OK);
12621 }
12622
12623 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12624 {
12625 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12626
12627 uint32_t *digest = (uint32_t *) hash_buf->digest;
12628
12629 salt_t *salt = hash_buf->salt;
12630
12631 char *salt_pos = input_buf + 3;
12632
12633 uint iterations_len = 0;
12634
12635 if (memcmp (salt_pos, "rounds=", 7) == 0)
12636 {
12637 salt_pos += 7;
12638
12639 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12640
12641 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12642 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12643
12644 salt_pos[0] = 0x0;
12645
12646 salt->salt_iter = atoi (salt_pos - iterations_len);
12647
12648 salt_pos += 1;
12649
12650 iterations_len += 8;
12651 }
12652 else
12653 {
12654 salt->salt_iter = ROUNDS_SHA256CRYPT;
12655 }
12656
12657 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12658
12659 char *hash_pos = strchr (salt_pos, '$');
12660
12661 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12662
12663 uint salt_len = hash_pos - salt_pos;
12664
12665 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12666
12667 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12668
12669 salt->salt_len = salt_len;
12670
12671 hash_pos++;
12672
12673 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12674
12675 return (PARSER_OK);
12676 }
12677
12678 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12679 {
12680 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12681
12682 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12683
12684 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12685
12686 uint64_t *digest = (uint64_t *) hash_buf->digest;
12687
12688 salt_t *salt = hash_buf->salt;
12689
12690 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12691
12692 char *iter_pos = input_buf + 4;
12693
12694 char *salt_pos = strchr (iter_pos, '$');
12695
12696 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12697
12698 salt_pos++;
12699
12700 char *hash_pos = strchr (salt_pos, '$');
12701
12702 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12703
12704 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12705
12706 hash_pos++;
12707
12708 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
12709 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
12710 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
12711 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
12712 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
12713 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
12714 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
12715 digest[7] = hex_to_uint64_t (&hash_pos[112]);
12716
12717 uint salt_len = hash_pos - salt_pos - 1;
12718
12719 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12720
12721 salt->salt_len = salt_len / 2;
12722
12723 pbkdf2_sha512->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
12724 pbkdf2_sha512->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
12725 pbkdf2_sha512->salt_buf[2] = hex_to_uint (&salt_pos[16]);
12726 pbkdf2_sha512->salt_buf[3] = hex_to_uint (&salt_pos[24]);
12727 pbkdf2_sha512->salt_buf[4] = hex_to_uint (&salt_pos[32]);
12728 pbkdf2_sha512->salt_buf[5] = hex_to_uint (&salt_pos[40]);
12729 pbkdf2_sha512->salt_buf[6] = hex_to_uint (&salt_pos[48]);
12730 pbkdf2_sha512->salt_buf[7] = hex_to_uint (&salt_pos[56]);
12731
12732 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12733 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12734 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12735 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12736 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12737 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12738 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12739 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12740 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12741 pbkdf2_sha512->salt_buf[9] = 0x80;
12742
12743 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12744
12745 salt->salt_iter = atoi (iter_pos) - 1;
12746
12747 return (PARSER_OK);
12748 }
12749
12750 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12751 {
12752 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12753
12754 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12755
12756 uint32_t *digest = (uint32_t *) hash_buf->digest;
12757
12758 salt_t *salt = hash_buf->salt;
12759
12760 char *salt_pos = input_buf + 14;
12761
12762 char *hash_pos = strchr (salt_pos, '*');
12763
12764 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12765
12766 hash_pos++;
12767
12768 uint salt_len = hash_pos - salt_pos - 1;
12769
12770 char *salt_buf_ptr = (char *) salt->salt_buf;
12771
12772 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
12773
12774 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12775
12776 salt->salt_len = salt_len;
12777
12778 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
12779
12780 base64_decode (base64_to_int, hash_pos, 43, tmp_buf);
12781
12782 memcpy (digest, tmp_buf, 32);
12783
12784 digest[0] = byte_swap_32 (digest[0]);
12785 digest[1] = byte_swap_32 (digest[1]);
12786 digest[2] = byte_swap_32 (digest[2]);
12787 digest[3] = byte_swap_32 (digest[3]);
12788 digest[4] = byte_swap_32 (digest[4]);
12789 digest[5] = byte_swap_32 (digest[5]);
12790 digest[6] = byte_swap_32 (digest[6]);
12791 digest[7] = byte_swap_32 (digest[7]);
12792
12793 digest[0] -= SHA256M_A;
12794 digest[1] -= SHA256M_B;
12795 digest[2] -= SHA256M_C;
12796 digest[3] -= SHA256M_D;
12797 digest[4] -= SHA256M_E;
12798 digest[5] -= SHA256M_F;
12799 digest[6] -= SHA256M_G;
12800 digest[7] -= SHA256M_H;
12801
12802 return (PARSER_OK);
12803 }
12804
12805 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12806 {
12807 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
12808
12809 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12810
12811 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
12812
12813 uint64_t *digest = (uint64_t *) hash_buf->digest;
12814
12815 salt_t *salt = hash_buf->salt;
12816
12817 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12818
12819 char *iter_pos = input_buf + 19;
12820
12821 char *salt_pos = strchr (iter_pos, '.');
12822
12823 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12824
12825 salt_pos++;
12826
12827 char *hash_pos = strchr (salt_pos, '.');
12828
12829 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12830
12831 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12832
12833 hash_pos++;
12834
12835 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
12836 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
12837 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
12838 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
12839 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
12840 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
12841 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
12842 digest[7] = hex_to_uint64_t (&hash_pos[112]);
12843
12844 uint salt_len = hash_pos - salt_pos - 1;
12845
12846 salt_len /= 2;
12847
12848 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
12849
12850 uint i;
12851
12852 for (i = 0; i < salt_len; i++)
12853 {
12854 salt_buf_ptr[i] = hex_to_char (&salt_pos[i * 2]);
12855 }
12856
12857 salt_buf_ptr[salt_len + 3] = 0x01;
12858 salt_buf_ptr[salt_len + 4] = 0x80;
12859
12860 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12861
12862 salt->salt_len = salt_len;
12863
12864 salt->salt_iter = atoi (iter_pos) - 1;
12865
12866 return (PARSER_OK);
12867 }
12868
12869 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12870 {
12871 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
12872
12873 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12874
12875 uint64_t *digest = (uint64_t *) hash_buf->digest;
12876
12877 salt_t *salt = hash_buf->salt;
12878
12879 char tmp_buf[120];
12880
12881 memset (tmp_buf, 0, sizeof (tmp_buf));
12882
12883 int tmp_len = base64_decode (base64_to_int, input_buf + 9, input_len - 9, tmp_buf);
12884
12885 memcpy (digest, tmp_buf, 64);
12886
12887 digest[0] = byte_swap_64 (digest[0]);
12888 digest[1] = byte_swap_64 (digest[1]);
12889 digest[2] = byte_swap_64 (digest[2]);
12890 digest[3] = byte_swap_64 (digest[3]);
12891 digest[4] = byte_swap_64 (digest[4]);
12892 digest[5] = byte_swap_64 (digest[5]);
12893 digest[6] = byte_swap_64 (digest[6]);
12894 digest[7] = byte_swap_64 (digest[7]);
12895
12896 digest[0] -= SHA512M_A;
12897 digest[1] -= SHA512M_B;
12898 digest[2] -= SHA512M_C;
12899 digest[3] -= SHA512M_D;
12900 digest[4] -= SHA512M_E;
12901 digest[5] -= SHA512M_F;
12902 digest[6] -= SHA512M_G;
12903 digest[7] -= SHA512M_H;
12904
12905 salt->salt_len = tmp_len - 64;
12906
12907 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
12908
12909 if (data.opts_type & OPTS_TYPE_ST_ADD80)
12910 {
12911 char *ptr = (char *) salt->salt_buf;
12912
12913 ptr[salt->salt_len] = 0x80;
12914 }
12915
12916 return (PARSER_OK);
12917 }
12918
12919 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12920 {
12921 if (data.opts_type & OPTS_TYPE_ST_HEX)
12922 {
12923 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
12924 }
12925 else
12926 {
12927 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
12928 }
12929
12930 uint32_t *digest = (uint32_t *) hash_buf->digest;
12931
12932 salt_t *salt = hash_buf->salt;
12933
12934 digest[0] = hex_to_uint (&input_buf[ 0]);
12935 digest[1] = hex_to_uint (&input_buf[ 8]);
12936 digest[2] = hex_to_uint (&input_buf[16]);
12937 digest[3] = hex_to_uint (&input_buf[24]);
12938
12939 digest[0] = byte_swap_32 (digest[0]);
12940 digest[1] = byte_swap_32 (digest[1]);
12941 digest[2] = byte_swap_32 (digest[2]);
12942 digest[3] = byte_swap_32 (digest[3]);
12943
12944 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12945
12946 uint salt_len = input_len - 32 - 1;
12947
12948 char *salt_buf = input_buf + 32 + 1;
12949
12950 char *salt_buf_ptr = (char *) salt->salt_buf;
12951
12952 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12953
12954 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12955
12956 salt->salt_len = salt_len;
12957
12958 return (PARSER_OK);
12959 }
12960
12961 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12962 {
12963 if (data.opts_type & OPTS_TYPE_ST_HEX)
12964 {
12965 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
12966 }
12967 else
12968 {
12969 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
12970 }
12971
12972 uint32_t *digest = (uint32_t *) hash_buf->digest;
12973
12974 salt_t *salt = hash_buf->salt;
12975
12976 digest[0] = hex_to_uint (&input_buf[ 0]);
12977 digest[1] = hex_to_uint (&input_buf[ 8]);
12978 digest[2] = hex_to_uint (&input_buf[16]);
12979 digest[3] = hex_to_uint (&input_buf[24]);
12980 digest[4] = hex_to_uint (&input_buf[32]);
12981
12982 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12983
12984 uint salt_len = input_len - 40 - 1;
12985
12986 char *salt_buf = input_buf + 40 + 1;
12987
12988 char *salt_buf_ptr = (char *) salt->salt_buf;
12989
12990 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12991
12992 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12993
12994 salt->salt_len = salt_len;
12995
12996 return (PARSER_OK);
12997 }
12998
12999 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13000 {
13001 if (data.opts_type & OPTS_TYPE_ST_HEX)
13002 {
13003 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13004 }
13005 else
13006 {
13007 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13008 }
13009
13010 uint32_t *digest = (uint32_t *) hash_buf->digest;
13011
13012 salt_t *salt = hash_buf->salt;
13013
13014 digest[0] = hex_to_uint (&input_buf[ 0]);
13015 digest[1] = hex_to_uint (&input_buf[ 8]);
13016 digest[2] = hex_to_uint (&input_buf[16]);
13017 digest[3] = hex_to_uint (&input_buf[24]);
13018 digest[4] = hex_to_uint (&input_buf[32]);
13019 digest[5] = hex_to_uint (&input_buf[40]);
13020 digest[6] = hex_to_uint (&input_buf[48]);
13021 digest[7] = hex_to_uint (&input_buf[56]);
13022
13023 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13024
13025 uint salt_len = input_len - 64 - 1;
13026
13027 char *salt_buf = input_buf + 64 + 1;
13028
13029 char *salt_buf_ptr = (char *) salt->salt_buf;
13030
13031 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13032
13033 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13034
13035 salt->salt_len = salt_len;
13036
13037 return (PARSER_OK);
13038 }
13039
13040 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13041 {
13042 if (data.opts_type & OPTS_TYPE_ST_HEX)
13043 {
13044 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13045 }
13046 else
13047 {
13048 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13049 }
13050
13051 uint64_t *digest = (uint64_t *) hash_buf->digest;
13052
13053 salt_t *salt = hash_buf->salt;
13054
13055 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
13056 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
13057 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
13058 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
13059 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
13060 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
13061 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
13062 digest[7] = hex_to_uint64_t (&input_buf[112]);
13063
13064 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13065
13066 uint salt_len = input_len - 128 - 1;
13067
13068 char *salt_buf = input_buf + 128 + 1;
13069
13070 char *salt_buf_ptr = (char *) salt->salt_buf;
13071
13072 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13073
13074 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13075
13076 salt->salt_len = salt_len;
13077
13078 return (PARSER_OK);
13079 }
13080
13081 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13082 {
13083 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13084
13085 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13086
13087 uint32_t *digest = (uint32_t *) hash_buf->digest;
13088
13089 salt_t *salt = hash_buf->salt;
13090
13091 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13092
13093 /**
13094 * parse line
13095 */
13096
13097 char *user_pos = input_buf + 10 + 1;
13098
13099 char *realm_pos = strchr (user_pos, '$');
13100
13101 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13102
13103 uint user_len = realm_pos - user_pos;
13104
13105 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13106
13107 realm_pos++;
13108
13109 char *salt_pos = strchr (realm_pos, '$');
13110
13111 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13112
13113 uint realm_len = salt_pos - realm_pos;
13114
13115 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13116
13117 salt_pos++;
13118
13119 char *data_pos = strchr (salt_pos, '$');
13120
13121 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13122
13123 uint salt_len = data_pos - salt_pos;
13124
13125 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13126
13127 data_pos++;
13128
13129 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13130
13131 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13132
13133 /**
13134 * copy data
13135 */
13136
13137 memcpy (krb5pa->user, user_pos, user_len);
13138 memcpy (krb5pa->realm, realm_pos, realm_len);
13139 memcpy (krb5pa->salt, salt_pos, salt_len);
13140
13141 char *timestamp_ptr = (char *) krb5pa->timestamp;
13142
13143 for (uint i = 0; i < (36 * 2); i += 2)
13144 {
13145 const char p0 = data_pos[i + 0];
13146 const char p1 = data_pos[i + 1];
13147
13148 *timestamp_ptr++ = hex_convert (p1) << 0
13149 | hex_convert (p0) << 4;
13150 }
13151
13152 char *checksum_ptr = (char *) krb5pa->checksum;
13153
13154 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13155 {
13156 const char p0 = data_pos[i + 0];
13157 const char p1 = data_pos[i + 1];
13158
13159 *checksum_ptr++ = hex_convert (p1) << 0
13160 | hex_convert (p0) << 4;
13161 }
13162
13163 /**
13164 * copy some data to generic buffers to make sorting happy
13165 */
13166
13167 salt->salt_buf[0] = krb5pa->timestamp[0];
13168 salt->salt_buf[1] = krb5pa->timestamp[1];
13169 salt->salt_buf[2] = krb5pa->timestamp[2];
13170 salt->salt_buf[3] = krb5pa->timestamp[3];
13171 salt->salt_buf[4] = krb5pa->timestamp[4];
13172 salt->salt_buf[5] = krb5pa->timestamp[5];
13173 salt->salt_buf[6] = krb5pa->timestamp[6];
13174 salt->salt_buf[7] = krb5pa->timestamp[7];
13175 salt->salt_buf[8] = krb5pa->timestamp[8];
13176
13177 salt->salt_len = 36;
13178
13179 digest[0] = krb5pa->checksum[0];
13180 digest[1] = krb5pa->checksum[1];
13181 digest[2] = krb5pa->checksum[2];
13182 digest[3] = krb5pa->checksum[3];
13183
13184 return (PARSER_OK);
13185 }
13186
13187 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13188 {
13189 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13190
13191 uint32_t *digest = (uint32_t *) hash_buf->digest;
13192
13193 salt_t *salt = hash_buf->salt;
13194
13195 /**
13196 * parse line
13197 */
13198
13199 char *salt_pos = input_buf;
13200
13201 char *hash_pos = strchr (salt_pos, '$');
13202
13203 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13204
13205 uint salt_len = hash_pos - salt_pos;
13206
13207 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13208
13209 hash_pos++;
13210
13211 uint hash_len = input_len - 1 - salt_len;
13212
13213 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13214
13215 /**
13216 * valid some data
13217 */
13218
13219 uint user_len = 0;
13220
13221 for (uint i = 0; i < salt_len; i++)
13222 {
13223 if (salt_pos[i] == ' ') continue;
13224
13225 user_len++;
13226 }
13227
13228 // SAP user names cannot be longer than 12 characters
13229 if (user_len > 12) return (PARSER_SALT_LENGTH);
13230
13231 // SAP user name cannot start with ! or ?
13232 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13233
13234 /**
13235 * copy data
13236 */
13237
13238 char *salt_buf_ptr = (char *) salt->salt_buf;
13239
13240 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13241
13242 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13243
13244 salt->salt_len = salt_len;
13245
13246 digest[0] = hex_to_uint (&hash_pos[0]);
13247 digest[1] = hex_to_uint (&hash_pos[8]);
13248 digest[2] = 0;
13249 digest[3] = 0;
13250
13251 digest[0] = byte_swap_32 (digest[0]);
13252 digest[1] = byte_swap_32 (digest[1]);
13253
13254 return (PARSER_OK);
13255 }
13256
13257 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13258 {
13259 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13260
13261 uint32_t *digest = (uint32_t *) hash_buf->digest;
13262
13263 salt_t *salt = hash_buf->salt;
13264
13265 /**
13266 * parse line
13267 */
13268
13269 char *salt_pos = input_buf;
13270
13271 char *hash_pos = strchr (salt_pos, '$');
13272
13273 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13274
13275 uint salt_len = hash_pos - salt_pos;
13276
13277 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13278
13279 hash_pos++;
13280
13281 uint hash_len = input_len - 1 - salt_len;
13282
13283 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13284
13285 /**
13286 * valid some data
13287 */
13288
13289 uint user_len = 0;
13290
13291 for (uint i = 0; i < salt_len; i++)
13292 {
13293 if (salt_pos[i] == ' ') continue;
13294
13295 user_len++;
13296 }
13297
13298 // SAP user names cannot be longer than 12 characters
13299 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
13300 // so far nobody complained so we stay with this because it helps in optimization
13301 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
13302
13303 if (user_len > 12) return (PARSER_SALT_LENGTH);
13304
13305 // SAP user name cannot start with ! or ?
13306 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13307
13308 /**
13309 * copy data
13310 */
13311
13312 char *salt_buf_ptr = (char *) salt->salt_buf;
13313
13314 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13315
13316 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13317
13318 salt->salt_len = salt_len;
13319
13320 digest[0] = hex_to_uint (&hash_pos[ 0]);
13321 digest[1] = hex_to_uint (&hash_pos[ 8]);
13322 digest[2] = hex_to_uint (&hash_pos[16]);
13323 digest[3] = hex_to_uint (&hash_pos[24]);
13324 digest[4] = hex_to_uint (&hash_pos[32]);
13325
13326 return (PARSER_OK);
13327 }
13328
13329 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13330 {
13331 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13332
13333 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13334
13335 uint64_t *digest = (uint64_t *) hash_buf->digest;
13336
13337 salt_t *salt = hash_buf->salt;
13338
13339 char *iter_pos = input_buf + 3;
13340
13341 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13342
13343 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13344
13345 memcpy ((char *) salt->salt_sign, input_buf, 4);
13346
13347 salt->salt_iter = salt_iter;
13348
13349 char *salt_pos = iter_pos + 1;
13350
13351 uint salt_len = 8;
13352
13353 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13354
13355 salt->salt_len = salt_len;
13356
13357 char *hash_pos = salt_pos + salt_len;
13358
13359 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13360
13361 // ugly hack start
13362
13363 char *tmp = (char *) salt->salt_buf_pc;
13364
13365 tmp[0] = hash_pos[42];
13366
13367 // ugly hack end
13368
13369 digest[ 0] = byte_swap_64 (digest[ 0]);
13370 digest[ 1] = byte_swap_64 (digest[ 1]);
13371 digest[ 2] = byte_swap_64 (digest[ 2]);
13372 digest[ 3] = byte_swap_64 (digest[ 3]);
13373 digest[ 4] = 0;
13374 digest[ 5] = 0;
13375 digest[ 6] = 0;
13376 digest[ 7] = 0;
13377
13378 return (PARSER_OK);
13379 }
13380
13381 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13382 {
13383 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13384
13385 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13386
13387 uint32_t *digest = (uint32_t *) hash_buf->digest;
13388
13389 salt_t *salt = hash_buf->salt;
13390
13391 char *salt_buf = input_buf + 6;
13392
13393 uint salt_len = 16;
13394
13395 char *salt_buf_ptr = (char *) salt->salt_buf;
13396
13397 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13398
13399 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13400
13401 salt->salt_len = salt_len;
13402
13403 char *hash_pos = input_buf + 6 + 16;
13404
13405 digest[0] = hex_to_uint (&hash_pos[ 0]);
13406 digest[1] = hex_to_uint (&hash_pos[ 8]);
13407 digest[2] = hex_to_uint (&hash_pos[16]);
13408 digest[3] = hex_to_uint (&hash_pos[24]);
13409 digest[4] = hex_to_uint (&hash_pos[32]);
13410 digest[5] = hex_to_uint (&hash_pos[40]);
13411 digest[6] = hex_to_uint (&hash_pos[48]);
13412 digest[7] = hex_to_uint (&hash_pos[56]);
13413
13414 return (PARSER_OK);
13415 }
13416
13417 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13418 {
13419 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13420
13421 uint32_t *digest = (uint32_t *) hash_buf->digest;
13422
13423 digest[0] = hex_to_uint (&input_buf[ 0]);
13424 digest[1] = hex_to_uint (&input_buf[ 8]);
13425 digest[2] = 0;
13426 digest[3] = 0;
13427
13428 return (PARSER_OK);
13429 }
13430
13431 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13432 {
13433 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13434
13435 uint32_t *digest = (uint32_t *) hash_buf->digest;
13436
13437 salt_t *salt = hash_buf->salt;
13438
13439 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13440
13441 char *saltbuf_pos = input_buf;
13442
13443 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13444
13445 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13446
13447 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13448
13449 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13450 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13451
13452 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13453
13454 hashbuf_pos++;
13455
13456 uint hashbuf_len = input_len - saltbuf_len - 1;
13457
13458 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13459
13460 char *salt_ptr = (char *) saltbuf_pos;
13461 char *rakp_ptr = (char *) rakp->salt_buf;
13462
13463 uint i;
13464 uint j;
13465
13466 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13467 {
13468 rakp_ptr[j] = hex_to_char (&salt_ptr[i]);
13469 }
13470
13471 rakp_ptr[j] = 0x80;
13472
13473 rakp->salt_len = j;
13474
13475 for (i = 0; i < 64; i++)
13476 {
13477 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13478 }
13479
13480 salt->salt_buf[0] = rakp->salt_buf[0];
13481 salt->salt_buf[1] = rakp->salt_buf[1];
13482 salt->salt_buf[2] = rakp->salt_buf[2];
13483 salt->salt_buf[3] = rakp->salt_buf[3];
13484 salt->salt_buf[4] = rakp->salt_buf[4];
13485 salt->salt_buf[5] = rakp->salt_buf[5];
13486 salt->salt_buf[6] = rakp->salt_buf[6];
13487 salt->salt_buf[7] = rakp->salt_buf[7];
13488
13489 salt->salt_len = 32; // muss min. 32 haben
13490
13491 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
13492 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
13493 digest[2] = hex_to_uint (&hashbuf_pos[16]);
13494 digest[3] = hex_to_uint (&hashbuf_pos[24]);
13495 digest[4] = hex_to_uint (&hashbuf_pos[32]);
13496
13497 return (PARSER_OK);
13498 }
13499
13500 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13501 {
13502 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13503
13504 uint32_t *digest = (uint32_t *) hash_buf->digest;
13505
13506 salt_t *salt = hash_buf->salt;
13507
13508 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13509
13510 char *salt_pos = input_buf + 1;
13511
13512 memcpy (salt->salt_buf, salt_pos, 8);
13513
13514 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13515 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13516
13517 salt->salt_len = 8;
13518
13519 char *hash_pos = salt_pos + 8;
13520
13521 digest[0] = hex_to_uint (&hash_pos[ 0]);
13522 digest[1] = hex_to_uint (&hash_pos[ 8]);
13523 digest[2] = hex_to_uint (&hash_pos[16]);
13524 digest[3] = hex_to_uint (&hash_pos[24]);
13525 digest[4] = hex_to_uint (&hash_pos[32]);
13526
13527 digest[0] -= SHA1M_A;
13528 digest[1] -= SHA1M_B;
13529 digest[2] -= SHA1M_C;
13530 digest[3] -= SHA1M_D;
13531 digest[4] -= SHA1M_E;
13532
13533 return (PARSER_OK);
13534 }
13535
13536 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13537 {
13538 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13539
13540 uint32_t *digest = (uint32_t *) hash_buf->digest;
13541
13542 salt_t *salt = hash_buf->salt;
13543
13544 digest[0] = hex_to_uint (&input_buf[ 0]);
13545 digest[1] = hex_to_uint (&input_buf[ 8]);
13546 digest[2] = hex_to_uint (&input_buf[16]);
13547 digest[3] = hex_to_uint (&input_buf[24]);
13548
13549 digest[0] = byte_swap_32 (digest[0]);
13550 digest[1] = byte_swap_32 (digest[1]);
13551 digest[2] = byte_swap_32 (digest[2]);
13552 digest[3] = byte_swap_32 (digest[3]);
13553
13554 digest[0] -= MD5M_A;
13555 digest[1] -= MD5M_B;
13556 digest[2] -= MD5M_C;
13557 digest[3] -= MD5M_D;
13558
13559 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13560
13561 char *salt_buf_ptr = input_buf + 32 + 1;
13562
13563 uint32_t *salt_buf = salt->salt_buf;
13564
13565 salt_buf[0] = hex_to_uint (&salt_buf_ptr[ 0]);
13566 salt_buf[1] = hex_to_uint (&salt_buf_ptr[ 8]);
13567 salt_buf[2] = hex_to_uint (&salt_buf_ptr[16]);
13568 salt_buf[3] = hex_to_uint (&salt_buf_ptr[24]);
13569
13570 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13571 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13572 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13573 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13574
13575 salt->salt_len = 16 + 1;
13576
13577 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13578
13579 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13580
13581 salt_buf[4] = hex_to_char (&idbyte_buf_ptr[0]) & 0xff;
13582
13583 return (PARSER_OK);
13584 }
13585
13586 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13587 {
13588 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13589
13590 uint32_t *digest = (uint32_t *) hash_buf->digest;
13591
13592 salt_t *salt = hash_buf->salt;
13593
13594 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13595
13596 /**
13597 * parse line
13598 */
13599
13600 char *hashbuf_pos = input_buf;
13601
13602 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13603
13604 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13605
13606 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13607
13608 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13609
13610 saltbuf_pos++;
13611
13612 char *iteration_pos = strchr (saltbuf_pos, ':');
13613
13614 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13615
13616 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13617
13618 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13619
13620 iteration_pos++;
13621
13622 char *databuf_pos = strchr (iteration_pos, ':');
13623
13624 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13625
13626 const uint iteration_len = databuf_pos - iteration_pos;
13627
13628 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13629 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13630
13631 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13632
13633 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13634 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13635
13636 databuf_pos++;
13637
13638 // digest
13639
13640 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
13641 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
13642 digest[2] = hex_to_uint (&hashbuf_pos[16]);
13643 digest[3] = hex_to_uint (&hashbuf_pos[24]);
13644 digest[4] = hex_to_uint (&hashbuf_pos[32]);
13645 digest[5] = hex_to_uint (&hashbuf_pos[40]);
13646 digest[6] = hex_to_uint (&hashbuf_pos[48]);
13647 digest[7] = hex_to_uint (&hashbuf_pos[56]);
13648
13649 // salt
13650
13651 char *saltbuf_ptr = (char *) salt->salt_buf;
13652
13653 for (uint i = 0; i < saltbuf_len; i += 2)
13654 {
13655 const char p0 = saltbuf_pos[i + 0];
13656 const char p1 = saltbuf_pos[i + 1];
13657
13658 *saltbuf_ptr++ = hex_convert (p1) << 0
13659 | hex_convert (p0) << 4;
13660 }
13661
13662 salt->salt_buf[4] = 0x01000000;
13663 salt->salt_buf[5] = 0x80;
13664
13665 salt->salt_len = saltbuf_len / 2;
13666
13667 // iteration
13668
13669 salt->salt_iter = atoi (iteration_pos) - 1;
13670
13671 // data
13672
13673 char *databuf_ptr = (char *) cloudkey->data_buf;
13674
13675 for (uint i = 0; i < databuf_len; i += 2)
13676 {
13677 const char p0 = databuf_pos[i + 0];
13678 const char p1 = databuf_pos[i + 1];
13679
13680 *databuf_ptr++ = hex_convert (p1) << 0
13681 | hex_convert (p0) << 4;
13682 }
13683
13684 *databuf_ptr++ = 0x80;
13685
13686 for (uint i = 0; i < 512; i++)
13687 {
13688 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13689 }
13690
13691 cloudkey->data_len = databuf_len / 2;
13692
13693 return (PARSER_OK);
13694 }
13695
13696 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13697 {
13698 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13699
13700 uint32_t *digest = (uint32_t *) hash_buf->digest;
13701
13702 salt_t *salt = hash_buf->salt;
13703
13704 /**
13705 * parse line
13706 */
13707
13708 char *hashbuf_pos = input_buf;
13709
13710 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13711
13712 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13713
13714 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13715
13716 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13717
13718 domainbuf_pos++;
13719
13720 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13721
13722 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13723
13724 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13725
13726 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13727
13728 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13729
13730 saltbuf_pos++;
13731
13732 char *iteration_pos = strchr (saltbuf_pos, ':');
13733
13734 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13735
13736 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13737
13738 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13739
13740 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13741
13742 iteration_pos++;
13743
13744 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13745
13746 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13747 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13748
13749 // ok, the plan for this algorithm is the following:
13750 // we have 2 salts here, the domain-name and a random salt
13751 // while both are used in the initial transformation,
13752 // only the random salt is used in the following iterations
13753 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13754 // and one that includes only the real salt (stored into salt_buf[]).
13755 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13756
13757 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
13758
13759 base32_decode (itoa32_to_int, hashbuf_pos, 32, tmp_buf);
13760
13761 memcpy (digest, tmp_buf, 20);
13762
13763 digest[0] = byte_swap_32 (digest[0]);
13764 digest[1] = byte_swap_32 (digest[1]);
13765 digest[2] = byte_swap_32 (digest[2]);
13766 digest[3] = byte_swap_32 (digest[3]);
13767 digest[4] = byte_swap_32 (digest[4]);
13768
13769 // domain
13770
13771 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13772
13773 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
13774
13775 char *len_ptr = NULL;
13776
13777 for (uint i = 0; i < domainbuf_len; i++)
13778 {
13779 if (salt_buf_pc_ptr[i] == '.')
13780 {
13781 len_ptr = &salt_buf_pc_ptr[i];
13782
13783 *len_ptr = 0;
13784 }
13785 else
13786 {
13787 *len_ptr += 1;
13788 }
13789 }
13790
13791 salt->salt_buf_pc[7] = domainbuf_len;
13792
13793 // "real" salt
13794
13795 char *salt_buf_ptr = (char *) salt->salt_buf;
13796
13797 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
13798
13799 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13800
13801 salt->salt_len = salt_len;
13802
13803 // iteration
13804
13805 salt->salt_iter = atoi (iteration_pos);
13806
13807 return (PARSER_OK);
13808 }
13809
13810 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13811 {
13812 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
13813
13814 uint32_t *digest = (uint32_t *) hash_buf->digest;
13815
13816 salt_t *salt = hash_buf->salt;
13817
13818 digest[0] = hex_to_uint (&input_buf[ 0]);
13819 digest[1] = hex_to_uint (&input_buf[ 8]);
13820 digest[2] = hex_to_uint (&input_buf[16]);
13821 digest[3] = hex_to_uint (&input_buf[24]);
13822 digest[4] = hex_to_uint (&input_buf[32]);
13823
13824 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13825
13826 uint salt_len = input_len - 40 - 1;
13827
13828 char *salt_buf = input_buf + 40 + 1;
13829
13830 char *salt_buf_ptr = (char *) salt->salt_buf;
13831
13832 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13833
13834 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13835
13836 salt->salt_len = salt_len;
13837
13838 return (PARSER_OK);
13839 }
13840
13841 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13842 {
13843 const uint8_t ascii_to_ebcdic[] =
13844 {
13845 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
13846 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
13847 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
13848 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
13849 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
13850 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
13851 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
13852 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
13853 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
13854 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
13855 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
13856 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
13857 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
13858 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
13859 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
13860 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
13861 };
13862
13863 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
13864
13865 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13866
13867 uint32_t *digest = (uint32_t *) hash_buf->digest;
13868
13869 salt_t *salt = hash_buf->salt;
13870
13871 char *salt_pos = input_buf + 6 + 1;
13872
13873 char *digest_pos = strchr (salt_pos, '*');
13874
13875 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13876
13877 uint salt_len = digest_pos - salt_pos;
13878
13879 if (salt_len > 8) return (PARSER_SALT_LENGTH);
13880
13881 uint hash_len = input_len - 1 - salt_len - 1 - 6;
13882
13883 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13884
13885 digest_pos++;
13886
13887 char *salt_buf_ptr = (char *) salt->salt_buf;
13888 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13889
13890 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13891
13892 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13893
13894 salt->salt_len = salt_len;
13895
13896 for (uint i = 0; i < salt_len; i++)
13897 {
13898 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
13899 }
13900 for (uint i = salt_len; i < 8; i++)
13901 {
13902 salt_buf_pc_ptr[i] = 0x40;
13903 }
13904
13905 uint tt;
13906
13907 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
13908
13909 salt->salt_buf_pc[0] = ROTATE_LEFT (salt->salt_buf_pc[0], 3u);
13910 salt->salt_buf_pc[1] = ROTATE_LEFT (salt->salt_buf_pc[1], 3u);
13911
13912 digest[0] = hex_to_uint (&digest_pos[ 0]);
13913 digest[1] = hex_to_uint (&digest_pos[ 8]);
13914
13915 digest[0] = byte_swap_32 (digest[0]);
13916 digest[1] = byte_swap_32 (digest[1]);
13917
13918 IP (digest[0], digest[1], tt);
13919
13920 digest[0] = ROTATE_RIGHT (digest[0], 29);
13921 digest[1] = ROTATE_RIGHT (digest[1], 29);
13922 digest[2] = 0;
13923 digest[3] = 0;
13924
13925 return (PARSER_OK);
13926 }
13927
13928 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13929 {
13930 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
13931
13932 uint32_t *digest = (uint32_t *) hash_buf->digest;
13933
13934 digest[0] = hex_to_uint (&input_buf[ 0]);
13935 digest[1] = hex_to_uint (&input_buf[ 8]);
13936 digest[2] = hex_to_uint (&input_buf[16]);
13937 digest[3] = hex_to_uint (&input_buf[24]);
13938
13939 digest[0] = byte_swap_32 (digest[0]);
13940 digest[1] = byte_swap_32 (digest[1]);
13941 digest[2] = byte_swap_32 (digest[2]);
13942 digest[3] = byte_swap_32 (digest[3]);
13943
13944 return (PARSER_OK);
13945 }
13946
13947 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13948 {
13949 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
13950
13951 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
13952
13953 uint32_t *digest = (uint32_t *) hash_buf->digest;
13954
13955 salt_t *salt = hash_buf->salt;
13956
13957 char tmp_buf[120];
13958
13959 memset (tmp_buf, 0, sizeof (tmp_buf));
13960
13961 base64_decode (lotus64_to_int, input_buf + 2, input_len - 3, tmp_buf);
13962
13963 tmp_buf[3] += -4; // dont ask!
13964
13965 memcpy (salt->salt_buf, tmp_buf, 5);
13966
13967 salt->salt_len = 5;
13968
13969 memcpy (digest, tmp_buf + 5, 9);
13970
13971 // yes, only 9 byte are needed to crack, but 10 to display
13972
13973 salt->salt_buf_pc[7] = input_buf[20];
13974
13975 return (PARSER_OK);
13976 }
13977
13978 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13979 {
13980 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
13981
13982 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
13983
13984 uint32_t *digest = (uint32_t *) hash_buf->digest;
13985
13986 salt_t *salt = hash_buf->salt;
13987
13988 char tmp_buf[120];
13989
13990 memset (tmp_buf, 0, sizeof (tmp_buf));
13991
13992 base64_decode (lotus64_to_int, input_buf + 2, input_len - 3, tmp_buf);
13993
13994 tmp_buf[3] += -4; // dont ask!
13995
13996 // salt
13997
13998 memcpy (salt->salt_buf, tmp_buf, 16);
13999
14000 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)
14001
14002 // iteration
14003
14004 char tmp_iter_buf[11];
14005
14006 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14007
14008 tmp_iter_buf[10] = 0;
14009
14010 salt->salt_iter = atoi (tmp_iter_buf);
14011
14012 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14013 {
14014 return (PARSER_SALT_ITERATION);
14015 }
14016
14017 salt->salt_iter--; // first round in init
14018
14019 // 2 additional bytes for display only
14020
14021 salt->salt_buf_pc[0] = tmp_buf[26];
14022 salt->salt_buf_pc[1] = tmp_buf[27];
14023
14024 // digest
14025
14026 memcpy (digest, tmp_buf + 28, 8);
14027
14028 digest[0] = byte_swap_32 (digest[0]);
14029 digest[1] = byte_swap_32 (digest[1]);
14030 digest[2] = 0;
14031 digest[3] = 0;
14032
14033 return (PARSER_OK);
14034 }
14035
14036 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14037 {
14038 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14039
14040 uint32_t *digest = (uint32_t *) hash_buf->digest;
14041
14042 salt_t *salt = hash_buf->salt;
14043
14044 char *salt_buf_pos = input_buf;
14045
14046 char *hash_buf_pos = salt_buf_pos + 6;
14047
14048 digest[0] = hex_to_uint (&hash_buf_pos[ 0]);
14049 digest[1] = hex_to_uint (&hash_buf_pos[ 8]);
14050 digest[2] = hex_to_uint (&hash_buf_pos[16]);
14051 digest[3] = hex_to_uint (&hash_buf_pos[24]);
14052 digest[4] = hex_to_uint (&hash_buf_pos[32]);
14053 digest[5] = hex_to_uint (&hash_buf_pos[40]);
14054 digest[6] = hex_to_uint (&hash_buf_pos[48]);
14055 digest[7] = hex_to_uint (&hash_buf_pos[56]);
14056
14057 digest[0] -= SHA256M_A;
14058 digest[1] -= SHA256M_B;
14059 digest[2] -= SHA256M_C;
14060 digest[3] -= SHA256M_D;
14061 digest[4] -= SHA256M_E;
14062 digest[5] -= SHA256M_F;
14063 digest[6] -= SHA256M_G;
14064 digest[7] -= SHA256M_H;
14065
14066 char *salt_buf_ptr = (char *) salt->salt_buf;
14067
14068 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14069
14070 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14071
14072 salt->salt_len = salt_len;
14073
14074 return (PARSER_OK);
14075 }
14076
14077 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14078 {
14079 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14080
14081 uint32_t *digest = (uint32_t *) hash_buf->digest;
14082
14083 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14084
14085 salt_t *salt = hash_buf->salt;
14086
14087 char *salt_buf = input_buf + 6;
14088
14089 char *digest_buf = strchr (salt_buf, '$');
14090
14091 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14092
14093 uint salt_len = digest_buf - salt_buf;
14094
14095 digest_buf++; // skip the '$' symbol
14096
14097 char *salt_buf_ptr = (char *) salt->salt_buf;
14098
14099 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14100
14101 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14102
14103 salt->salt_len = salt_len;
14104
14105 digest[0] = hex_to_uint (&digest_buf[ 0]);
14106 digest[1] = hex_to_uint (&digest_buf[ 8]);
14107 digest[2] = hex_to_uint (&digest_buf[16]);
14108 digest[3] = hex_to_uint (&digest_buf[24]);
14109
14110 digest[0] = byte_swap_32 (digest[0]);
14111 digest[1] = byte_swap_32 (digest[1]);
14112 digest[2] = byte_swap_32 (digest[2]);
14113 digest[3] = byte_swap_32 (digest[3]);
14114
14115 digest[0] -= MD5M_A;
14116 digest[1] -= MD5M_B;
14117 digest[2] -= MD5M_C;
14118 digest[3] -= MD5M_D;
14119
14120 return (PARSER_OK);
14121 }
14122
14123 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14124 {
14125 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14126
14127 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14128
14129 uint32_t *digest = (uint32_t *) hash_buf->digest;
14130
14131 salt_t *salt = hash_buf->salt;
14132
14133 char *salt_buf = input_buf + 3;
14134
14135 char *digest_buf = strchr (salt_buf, '$');
14136
14137 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14138
14139 uint salt_len = digest_buf - salt_buf;
14140
14141 digest_buf++; // skip the '$' symbol
14142
14143 char *salt_buf_ptr = (char *) salt->salt_buf;
14144
14145 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14146
14147 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14148
14149 salt_buf_ptr[salt_len] = 0x2d;
14150
14151 salt->salt_len = salt_len + 1;
14152
14153 digest[0] = hex_to_uint (&digest_buf[ 0]);
14154 digest[1] = hex_to_uint (&digest_buf[ 8]);
14155 digest[2] = hex_to_uint (&digest_buf[16]);
14156 digest[3] = hex_to_uint (&digest_buf[24]);
14157
14158 digest[0] = byte_swap_32 (digest[0]);
14159 digest[1] = byte_swap_32 (digest[1]);
14160 digest[2] = byte_swap_32 (digest[2]);
14161 digest[3] = byte_swap_32 (digest[3]);
14162
14163 digest[0] -= MD5M_A;
14164 digest[1] -= MD5M_B;
14165 digest[2] -= MD5M_C;
14166 digest[3] -= MD5M_D;
14167
14168 return (PARSER_OK);
14169 }
14170
14171 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14172 {
14173 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14174
14175 uint32_t *digest = (uint32_t *) hash_buf->digest;
14176
14177 char tmp_buf[100];
14178
14179 memset (tmp_buf, 0, sizeof (tmp_buf));
14180
14181 base64_decode (base64_to_int, input_buf, input_len, tmp_buf);
14182
14183 memcpy (digest, tmp_buf, 20);
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 digest[4] = byte_swap_32 (digest[4]);
14190
14191 digest[0] -= SHA1M_A;
14192 digest[1] -= SHA1M_B;
14193 digest[2] -= SHA1M_C;
14194 digest[3] -= SHA1M_D;
14195 digest[4] -= SHA1M_E;
14196
14197 return (PARSER_OK);
14198 }
14199
14200 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14201 {
14202 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14203
14204 uint32_t *digest = (uint32_t *) hash_buf->digest;
14205
14206 salt_t *salt = hash_buf->salt;
14207
14208 digest[0] = hex_to_uint (&input_buf[ 0]);
14209 digest[1] = hex_to_uint (&input_buf[ 8]);
14210 digest[2] = hex_to_uint (&input_buf[16]);
14211 digest[3] = hex_to_uint (&input_buf[24]);
14212
14213 digest[0] = byte_swap_32 (digest[0]);
14214 digest[1] = byte_swap_32 (digest[1]);
14215 digest[2] = byte_swap_32 (digest[2]);
14216 digest[3] = byte_swap_32 (digest[3]);
14217
14218 digest[0] -= MD5M_A;
14219 digest[1] -= MD5M_B;
14220 digest[2] -= MD5M_C;
14221 digest[3] -= MD5M_D;
14222
14223 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14224
14225 uint salt_len = input_len - 32 - 1;
14226
14227 char *salt_buf = input_buf + 32 + 1;
14228
14229 char *salt_buf_ptr = (char *) salt->salt_buf;
14230
14231 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14232
14233 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14234
14235 /*
14236 * add static "salt" part
14237 */
14238
14239 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14240
14241 salt_len += 8;
14242
14243 salt->salt_len = salt_len;
14244
14245 return (PARSER_OK);
14246 }
14247
14248 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14249 {
14250 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14251
14252 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14253
14254 uint32_t *digest = (uint32_t *) hash_buf->digest;
14255
14256 salt_t *salt = hash_buf->salt;
14257
14258 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14259
14260 /**
14261 * parse line
14262 */
14263
14264 char *saltlen_pos = input_buf + 1 + 3 + 1;
14265
14266 char *saltbuf_pos = strchr (saltlen_pos, '$');
14267
14268 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14269
14270 uint saltlen_len = saltbuf_pos - saltlen_pos;
14271
14272 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14273
14274 saltbuf_pos++;
14275
14276 char *keylen_pos = strchr (saltbuf_pos, '$');
14277
14278 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14279
14280 uint saltbuf_len = keylen_pos - saltbuf_pos;
14281
14282 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14283
14284 keylen_pos++;
14285
14286 char *keybuf_pos = strchr (keylen_pos, '$');
14287
14288 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14289
14290 uint keylen_len = keybuf_pos - keylen_pos;
14291
14292 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14293
14294 keybuf_pos++;
14295
14296 char *databuf_pos = strchr (keybuf_pos, '$');
14297
14298 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14299
14300 uint keybuf_len = databuf_pos - keybuf_pos;
14301
14302 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14303
14304 databuf_pos++;
14305
14306 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14307
14308 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14309
14310 /**
14311 * copy data
14312 */
14313
14314 digest[0] = hex_to_uint (&keybuf_pos[ 0]);
14315 digest[1] = hex_to_uint (&keybuf_pos[ 8]);
14316 digest[2] = hex_to_uint (&keybuf_pos[16]);
14317 digest[3] = hex_to_uint (&keybuf_pos[24]);
14318
14319 salt->salt_buf[0] = hex_to_uint (&saltbuf_pos[ 0]);
14320 salt->salt_buf[1] = hex_to_uint (&saltbuf_pos[ 8]);
14321 salt->salt_buf[2] = hex_to_uint (&saltbuf_pos[16]);
14322 salt->salt_buf[3] = hex_to_uint (&saltbuf_pos[24]);
14323
14324 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14325 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14326 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14327 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14328
14329 salt->salt_len = 16;
14330 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14331
14332 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14333 {
14334 androidfde->data[j] = hex_to_uint (&databuf_pos[i]);
14335 }
14336
14337 return (PARSER_OK);
14338 }
14339
14340 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14341 {
14342 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14343
14344 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14345
14346 uint32_t *digest = (uint32_t *) hash_buf->digest;
14347
14348 salt_t *salt = hash_buf->salt;
14349
14350 /**
14351 * parse line
14352 */
14353
14354 // first is the N salt parameter
14355
14356 char *N_pos = input_buf + 6;
14357
14358 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14359
14360 N_pos++;
14361
14362 salt->scrypt_N = atoi (N_pos);
14363
14364 // r
14365
14366 char *r_pos = strchr (N_pos, ':');
14367
14368 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14369
14370 r_pos++;
14371
14372 salt->scrypt_r = atoi (r_pos);
14373
14374 // p
14375
14376 char *p_pos = strchr (r_pos, ':');
14377
14378 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14379
14380 p_pos++;
14381
14382 salt->scrypt_p = atoi (p_pos);
14383
14384 // salt
14385
14386 char *saltbuf_pos = strchr (p_pos, ':');
14387
14388 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14389
14390 saltbuf_pos++;
14391
14392 char *hash_pos = strchr (saltbuf_pos, ':');
14393
14394 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14395
14396 hash_pos++;
14397
14398 // base64 decode
14399
14400 char tmp_buf[32];
14401
14402 memset (tmp_buf, 0, sizeof (tmp_buf));
14403
14404 int tmp_len = base64_decode (base64_to_int, saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14405
14406 char *salt_buf_ptr = (char *) salt->salt_buf;
14407
14408 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14409
14410 salt->salt_len = tmp_len;
14411 salt->salt_iter = 1;
14412
14413 // digest - base64 decode
14414
14415 memset (tmp_buf, 0, sizeof (tmp_buf));
14416
14417 tmp_len = input_len - (hash_pos - input_buf);
14418
14419 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14420
14421 base64_decode (base64_to_int, hash_pos, tmp_len, tmp_buf);
14422
14423 memcpy (digest, tmp_buf, 32);
14424
14425 return (PARSER_OK);
14426 }
14427
14428 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14429 {
14430 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14431
14432 uint32_t *digest = (uint32_t *) hash_buf->digest;
14433
14434 salt_t *salt = hash_buf->salt;
14435
14436 /**
14437 * parse line
14438 */
14439
14440 char decrypted[76]; // iv + hash
14441
14442 juniper_decrypt_hash (input_buf, decrypted);
14443
14444 char *md5crypt_hash = decrypted + 12;
14445
14446 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14447
14448 salt->salt_iter = ROUNDS_MD5CRYPT;
14449
14450 char *salt_pos = md5crypt_hash + 3;
14451
14452 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14453
14454 salt->salt_len = hash_pos - salt_pos; // should be 8
14455
14456 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14457
14458 hash_pos++;
14459
14460 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14461
14462 return (PARSER_OK);
14463 }
14464
14465 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14466 {
14467 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14468
14469 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14470
14471 uint32_t *digest = (uint32_t *) hash_buf->digest;
14472
14473 salt_t *salt = hash_buf->salt;
14474
14475 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14476
14477 /**
14478 * parse line
14479 */
14480
14481 // first is *raw* salt
14482
14483 char *salt_pos = input_buf + 3;
14484
14485 char *hash_pos = strchr (salt_pos, '$');
14486
14487 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14488
14489 uint salt_len = hash_pos - salt_pos;
14490
14491 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14492
14493 hash_pos++;
14494
14495 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14496
14497 memcpy (salt_buf_ptr, salt_pos, 14);
14498
14499 salt_buf_ptr[17] = 0x01;
14500 salt_buf_ptr[18] = 0x80;
14501
14502 // add some stuff to normal salt to make sorted happy
14503
14504 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14505 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14506 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14507 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14508
14509 salt->salt_len = salt_len;
14510 salt->salt_iter = ROUNDS_CISCO8 - 1;
14511
14512 // base64 decode hash
14513
14514 char tmp_buf[100];
14515
14516 memset (tmp_buf, 0, sizeof (tmp_buf));
14517
14518 uint hash_len = input_len - 3 - salt_len - 1;
14519
14520 int tmp_len = base64_decode (itoa64_to_int, hash_pos, hash_len, tmp_buf);
14521
14522 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14523
14524 memcpy (digest, tmp_buf, 32);
14525
14526 digest[0] = byte_swap_32 (digest[0]);
14527 digest[1] = byte_swap_32 (digest[1]);
14528 digest[2] = byte_swap_32 (digest[2]);
14529 digest[3] = byte_swap_32 (digest[3]);
14530 digest[4] = byte_swap_32 (digest[4]);
14531 digest[5] = byte_swap_32 (digest[5]);
14532 digest[6] = byte_swap_32 (digest[6]);
14533 digest[7] = byte_swap_32 (digest[7]);
14534
14535 return (PARSER_OK);
14536 }
14537
14538 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14539 {
14540 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14541
14542 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14543
14544 uint32_t *digest = (uint32_t *) hash_buf->digest;
14545
14546 salt_t *salt = hash_buf->salt;
14547
14548 /**
14549 * parse line
14550 */
14551
14552 // first is *raw* salt
14553
14554 char *salt_pos = input_buf + 3;
14555
14556 char *hash_pos = strchr (salt_pos, '$');
14557
14558 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14559
14560 uint salt_len = hash_pos - salt_pos;
14561
14562 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14563
14564 salt->salt_len = salt_len;
14565 hash_pos++;
14566
14567 char *salt_buf_ptr = (char *) salt->salt_buf;
14568
14569 memcpy (salt_buf_ptr, salt_pos, salt_len);
14570 salt_buf_ptr[salt_len] = 0;
14571
14572 // base64 decode hash
14573
14574 char tmp_buf[100];
14575
14576 memset (tmp_buf, 0, sizeof (tmp_buf));
14577
14578 uint hash_len = input_len - 3 - salt_len - 1;
14579
14580 int tmp_len = base64_decode (itoa64_to_int, hash_pos, hash_len, tmp_buf);
14581
14582 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14583
14584 memcpy (digest, tmp_buf, 32);
14585
14586 // fixed:
14587 salt->scrypt_N = 16384;
14588 salt->scrypt_r = 1;
14589 salt->scrypt_p = 1;
14590 salt->salt_iter = 1;
14591
14592 return (PARSER_OK);
14593 }
14594
14595 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14596 {
14597 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14598
14599 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14600
14601 uint32_t *digest = (uint32_t *) hash_buf->digest;
14602
14603 salt_t *salt = hash_buf->salt;
14604
14605 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14606
14607 /**
14608 * parse line
14609 */
14610
14611 char *version_pos = input_buf + 8 + 1;
14612
14613 char *verifierHashSize_pos = strchr (version_pos, '*');
14614
14615 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14616
14617 uint32_t version_len = verifierHashSize_pos - version_pos;
14618
14619 if (version_len != 4) return (PARSER_SALT_LENGTH);
14620
14621 verifierHashSize_pos++;
14622
14623 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14624
14625 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14626
14627 uint32_t verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14628
14629 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14630
14631 keySize_pos++;
14632
14633 char *saltSize_pos = strchr (keySize_pos, '*');
14634
14635 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14636
14637 uint32_t keySize_len = saltSize_pos - keySize_pos;
14638
14639 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14640
14641 saltSize_pos++;
14642
14643 char *osalt_pos = strchr (saltSize_pos, '*');
14644
14645 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14646
14647 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14648
14649 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14650
14651 osalt_pos++;
14652
14653 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14654
14655 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14656
14657 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14658
14659 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14660
14661 encryptedVerifier_pos++;
14662
14663 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14664
14665 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14666
14667 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14668
14669 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14670
14671 encryptedVerifierHash_pos++;
14672
14673 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;
14674
14675 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14676
14677 const uint version = atoi (version_pos);
14678
14679 if (version != 2007) return (PARSER_SALT_VALUE);
14680
14681 const uint verifierHashSize = atoi (verifierHashSize_pos);
14682
14683 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14684
14685 const uint keySize = atoi (keySize_pos);
14686
14687 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14688
14689 office2007->keySize = keySize;
14690
14691 const uint saltSize = atoi (saltSize_pos);
14692
14693 if (saltSize != 16) return (PARSER_SALT_VALUE);
14694
14695 /**
14696 * salt
14697 */
14698
14699 salt->salt_len = 16;
14700 salt->salt_iter = ROUNDS_OFFICE2007;
14701
14702 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14703 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14704 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14705 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14706
14707 /**
14708 * esalt
14709 */
14710
14711 office2007->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14712 office2007->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14713 office2007->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14714 office2007->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14715
14716 office2007->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14717 office2007->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14718 office2007->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14719 office2007->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14720 office2007->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14721
14722 /**
14723 * digest
14724 */
14725
14726 digest[0] = office2007->encryptedVerifierHash[0];
14727 digest[1] = office2007->encryptedVerifierHash[1];
14728 digest[2] = office2007->encryptedVerifierHash[2];
14729 digest[3] = office2007->encryptedVerifierHash[3];
14730
14731 return (PARSER_OK);
14732 }
14733
14734 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14735 {
14736 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14737
14738 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14739
14740 uint32_t *digest = (uint32_t *) hash_buf->digest;
14741
14742 salt_t *salt = hash_buf->salt;
14743
14744 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14745
14746 /**
14747 * parse line
14748 */
14749
14750 char *version_pos = input_buf + 8 + 1;
14751
14752 char *spinCount_pos = strchr (version_pos, '*');
14753
14754 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14755
14756 uint32_t version_len = spinCount_pos - version_pos;
14757
14758 if (version_len != 4) return (PARSER_SALT_LENGTH);
14759
14760 spinCount_pos++;
14761
14762 char *keySize_pos = strchr (spinCount_pos, '*');
14763
14764 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14765
14766 uint32_t spinCount_len = keySize_pos - spinCount_pos;
14767
14768 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14769
14770 keySize_pos++;
14771
14772 char *saltSize_pos = strchr (keySize_pos, '*');
14773
14774 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14775
14776 uint32_t keySize_len = saltSize_pos - keySize_pos;
14777
14778 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14779
14780 saltSize_pos++;
14781
14782 char *osalt_pos = strchr (saltSize_pos, '*');
14783
14784 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14785
14786 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14787
14788 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14789
14790 osalt_pos++;
14791
14792 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14793
14794 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14795
14796 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14797
14798 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14799
14800 encryptedVerifier_pos++;
14801
14802 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14803
14804 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14805
14806 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14807
14808 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14809
14810 encryptedVerifierHash_pos++;
14811
14812 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;
14813
14814 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14815
14816 const uint version = atoi (version_pos);
14817
14818 if (version != 2010) return (PARSER_SALT_VALUE);
14819
14820 const uint spinCount = atoi (spinCount_pos);
14821
14822 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14823
14824 const uint keySize = atoi (keySize_pos);
14825
14826 if (keySize != 128) return (PARSER_SALT_VALUE);
14827
14828 const uint saltSize = atoi (saltSize_pos);
14829
14830 if (saltSize != 16) return (PARSER_SALT_VALUE);
14831
14832 /**
14833 * salt
14834 */
14835
14836 salt->salt_len = 16;
14837 salt->salt_iter = spinCount;
14838
14839 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14840 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14841 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14842 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14843
14844 /**
14845 * esalt
14846 */
14847
14848 office2010->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14849 office2010->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14850 office2010->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14851 office2010->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14852
14853 office2010->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14854 office2010->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14855 office2010->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14856 office2010->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14857 office2010->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14858 office2010->encryptedVerifierHash[5] = hex_to_uint (&encryptedVerifierHash_pos[40]);
14859 office2010->encryptedVerifierHash[6] = hex_to_uint (&encryptedVerifierHash_pos[48]);
14860 office2010->encryptedVerifierHash[7] = hex_to_uint (&encryptedVerifierHash_pos[56]);
14861
14862 /**
14863 * digest
14864 */
14865
14866 digest[0] = office2010->encryptedVerifierHash[0];
14867 digest[1] = office2010->encryptedVerifierHash[1];
14868 digest[2] = office2010->encryptedVerifierHash[2];
14869 digest[3] = office2010->encryptedVerifierHash[3];
14870
14871 return (PARSER_OK);
14872 }
14873
14874 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14875 {
14876 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
14877
14878 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14879
14880 uint32_t *digest = (uint32_t *) hash_buf->digest;
14881
14882 salt_t *salt = hash_buf->salt;
14883
14884 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
14885
14886 /**
14887 * parse line
14888 */
14889
14890 char *version_pos = input_buf + 8 + 1;
14891
14892 char *spinCount_pos = strchr (version_pos, '*');
14893
14894 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14895
14896 uint32_t version_len = spinCount_pos - version_pos;
14897
14898 if (version_len != 4) return (PARSER_SALT_LENGTH);
14899
14900 spinCount_pos++;
14901
14902 char *keySize_pos = strchr (spinCount_pos, '*');
14903
14904 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14905
14906 uint32_t spinCount_len = keySize_pos - spinCount_pos;
14907
14908 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14909
14910 keySize_pos++;
14911
14912 char *saltSize_pos = strchr (keySize_pos, '*');
14913
14914 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14915
14916 uint32_t keySize_len = saltSize_pos - keySize_pos;
14917
14918 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14919
14920 saltSize_pos++;
14921
14922 char *osalt_pos = strchr (saltSize_pos, '*');
14923
14924 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14925
14926 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14927
14928 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14929
14930 osalt_pos++;
14931
14932 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14933
14934 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14935
14936 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14937
14938 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14939
14940 encryptedVerifier_pos++;
14941
14942 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14943
14944 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14945
14946 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14947
14948 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14949
14950 encryptedVerifierHash_pos++;
14951
14952 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;
14953
14954 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14955
14956 const uint version = atoi (version_pos);
14957
14958 if (version != 2013) return (PARSER_SALT_VALUE);
14959
14960 const uint spinCount = atoi (spinCount_pos);
14961
14962 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14963
14964 const uint keySize = atoi (keySize_pos);
14965
14966 if (keySize != 256) return (PARSER_SALT_VALUE);
14967
14968 const uint saltSize = atoi (saltSize_pos);
14969
14970 if (saltSize != 16) return (PARSER_SALT_VALUE);
14971
14972 /**
14973 * salt
14974 */
14975
14976 salt->salt_len = 16;
14977 salt->salt_iter = spinCount;
14978
14979 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14980 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14981 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14982 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14983
14984 /**
14985 * esalt
14986 */
14987
14988 office2013->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14989 office2013->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14990 office2013->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14991 office2013->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14992
14993 office2013->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14994 office2013->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14995 office2013->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14996 office2013->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14997 office2013->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14998 office2013->encryptedVerifierHash[5] = hex_to_uint (&encryptedVerifierHash_pos[40]);
14999 office2013->encryptedVerifierHash[6] = hex_to_uint (&encryptedVerifierHash_pos[48]);
15000 office2013->encryptedVerifierHash[7] = hex_to_uint (&encryptedVerifierHash_pos[56]);
15001
15002 /**
15003 * digest
15004 */
15005
15006 digest[0] = office2013->encryptedVerifierHash[0];
15007 digest[1] = office2013->encryptedVerifierHash[1];
15008 digest[2] = office2013->encryptedVerifierHash[2];
15009 digest[3] = office2013->encryptedVerifierHash[3];
15010
15011 return (PARSER_OK);
15012 }
15013
15014 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15015 {
15016 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15017
15018 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15019
15020 uint32_t *digest = (uint32_t *) hash_buf->digest;
15021
15022 salt_t *salt = hash_buf->salt;
15023
15024 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15025
15026 /**
15027 * parse line
15028 */
15029
15030 char *version_pos = input_buf + 11;
15031
15032 char *osalt_pos = strchr (version_pos, '*');
15033
15034 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15035
15036 uint32_t version_len = osalt_pos - version_pos;
15037
15038 if (version_len != 1) return (PARSER_SALT_LENGTH);
15039
15040 osalt_pos++;
15041
15042 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15043
15044 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15045
15046 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15047
15048 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15049
15050 encryptedVerifier_pos++;
15051
15052 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15053
15054 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15055
15056 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15057
15058 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15059
15060 encryptedVerifierHash_pos++;
15061
15062 uint32_t encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15063
15064 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15065
15066 const uint version = *version_pos - 0x30;
15067
15068 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15069
15070 /**
15071 * esalt
15072 */
15073
15074 oldoffice01->version = version;
15075
15076 oldoffice01->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15077 oldoffice01->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15078 oldoffice01->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15079 oldoffice01->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15080
15081 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15082 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15083 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15084 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15085
15086 oldoffice01->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15087 oldoffice01->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15088 oldoffice01->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15089 oldoffice01->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15090
15091 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15092 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15093 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15094 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15095
15096 /**
15097 * salt
15098 */
15099
15100 salt->salt_len = 16;
15101
15102 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15103 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15104 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15105 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15106
15107 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15108 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15109 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15110 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15111
15112 // this is a workaround as office produces multiple documents with the same salt
15113
15114 salt->salt_len += 32;
15115
15116 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15117 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15118 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15119 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15120 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15121 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15122 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15123 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15124
15125 /**
15126 * digest
15127 */
15128
15129 digest[0] = oldoffice01->encryptedVerifierHash[0];
15130 digest[1] = oldoffice01->encryptedVerifierHash[1];
15131 digest[2] = oldoffice01->encryptedVerifierHash[2];
15132 digest[3] = oldoffice01->encryptedVerifierHash[3];
15133
15134 return (PARSER_OK);
15135 }
15136
15137 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15138 {
15139 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15140 }
15141
15142 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15143 {
15144 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15145
15146 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15147
15148 uint32_t *digest = (uint32_t *) hash_buf->digest;
15149
15150 salt_t *salt = hash_buf->salt;
15151
15152 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15153
15154 /**
15155 * parse line
15156 */
15157
15158 char *version_pos = input_buf + 11;
15159
15160 char *osalt_pos = strchr (version_pos, '*');
15161
15162 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15163
15164 uint32_t version_len = osalt_pos - version_pos;
15165
15166 if (version_len != 1) return (PARSER_SALT_LENGTH);
15167
15168 osalt_pos++;
15169
15170 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15171
15172 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15173
15174 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15175
15176 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15177
15178 encryptedVerifier_pos++;
15179
15180 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15181
15182 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15183
15184 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15185
15186 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15187
15188 encryptedVerifierHash_pos++;
15189
15190 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15191
15192 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15193
15194 uint32_t encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15195
15196 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15197
15198 rc4key_pos++;
15199
15200 uint32_t rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15201
15202 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15203
15204 const uint version = *version_pos - 0x30;
15205
15206 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15207
15208 /**
15209 * esalt
15210 */
15211
15212 oldoffice01->version = version;
15213
15214 oldoffice01->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15215 oldoffice01->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15216 oldoffice01->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15217 oldoffice01->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15218
15219 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15220 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15221 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15222 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15223
15224 oldoffice01->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15225 oldoffice01->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15226 oldoffice01->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15227 oldoffice01->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15228
15229 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15230 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15231 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15232 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15233
15234 oldoffice01->rc4key[1] = 0;
15235 oldoffice01->rc4key[0] = 0;
15236
15237 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15238 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15239 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15240 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15241 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15242 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15243 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15244 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15245 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15246 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15247
15248 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15249 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15250
15251 /**
15252 * salt
15253 */
15254
15255 salt->salt_len = 16;
15256
15257 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15258 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15259 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15260 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15261
15262 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15263 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15264 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15265 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15266
15267 // this is a workaround as office produces multiple documents with the same salt
15268
15269 salt->salt_len += 32;
15270
15271 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15272 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15273 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15274 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15275 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15276 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15277 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15278 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15279
15280 /**
15281 * digest
15282 */
15283
15284 digest[0] = oldoffice01->rc4key[0];
15285 digest[1] = oldoffice01->rc4key[1];
15286 digest[2] = 0;
15287 digest[3] = 0;
15288
15289 return (PARSER_OK);
15290 }
15291
15292 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15293 {
15294 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15295
15296 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15297
15298 uint32_t *digest = (uint32_t *) hash_buf->digest;
15299
15300 salt_t *salt = hash_buf->salt;
15301
15302 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15303
15304 /**
15305 * parse line
15306 */
15307
15308 char *version_pos = input_buf + 11;
15309
15310 char *osalt_pos = strchr (version_pos, '*');
15311
15312 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15313
15314 uint32_t version_len = osalt_pos - version_pos;
15315
15316 if (version_len != 1) return (PARSER_SALT_LENGTH);
15317
15318 osalt_pos++;
15319
15320 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15321
15322 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15323
15324 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15325
15326 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15327
15328 encryptedVerifier_pos++;
15329
15330 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15331
15332 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15333
15334 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15335
15336 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15337
15338 encryptedVerifierHash_pos++;
15339
15340 uint32_t encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15341
15342 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15343
15344 const uint version = *version_pos - 0x30;
15345
15346 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15347
15348 /**
15349 * esalt
15350 */
15351
15352 oldoffice34->version = version;
15353
15354 oldoffice34->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15355 oldoffice34->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15356 oldoffice34->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15357 oldoffice34->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15358
15359 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15360 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15361 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15362 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15363
15364 oldoffice34->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15365 oldoffice34->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15366 oldoffice34->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15367 oldoffice34->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15368 oldoffice34->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15369
15370 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15371 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15372 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15373 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15374 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15375
15376 /**
15377 * salt
15378 */
15379
15380 salt->salt_len = 16;
15381
15382 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15383 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15384 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15385 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15386
15387 // this is a workaround as office produces multiple documents with the same salt
15388
15389 salt->salt_len += 32;
15390
15391 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15392 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15393 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15394 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15395 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15396 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15397 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15398 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15399
15400 /**
15401 * digest
15402 */
15403
15404 digest[0] = oldoffice34->encryptedVerifierHash[0];
15405 digest[1] = oldoffice34->encryptedVerifierHash[1];
15406 digest[2] = oldoffice34->encryptedVerifierHash[2];
15407 digest[3] = oldoffice34->encryptedVerifierHash[3];
15408
15409 return (PARSER_OK);
15410 }
15411
15412 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15413 {
15414 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15415
15416 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15417 }
15418
15419 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15420 {
15421 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15422
15423 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15424
15425 uint32_t *digest = (uint32_t *) hash_buf->digest;
15426
15427 salt_t *salt = hash_buf->salt;
15428
15429 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15430
15431 /**
15432 * parse line
15433 */
15434
15435 char *version_pos = input_buf + 11;
15436
15437 char *osalt_pos = strchr (version_pos, '*');
15438
15439 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15440
15441 uint32_t version_len = osalt_pos - version_pos;
15442
15443 if (version_len != 1) return (PARSER_SALT_LENGTH);
15444
15445 osalt_pos++;
15446
15447 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15448
15449 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15450
15451 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15452
15453 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15454
15455 encryptedVerifier_pos++;
15456
15457 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15458
15459 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15460
15461 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15462
15463 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15464
15465 encryptedVerifierHash_pos++;
15466
15467 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15468
15469 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15470
15471 uint32_t encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15472
15473 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15474
15475 rc4key_pos++;
15476
15477 uint32_t rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15478
15479 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15480
15481 const uint version = *version_pos - 0x30;
15482
15483 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15484
15485 /**
15486 * esalt
15487 */
15488
15489 oldoffice34->version = version;
15490
15491 oldoffice34->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15492 oldoffice34->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15493 oldoffice34->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15494 oldoffice34->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15495
15496 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15497 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15498 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15499 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15500
15501 oldoffice34->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15502 oldoffice34->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15503 oldoffice34->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15504 oldoffice34->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15505 oldoffice34->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15506
15507 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15508 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15509 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15510 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15511 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15512
15513 oldoffice34->rc4key[1] = 0;
15514 oldoffice34->rc4key[0] = 0;
15515
15516 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15517 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15518 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15519 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15520 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15521 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15522 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15523 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15524 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15525 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15526
15527 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15528 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15529
15530 /**
15531 * salt
15532 */
15533
15534 salt->salt_len = 16;
15535
15536 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15537 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15538 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15539 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15540
15541 // this is a workaround as office produces multiple documents with the same salt
15542
15543 salt->salt_len += 32;
15544
15545 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15546 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15547 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15548 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15549 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15550 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15551 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15552 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15553
15554 /**
15555 * digest
15556 */
15557
15558 digest[0] = oldoffice34->rc4key[0];
15559 digest[1] = oldoffice34->rc4key[1];
15560 digest[2] = 0;
15561 digest[3] = 0;
15562
15563 return (PARSER_OK);
15564 }
15565
15566 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15567 {
15568 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15569
15570 uint32_t *digest = (uint32_t *) hash_buf->digest;
15571
15572 digest[0] = hex_to_uint (&input_buf[ 0]);
15573 digest[1] = hex_to_uint (&input_buf[ 8]);
15574 digest[2] = hex_to_uint (&input_buf[16]);
15575 digest[3] = hex_to_uint (&input_buf[24]);
15576
15577 digest[0] = byte_swap_32 (digest[0]);
15578 digest[1] = byte_swap_32 (digest[1]);
15579 digest[2] = byte_swap_32 (digest[2]);
15580 digest[3] = byte_swap_32 (digest[3]);
15581
15582 return (PARSER_OK);
15583 }
15584
15585 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15586 {
15587 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15588
15589 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15590
15591 uint32_t *digest = (uint32_t *) hash_buf->digest;
15592
15593 salt_t *salt = hash_buf->salt;
15594
15595 char *signature_pos = input_buf;
15596
15597 char *salt_pos = strchr (signature_pos, '$');
15598
15599 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15600
15601 uint32_t signature_len = salt_pos - signature_pos;
15602
15603 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15604
15605 salt_pos++;
15606
15607 char *hash_pos = strchr (salt_pos, '$');
15608
15609 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15610
15611 uint32_t salt_len = hash_pos - salt_pos;
15612
15613 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15614
15615 hash_pos++;
15616
15617 uint32_t hash_len = input_len - signature_len - 1 - salt_len - 1;
15618
15619 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15620
15621 digest[0] = hex_to_uint (&hash_pos[ 0]);
15622 digest[1] = hex_to_uint (&hash_pos[ 8]);
15623 digest[2] = hex_to_uint (&hash_pos[16]);
15624 digest[3] = hex_to_uint (&hash_pos[24]);
15625 digest[4] = hex_to_uint (&hash_pos[32]);
15626
15627 digest[0] -= SHA1M_A;
15628 digest[1] -= SHA1M_B;
15629 digest[2] -= SHA1M_C;
15630 digest[3] -= SHA1M_D;
15631 digest[4] -= SHA1M_E;
15632
15633 char *salt_buf_ptr = (char *) salt->salt_buf;
15634
15635 memcpy (salt_buf_ptr, salt_pos, salt_len);
15636
15637 salt->salt_len = salt_len;
15638
15639 return (PARSER_OK);
15640 }
15641
15642 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15643 {
15644 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15645
15646 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15647
15648 uint32_t *digest = (uint32_t *) hash_buf->digest;
15649
15650 salt_t *salt = hash_buf->salt;
15651
15652 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15653
15654 /**
15655 * parse line
15656 */
15657
15658 char *iter_pos = input_buf + 14;
15659
15660 const int iter = atoi (iter_pos);
15661
15662 if (iter < 1) return (PARSER_SALT_ITERATION);
15663
15664 salt->salt_iter = iter - 1;
15665
15666 char *salt_pos = strchr (iter_pos, '$');
15667
15668 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15669
15670 salt_pos++;
15671
15672 char *hash_pos = strchr (salt_pos, '$');
15673
15674 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15675
15676 const uint salt_len = hash_pos - salt_pos;
15677
15678 hash_pos++;
15679
15680 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15681
15682 memcpy (salt_buf_ptr, salt_pos, salt_len);
15683
15684 salt->salt_len = salt_len;
15685
15686 salt_buf_ptr[salt_len + 3] = 0x01;
15687 salt_buf_ptr[salt_len + 4] = 0x80;
15688
15689 // add some stuff to normal salt to make sorted happy
15690
15691 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15692 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15693 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15694 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15695 salt->salt_buf[4] = salt->salt_iter;
15696
15697 // base64 decode hash
15698
15699 char tmp_buf[100];
15700
15701 memset (tmp_buf, 0, sizeof (tmp_buf));
15702
15703 uint hash_len = input_len - (hash_pos - input_buf);
15704
15705 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15706
15707 base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf);
15708
15709 memcpy (digest, tmp_buf, 32);
15710
15711 digest[0] = byte_swap_32 (digest[0]);
15712 digest[1] = byte_swap_32 (digest[1]);
15713 digest[2] = byte_swap_32 (digest[2]);
15714 digest[3] = byte_swap_32 (digest[3]);
15715 digest[4] = byte_swap_32 (digest[4]);
15716 digest[5] = byte_swap_32 (digest[5]);
15717 digest[6] = byte_swap_32 (digest[6]);
15718 digest[7] = byte_swap_32 (digest[7]);
15719
15720 return (PARSER_OK);
15721 }
15722
15723 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15724 {
15725 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15726
15727 uint32_t *digest = (uint32_t *) hash_buf->digest;
15728
15729 salt_t *salt = hash_buf->salt;
15730
15731 digest[0] = hex_to_uint (&input_buf[ 0]);
15732 digest[1] = hex_to_uint (&input_buf[ 8]);
15733 digest[2] = 0;
15734 digest[3] = 0;
15735
15736 digest[0] = byte_swap_32 (digest[0]);
15737 digest[1] = byte_swap_32 (digest[1]);
15738
15739 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15740 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15741 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15742
15743 char iter_c = input_buf[17];
15744 char iter_d = input_buf[19];
15745
15746 // atm only defaults, let's see if there's more request
15747 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15748 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15749
15750 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15751
15752 salt->salt_buf[0] = hex_to_uint (&salt_buf[ 0]);
15753 salt->salt_buf[1] = hex_to_uint (&salt_buf[ 8]);
15754 salt->salt_buf[2] = hex_to_uint (&salt_buf[16]);
15755 salt->salt_buf[3] = hex_to_uint (&salt_buf[24]);
15756
15757 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15758 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15759 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15760 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15761
15762 salt->salt_len = 16;
15763
15764 return (PARSER_OK);
15765 }
15766
15767 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15768 {
15769 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
15770
15771 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15772
15773 uint32_t *digest = (uint32_t *) hash_buf->digest;
15774
15775 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
15776
15777 salt_t *salt = hash_buf->salt;
15778
15779 char *salt_pos = input_buf + 10;
15780
15781 char *hash_pos = strchr (salt_pos, '$');
15782
15783 uint salt_len = hash_pos - salt_pos;
15784
15785 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15786
15787 hash_pos++;
15788
15789 uint hash_len = input_len - 10 - salt_len - 1;
15790
15791 // base64 decode salt
15792
15793 char tmp_buf[100];
15794
15795 memset (tmp_buf, 0, sizeof (tmp_buf));
15796
15797 salt_len = base64_decode (base64_to_int, salt_pos, salt_len, tmp_buf);
15798
15799 if (salt_len > 55) return (PARSER_SALT_LENGTH);
15800
15801 tmp_buf[salt_len] = 0x80;
15802
15803 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
15804
15805 salt->salt_len = salt_len;
15806
15807 // base64 decode salt
15808
15809 memset (tmp_buf, 0, sizeof (tmp_buf));
15810
15811 hash_len = base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf);
15812
15813 uint user_len = hash_len - 32;
15814
15815 char *tmp_hash = tmp_buf + user_len;
15816
15817 user_len--; // skip the trailing space
15818
15819 digest[0] = hex_to_uint (&tmp_hash[ 0]);
15820 digest[1] = hex_to_uint (&tmp_hash[ 8]);
15821 digest[2] = hex_to_uint (&tmp_hash[16]);
15822 digest[3] = hex_to_uint (&tmp_hash[24]);
15823
15824 digest[0] = byte_swap_32 (digest[0]);
15825 digest[1] = byte_swap_32 (digest[1]);
15826 digest[2] = byte_swap_32 (digest[2]);
15827 digest[3] = byte_swap_32 (digest[3]);
15828
15829 // store username for host only (output hash if cracked)
15830
15831 memset (cram_md5->user, 0, sizeof (cram_md5->user));
15832 memcpy (cram_md5->user, tmp_buf, user_len);
15833
15834 return (PARSER_OK);
15835 }
15836
15837 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15838 {
15839 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
15840
15841 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15842
15843 uint32_t *digest = (uint32_t *) hash_buf->digest;
15844
15845 salt_t *salt = hash_buf->salt;
15846
15847 char *iter_pos = input_buf + 10;
15848
15849 uint32_t iter = atoi (iter_pos);
15850
15851 if (iter < 1)
15852 {
15853 return (PARSER_SALT_ITERATION);
15854 }
15855
15856 iter--; // first iteration is special
15857
15858 salt->salt_iter = iter;
15859
15860 char *base64_pos = strchr (iter_pos, '}');
15861
15862 if (base64_pos == NULL)
15863 {
15864 return (PARSER_SIGNATURE_UNMATCHED);
15865 }
15866
15867 base64_pos++;
15868
15869 // base64 decode salt
15870
15871 uint32_t base64_len = input_len - (base64_pos - input_buf);
15872
15873 char tmp_buf[100];
15874
15875 memset (tmp_buf, 0, sizeof (tmp_buf));
15876
15877 uint32_t decoded_len = base64_decode (base64_to_int, base64_pos, base64_len, tmp_buf);
15878
15879 if (decoded_len < 24)
15880 {
15881 return (PARSER_SALT_LENGTH);
15882 }
15883
15884 // copy the salt
15885
15886 uint salt_len = decoded_len - 20;
15887
15888 if (salt_len < 4) return (PARSER_SALT_LENGTH);
15889 if (salt_len > 16) return (PARSER_SALT_LENGTH);
15890
15891 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
15892
15893 salt->salt_len = salt_len;
15894
15895 // set digest
15896
15897 uint32_t *digest_ptr = (uint32_t*) tmp_buf;
15898
15899 digest[0] = byte_swap_32 (digest_ptr[0]);
15900 digest[1] = byte_swap_32 (digest_ptr[1]);
15901 digest[2] = byte_swap_32 (digest_ptr[2]);
15902 digest[3] = byte_swap_32 (digest_ptr[3]);
15903 digest[4] = byte_swap_32 (digest_ptr[4]);
15904
15905 return (PARSER_OK);
15906 }
15907
15908 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15909 {
15910 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
15911
15912 uint32_t *digest = (uint32_t *) hash_buf->digest;
15913
15914 salt_t *salt = hash_buf->salt;
15915
15916 digest[0] = hex_to_uint (&input_buf[ 0]);
15917 digest[1] = hex_to_uint (&input_buf[ 8]);
15918 digest[2] = hex_to_uint (&input_buf[16]);
15919 digest[3] = hex_to_uint (&input_buf[24]);
15920 digest[4] = hex_to_uint (&input_buf[32]);
15921
15922 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15923
15924 uint salt_len = input_len - 40 - 1;
15925
15926 char *salt_buf = input_buf + 40 + 1;
15927
15928 char *salt_buf_ptr = (char *) salt->salt_buf;
15929
15930 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15931
15932 if (salt_len != 32) return (PARSER_SALT_LENGTH);
15933
15934 salt->salt_len = salt_len;
15935
15936 return (PARSER_OK);
15937 }
15938
15939 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15940 {
15941 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
15942
15943 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15944
15945 uint32_t *digest = (uint32_t *) hash_buf->digest;
15946
15947 salt_t *salt = hash_buf->salt;
15948
15949 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
15950
15951 /**
15952 * parse line
15953 */
15954
15955 char *V_pos = input_buf + 5;
15956
15957 char *R_pos = strchr (V_pos, '*');
15958
15959 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15960
15961 uint32_t V_len = R_pos - V_pos;
15962
15963 R_pos++;
15964
15965 char *bits_pos = strchr (R_pos, '*');
15966
15967 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15968
15969 uint32_t R_len = bits_pos - R_pos;
15970
15971 bits_pos++;
15972
15973 char *P_pos = strchr (bits_pos, '*');
15974
15975 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15976
15977 uint32_t bits_len = P_pos - bits_pos;
15978
15979 P_pos++;
15980
15981 char *enc_md_pos = strchr (P_pos, '*');
15982
15983 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15984
15985 uint32_t P_len = enc_md_pos - P_pos;
15986
15987 enc_md_pos++;
15988
15989 char *id_len_pos = strchr (enc_md_pos, '*');
15990
15991 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15992
15993 uint32_t enc_md_len = id_len_pos - enc_md_pos;
15994
15995 id_len_pos++;
15996
15997 char *id_buf_pos = strchr (id_len_pos, '*');
15998
15999 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16000
16001 uint32_t id_len_len = id_buf_pos - id_len_pos;
16002
16003 id_buf_pos++;
16004
16005 char *u_len_pos = strchr (id_buf_pos, '*');
16006
16007 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16008
16009 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16010
16011 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16012
16013 u_len_pos++;
16014
16015 char *u_buf_pos = strchr (u_len_pos, '*');
16016
16017 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16018
16019 uint32_t u_len_len = u_buf_pos - u_len_pos;
16020
16021 u_buf_pos++;
16022
16023 char *o_len_pos = strchr (u_buf_pos, '*');
16024
16025 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16026
16027 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16028
16029 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16030
16031 o_len_pos++;
16032
16033 char *o_buf_pos = strchr (o_len_pos, '*');
16034
16035 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16036
16037 uint32_t o_len_len = o_buf_pos - o_len_pos;
16038
16039 o_buf_pos++;
16040
16041 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;
16042
16043 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16044
16045 // validate data
16046
16047 const int V = atoi (V_pos);
16048 const int R = atoi (R_pos);
16049 const int P = atoi (P_pos);
16050
16051 if (V != 1) return (PARSER_SALT_VALUE);
16052 if (R != 2) return (PARSER_SALT_VALUE);
16053
16054 const int enc_md = atoi (enc_md_pos);
16055
16056 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16057
16058 const int id_len = atoi (id_len_pos);
16059 const int u_len = atoi (u_len_pos);
16060 const int o_len = atoi (o_len_pos);
16061
16062 if (id_len != 16) return (PARSER_SALT_VALUE);
16063 if (u_len != 32) return (PARSER_SALT_VALUE);
16064 if (o_len != 32) return (PARSER_SALT_VALUE);
16065
16066 const int bits = atoi (bits_pos);
16067
16068 if (bits != 40) return (PARSER_SALT_VALUE);
16069
16070 // copy data to esalt
16071
16072 pdf->V = V;
16073 pdf->R = R;
16074 pdf->P = P;
16075
16076 pdf->enc_md = enc_md;
16077
16078 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16079 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16080 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16081 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16082 pdf->id_len = id_len;
16083
16084 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16085 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16086 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16087 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16088 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16089 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16090 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16091 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16092 pdf->u_len = u_len;
16093
16094 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16095 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16096 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16097 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16098 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16099 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16100 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16101 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16102 pdf->o_len = o_len;
16103
16104 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16105 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16106 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16107 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16108
16109 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16110 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16111 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16112 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16113 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16114 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16115 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16116 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16117
16118 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16119 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16120 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16121 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16122 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16123 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16124 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16125 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16126
16127 // we use ID for salt, maybe needs to change, we will see...
16128
16129 salt->salt_buf[0] = pdf->id_buf[0];
16130 salt->salt_buf[1] = pdf->id_buf[1];
16131 salt->salt_buf[2] = pdf->id_buf[2];
16132 salt->salt_buf[3] = pdf->id_buf[3];
16133 salt->salt_len = pdf->id_len;
16134
16135 digest[0] = pdf->u_buf[0];
16136 digest[1] = pdf->u_buf[1];
16137 digest[2] = pdf->u_buf[2];
16138 digest[3] = pdf->u_buf[3];
16139
16140 return (PARSER_OK);
16141 }
16142
16143 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16144 {
16145 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16146 }
16147
16148 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16149 {
16150 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16151
16152 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16153
16154 uint32_t *digest = (uint32_t *) hash_buf->digest;
16155
16156 salt_t *salt = hash_buf->salt;
16157
16158 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16159
16160 /**
16161 * parse line
16162 */
16163
16164 char *V_pos = input_buf + 5;
16165
16166 char *R_pos = strchr (V_pos, '*');
16167
16168 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16169
16170 uint32_t V_len = R_pos - V_pos;
16171
16172 R_pos++;
16173
16174 char *bits_pos = strchr (R_pos, '*');
16175
16176 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16177
16178 uint32_t R_len = bits_pos - R_pos;
16179
16180 bits_pos++;
16181
16182 char *P_pos = strchr (bits_pos, '*');
16183
16184 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16185
16186 uint32_t bits_len = P_pos - bits_pos;
16187
16188 P_pos++;
16189
16190 char *enc_md_pos = strchr (P_pos, '*');
16191
16192 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16193
16194 uint32_t P_len = enc_md_pos - P_pos;
16195
16196 enc_md_pos++;
16197
16198 char *id_len_pos = strchr (enc_md_pos, '*');
16199
16200 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16201
16202 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16203
16204 id_len_pos++;
16205
16206 char *id_buf_pos = strchr (id_len_pos, '*');
16207
16208 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16209
16210 uint32_t id_len_len = id_buf_pos - id_len_pos;
16211
16212 id_buf_pos++;
16213
16214 char *u_len_pos = strchr (id_buf_pos, '*');
16215
16216 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16217
16218 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16219
16220 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16221
16222 u_len_pos++;
16223
16224 char *u_buf_pos = strchr (u_len_pos, '*');
16225
16226 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16227
16228 uint32_t u_len_len = u_buf_pos - u_len_pos;
16229
16230 u_buf_pos++;
16231
16232 char *o_len_pos = strchr (u_buf_pos, '*');
16233
16234 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16235
16236 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16237
16238 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16239
16240 o_len_pos++;
16241
16242 char *o_buf_pos = strchr (o_len_pos, '*');
16243
16244 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16245
16246 uint32_t o_len_len = o_buf_pos - o_len_pos;
16247
16248 o_buf_pos++;
16249
16250 char *rc4key_pos = strchr (o_buf_pos, ':');
16251
16252 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16253
16254 uint32_t o_buf_len = rc4key_pos - o_buf_pos;
16255
16256 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16257
16258 rc4key_pos++;
16259
16260 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;
16261
16262 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16263
16264 // validate data
16265
16266 const int V = atoi (V_pos);
16267 const int R = atoi (R_pos);
16268 const int P = atoi (P_pos);
16269
16270 if (V != 1) return (PARSER_SALT_VALUE);
16271 if (R != 2) return (PARSER_SALT_VALUE);
16272
16273 const int enc_md = atoi (enc_md_pos);
16274
16275 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16276
16277 const int id_len = atoi (id_len_pos);
16278 const int u_len = atoi (u_len_pos);
16279 const int o_len = atoi (o_len_pos);
16280
16281 if (id_len != 16) return (PARSER_SALT_VALUE);
16282 if (u_len != 32) return (PARSER_SALT_VALUE);
16283 if (o_len != 32) return (PARSER_SALT_VALUE);
16284
16285 const int bits = atoi (bits_pos);
16286
16287 if (bits != 40) return (PARSER_SALT_VALUE);
16288
16289 // copy data to esalt
16290
16291 pdf->V = V;
16292 pdf->R = R;
16293 pdf->P = P;
16294
16295 pdf->enc_md = enc_md;
16296
16297 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16298 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16299 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16300 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16301 pdf->id_len = id_len;
16302
16303 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16304 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16305 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16306 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16307 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16308 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16309 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16310 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16311 pdf->u_len = u_len;
16312
16313 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16314 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16315 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16316 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16317 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16318 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16319 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16320 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16321 pdf->o_len = o_len;
16322
16323 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16324 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16325 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16326 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16327
16328 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16329 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16330 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16331 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16332 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16333 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16334 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16335 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16336
16337 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16338 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16339 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16340 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16341 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16342 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16343 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16344 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16345
16346 pdf->rc4key[1] = 0;
16347 pdf->rc4key[0] = 0;
16348
16349 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16350 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16351 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16352 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16353 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16354 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16355 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16356 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16357 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16358 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16359
16360 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16361 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16362
16363 // we use ID for salt, maybe needs to change, we will see...
16364
16365 salt->salt_buf[0] = pdf->id_buf[0];
16366 salt->salt_buf[1] = pdf->id_buf[1];
16367 salt->salt_buf[2] = pdf->id_buf[2];
16368 salt->salt_buf[3] = pdf->id_buf[3];
16369 salt->salt_buf[4] = pdf->u_buf[0];
16370 salt->salt_buf[5] = pdf->u_buf[1];
16371 salt->salt_buf[6] = pdf->o_buf[0];
16372 salt->salt_buf[7] = pdf->o_buf[1];
16373 salt->salt_len = pdf->id_len + 16;
16374
16375 digest[0] = pdf->rc4key[0];
16376 digest[1] = pdf->rc4key[1];
16377 digest[2] = 0;
16378 digest[3] = 0;
16379
16380 return (PARSER_OK);
16381 }
16382
16383 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16384 {
16385 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16386
16387 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16388
16389 uint32_t *digest = (uint32_t *) hash_buf->digest;
16390
16391 salt_t *salt = hash_buf->salt;
16392
16393 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16394
16395 /**
16396 * parse line
16397 */
16398
16399 char *V_pos = input_buf + 5;
16400
16401 char *R_pos = strchr (V_pos, '*');
16402
16403 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16404
16405 uint32_t V_len = R_pos - V_pos;
16406
16407 R_pos++;
16408
16409 char *bits_pos = strchr (R_pos, '*');
16410
16411 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16412
16413 uint32_t R_len = bits_pos - R_pos;
16414
16415 bits_pos++;
16416
16417 char *P_pos = strchr (bits_pos, '*');
16418
16419 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16420
16421 uint32_t bits_len = P_pos - bits_pos;
16422
16423 P_pos++;
16424
16425 char *enc_md_pos = strchr (P_pos, '*');
16426
16427 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16428
16429 uint32_t P_len = enc_md_pos - P_pos;
16430
16431 enc_md_pos++;
16432
16433 char *id_len_pos = strchr (enc_md_pos, '*');
16434
16435 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16436
16437 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16438
16439 id_len_pos++;
16440
16441 char *id_buf_pos = strchr (id_len_pos, '*');
16442
16443 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16444
16445 uint32_t id_len_len = id_buf_pos - id_len_pos;
16446
16447 id_buf_pos++;
16448
16449 char *u_len_pos = strchr (id_buf_pos, '*');
16450
16451 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16452
16453 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16454
16455 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16456
16457 u_len_pos++;
16458
16459 char *u_buf_pos = strchr (u_len_pos, '*');
16460
16461 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16462
16463 uint32_t u_len_len = u_buf_pos - u_len_pos;
16464
16465 u_buf_pos++;
16466
16467 char *o_len_pos = strchr (u_buf_pos, '*');
16468
16469 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16470
16471 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16472
16473 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16474
16475 o_len_pos++;
16476
16477 char *o_buf_pos = strchr (o_len_pos, '*');
16478
16479 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16480
16481 uint32_t o_len_len = o_buf_pos - o_len_pos;
16482
16483 o_buf_pos++;
16484
16485 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;
16486
16487 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16488
16489 // validate data
16490
16491 const int V = atoi (V_pos);
16492 const int R = atoi (R_pos);
16493 const int P = atoi (P_pos);
16494
16495 int vr_ok = 0;
16496
16497 if ((V == 2) && (R == 3)) vr_ok = 1;
16498 if ((V == 4) && (R == 4)) vr_ok = 1;
16499
16500 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16501
16502 const int id_len = atoi (id_len_pos);
16503 const int u_len = atoi (u_len_pos);
16504 const int o_len = atoi (o_len_pos);
16505
16506 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16507
16508 if (u_len != 32) return (PARSER_SALT_VALUE);
16509 if (o_len != 32) return (PARSER_SALT_VALUE);
16510
16511 const int bits = atoi (bits_pos);
16512
16513 if (bits != 128) return (PARSER_SALT_VALUE);
16514
16515 int enc_md = 1;
16516
16517 if (R >= 4)
16518 {
16519 enc_md = atoi (enc_md_pos);
16520 }
16521
16522 // copy data to esalt
16523
16524 pdf->V = V;
16525 pdf->R = R;
16526 pdf->P = P;
16527
16528 pdf->enc_md = enc_md;
16529
16530 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16531 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16532 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16533 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16534
16535 if (id_len == 32)
16536 {
16537 pdf->id_buf[4] = hex_to_uint (&id_buf_pos[32]);
16538 pdf->id_buf[5] = hex_to_uint (&id_buf_pos[40]);
16539 pdf->id_buf[6] = hex_to_uint (&id_buf_pos[48]);
16540 pdf->id_buf[7] = hex_to_uint (&id_buf_pos[56]);
16541 }
16542
16543 pdf->id_len = id_len;
16544
16545 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16546 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16547 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16548 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16549 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16550 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16551 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16552 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16553 pdf->u_len = u_len;
16554
16555 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16556 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16557 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16558 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16559 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16560 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16561 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16562 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16563 pdf->o_len = o_len;
16564
16565 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16566 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16567 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16568 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16569
16570 if (id_len == 32)
16571 {
16572 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16573 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16574 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16575 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16576 }
16577
16578 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16579 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16580 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16581 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16582 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16583 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16584 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16585 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16586
16587 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16588 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16589 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16590 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16591 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16592 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16593 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16594 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16595
16596 // precompute rc4 data for later use
16597
16598 uint padding[8] =
16599 {
16600 0x5e4ebf28,
16601 0x418a754e,
16602 0x564e0064,
16603 0x0801faff,
16604 0xb6002e2e,
16605 0x803e68d0,
16606 0xfea90c2f,
16607 0x7a695364
16608 };
16609
16610 // md5
16611
16612 uint salt_pc_block[32];
16613
16614 char *salt_pc_ptr = (char *) salt_pc_block;
16615
16616 memcpy (salt_pc_ptr, padding, 32);
16617 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16618
16619 uint salt_pc_digest[4];
16620
16621 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16622
16623 pdf->rc4data[0] = salt_pc_digest[0];
16624 pdf->rc4data[1] = salt_pc_digest[1];
16625
16626 // we use ID for salt, maybe needs to change, we will see...
16627
16628 salt->salt_buf[0] = pdf->id_buf[0];
16629 salt->salt_buf[1] = pdf->id_buf[1];
16630 salt->salt_buf[2] = pdf->id_buf[2];
16631 salt->salt_buf[3] = pdf->id_buf[3];
16632 salt->salt_buf[4] = pdf->u_buf[0];
16633 salt->salt_buf[5] = pdf->u_buf[1];
16634 salt->salt_buf[6] = pdf->o_buf[0];
16635 salt->salt_buf[7] = pdf->o_buf[1];
16636 salt->salt_len = pdf->id_len + 16;
16637
16638 salt->salt_iter = ROUNDS_PDF14;
16639
16640 digest[0] = pdf->u_buf[0];
16641 digest[1] = pdf->u_buf[1];
16642 digest[2] = 0;
16643 digest[3] = 0;
16644
16645 return (PARSER_OK);
16646 }
16647
16648 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16649 {
16650 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16651
16652 if (ret != PARSER_OK)
16653 {
16654 return ret;
16655 }
16656
16657 uint32_t *digest = (uint32_t *) hash_buf->digest;
16658
16659 salt_t *salt = hash_buf->salt;
16660
16661 digest[0] -= SHA256M_A;
16662 digest[1] -= SHA256M_B;
16663 digest[2] -= SHA256M_C;
16664 digest[3] -= SHA256M_D;
16665 digest[4] -= SHA256M_E;
16666 digest[5] -= SHA256M_F;
16667 digest[6] -= SHA256M_G;
16668 digest[7] -= SHA256M_H;
16669
16670 salt->salt_buf[2] = 0x80;
16671
16672 return (PARSER_OK);
16673 }
16674
16675 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16676 {
16677 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16678
16679 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16680
16681 uint32_t *digest = (uint32_t *) hash_buf->digest;
16682
16683 salt_t *salt = hash_buf->salt;
16684
16685 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16686
16687 /**
16688 * parse line
16689 */
16690
16691 char *V_pos = input_buf + 5;
16692
16693 char *R_pos = strchr (V_pos, '*');
16694
16695 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16696
16697 uint32_t V_len = R_pos - V_pos;
16698
16699 R_pos++;
16700
16701 char *bits_pos = strchr (R_pos, '*');
16702
16703 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16704
16705 uint32_t R_len = bits_pos - R_pos;
16706
16707 bits_pos++;
16708
16709 char *P_pos = strchr (bits_pos, '*');
16710
16711 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16712
16713 uint32_t bits_len = P_pos - bits_pos;
16714
16715 P_pos++;
16716
16717 char *enc_md_pos = strchr (P_pos, '*');
16718
16719 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16720
16721 uint32_t P_len = enc_md_pos - P_pos;
16722
16723 enc_md_pos++;
16724
16725 char *id_len_pos = strchr (enc_md_pos, '*');
16726
16727 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16728
16729 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16730
16731 id_len_pos++;
16732
16733 char *id_buf_pos = strchr (id_len_pos, '*');
16734
16735 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16736
16737 uint32_t id_len_len = id_buf_pos - id_len_pos;
16738
16739 id_buf_pos++;
16740
16741 char *u_len_pos = strchr (id_buf_pos, '*');
16742
16743 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16744
16745 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16746
16747 u_len_pos++;
16748
16749 char *u_buf_pos = strchr (u_len_pos, '*');
16750
16751 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16752
16753 uint32_t u_len_len = u_buf_pos - u_len_pos;
16754
16755 u_buf_pos++;
16756
16757 char *o_len_pos = strchr (u_buf_pos, '*');
16758
16759 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16760
16761 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16762
16763 o_len_pos++;
16764
16765 char *o_buf_pos = strchr (o_len_pos, '*');
16766
16767 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16768
16769 uint32_t o_len_len = o_buf_pos - o_len_pos;
16770
16771 o_buf_pos++;
16772
16773 char *last = strchr (o_buf_pos, '*');
16774
16775 if (last == NULL) last = input_buf + input_len;
16776
16777 uint32_t o_buf_len = last - o_buf_pos;
16778
16779 // validate data
16780
16781 const int V = atoi (V_pos);
16782 const int R = atoi (R_pos);
16783
16784 int vr_ok = 0;
16785
16786 if ((V == 5) && (R == 5)) vr_ok = 1;
16787 if ((V == 5) && (R == 6)) vr_ok = 1;
16788
16789 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16790
16791 const int bits = atoi (bits_pos);
16792
16793 if (bits != 256) return (PARSER_SALT_VALUE);
16794
16795 int enc_md = atoi (enc_md_pos);
16796
16797 if (enc_md != 1) return (PARSER_SALT_VALUE);
16798
16799 const uint id_len = atoi (id_len_pos);
16800 const uint u_len = atoi (u_len_pos);
16801 const uint o_len = atoi (o_len_pos);
16802
16803 if (V_len > 6) return (PARSER_SALT_LENGTH);
16804 if (R_len > 6) return (PARSER_SALT_LENGTH);
16805 if (P_len > 6) return (PARSER_SALT_LENGTH);
16806 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
16807 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
16808 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
16809 if (bits_len > 6) return (PARSER_SALT_LENGTH);
16810 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
16811
16812 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
16813 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
16814 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
16815
16816 // copy data to esalt
16817
16818 if (u_len < 40) return (PARSER_SALT_VALUE);
16819
16820 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
16821 {
16822 pdf->u_buf[i] = hex_to_uint (&u_buf_pos[j]);
16823 }
16824
16825 salt->salt_buf[0] = pdf->u_buf[8];
16826 salt->salt_buf[1] = pdf->u_buf[9];
16827
16828 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16829 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16830
16831 salt->salt_len = 8;
16832 salt->salt_iter = ROUNDS_PDF17L8;
16833
16834 digest[0] = pdf->u_buf[0];
16835 digest[1] = pdf->u_buf[1];
16836 digest[2] = pdf->u_buf[2];
16837 digest[3] = pdf->u_buf[3];
16838 digest[4] = pdf->u_buf[4];
16839 digest[5] = pdf->u_buf[5];
16840 digest[6] = pdf->u_buf[6];
16841 digest[7] = pdf->u_buf[7];
16842
16843 return (PARSER_OK);
16844 }
16845
16846 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16847 {
16848 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
16849
16850 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
16851
16852 uint32_t *digest = (uint32_t *) hash_buf->digest;
16853
16854 salt_t *salt = hash_buf->salt;
16855
16856 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16857
16858 /**
16859 * parse line
16860 */
16861
16862 // iterations
16863
16864 char *iter_pos = input_buf + 7;
16865
16866 uint32_t iter = atoi (iter_pos);
16867
16868 if (iter < 1) return (PARSER_SALT_ITERATION);
16869 if (iter > 999999) return (PARSER_SALT_ITERATION);
16870
16871 // first is *raw* salt
16872
16873 char *salt_pos = strchr (iter_pos, ':');
16874
16875 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16876
16877 salt_pos++;
16878
16879 char *hash_pos = strchr (salt_pos, ':');
16880
16881 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16882
16883 uint32_t salt_len = hash_pos - salt_pos;
16884
16885 if (salt_len > 64) return (PARSER_SALT_LENGTH);
16886
16887 hash_pos++;
16888
16889 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
16890
16891 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
16892
16893 // decode salt
16894
16895 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16896
16897 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
16898
16899 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
16900
16901 salt_buf_ptr[salt_len + 3] = 0x01;
16902 salt_buf_ptr[salt_len + 4] = 0x80;
16903
16904 salt->salt_len = salt_len;
16905 salt->salt_iter = iter - 1;
16906
16907 // decode hash
16908
16909 char tmp_buf[100];
16910
16911 memset (tmp_buf, 0, sizeof (tmp_buf));
16912
16913 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
16914
16915 if (hash_len < 16) return (PARSER_HASH_LENGTH);
16916
16917 memcpy (digest, tmp_buf, 16);
16918
16919 digest[0] = byte_swap_32 (digest[0]);
16920 digest[1] = byte_swap_32 (digest[1]);
16921 digest[2] = byte_swap_32 (digest[2]);
16922 digest[3] = byte_swap_32 (digest[3]);
16923
16924 // add some stuff to normal salt to make sorted happy
16925
16926 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16927 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16928 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16929 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16930 salt->salt_buf[4] = salt->salt_iter;
16931
16932 return (PARSER_OK);
16933 }
16934
16935 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16936 {
16937 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
16938
16939 uint32_t *digest = (uint32_t *) hash_buf->digest;
16940
16941 salt_t *salt = hash_buf->salt;
16942
16943 digest[0] = hex_to_uint (&input_buf[ 0]);
16944 digest[1] = hex_to_uint (&input_buf[ 8]);
16945 digest[2] = hex_to_uint (&input_buf[16]);
16946 digest[3] = hex_to_uint (&input_buf[24]);
16947
16948 digest[0] = byte_swap_32 (digest[0]);
16949 digest[1] = byte_swap_32 (digest[1]);
16950 digest[2] = byte_swap_32 (digest[2]);
16951 digest[3] = byte_swap_32 (digest[3]);
16952
16953 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16954
16955 uint salt_len = input_len - 32 - 1;
16956
16957 char *salt_buf = input_buf + 32 + 1;
16958
16959 char *salt_buf_ptr = (char *) salt->salt_buf;
16960
16961 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16962
16963 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
16964
16965 salt->salt_len = salt_len;
16966
16967 return (PARSER_OK);
16968 }
16969
16970 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16971 {
16972 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
16973
16974 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16975
16976 uint32_t *digest = (uint32_t *) hash_buf->digest;
16977
16978 salt_t *salt = hash_buf->salt;
16979
16980 char *user_pos = input_buf + 10;
16981
16982 char *salt_pos = strchr (user_pos, '*');
16983
16984 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16985
16986 salt_pos++;
16987
16988 char *hash_pos = strchr (salt_pos, '*');
16989
16990 hash_pos++;
16991
16992 uint hash_len = input_len - (hash_pos - input_buf);
16993
16994 if (hash_len != 32) return (PARSER_HASH_LENGTH);
16995
16996 uint user_len = salt_pos - user_pos - 1;
16997
16998 uint salt_len = hash_pos - salt_pos - 1;
16999
17000 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17001
17002 /*
17003 * store digest
17004 */
17005
17006 digest[0] = hex_to_uint (&hash_pos[ 0]);
17007 digest[1] = hex_to_uint (&hash_pos[ 8]);
17008 digest[2] = hex_to_uint (&hash_pos[16]);
17009 digest[3] = hex_to_uint (&hash_pos[24]);
17010
17011 digest[0] = byte_swap_32 (digest[0]);
17012 digest[1] = byte_swap_32 (digest[1]);
17013 digest[2] = byte_swap_32 (digest[2]);
17014 digest[3] = byte_swap_32 (digest[3]);
17015
17016 digest[0] -= MD5M_A;
17017 digest[1] -= MD5M_B;
17018 digest[2] -= MD5M_C;
17019 digest[3] -= MD5M_D;
17020
17021 /*
17022 * store salt
17023 */
17024
17025 char *salt_buf_ptr = (char *) salt->salt_buf;
17026
17027 // first 4 bytes are the "challenge"
17028
17029 salt_buf_ptr[0] = hex_to_char (&salt_pos[0]);
17030 salt_buf_ptr[1] = hex_to_char (&salt_pos[2]);
17031 salt_buf_ptr[2] = hex_to_char (&salt_pos[4]);
17032 salt_buf_ptr[3] = hex_to_char (&salt_pos[6]);
17033
17034 // append the user name
17035
17036 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17037
17038 salt->salt_len = 4 + user_len;
17039
17040 return (PARSER_OK);
17041 }
17042
17043 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17044 {
17045 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17046
17047 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17048
17049 uint32_t *digest = (uint32_t *) hash_buf->digest;
17050
17051 salt_t *salt = hash_buf->salt;
17052
17053 char *salt_pos = input_buf + 9;
17054
17055 char *hash_pos = strchr (salt_pos, '*');
17056
17057 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17058
17059 hash_pos++;
17060
17061 uint hash_len = input_len - (hash_pos - input_buf);
17062
17063 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17064
17065 uint salt_len = hash_pos - salt_pos - 1;
17066
17067 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17068
17069 /*
17070 * store digest
17071 */
17072
17073 digest[0] = hex_to_uint (&hash_pos[ 0]);
17074 digest[1] = hex_to_uint (&hash_pos[ 8]);
17075 digest[2] = hex_to_uint (&hash_pos[16]);
17076 digest[3] = hex_to_uint (&hash_pos[24]);
17077 digest[4] = hex_to_uint (&hash_pos[32]);
17078
17079 /*
17080 * store salt
17081 */
17082
17083 char *salt_buf_ptr = (char *) salt->salt_buf;
17084
17085 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17086
17087 salt->salt_len = salt_len;
17088
17089 return (PARSER_OK);
17090 }
17091
17092 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17093 {
17094 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17095
17096 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17097
17098 uint32_t *digest = (uint32_t *) hash_buf->digest;
17099
17100 salt_t *salt = hash_buf->salt;
17101
17102 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17103
17104 /**
17105 * parse line
17106 */
17107
17108 char *cry_master_len_pos = input_buf + 9;
17109
17110 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17111
17112 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17113
17114 uint32_t cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17115
17116 cry_master_buf_pos++;
17117
17118 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17119
17120 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17121
17122 uint32_t cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17123
17124 cry_salt_len_pos++;
17125
17126 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17127
17128 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17129
17130 uint32_t cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17131
17132 cry_salt_buf_pos++;
17133
17134 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17135
17136 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17137
17138 uint32_t cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17139
17140 cry_rounds_pos++;
17141
17142 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17143
17144 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17145
17146 uint32_t cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17147
17148 ckey_len_pos++;
17149
17150 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17151
17152 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17153
17154 uint32_t ckey_len_len = ckey_buf_pos - ckey_len_pos;
17155
17156 ckey_buf_pos++;
17157
17158 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17159
17160 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17161
17162 uint32_t ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17163
17164 public_key_len_pos++;
17165
17166 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17167
17168 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17169
17170 uint32_t public_key_len_len = public_key_buf_pos - public_key_len_pos;
17171
17172 public_key_buf_pos++;
17173
17174 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;
17175
17176 const uint cry_master_len = atoi (cry_master_len_pos);
17177 const uint cry_salt_len = atoi (cry_salt_len_pos);
17178 const uint ckey_len = atoi (ckey_len_pos);
17179 const uint public_key_len = atoi (public_key_len_pos);
17180
17181 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17182 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17183 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17184 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17185
17186 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 8)
17187 {
17188 bitcoin_wallet->cry_master_buf[i] = hex_to_uint (&cry_master_buf_pos[j]);
17189
17190 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17191 }
17192
17193 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 8)
17194 {
17195 bitcoin_wallet->ckey_buf[i] = hex_to_uint (&ckey_buf_pos[j]);
17196
17197 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17198 }
17199
17200 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 8)
17201 {
17202 bitcoin_wallet->public_key_buf[i] = hex_to_uint (&public_key_buf_pos[j]);
17203
17204 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17205 }
17206
17207 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17208 bitcoin_wallet->ckey_len = ckey_len / 2;
17209 bitcoin_wallet->public_key_len = public_key_len / 2;
17210
17211 /*
17212 * store digest (should be unique enought, hopefully)
17213 */
17214
17215 digest[0] = bitcoin_wallet->cry_master_buf[0];
17216 digest[1] = bitcoin_wallet->cry_master_buf[1];
17217 digest[2] = bitcoin_wallet->cry_master_buf[2];
17218 digest[3] = bitcoin_wallet->cry_master_buf[3];
17219
17220 /*
17221 * store salt
17222 */
17223
17224 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17225
17226 const uint cry_rounds = atoi (cry_rounds_pos);
17227
17228 salt->salt_iter = cry_rounds - 1;
17229
17230 char *salt_buf_ptr = (char *) salt->salt_buf;
17231
17232 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17233
17234 salt->salt_len = salt_len;
17235
17236 return (PARSER_OK);
17237 }
17238
17239 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17240 {
17241 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17242
17243 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17244
17245 uint32_t *digest = (uint32_t *) hash_buf->digest;
17246
17247 salt_t *salt = hash_buf->salt;
17248
17249 sip_t *sip = (sip_t *) hash_buf->esalt;
17250
17251 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17252
17253 char temp_input_buf[input_len + 1];
17254
17255 memset (temp_input_buf, 0, sizeof (temp_input_buf));
17256 memcpy (temp_input_buf, input_buf, input_len);
17257
17258 // URI_server:
17259
17260 char *URI_server_pos = temp_input_buf + 6;
17261
17262 char *URI_client_pos = strchr (URI_server_pos, '*');
17263
17264 if (URI_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17265
17266 URI_client_pos[0] = 0;
17267 URI_client_pos++;
17268
17269 uint URI_server_len = strlen (URI_server_pos);
17270
17271 if (URI_server_len > 512) return (PARSER_SALT_LENGTH);
17272
17273 // URI_client:
17274
17275 char *user_pos = strchr (URI_client_pos, '*');
17276
17277 if (user_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17278
17279 user_pos[0] = 0;
17280 user_pos++;
17281
17282 uint URI_client_len = strlen (URI_client_pos);
17283
17284 if (URI_client_len > 512) return (PARSER_SALT_LENGTH);
17285
17286 // user:
17287
17288 char *realm_pos = strchr (user_pos, '*');
17289
17290 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17291
17292 realm_pos[0] = 0;
17293 realm_pos++;
17294
17295 uint user_len = strlen (user_pos);
17296
17297 if (user_len > 116) return (PARSER_SALT_LENGTH);
17298
17299 // realm:
17300
17301 char *method_pos = strchr (realm_pos, '*');
17302
17303 if (method_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17304
17305 method_pos[0] = 0;
17306 method_pos++;
17307
17308 uint realm_len = strlen (realm_pos);
17309
17310 if (realm_len > 116) return (PARSER_SALT_LENGTH);
17311
17312 // method:
17313
17314 char *URI_prefix_pos = strchr (method_pos, '*');
17315
17316 if (URI_prefix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17317
17318 URI_prefix_pos[0] = 0;
17319 URI_prefix_pos++;
17320
17321 uint method_len = strlen (method_pos);
17322
17323 if (method_len > 246) return (PARSER_SALT_LENGTH);
17324
17325 // URI_prefix:
17326
17327 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17328
17329 if (URI_resource_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17330
17331 URI_resource_pos[0] = 0;
17332 URI_resource_pos++;
17333
17334 uint URI_prefix_len = strlen (URI_prefix_pos);
17335
17336 if (URI_prefix_len > 245) return (PARSER_SALT_LENGTH);
17337
17338 // URI_resource:
17339
17340 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17341
17342 if (URI_suffix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17343
17344 URI_suffix_pos[0] = 0;
17345 URI_suffix_pos++;
17346
17347 uint URI_resource_len = strlen (URI_resource_pos);
17348
17349 if (URI_resource_len < 1) return (PARSER_SALT_LENGTH);
17350 if (URI_resource_len > 246) return (PARSER_SALT_LENGTH);
17351
17352 // URI_suffix:
17353
17354 char *nonce_pos = strchr (URI_suffix_pos, '*');
17355
17356 if (nonce_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17357
17358 nonce_pos[0] = 0;
17359 nonce_pos++;
17360
17361 uint URI_suffix_len = strlen (URI_suffix_pos);
17362
17363 if (URI_suffix_len > 245) return (PARSER_SALT_LENGTH);
17364
17365 // nonce:
17366
17367 char *nonce_client_pos = strchr (nonce_pos, '*');
17368
17369 if (nonce_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17370
17371 nonce_client_pos[0] = 0;
17372 nonce_client_pos++;
17373
17374 uint nonce_len = strlen (nonce_pos);
17375
17376 if (nonce_len < 1) return (PARSER_SALT_LENGTH);
17377 if (nonce_len > 50) return (PARSER_SALT_LENGTH);
17378
17379 // nonce_client:
17380
17381 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17382
17383 if (nonce_count_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17384
17385 nonce_count_pos[0] = 0;
17386 nonce_count_pos++;
17387
17388 uint nonce_client_len = strlen (nonce_client_pos);
17389
17390 if (nonce_client_len > 50) return (PARSER_SALT_LENGTH);
17391
17392 // nonce_count:
17393
17394 char *qop_pos = strchr (nonce_count_pos, '*');
17395
17396 if (qop_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17397
17398 qop_pos[0] = 0;
17399 qop_pos++;
17400
17401 uint nonce_count_len = strlen (nonce_count_pos);
17402
17403 if (nonce_count_len > 50) return (PARSER_SALT_LENGTH);
17404
17405 // qop:
17406
17407 char *directive_pos = strchr (qop_pos, '*');
17408
17409 if (directive_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17410
17411 directive_pos[0] = 0;
17412 directive_pos++;
17413
17414 uint qop_len = strlen (qop_pos);
17415
17416 if (qop_len > 50) return (PARSER_SALT_LENGTH);
17417
17418 // directive
17419
17420 char *digest_pos = strchr (directive_pos, '*');
17421
17422 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17423
17424 digest_pos[0] = 0;
17425 digest_pos++;
17426
17427 uint directive_len = strlen (directive_pos);
17428
17429 if (directive_len != 3) return (PARSER_SALT_LENGTH);
17430
17431 if (memcmp (directive_pos, "MD5", 3))
17432 {
17433 log_info ("ERROR: only the MD5 directive is currently supported\n");
17434
17435 return (PARSER_SIP_AUTH_DIRECTIVE);
17436 }
17437
17438 /*
17439 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17440 */
17441
17442 uint md5_len = 0;
17443
17444 uint md5_max_len = 4 * 64;
17445
17446 uint md5_remaining_len = md5_max_len;
17447
17448 uint tmp_md5_buf[md5_max_len / 4];
17449
17450 memset (tmp_md5_buf, 0, sizeof (tmp_md5_buf));
17451
17452 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17453
17454 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17455
17456 md5_len += method_len + 1;
17457 tmp_md5_ptr += method_len + 1;
17458
17459 if (URI_prefix_len > 0)
17460 {
17461 md5_remaining_len = md5_max_len - md5_len;
17462
17463 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17464
17465 md5_len += URI_prefix_len + 1;
17466 tmp_md5_ptr += URI_prefix_len + 1;
17467 }
17468
17469 md5_remaining_len = md5_max_len - md5_len;
17470
17471 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17472
17473 md5_len += URI_resource_len;
17474 tmp_md5_ptr += URI_resource_len;
17475
17476 if (URI_suffix_len > 0)
17477 {
17478 md5_remaining_len = md5_max_len - md5_len;
17479
17480 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17481
17482 md5_len += 1 + URI_suffix_len;
17483 }
17484
17485 uint tmp_digest[4];
17486
17487 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17488
17489 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17490 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17491 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17492 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17493
17494 /*
17495 * esalt
17496 */
17497
17498 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17499
17500 uint esalt_len = 0;
17501
17502 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17503
17504 // there are 2 possibilities for the esalt:
17505
17506 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17507 {
17508 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17509
17510 if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH);
17511
17512 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17513 nonce_pos,
17514 nonce_count_pos,
17515 nonce_client_pos,
17516 qop_pos,
17517 tmp_digest[0],
17518 tmp_digest[1],
17519 tmp_digest[2],
17520 tmp_digest[3]);
17521 }
17522 else
17523 {
17524 esalt_len = 1 + nonce_len + 1 + 32;
17525
17526 if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH);
17527
17528 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17529 nonce_pos,
17530 tmp_digest[0],
17531 tmp_digest[1],
17532 tmp_digest[2],
17533 tmp_digest[3]);
17534 }
17535
17536 // add 0x80 to esalt
17537
17538 esalt_buf_ptr[esalt_len] = 0x80;
17539
17540 sip->esalt_len = esalt_len;
17541
17542 /*
17543 * actual salt
17544 */
17545
17546 char *sip_salt_ptr = (char *) sip->salt_buf;
17547
17548 uint salt_len = user_len + 1 + realm_len + 1;
17549
17550 uint max_salt_len = 119;
17551
17552 if (salt_len > max_salt_len) return (PARSER_SALT_LENGTH);
17553
17554 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17555
17556 sip->salt_len = salt_len;
17557
17558 /*
17559 * fake salt (for sorting)
17560 */
17561
17562 char *salt_buf_ptr = (char *) salt->salt_buf;
17563
17564 max_salt_len = 55;
17565
17566 uint fake_salt_len = salt_len;
17567
17568 if (fake_salt_len > max_salt_len)
17569 {
17570 fake_salt_len = max_salt_len;
17571 }
17572
17573 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17574
17575 salt->salt_len = fake_salt_len;
17576
17577 /*
17578 * digest
17579 */
17580
17581 digest[0] = hex_to_uint (&digest_pos[ 0]);
17582 digest[1] = hex_to_uint (&digest_pos[ 8]);
17583 digest[2] = hex_to_uint (&digest_pos[16]);
17584 digest[3] = hex_to_uint (&digest_pos[24]);
17585
17586 digest[0] = byte_swap_32 (digest[0]);
17587 digest[1] = byte_swap_32 (digest[1]);
17588 digest[2] = byte_swap_32 (digest[2]);
17589 digest[3] = byte_swap_32 (digest[3]);
17590
17591 return (PARSER_OK);
17592 }
17593
17594 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17595 {
17596 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17597
17598 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17599
17600 uint32_t *digest = (uint32_t *) hash_buf->digest;
17601
17602 salt_t *salt = hash_buf->salt;
17603
17604 // digest
17605
17606 char *digest_pos = input_buf;
17607
17608 digest[0] = hex_to_uint (&digest_pos[0]);
17609 digest[1] = 0;
17610 digest[2] = 0;
17611 digest[3] = 0;
17612
17613 // salt
17614
17615 char *salt_buf = input_buf + 8 + 1;
17616
17617 uint salt_len = 8;
17618
17619 char *salt_buf_ptr = (char *) salt->salt_buf;
17620
17621 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17622
17623 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17624
17625 salt->salt_len = salt_len;
17626
17627 return (PARSER_OK);
17628 }
17629
17630 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17631 {
17632 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
17633
17634 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17635
17636 uint32_t *digest = (uint32_t *) hash_buf->digest;
17637
17638 salt_t *salt = hash_buf->salt;
17639
17640 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
17641
17642 /**
17643 * parse line
17644 */
17645
17646 char *p_buf_pos = input_buf + 4;
17647
17648 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
17649
17650 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17651
17652 uint32_t p_buf_len = NumCyclesPower_pos - p_buf_pos;
17653
17654 NumCyclesPower_pos++;
17655
17656 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
17657
17658 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17659
17660 uint32_t NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
17661
17662 salt_len_pos++;
17663
17664 char *salt_buf_pos = strchr (salt_len_pos, '$');
17665
17666 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17667
17668 uint32_t salt_len_len = salt_buf_pos - salt_len_pos;
17669
17670 salt_buf_pos++;
17671
17672 char *iv_len_pos = strchr (salt_buf_pos, '$');
17673
17674 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17675
17676 uint32_t salt_buf_len = iv_len_pos - salt_buf_pos;
17677
17678 iv_len_pos++;
17679
17680 char *iv_buf_pos = strchr (iv_len_pos, '$');
17681
17682 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17683
17684 uint32_t iv_len_len = iv_buf_pos - iv_len_pos;
17685
17686 iv_buf_pos++;
17687
17688 char *crc_buf_pos = strchr (iv_buf_pos, '$');
17689
17690 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17691
17692 uint32_t iv_buf_len = crc_buf_pos - iv_buf_pos;
17693
17694 crc_buf_pos++;
17695
17696 char *data_len_pos = strchr (crc_buf_pos, '$');
17697
17698 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17699
17700 uint32_t crc_buf_len = data_len_pos - crc_buf_pos;
17701
17702 data_len_pos++;
17703
17704 char *unpack_size_pos = strchr (data_len_pos, '$');
17705
17706 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17707
17708 uint32_t data_len_len = unpack_size_pos - data_len_pos;
17709
17710 unpack_size_pos++;
17711
17712 char *data_buf_pos = strchr (unpack_size_pos, '$');
17713
17714 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17715
17716 uint32_t unpack_size_len = data_buf_pos - unpack_size_pos;
17717
17718 data_buf_pos++;
17719
17720 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;
17721
17722 const uint iter = atoi (NumCyclesPower_pos);
17723 const uint crc = atoi (crc_buf_pos);
17724 const uint p_buf = atoi (p_buf_pos);
17725 const uint salt_len = atoi (salt_len_pos);
17726 const uint iv_len = atoi (iv_len_pos);
17727 const uint unpack_size = atoi (unpack_size_pos);
17728 const uint data_len = atoi (data_len_pos);
17729
17730 /**
17731 * verify some data
17732 */
17733
17734 if (p_buf != 0) return (PARSER_SALT_VALUE);
17735 if (salt_len != 0) return (PARSER_SALT_VALUE);
17736
17737 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
17738
17739 if (data_len > 384) return (PARSER_SALT_VALUE);
17740
17741 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
17742
17743 /**
17744 * store data
17745 */
17746
17747 seven_zip->iv_buf[0] = hex_to_uint (&iv_buf_pos[ 0]);
17748 seven_zip->iv_buf[1] = hex_to_uint (&iv_buf_pos[ 8]);
17749 seven_zip->iv_buf[2] = hex_to_uint (&iv_buf_pos[16]);
17750 seven_zip->iv_buf[3] = hex_to_uint (&iv_buf_pos[24]);
17751
17752 seven_zip->iv_len = iv_len;
17753
17754 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
17755
17756 seven_zip->salt_len = 0;
17757
17758 seven_zip->crc = crc;
17759
17760 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
17761 {
17762 seven_zip->data_buf[i] = hex_to_uint (&data_buf_pos[j]);
17763
17764 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
17765 }
17766
17767 seven_zip->data_len = data_len;
17768
17769 seven_zip->unpack_size = unpack_size;
17770
17771 // real salt
17772
17773 salt->salt_buf[0] = seven_zip->data_buf[0];
17774 salt->salt_buf[1] = seven_zip->data_buf[1];
17775 salt->salt_buf[2] = seven_zip->data_buf[2];
17776 salt->salt_buf[3] = seven_zip->data_buf[3];
17777
17778 salt->salt_len = 16;
17779
17780 salt->salt_sign[0] = iter;
17781
17782 salt->salt_iter = 1 << iter;
17783
17784 /**
17785 * digest
17786 */
17787
17788 digest[0] = crc;
17789 digest[1] = 0;
17790 digest[2] = 0;
17791 digest[3] = 0;
17792
17793 return (PARSER_OK);
17794 }
17795
17796 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17797 {
17798 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
17799
17800 uint32_t *digest = (uint32_t *) hash_buf->digest;
17801
17802 digest[0] = hex_to_uint (&input_buf[ 0]);
17803 digest[1] = hex_to_uint (&input_buf[ 8]);
17804 digest[2] = hex_to_uint (&input_buf[16]);
17805 digest[3] = hex_to_uint (&input_buf[24]);
17806 digest[4] = hex_to_uint (&input_buf[32]);
17807 digest[5] = hex_to_uint (&input_buf[40]);
17808 digest[6] = hex_to_uint (&input_buf[48]);
17809 digest[7] = hex_to_uint (&input_buf[56]);
17810
17811 digest[0] = byte_swap_32 (digest[0]);
17812 digest[1] = byte_swap_32 (digest[1]);
17813 digest[2] = byte_swap_32 (digest[2]);
17814 digest[3] = byte_swap_32 (digest[3]);
17815 digest[4] = byte_swap_32 (digest[4]);
17816 digest[5] = byte_swap_32 (digest[5]);
17817 digest[6] = byte_swap_32 (digest[6]);
17818 digest[7] = byte_swap_32 (digest[7]);
17819
17820 return (PARSER_OK);
17821 }
17822
17823 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17824 {
17825 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) 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 digest[ 8] = hex_to_uint (&input_buf[ 64]);
17838 digest[ 9] = hex_to_uint (&input_buf[ 72]);
17839 digest[10] = hex_to_uint (&input_buf[ 80]);
17840 digest[11] = hex_to_uint (&input_buf[ 88]);
17841 digest[12] = hex_to_uint (&input_buf[ 96]);
17842 digest[13] = hex_to_uint (&input_buf[104]);
17843 digest[14] = hex_to_uint (&input_buf[112]);
17844 digest[15] = hex_to_uint (&input_buf[120]);
17845
17846 digest[ 0] = byte_swap_32 (digest[ 0]);
17847 digest[ 1] = byte_swap_32 (digest[ 1]);
17848 digest[ 2] = byte_swap_32 (digest[ 2]);
17849 digest[ 3] = byte_swap_32 (digest[ 3]);
17850 digest[ 4] = byte_swap_32 (digest[ 4]);
17851 digest[ 5] = byte_swap_32 (digest[ 5]);
17852 digest[ 6] = byte_swap_32 (digest[ 6]);
17853 digest[ 7] = byte_swap_32 (digest[ 7]);
17854 digest[ 8] = byte_swap_32 (digest[ 8]);
17855 digest[ 9] = byte_swap_32 (digest[ 9]);
17856 digest[10] = byte_swap_32 (digest[10]);
17857 digest[11] = byte_swap_32 (digest[11]);
17858 digest[12] = byte_swap_32 (digest[12]);
17859 digest[13] = byte_swap_32 (digest[13]);
17860 digest[14] = byte_swap_32 (digest[14]);
17861 digest[15] = byte_swap_32 (digest[15]);
17862
17863 return (PARSER_OK);
17864 }
17865
17866 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17867 {
17868 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
17869
17870 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17871
17872 uint32_t *digest = (uint32_t *) hash_buf->digest;
17873
17874 salt_t *salt = hash_buf->salt;
17875
17876 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
17877
17878 /**
17879 * parse line
17880 */
17881
17882 // iterations
17883
17884 char *iter_pos = input_buf + 4;
17885
17886 uint32_t iter = atoi (iter_pos);
17887
17888 if (iter < 1) return (PARSER_SALT_ITERATION);
17889 if (iter > 999999) return (PARSER_SALT_ITERATION);
17890
17891 // first is *raw* salt
17892
17893 char *salt_pos = strchr (iter_pos, ':');
17894
17895 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17896
17897 salt_pos++;
17898
17899 char *hash_pos = strchr (salt_pos, ':');
17900
17901 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17902
17903 uint32_t salt_len = hash_pos - salt_pos;
17904
17905 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17906
17907 hash_pos++;
17908
17909 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
17910
17911 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17912
17913 // decode salt
17914
17915 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
17916
17917 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17918
17919 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17920
17921 salt_buf_ptr[salt_len + 3] = 0x01;
17922 salt_buf_ptr[salt_len + 4] = 0x80;
17923
17924 salt->salt_len = salt_len;
17925 salt->salt_iter = iter - 1;
17926
17927 // decode hash
17928
17929 char tmp_buf[100];
17930
17931 memset (tmp_buf, 0, sizeof (tmp_buf));
17932
17933 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
17934
17935 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17936
17937 memcpy (digest, tmp_buf, 16);
17938
17939 // add some stuff to normal salt to make sorted happy
17940
17941 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
17942 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
17943 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
17944 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
17945 salt->salt_buf[4] = salt->salt_iter;
17946
17947 return (PARSER_OK);
17948 }
17949
17950 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17951 {
17952 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
17953
17954 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
17955
17956 uint32_t *digest = (uint32_t *) hash_buf->digest;
17957
17958 salt_t *salt = hash_buf->salt;
17959
17960 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
17961
17962 /**
17963 * parse line
17964 */
17965
17966 // iterations
17967
17968 char *iter_pos = input_buf + 5;
17969
17970 uint32_t iter = atoi (iter_pos);
17971
17972 if (iter < 1) return (PARSER_SALT_ITERATION);
17973 if (iter > 999999) return (PARSER_SALT_ITERATION);
17974
17975 // first is *raw* salt
17976
17977 char *salt_pos = strchr (iter_pos, ':');
17978
17979 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17980
17981 salt_pos++;
17982
17983 char *hash_pos = strchr (salt_pos, ':');
17984
17985 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17986
17987 uint32_t salt_len = hash_pos - salt_pos;
17988
17989 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17990
17991 hash_pos++;
17992
17993 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
17994
17995 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17996
17997 // decode salt
17998
17999 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18000
18001 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18002
18003 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18004
18005 salt_buf_ptr[salt_len + 3] = 0x01;
18006 salt_buf_ptr[salt_len + 4] = 0x80;
18007
18008 salt->salt_len = salt_len;
18009 salt->salt_iter = iter - 1;
18010
18011 // decode hash
18012
18013 char tmp_buf[100];
18014
18015 memset (tmp_buf, 0, sizeof (tmp_buf));
18016
18017 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
18018
18019 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18020
18021 memcpy (digest, tmp_buf, 16);
18022
18023 digest[0] = byte_swap_32 (digest[0]);
18024 digest[1] = byte_swap_32 (digest[1]);
18025 digest[2] = byte_swap_32 (digest[2]);
18026 digest[3] = byte_swap_32 (digest[3]);
18027
18028 // add some stuff to normal salt to make sorted happy
18029
18030 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18031 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18032 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18033 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18034 salt->salt_buf[4] = salt->salt_iter;
18035
18036 return (PARSER_OK);
18037 }
18038
18039 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18040 {
18041 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18042
18043 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18044
18045 uint64_t *digest = (uint64_t *) hash_buf->digest;
18046
18047 salt_t *salt = hash_buf->salt;
18048
18049 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18050
18051 /**
18052 * parse line
18053 */
18054
18055 // iterations
18056
18057 char *iter_pos = input_buf + 7;
18058
18059 uint32_t iter = atoi (iter_pos);
18060
18061 if (iter < 1) return (PARSER_SALT_ITERATION);
18062 if (iter > 999999) return (PARSER_SALT_ITERATION);
18063
18064 // first is *raw* salt
18065
18066 char *salt_pos = strchr (iter_pos, ':');
18067
18068 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18069
18070 salt_pos++;
18071
18072 char *hash_pos = strchr (salt_pos, ':');
18073
18074 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18075
18076 uint32_t salt_len = hash_pos - salt_pos;
18077
18078 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18079
18080 hash_pos++;
18081
18082 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
18083
18084 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18085
18086 // decode salt
18087
18088 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18089
18090 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18091
18092 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18093
18094 salt_buf_ptr[salt_len + 3] = 0x01;
18095 salt_buf_ptr[salt_len + 4] = 0x80;
18096
18097 salt->salt_len = salt_len;
18098 salt->salt_iter = iter - 1;
18099
18100 // decode hash
18101
18102 char tmp_buf[100];
18103
18104 memset (tmp_buf, 0, sizeof (tmp_buf));
18105
18106 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
18107
18108 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18109
18110 memcpy (digest, tmp_buf, 64);
18111
18112 digest[0] = byte_swap_64 (digest[0]);
18113 digest[1] = byte_swap_64 (digest[1]);
18114 digest[2] = byte_swap_64 (digest[2]);
18115 digest[3] = byte_swap_64 (digest[3]);
18116 digest[4] = byte_swap_64 (digest[4]);
18117 digest[5] = byte_swap_64 (digest[5]);
18118 digest[6] = byte_swap_64 (digest[6]);
18119 digest[7] = byte_swap_64 (digest[7]);
18120
18121 // add some stuff to normal salt to make sorted happy
18122
18123 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18124 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18125 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18126 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18127 salt->salt_buf[4] = salt->salt_iter;
18128
18129 return (PARSER_OK);
18130 }
18131
18132 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18133 {
18134 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18135
18136 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18137
18138 uint *digest = (uint *) hash_buf->digest;
18139
18140 salt_t *salt = hash_buf->salt;
18141
18142 /**
18143 * parse line
18144 */
18145
18146 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18147
18148 char *hash_pos = strchr (salt_pos, '$');
18149
18150 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18151
18152 uint32_t salt_len = hash_pos - salt_pos;
18153
18154 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18155
18156 hash_pos++;
18157
18158 uint32_t hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18159
18160 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18161
18162 // decode hash
18163
18164 digest[ 0] = hex_to_uint (&hash_pos[0]);
18165 digest[ 1] = hex_to_uint (&hash_pos[8]);
18166 digest[ 2] = 0;
18167 digest[ 3] = 0;
18168 digest[ 4] = 0;
18169 digest[ 5] = 0;
18170 digest[ 6] = 0;
18171 digest[ 7] = 0;
18172 digest[ 8] = 0;
18173 digest[ 9] = 0;
18174 digest[10] = 0;
18175 digest[11] = 0;
18176 digest[12] = 0;
18177 digest[13] = 0;
18178 digest[14] = 0;
18179 digest[15] = 0;
18180
18181 // decode salt
18182
18183 salt->salt_buf[0] = hex_to_uint (&salt_pos[0]);
18184 salt->salt_buf[1] = hex_to_uint (&salt_pos[8]);
18185
18186 salt->salt_iter = ROUNDS_ECRYPTFS;
18187 salt->salt_len = 8;
18188
18189 return (PARSER_OK);
18190 }
18191
18192 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18193 {
18194 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18195
18196 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18197
18198 unsigned char c19 = itoa64_to_int (input_buf[19]);
18199
18200 if (c19 & 3) return (PARSER_HASH_VALUE);
18201
18202 salt_t *salt = hash_buf->salt;
18203
18204 uint32_t *digest = (uint32_t *) hash_buf->digest;
18205
18206 // iteration count
18207
18208 salt->salt_iter = itoa64_to_int (input_buf[1])
18209 | itoa64_to_int (input_buf[2]) << 6
18210 | itoa64_to_int (input_buf[3]) << 12
18211 | itoa64_to_int (input_buf[4]) << 18;
18212
18213 // set salt
18214
18215 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18216 | itoa64_to_int (input_buf[6]) << 6
18217 | itoa64_to_int (input_buf[7]) << 12
18218 | itoa64_to_int (input_buf[8]) << 18;
18219
18220 salt->salt_len = 4;
18221
18222 char tmp_buf[100];
18223
18224 memset (tmp_buf, 0, sizeof (tmp_buf));
18225
18226 base64_decode (itoa64_to_int, input_buf + 9, 11, tmp_buf);
18227
18228 memcpy (digest, tmp_buf, 8);
18229
18230 uint tt;
18231
18232 IP (digest[0], digest[1], tt);
18233
18234 digest[0] = ROTATE_RIGHT (digest[0], 31);
18235 digest[1] = ROTATE_RIGHT (digest[1], 31);
18236 digest[2] = 0;
18237 digest[3] = 0;
18238
18239 return (PARSER_OK);
18240 }
18241
18242 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18243 {
18244 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18245
18246 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18247
18248 uint32_t *digest = (uint32_t *) hash_buf->digest;
18249
18250 salt_t *salt = hash_buf->salt;
18251
18252 /**
18253 * parse line
18254 */
18255
18256 char *type_pos = input_buf + 6 + 1;
18257
18258 char *salt_pos = strchr (type_pos, '*');
18259
18260 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18261
18262 uint32_t type_len = salt_pos - type_pos;
18263
18264 if (type_len != 1) return (PARSER_SALT_LENGTH);
18265
18266 salt_pos++;
18267
18268 char *crypted_pos = strchr (salt_pos, '*');
18269
18270 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18271
18272 uint32_t salt_len = crypted_pos - salt_pos;
18273
18274 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18275
18276 crypted_pos++;
18277
18278 uint32_t crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18279
18280 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18281
18282 /**
18283 * copy data
18284 */
18285
18286 salt->salt_buf[0] = hex_to_uint (&salt_pos[0]);
18287 salt->salt_buf[1] = hex_to_uint (&salt_pos[8]);
18288
18289 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18290 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18291
18292 salt->salt_buf[2] = hex_to_uint (&crypted_pos[ 0]);
18293 salt->salt_buf[3] = hex_to_uint (&crypted_pos[ 8]);
18294 salt->salt_buf[4] = hex_to_uint (&crypted_pos[16]);
18295 salt->salt_buf[5] = hex_to_uint (&crypted_pos[24]);
18296
18297 salt->salt_len = 24;
18298 salt->salt_iter = ROUNDS_RAR3;
18299
18300 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18301 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18302
18303 digest[0] = 0xc43d7b00;
18304 digest[1] = 0x40070000;
18305 digest[2] = 0;
18306 digest[3] = 0;
18307
18308 return (PARSER_OK);
18309 }
18310
18311 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18312 {
18313 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18314
18315 uint32_t *digest = (uint32_t *) hash_buf->digest;
18316
18317 salt_t *salt = hash_buf->salt;
18318
18319 digest[0] = hex_to_uint (&input_buf[ 0]);
18320 digest[1] = hex_to_uint (&input_buf[ 8]);
18321 digest[2] = hex_to_uint (&input_buf[16]);
18322 digest[3] = hex_to_uint (&input_buf[24]);
18323 digest[4] = hex_to_uint (&input_buf[32]);
18324 digest[5] = hex_to_uint (&input_buf[40]);
18325 digest[6] = hex_to_uint (&input_buf[48]);
18326 digest[7] = hex_to_uint (&input_buf[56]);
18327
18328 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18329
18330 uint salt_len = input_len - 64 - 1;
18331
18332 char *salt_buf = input_buf + 64 + 1;
18333
18334 char *salt_buf_ptr = (char *) salt->salt_buf;
18335
18336 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18337
18338 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18339
18340 salt->salt_len = salt_len;
18341
18342 /**
18343 * we can precompute the first sha256 transform
18344 */
18345
18346 uint w[16];
18347
18348 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18349 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18350 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18351 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18352 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18353 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18354 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18355 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18356 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18357 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18358 w[10] = byte_swap_32 (salt->salt_buf[10]);
18359 w[11] = byte_swap_32 (salt->salt_buf[11]);
18360 w[12] = byte_swap_32 (salt->salt_buf[12]);
18361 w[13] = byte_swap_32 (salt->salt_buf[13]);
18362 w[14] = byte_swap_32 (salt->salt_buf[14]);
18363 w[15] = byte_swap_32 (salt->salt_buf[15]);
18364
18365 uint pc256[8];
18366
18367 pc256[0] = SHA256M_A;
18368 pc256[1] = SHA256M_B;
18369 pc256[2] = SHA256M_C;
18370 pc256[3] = SHA256M_D;
18371 pc256[4] = SHA256M_E;
18372 pc256[5] = SHA256M_F;
18373 pc256[6] = SHA256M_G;
18374 pc256[7] = SHA256M_H;
18375
18376 sha256_64 (w, pc256);
18377
18378 salt->salt_buf_pc[0] = pc256[0];
18379 salt->salt_buf_pc[1] = pc256[1];
18380 salt->salt_buf_pc[2] = pc256[2];
18381 salt->salt_buf_pc[3] = pc256[3];
18382 salt->salt_buf_pc[4] = pc256[4];
18383 salt->salt_buf_pc[5] = pc256[5];
18384 salt->salt_buf_pc[6] = pc256[6];
18385 salt->salt_buf_pc[7] = pc256[7];
18386
18387 digest[0] -= pc256[0];
18388 digest[1] -= pc256[1];
18389 digest[2] -= pc256[2];
18390 digest[3] -= pc256[3];
18391 digest[4] -= pc256[4];
18392 digest[5] -= pc256[5];
18393 digest[6] -= pc256[6];
18394 digest[7] -= pc256[7];
18395
18396 return (PARSER_OK);
18397 }
18398
18399 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18400 {
18401 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18402
18403 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18404
18405 uint32_t *digest = (uint32_t *) hash_buf->digest;
18406
18407 salt_t *salt = hash_buf->salt;
18408
18409 /**
18410 * parse line
18411 */
18412
18413 char *data_len_pos = input_buf + 1 + 10 + 1;
18414
18415 char *data_buf_pos = strchr (data_len_pos, '$');
18416
18417 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18418
18419 uint32_t data_len_len = data_buf_pos - data_len_pos;
18420
18421 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18422 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18423
18424 data_buf_pos++;
18425
18426 uint32_t data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18427
18428 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18429
18430 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18431
18432 uint32_t data_len = atoi (data_len_pos);
18433
18434 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18435
18436 /**
18437 * salt
18438 */
18439
18440 char *salt_pos = data_buf_pos;
18441
18442 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
18443 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
18444 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]);
18445 salt->salt_buf[3] = hex_to_uint (&salt_pos[24]);
18446
18447 // this is actually the CT, which is also the hash later (if matched)
18448
18449 salt->salt_buf[4] = hex_to_uint (&salt_pos[32]);
18450 salt->salt_buf[5] = hex_to_uint (&salt_pos[40]);
18451 salt->salt_buf[6] = hex_to_uint (&salt_pos[48]);
18452 salt->salt_buf[7] = hex_to_uint (&salt_pos[56]);
18453
18454 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18455
18456 salt->salt_iter = 10 - 1;
18457
18458 /**
18459 * digest buf
18460 */
18461
18462 digest[0] = salt->salt_buf[4];
18463 digest[1] = salt->salt_buf[5];
18464 digest[2] = salt->salt_buf[6];
18465 digest[3] = salt->salt_buf[7];
18466
18467 return (PARSER_OK);
18468 }
18469
18470 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18471 {
18472 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
18473
18474 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18475
18476 uint32_t *digest = (uint32_t *) hash_buf->digest;
18477
18478 salt_t *salt = hash_buf->salt;
18479
18480 /**
18481 * parse line
18482 */
18483
18484 char *salt_pos = input_buf + 11 + 1;
18485
18486 char *iter_pos = strchr (salt_pos, ',');
18487
18488 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18489
18490 uint32_t salt_len = iter_pos - salt_pos;
18491
18492 if (salt_len != 20) return (PARSER_SALT_LENGTH);
18493
18494 iter_pos++;
18495
18496 char *hash_pos = strchr (iter_pos, ',');
18497
18498 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18499
18500 uint32_t iter_len = hash_pos - iter_pos;
18501
18502 if (iter_len > 5) return (PARSER_SALT_LENGTH);
18503
18504 hash_pos++;
18505
18506 uint32_t hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
18507
18508 if (hash_len != 64) return (PARSER_HASH_LENGTH);
18509
18510 /**
18511 * salt
18512 */
18513
18514 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
18515 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
18516 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]) & 0xffff0000;
18517 salt->salt_buf[3] = 0x00018000;
18518
18519 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18520 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18521 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
18522 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
18523
18524 salt->salt_len = salt_len / 2;
18525
18526 salt->salt_iter = atoi (iter_pos) - 1;
18527
18528 /**
18529 * digest buf
18530 */
18531
18532 digest[0] = hex_to_uint (&hash_pos[ 0]);
18533 digest[1] = hex_to_uint (&hash_pos[ 8]);
18534 digest[2] = hex_to_uint (&hash_pos[16]);
18535 digest[3] = hex_to_uint (&hash_pos[24]);
18536 digest[4] = hex_to_uint (&hash_pos[32]);
18537 digest[5] = hex_to_uint (&hash_pos[40]);
18538 digest[6] = hex_to_uint (&hash_pos[48]);
18539 digest[7] = hex_to_uint (&hash_pos[56]);
18540
18541 return (PARSER_OK);
18542 }
18543
18544 /**
18545 * parallel running threads
18546 */
18547
18548 #ifdef WIN
18549
18550 BOOL WINAPI sigHandler_default (DWORD sig)
18551 {
18552 switch (sig)
18553 {
18554 case CTRL_CLOSE_EVENT:
18555
18556 /*
18557 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
18558 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
18559 * function otherwise it is to late (e.g. after returning from this function)
18560 */
18561
18562 myabort ();
18563
18564 SetConsoleCtrlHandler (NULL, TRUE);
18565
18566 hc_sleep (10);
18567
18568 return TRUE;
18569
18570 case CTRL_C_EVENT:
18571 case CTRL_LOGOFF_EVENT:
18572 case CTRL_SHUTDOWN_EVENT:
18573
18574 myabort ();
18575
18576 SetConsoleCtrlHandler (NULL, TRUE);
18577
18578 return TRUE;
18579 }
18580
18581 return FALSE;
18582 }
18583
18584 BOOL WINAPI sigHandler_benchmark (DWORD sig)
18585 {
18586 switch (sig)
18587 {
18588 case CTRL_CLOSE_EVENT:
18589
18590 myabort ();
18591
18592 SetConsoleCtrlHandler (NULL, TRUE);
18593
18594 hc_sleep (10);
18595
18596 return TRUE;
18597
18598 case CTRL_C_EVENT:
18599 case CTRL_LOGOFF_EVENT:
18600 case CTRL_SHUTDOWN_EVENT:
18601
18602 myquit ();
18603
18604 SetConsoleCtrlHandler (NULL, TRUE);
18605
18606 return TRUE;
18607 }
18608
18609 return FALSE;
18610 }
18611
18612 void hc_signal (BOOL WINAPI (callback) (DWORD))
18613 {
18614 if (callback == NULL)
18615 {
18616 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
18617 }
18618 else
18619 {
18620 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
18621 }
18622 }
18623
18624 #else
18625
18626 void sigHandler_default (int sig)
18627 {
18628 myabort ();
18629
18630 signal (sig, NULL);
18631 }
18632
18633 void sigHandler_benchmark (int sig)
18634 {
18635 myquit ();
18636
18637 signal (sig, NULL);
18638 }
18639
18640 void hc_signal (void (callback) (int))
18641 {
18642 if (callback == NULL) callback = SIG_DFL;
18643
18644 signal (SIGINT, callback);
18645 signal (SIGTERM, callback);
18646 signal (SIGABRT, callback);
18647 }
18648
18649 #endif
18650
18651 void status_display ();
18652
18653 void *thread_keypress (void *p)
18654 {
18655 int benchmark = *((int *) p);
18656
18657 uint quiet = data.quiet;
18658
18659 tty_break();
18660
18661 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
18662 {
18663 int ch = tty_getchar();
18664
18665 if (ch == -1) break;
18666
18667 if (ch == 0) continue;
18668
18669 #ifdef _POSIX
18670 if (ch != '\n')
18671 #endif
18672
18673 hc_thread_mutex_lock (mux_display);
18674
18675 log_info ("");
18676
18677 switch (ch)
18678 {
18679 case 's':
18680 case '\n':
18681
18682 log_info ("");
18683
18684 status_display ();
18685
18686 log_info ("");
18687
18688 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18689 if (quiet == 0) fflush (stdout);
18690
18691 break;
18692
18693 case 'b':
18694
18695 log_info ("");
18696
18697 bypass ();
18698
18699 log_info ("");
18700
18701 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18702 if (quiet == 0) fflush (stdout);
18703
18704 break;
18705
18706 case 'p':
18707
18708 log_info ("");
18709
18710 SuspendThreads ();
18711
18712 log_info ("");
18713
18714 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18715 if (quiet == 0) fflush (stdout);
18716
18717 break;
18718
18719 case 'r':
18720
18721 log_info ("");
18722
18723 ResumeThreads ();
18724
18725 log_info ("");
18726
18727 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18728 if (quiet == 0) fflush (stdout);
18729
18730 break;
18731
18732 case 'c':
18733
18734 log_info ("");
18735
18736 if (benchmark == 1) break;
18737
18738 stop_at_checkpoint ();
18739
18740 log_info ("");
18741
18742 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18743 if (quiet == 0) fflush (stdout);
18744
18745 break;
18746
18747 case 'q':
18748
18749 log_info ("");
18750
18751 if (benchmark == 1)
18752 {
18753 myquit ();
18754 }
18755 else
18756 {
18757 myabort ();
18758 }
18759
18760 break;
18761 }
18762
18763 hc_thread_mutex_unlock (mux_display);
18764 }
18765
18766 tty_fix();
18767
18768 return (p);
18769 }
18770
18771 /**
18772 * rules common
18773 */
18774
18775 bool class_num (char c)
18776 {
18777 return ((c >= '0') && (c <= '9'));
18778 }
18779
18780 bool class_lower (char c)
18781 {
18782 return ((c >= 'a') && (c <= 'z'));
18783 }
18784
18785 bool class_upper (char c)
18786 {
18787 return ((c >= 'A') && (c <= 'Z'));
18788 }
18789
18790 bool class_alpha (char c)
18791 {
18792 return (class_lower (c) || class_upper (c));
18793 }
18794
18795 char conv_ctoi (char c)
18796 {
18797 if (class_num (c))
18798 {
18799 return c - '0';
18800 }
18801 else if (class_upper (c))
18802 {
18803 return c - 'A' + (char) 10;
18804 }
18805
18806 return (char) (-1);
18807 }
18808
18809 char conv_itoc (char c)
18810 {
18811 if (c < 10)
18812 {
18813 return c + '0';
18814 }
18815 else if (c < 37)
18816 {
18817 return c + 'A' - (char) 10;
18818 }
18819
18820 return (char) (-1);
18821 }
18822
18823 /**
18824 * GPU rules
18825 */
18826
18827 #define INCR_POS if (++rule_pos == rule_len) return (-1)
18828 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
18829 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
18830 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
18831 #define MAX_GPU_RULES 14
18832 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
18833 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
18834 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
18835
18836 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
18837 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
18838 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
18839 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
18840
18841 int cpu_rule_to_gpu_rule (char rule_buf[BUFSIZ], uint rule_len, gpu_rule_t *rule)
18842 {
18843 uint rule_pos;
18844 uint rule_cnt;
18845
18846 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_GPU_RULES; rule_pos++, rule_cnt++)
18847 {
18848 switch (rule_buf[rule_pos])
18849 {
18850 case ' ':
18851 rule_cnt--;
18852 break;
18853
18854 case RULE_OP_MANGLE_NOOP:
18855 SET_NAME (rule, rule_buf[rule_pos]);
18856 break;
18857
18858 case RULE_OP_MANGLE_LREST:
18859 SET_NAME (rule, rule_buf[rule_pos]);
18860 break;
18861
18862 case RULE_OP_MANGLE_UREST:
18863 SET_NAME (rule, rule_buf[rule_pos]);
18864 break;
18865
18866 case RULE_OP_MANGLE_LREST_UFIRST:
18867 SET_NAME (rule, rule_buf[rule_pos]);
18868 break;
18869
18870 case RULE_OP_MANGLE_UREST_LFIRST:
18871 SET_NAME (rule, rule_buf[rule_pos]);
18872 break;
18873
18874 case RULE_OP_MANGLE_TREST:
18875 SET_NAME (rule, rule_buf[rule_pos]);
18876 break;
18877
18878 case RULE_OP_MANGLE_TOGGLE_AT:
18879 SET_NAME (rule, rule_buf[rule_pos]);
18880 SET_P0_CONV (rule, rule_buf[rule_pos]);
18881 break;
18882
18883 case RULE_OP_MANGLE_REVERSE:
18884 SET_NAME (rule, rule_buf[rule_pos]);
18885 break;
18886
18887 case RULE_OP_MANGLE_DUPEWORD:
18888 SET_NAME (rule, rule_buf[rule_pos]);
18889 break;
18890
18891 case RULE_OP_MANGLE_DUPEWORD_TIMES:
18892 SET_NAME (rule, rule_buf[rule_pos]);
18893 SET_P0_CONV (rule, rule_buf[rule_pos]);
18894 break;
18895
18896 case RULE_OP_MANGLE_REFLECT:
18897 SET_NAME (rule, rule_buf[rule_pos]);
18898 break;
18899
18900 case RULE_OP_MANGLE_ROTATE_LEFT:
18901 SET_NAME (rule, rule_buf[rule_pos]);
18902 break;
18903
18904 case RULE_OP_MANGLE_ROTATE_RIGHT:
18905 SET_NAME (rule, rule_buf[rule_pos]);
18906 break;
18907
18908 case RULE_OP_MANGLE_APPEND:
18909 SET_NAME (rule, rule_buf[rule_pos]);
18910 SET_P0 (rule, rule_buf[rule_pos]);
18911 break;
18912
18913 case RULE_OP_MANGLE_PREPEND:
18914 SET_NAME (rule, rule_buf[rule_pos]);
18915 SET_P0 (rule, rule_buf[rule_pos]);
18916 break;
18917
18918 case RULE_OP_MANGLE_DELETE_FIRST:
18919 SET_NAME (rule, rule_buf[rule_pos]);
18920 break;
18921
18922 case RULE_OP_MANGLE_DELETE_LAST:
18923 SET_NAME (rule, rule_buf[rule_pos]);
18924 break;
18925
18926 case RULE_OP_MANGLE_DELETE_AT:
18927 SET_NAME (rule, rule_buf[rule_pos]);
18928 SET_P0_CONV (rule, rule_buf[rule_pos]);
18929 break;
18930
18931 case RULE_OP_MANGLE_EXTRACT:
18932 SET_NAME (rule, rule_buf[rule_pos]);
18933 SET_P0_CONV (rule, rule_buf[rule_pos]);
18934 SET_P1_CONV (rule, rule_buf[rule_pos]);
18935 break;
18936
18937 case RULE_OP_MANGLE_OMIT:
18938 SET_NAME (rule, rule_buf[rule_pos]);
18939 SET_P0_CONV (rule, rule_buf[rule_pos]);
18940 SET_P1_CONV (rule, rule_buf[rule_pos]);
18941 break;
18942
18943 case RULE_OP_MANGLE_INSERT:
18944 SET_NAME (rule, rule_buf[rule_pos]);
18945 SET_P0_CONV (rule, rule_buf[rule_pos]);
18946 SET_P1 (rule, rule_buf[rule_pos]);
18947 break;
18948
18949 case RULE_OP_MANGLE_OVERSTRIKE:
18950 SET_NAME (rule, rule_buf[rule_pos]);
18951 SET_P0_CONV (rule, rule_buf[rule_pos]);
18952 SET_P1 (rule, rule_buf[rule_pos]);
18953 break;
18954
18955 case RULE_OP_MANGLE_TRUNCATE_AT:
18956 SET_NAME (rule, rule_buf[rule_pos]);
18957 SET_P0_CONV (rule, rule_buf[rule_pos]);
18958 break;
18959
18960 case RULE_OP_MANGLE_REPLACE:
18961 SET_NAME (rule, rule_buf[rule_pos]);
18962 SET_P0 (rule, rule_buf[rule_pos]);
18963 SET_P1 (rule, rule_buf[rule_pos]);
18964 break;
18965
18966 case RULE_OP_MANGLE_PURGECHAR:
18967 return (-1);
18968 break;
18969
18970 case RULE_OP_MANGLE_TOGGLECASE_REC:
18971 return (-1);
18972 break;
18973
18974 case RULE_OP_MANGLE_DUPECHAR_FIRST:
18975 SET_NAME (rule, rule_buf[rule_pos]);
18976 SET_P0_CONV (rule, rule_buf[rule_pos]);
18977 break;
18978
18979 case RULE_OP_MANGLE_DUPECHAR_LAST:
18980 SET_NAME (rule, rule_buf[rule_pos]);
18981 SET_P0_CONV (rule, rule_buf[rule_pos]);
18982 break;
18983
18984 case RULE_OP_MANGLE_DUPECHAR_ALL:
18985 SET_NAME (rule, rule_buf[rule_pos]);
18986 break;
18987
18988 case RULE_OP_MANGLE_SWITCH_FIRST:
18989 SET_NAME (rule, rule_buf[rule_pos]);
18990 break;
18991
18992 case RULE_OP_MANGLE_SWITCH_LAST:
18993 SET_NAME (rule, rule_buf[rule_pos]);
18994 break;
18995
18996 case RULE_OP_MANGLE_SWITCH_AT:
18997 SET_NAME (rule, rule_buf[rule_pos]);
18998 SET_P0_CONV (rule, rule_buf[rule_pos]);
18999 SET_P1_CONV (rule, rule_buf[rule_pos]);
19000 break;
19001
19002 case RULE_OP_MANGLE_CHR_SHIFTL:
19003 SET_NAME (rule, rule_buf[rule_pos]);
19004 SET_P0_CONV (rule, rule_buf[rule_pos]);
19005 break;
19006
19007 case RULE_OP_MANGLE_CHR_SHIFTR:
19008 SET_NAME (rule, rule_buf[rule_pos]);
19009 SET_P0_CONV (rule, rule_buf[rule_pos]);
19010 break;
19011
19012 case RULE_OP_MANGLE_CHR_INCR:
19013 SET_NAME (rule, rule_buf[rule_pos]);
19014 SET_P0_CONV (rule, rule_buf[rule_pos]);
19015 break;
19016
19017 case RULE_OP_MANGLE_CHR_DECR:
19018 SET_NAME (rule, rule_buf[rule_pos]);
19019 SET_P0_CONV (rule, rule_buf[rule_pos]);
19020 break;
19021
19022 case RULE_OP_MANGLE_REPLACE_NP1:
19023 SET_NAME (rule, rule_buf[rule_pos]);
19024 SET_P0_CONV (rule, rule_buf[rule_pos]);
19025 break;
19026
19027 case RULE_OP_MANGLE_REPLACE_NM1:
19028 SET_NAME (rule, rule_buf[rule_pos]);
19029 SET_P0_CONV (rule, rule_buf[rule_pos]);
19030 break;
19031
19032 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19033 SET_NAME (rule, rule_buf[rule_pos]);
19034 SET_P0_CONV (rule, rule_buf[rule_pos]);
19035 break;
19036
19037 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19038 SET_NAME (rule, rule_buf[rule_pos]);
19039 SET_P0_CONV (rule, rule_buf[rule_pos]);
19040 break;
19041
19042 case RULE_OP_MANGLE_TITLE:
19043 SET_NAME (rule, rule_buf[rule_pos]);
19044 break;
19045
19046 default:
19047 return (-1);
19048 break;
19049 }
19050 }
19051
19052 if (rule_pos < rule_len) return (-1);
19053
19054 return (0);
19055 }
19056
19057 int gpu_rule_to_cpu_rule (char rule_buf[BUFSIZ], gpu_rule_t *rule)
19058 {
19059 uint rule_cnt;
19060 uint rule_pos;
19061 uint rule_len = BUFSIZ - 1; // maximum possible len
19062
19063 char rule_cmd;
19064
19065 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_GPU_RULES; rule_pos++, rule_cnt++)
19066 {
19067 GET_NAME (rule);
19068
19069 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19070
19071 switch (rule_cmd)
19072 {
19073 case RULE_OP_MANGLE_NOOP:
19074 rule_buf[rule_pos] = rule_cmd;
19075 break;
19076
19077 case RULE_OP_MANGLE_LREST:
19078 rule_buf[rule_pos] = rule_cmd;
19079 break;
19080
19081 case RULE_OP_MANGLE_UREST:
19082 rule_buf[rule_pos] = rule_cmd;
19083 break;
19084
19085 case RULE_OP_MANGLE_LREST_UFIRST:
19086 rule_buf[rule_pos] = rule_cmd;
19087 break;
19088
19089 case RULE_OP_MANGLE_UREST_LFIRST:
19090 rule_buf[rule_pos] = rule_cmd;
19091 break;
19092
19093 case RULE_OP_MANGLE_TREST:
19094 rule_buf[rule_pos] = rule_cmd;
19095 break;
19096
19097 case RULE_OP_MANGLE_TOGGLE_AT:
19098 rule_buf[rule_pos] = rule_cmd;
19099 GET_P0_CONV (rule);
19100 break;
19101
19102 case RULE_OP_MANGLE_REVERSE:
19103 rule_buf[rule_pos] = rule_cmd;
19104 break;
19105
19106 case RULE_OP_MANGLE_DUPEWORD:
19107 rule_buf[rule_pos] = rule_cmd;
19108 break;
19109
19110 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19111 rule_buf[rule_pos] = rule_cmd;
19112 GET_P0_CONV (rule);
19113 break;
19114
19115 case RULE_OP_MANGLE_REFLECT:
19116 rule_buf[rule_pos] = rule_cmd;
19117 break;
19118
19119 case RULE_OP_MANGLE_ROTATE_LEFT:
19120 rule_buf[rule_pos] = rule_cmd;
19121 break;
19122
19123 case RULE_OP_MANGLE_ROTATE_RIGHT:
19124 rule_buf[rule_pos] = rule_cmd;
19125 break;
19126
19127 case RULE_OP_MANGLE_APPEND:
19128 rule_buf[rule_pos] = rule_cmd;
19129 GET_P0 (rule);
19130 break;
19131
19132 case RULE_OP_MANGLE_PREPEND:
19133 rule_buf[rule_pos] = rule_cmd;
19134 GET_P0 (rule);
19135 break;
19136
19137 case RULE_OP_MANGLE_DELETE_FIRST:
19138 rule_buf[rule_pos] = rule_cmd;
19139 break;
19140
19141 case RULE_OP_MANGLE_DELETE_LAST:
19142 rule_buf[rule_pos] = rule_cmd;
19143 break;
19144
19145 case RULE_OP_MANGLE_DELETE_AT:
19146 rule_buf[rule_pos] = rule_cmd;
19147 GET_P0_CONV (rule);
19148 break;
19149
19150 case RULE_OP_MANGLE_EXTRACT:
19151 rule_buf[rule_pos] = rule_cmd;
19152 GET_P0_CONV (rule);
19153 GET_P1_CONV (rule);
19154 break;
19155
19156 case RULE_OP_MANGLE_OMIT:
19157 rule_buf[rule_pos] = rule_cmd;
19158 GET_P0_CONV (rule);
19159 GET_P1_CONV (rule);
19160 break;
19161
19162 case RULE_OP_MANGLE_INSERT:
19163 rule_buf[rule_pos] = rule_cmd;
19164 GET_P0_CONV (rule);
19165 GET_P1 (rule);
19166 break;
19167
19168 case RULE_OP_MANGLE_OVERSTRIKE:
19169 rule_buf[rule_pos] = rule_cmd;
19170 GET_P0_CONV (rule);
19171 GET_P1 (rule);
19172 break;
19173
19174 case RULE_OP_MANGLE_TRUNCATE_AT:
19175 rule_buf[rule_pos] = rule_cmd;
19176 GET_P0_CONV (rule);
19177 break;
19178
19179 case RULE_OP_MANGLE_REPLACE:
19180 rule_buf[rule_pos] = rule_cmd;
19181 GET_P0 (rule);
19182 GET_P1 (rule);
19183 break;
19184
19185 case RULE_OP_MANGLE_PURGECHAR:
19186 return (-1);
19187 break;
19188
19189 case RULE_OP_MANGLE_TOGGLECASE_REC:
19190 return (-1);
19191 break;
19192
19193 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19194 rule_buf[rule_pos] = rule_cmd;
19195 GET_P0_CONV (rule);
19196 break;
19197
19198 case RULE_OP_MANGLE_DUPECHAR_LAST:
19199 rule_buf[rule_pos] = rule_cmd;
19200 GET_P0_CONV (rule);
19201 break;
19202
19203 case RULE_OP_MANGLE_DUPECHAR_ALL:
19204 rule_buf[rule_pos] = rule_cmd;
19205 break;
19206
19207 case RULE_OP_MANGLE_SWITCH_FIRST:
19208 rule_buf[rule_pos] = rule_cmd;
19209 break;
19210
19211 case RULE_OP_MANGLE_SWITCH_LAST:
19212 rule_buf[rule_pos] = rule_cmd;
19213 break;
19214
19215 case RULE_OP_MANGLE_SWITCH_AT:
19216 rule_buf[rule_pos] = rule_cmd;
19217 GET_P0_CONV (rule);
19218 GET_P1_CONV (rule);
19219 break;
19220
19221 case RULE_OP_MANGLE_CHR_SHIFTL:
19222 rule_buf[rule_pos] = rule_cmd;
19223 GET_P0_CONV (rule);
19224 break;
19225
19226 case RULE_OP_MANGLE_CHR_SHIFTR:
19227 rule_buf[rule_pos] = rule_cmd;
19228 GET_P0_CONV (rule);
19229 break;
19230
19231 case RULE_OP_MANGLE_CHR_INCR:
19232 rule_buf[rule_pos] = rule_cmd;
19233 GET_P0_CONV (rule);
19234 break;
19235
19236 case RULE_OP_MANGLE_CHR_DECR:
19237 rule_buf[rule_pos] = rule_cmd;
19238 GET_P0_CONV (rule);
19239 break;
19240
19241 case RULE_OP_MANGLE_REPLACE_NP1:
19242 rule_buf[rule_pos] = rule_cmd;
19243 GET_P0_CONV (rule);
19244 break;
19245
19246 case RULE_OP_MANGLE_REPLACE_NM1:
19247 rule_buf[rule_pos] = rule_cmd;
19248 GET_P0_CONV (rule);
19249 break;
19250
19251 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19252 rule_buf[rule_pos] = rule_cmd;
19253 GET_P0_CONV (rule);
19254 break;
19255
19256 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19257 rule_buf[rule_pos] = rule_cmd;
19258 GET_P0_CONV (rule);
19259 break;
19260
19261 case RULE_OP_MANGLE_TITLE:
19262 rule_buf[rule_pos] = rule_cmd;
19263 break;
19264
19265 case 0:
19266 return rule_pos - 1;
19267 break;
19268
19269 default:
19270 return (-1);
19271 break;
19272 }
19273 }
19274
19275 if (rule_cnt > 0)
19276 {
19277 return rule_pos;
19278 }
19279
19280 return (-1);
19281 }
19282
19283 /**
19284 * CPU rules : this is from hashcat sources, cpu based rules
19285 */
19286
19287 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19288 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19289
19290 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19291 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19292 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19293
19294 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19295 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19296 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19297
19298 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19299 {
19300 int pos;
19301
19302 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19303
19304 return (arr_len);
19305 }
19306
19307 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19308 {
19309 int pos;
19310
19311 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19312
19313 return (arr_len);
19314 }
19315
19316 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19317 {
19318 int pos;
19319
19320 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19321
19322 return (arr_len);
19323 }
19324
19325 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19326 {
19327 int l;
19328 int r;
19329
19330 for (l = 0; l < arr_len; l++)
19331 {
19332 r = arr_len - 1 - l;
19333
19334 if (l >= r) break;
19335
19336 MANGLE_SWITCH (arr, l, r);
19337 }
19338
19339 return (arr_len);
19340 }
19341
19342 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19343 {
19344 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19345
19346 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19347
19348 return (arr_len * 2);
19349 }
19350
19351 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19352 {
19353 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19354
19355 int orig_len = arr_len;
19356
19357 int i;
19358
19359 for (i = 0; i < times; i++)
19360 {
19361 memcpy (&arr[arr_len], arr, orig_len);
19362
19363 arr_len += orig_len;
19364 }
19365
19366 return (arr_len);
19367 }
19368
19369 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19370 {
19371 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19372
19373 mangle_double (arr, arr_len);
19374
19375 mangle_reverse (arr + arr_len, arr_len);
19376
19377 return (arr_len * 2);
19378 }
19379
19380 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19381 {
19382 int l;
19383 int r;
19384
19385 for (l = 0, r = arr_len - 1; r > 0; r--)
19386 {
19387 MANGLE_SWITCH (arr, l, r);
19388 }
19389
19390 return (arr_len);
19391 }
19392
19393 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19394 {
19395 int l;
19396 int r;
19397
19398 for (l = 0, r = arr_len - 1; l < r; l++)
19399 {
19400 MANGLE_SWITCH (arr, l, r);
19401 }
19402
19403 return (arr_len);
19404 }
19405
19406 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19407 {
19408 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19409
19410 arr[arr_len] = c;
19411
19412 return (arr_len + 1);
19413 }
19414
19415 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19416 {
19417 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19418
19419 int arr_pos;
19420
19421 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19422 {
19423 arr[arr_pos + 1] = arr[arr_pos];
19424 }
19425
19426 arr[0] = c;
19427
19428 return (arr_len + 1);
19429 }
19430
19431 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19432 {
19433 if (upos >= arr_len) return (arr_len);
19434
19435 int arr_pos;
19436
19437 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
19438 {
19439 arr[arr_pos] = arr[arr_pos + 1];
19440 }
19441
19442 return (arr_len - 1);
19443 }
19444
19445 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19446 {
19447 if (upos >= arr_len) return (arr_len);
19448
19449 if ((upos + ulen) > arr_len) return (arr_len);
19450
19451 int arr_pos;
19452
19453 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
19454 {
19455 arr[arr_pos] = arr[upos + arr_pos];
19456 }
19457
19458 return (ulen);
19459 }
19460
19461 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19462 {
19463 if (upos >= arr_len) return (arr_len);
19464
19465 if ((upos + ulen) >= arr_len) return (arr_len);
19466
19467 int arr_pos;
19468
19469 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
19470 {
19471 arr[arr_pos] = arr[arr_pos + ulen];
19472 }
19473
19474 return (arr_len - ulen);
19475 }
19476
19477 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19478 {
19479 if (upos >= arr_len) return (arr_len);
19480
19481 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19482
19483 int arr_pos;
19484
19485 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
19486 {
19487 arr[arr_pos + 1] = arr[arr_pos];
19488 }
19489
19490 arr[upos] = c;
19491
19492 return (arr_len + 1);
19493 }
19494
19495 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)
19496 {
19497 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
19498
19499 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
19500
19501 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
19502
19503 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
19504
19505 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
19506
19507 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
19508
19509 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
19510
19511 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
19512
19513 return (arr_len + arr2_cpy);
19514 }
19515
19516 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19517 {
19518 if (upos >= arr_len) return (arr_len);
19519
19520 arr[upos] = c;
19521
19522 return (arr_len);
19523 }
19524
19525 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19526 {
19527 if (upos >= arr_len) return (arr_len);
19528
19529 memset (arr + upos, 0, arr_len - upos);
19530
19531 return (upos);
19532 }
19533
19534 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
19535 {
19536 int arr_pos;
19537
19538 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
19539 {
19540 if (arr[arr_pos] != oldc) continue;
19541
19542 arr[arr_pos] = newc;
19543 }
19544
19545 return (arr_len);
19546 }
19547
19548 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
19549 {
19550 int arr_pos;
19551
19552 int ret_len;
19553
19554 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
19555 {
19556 if (arr[arr_pos] == c) continue;
19557
19558 arr[ret_len] = arr[arr_pos];
19559
19560 ret_len++;
19561 }
19562
19563 return (ret_len);
19564 }
19565
19566 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
19567 {
19568 if (ulen > arr_len) return (arr_len);
19569
19570 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19571
19572 char cs[100];
19573
19574 memcpy (cs, arr, ulen);
19575
19576 int i;
19577
19578 for (i = 0; i < ulen; i++)
19579 {
19580 char c = cs[i];
19581
19582 arr_len = mangle_insert (arr, arr_len, i, c);
19583 }
19584
19585 return (arr_len);
19586 }
19587
19588 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
19589 {
19590 if (ulen > arr_len) return (arr_len);
19591
19592 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19593
19594 int upos = arr_len - ulen;
19595
19596 int i;
19597
19598 for (i = 0; i < ulen; i++)
19599 {
19600 char c = arr[upos + i];
19601
19602 arr_len = mangle_append (arr, arr_len, c);
19603 }
19604
19605 return (arr_len);
19606 }
19607
19608 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19609 {
19610 if ( arr_len == 0) return (arr_len);
19611 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19612
19613 char c = arr[upos];
19614
19615 int i;
19616
19617 for (i = 0; i < ulen; i++)
19618 {
19619 arr_len = mangle_insert (arr, arr_len, upos, c);
19620 }
19621
19622 return (arr_len);
19623 }
19624
19625 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
19626 {
19627 if ( arr_len == 0) return (arr_len);
19628 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
19629
19630 int arr_pos;
19631
19632 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19633 {
19634 int new_pos = arr_pos * 2;
19635
19636 arr[new_pos] = arr[arr_pos];
19637
19638 arr[new_pos + 1] = arr[arr_pos];
19639 }
19640
19641 return (arr_len * 2);
19642 }
19643
19644 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
19645 {
19646 if (upos >= arr_len) return (arr_len);
19647 if (upos2 >= arr_len) return (arr_len);
19648
19649 MANGLE_SWITCH (arr, upos, upos2);
19650
19651 return (arr_len);
19652 }
19653
19654 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
19655 {
19656 MANGLE_SWITCH (arr, upos, upos2);
19657
19658 return (arr_len);
19659 }
19660
19661 int mangle_chr_shiftl (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19662 {
19663 if (upos >= arr_len) return (arr_len);
19664
19665 arr[upos] <<= 1;
19666
19667 return (arr_len);
19668 }
19669
19670 int mangle_chr_shiftr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19671 {
19672 if (upos >= arr_len) return (arr_len);
19673
19674 arr[upos] >>= 1;
19675
19676 return (arr_len);
19677 }
19678
19679 int mangle_chr_incr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19680 {
19681 if (upos >= arr_len) return (arr_len);
19682
19683 arr[upos] += 1;
19684
19685 return (arr_len);
19686 }
19687
19688 int mangle_chr_decr (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_title (char arr[BLOCK_SIZE], int arr_len)
19698 {
19699 int upper_next = 1;
19700
19701 int pos;
19702
19703 for (pos = 0; pos < arr_len; pos++)
19704 {
19705 if (arr[pos] == ' ')
19706 {
19707 upper_next = 1;
19708
19709 continue;
19710 }
19711
19712 if (upper_next)
19713 {
19714 upper_next = 0;
19715
19716 MANGLE_UPPER_AT (arr, pos);
19717 }
19718 else
19719 {
19720 MANGLE_LOWER_AT (arr, pos);
19721 }
19722 }
19723
19724 return (arr_len);
19725 }
19726
19727 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], uint32_t rp_gen_func_min, uint32_t rp_gen_func_max)
19728 {
19729 uint32_t rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
19730
19731 uint32_t j;
19732
19733 uint32_t rule_pos = 0;
19734
19735 for (j = 0; j < rp_gen_num; j++)
19736 {
19737 uint32_t r = 0;
19738 uint32_t p1 = 0;
19739 uint32_t p2 = 0;
19740 uint32_t p3 = 0;
19741
19742 switch ((char) get_random_num (0, 9))
19743 {
19744 case 0:
19745 r = get_random_num (0, sizeof (grp_op_nop));
19746 rule_buf[rule_pos++] = grp_op_nop[r];
19747 break;
19748
19749 case 1:
19750 r = get_random_num (0, sizeof (grp_op_pos_p0));
19751 rule_buf[rule_pos++] = grp_op_pos_p0[r];
19752 p1 = get_random_num (0, sizeof (grp_pos));
19753 rule_buf[rule_pos++] = grp_pos[p1];
19754 break;
19755
19756 case 2:
19757 r = get_random_num (0, sizeof (grp_op_pos_p1));
19758 rule_buf[rule_pos++] = grp_op_pos_p1[r];
19759 p1 = get_random_num (1, 6);
19760 rule_buf[rule_pos++] = grp_pos[p1];
19761 break;
19762
19763 case 3:
19764 r = get_random_num (0, sizeof (grp_op_chr));
19765 rule_buf[rule_pos++] = grp_op_chr[r];
19766 p1 = get_random_num (0x20, 0x7e);
19767 rule_buf[rule_pos++] = (char) p1;
19768 break;
19769
19770 case 4:
19771 r = get_random_num (0, sizeof (grp_op_chr_chr));
19772 rule_buf[rule_pos++] = grp_op_chr_chr[r];
19773 p1 = get_random_num (0x20, 0x7e);
19774 rule_buf[rule_pos++] = (char) p1;
19775 p2 = get_random_num (0x20, 0x7e);
19776 while (p1 == p2)
19777 p2 = get_random_num (0x20, 0x7e);
19778 rule_buf[rule_pos++] = (char) p2;
19779 break;
19780
19781 case 5:
19782 r = get_random_num (0, sizeof (grp_op_pos_chr));
19783 rule_buf[rule_pos++] = grp_op_pos_chr[r];
19784 p1 = get_random_num (0, sizeof (grp_pos));
19785 rule_buf[rule_pos++] = grp_pos[p1];
19786 p2 = get_random_num (0x20, 0x7e);
19787 rule_buf[rule_pos++] = (char) p2;
19788 break;
19789
19790 case 6:
19791 r = get_random_num (0, sizeof (grp_op_pos_pos0));
19792 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
19793 p1 = get_random_num (0, sizeof (grp_pos));
19794 rule_buf[rule_pos++] = grp_pos[p1];
19795 p2 = get_random_num (0, sizeof (grp_pos));
19796 while (p1 == p2)
19797 p2 = get_random_num (0, sizeof (grp_pos));
19798 rule_buf[rule_pos++] = grp_pos[p2];
19799 break;
19800
19801 case 7:
19802 r = get_random_num (0, sizeof (grp_op_pos_pos1));
19803 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
19804 p1 = get_random_num (0, sizeof (grp_pos));
19805 rule_buf[rule_pos++] = grp_pos[p1];
19806 p2 = get_random_num (1, sizeof (grp_pos));
19807 while (p1 == p2)
19808 p2 = get_random_num (1, sizeof (grp_pos));
19809 rule_buf[rule_pos++] = grp_pos[p2];
19810 break;
19811
19812 case 8:
19813 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
19814 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
19815 p1 = get_random_num (0, sizeof (grp_pos));
19816 rule_buf[rule_pos++] = grp_pos[p1];
19817 p2 = get_random_num (1, sizeof (grp_pos));
19818 rule_buf[rule_pos++] = grp_pos[p1];
19819 p3 = get_random_num (0, sizeof (grp_pos));
19820 rule_buf[rule_pos++] = grp_pos[p3];
19821 break;
19822 }
19823 }
19824
19825 return (rule_pos);
19826 }
19827
19828 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
19829 {
19830 char mem[BLOCK_SIZE];
19831
19832 if (in == NULL) return (RULE_RC_REJECT_ERROR);
19833
19834 if (out == NULL) return (RULE_RC_REJECT_ERROR);
19835
19836 if (in_len < 1) return (RULE_RC_REJECT_ERROR);
19837
19838 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
19839
19840 int out_len = in_len;
19841 int mem_len = in_len;
19842
19843 memcpy (out, in, out_len);
19844
19845 int rule_pos;
19846
19847 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
19848 {
19849 int upos; int upos2;
19850 int ulen;
19851
19852 switch (rule[rule_pos])
19853 {
19854 case ' ':
19855 break;
19856
19857 case RULE_OP_MANGLE_NOOP:
19858 break;
19859
19860 case RULE_OP_MANGLE_LREST:
19861 out_len = mangle_lrest (out, out_len);
19862 break;
19863
19864 case RULE_OP_MANGLE_UREST:
19865 out_len = mangle_urest (out, out_len);
19866 break;
19867
19868 case RULE_OP_MANGLE_LREST_UFIRST:
19869 out_len = mangle_lrest (out, out_len);
19870 if (out_len) MANGLE_UPPER_AT (out, 0);
19871 break;
19872
19873 case RULE_OP_MANGLE_UREST_LFIRST:
19874 out_len = mangle_urest (out, out_len);
19875 if (out_len) MANGLE_LOWER_AT (out, 0);
19876 break;
19877
19878 case RULE_OP_MANGLE_TREST:
19879 out_len = mangle_trest (out, out_len);
19880 break;
19881
19882 case RULE_OP_MANGLE_TOGGLE_AT:
19883 NEXT_RULEPOS (rule_pos);
19884 NEXT_RPTOI (rule, rule_pos, upos);
19885 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
19886 break;
19887
19888 case RULE_OP_MANGLE_REVERSE:
19889 out_len = mangle_reverse (out, out_len);
19890 break;
19891
19892 case RULE_OP_MANGLE_DUPEWORD:
19893 out_len = mangle_double (out, out_len);
19894 break;
19895
19896 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19897 NEXT_RULEPOS (rule_pos);
19898 NEXT_RPTOI (rule, rule_pos, ulen);
19899 out_len = mangle_double_times (out, out_len, ulen);
19900 break;
19901
19902 case RULE_OP_MANGLE_REFLECT:
19903 out_len = mangle_reflect (out, out_len);
19904 break;
19905
19906 case RULE_OP_MANGLE_ROTATE_LEFT:
19907 mangle_rotate_left (out, out_len);
19908 break;
19909
19910 case RULE_OP_MANGLE_ROTATE_RIGHT:
19911 mangle_rotate_right (out, out_len);
19912 break;
19913
19914 case RULE_OP_MANGLE_APPEND:
19915 NEXT_RULEPOS (rule_pos);
19916 out_len = mangle_append (out, out_len, rule[rule_pos]);
19917 break;
19918
19919 case RULE_OP_MANGLE_PREPEND:
19920 NEXT_RULEPOS (rule_pos);
19921 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
19922 break;
19923
19924 case RULE_OP_MANGLE_DELETE_FIRST:
19925 out_len = mangle_delete_at (out, out_len, 0);
19926 break;
19927
19928 case RULE_OP_MANGLE_DELETE_LAST:
19929 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
19930 break;
19931
19932 case RULE_OP_MANGLE_DELETE_AT:
19933 NEXT_RULEPOS (rule_pos);
19934 NEXT_RPTOI (rule, rule_pos, upos);
19935 out_len = mangle_delete_at (out, out_len, upos);
19936 break;
19937
19938 case RULE_OP_MANGLE_EXTRACT:
19939 NEXT_RULEPOS (rule_pos);
19940 NEXT_RPTOI (rule, rule_pos, upos);
19941 NEXT_RULEPOS (rule_pos);
19942 NEXT_RPTOI (rule, rule_pos, ulen);
19943 out_len = mangle_extract (out, out_len, upos, ulen);
19944 break;
19945
19946 case RULE_OP_MANGLE_OMIT:
19947 NEXT_RULEPOS (rule_pos);
19948 NEXT_RPTOI (rule, rule_pos, upos);
19949 NEXT_RULEPOS (rule_pos);
19950 NEXT_RPTOI (rule, rule_pos, ulen);
19951 out_len = mangle_omit (out, out_len, upos, ulen);
19952 break;
19953
19954 case RULE_OP_MANGLE_INSERT:
19955 NEXT_RULEPOS (rule_pos);
19956 NEXT_RPTOI (rule, rule_pos, upos);
19957 NEXT_RULEPOS (rule_pos);
19958 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
19959 break;
19960
19961 case RULE_OP_MANGLE_OVERSTRIKE:
19962 NEXT_RULEPOS (rule_pos);
19963 NEXT_RPTOI (rule, rule_pos, upos);
19964 NEXT_RULEPOS (rule_pos);
19965 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
19966 break;
19967
19968 case RULE_OP_MANGLE_TRUNCATE_AT:
19969 NEXT_RULEPOS (rule_pos);
19970 NEXT_RPTOI (rule, rule_pos, upos);
19971 out_len = mangle_truncate_at (out, out_len, upos);
19972 break;
19973
19974 case RULE_OP_MANGLE_REPLACE:
19975 NEXT_RULEPOS (rule_pos);
19976 NEXT_RULEPOS (rule_pos);
19977 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
19978 break;
19979
19980 case RULE_OP_MANGLE_PURGECHAR:
19981 NEXT_RULEPOS (rule_pos);
19982 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
19983 break;
19984
19985 case RULE_OP_MANGLE_TOGGLECASE_REC:
19986 /* todo */
19987 break;
19988
19989 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19990 NEXT_RULEPOS (rule_pos);
19991 NEXT_RPTOI (rule, rule_pos, ulen);
19992 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
19993 break;
19994
19995 case RULE_OP_MANGLE_DUPECHAR_LAST:
19996 NEXT_RULEPOS (rule_pos);
19997 NEXT_RPTOI (rule, rule_pos, ulen);
19998 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
19999 break;
20000
20001 case RULE_OP_MANGLE_DUPECHAR_ALL:
20002 out_len = mangle_dupechar (out, out_len);
20003 break;
20004
20005 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20006 NEXT_RULEPOS (rule_pos);
20007 NEXT_RPTOI (rule, rule_pos, ulen);
20008 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20009 break;
20010
20011 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20012 NEXT_RULEPOS (rule_pos);
20013 NEXT_RPTOI (rule, rule_pos, ulen);
20014 out_len = mangle_dupeblock_append (out, out_len, ulen);
20015 break;
20016
20017 case RULE_OP_MANGLE_SWITCH_FIRST:
20018 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20019 break;
20020
20021 case RULE_OP_MANGLE_SWITCH_LAST:
20022 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20023 break;
20024
20025 case RULE_OP_MANGLE_SWITCH_AT:
20026 NEXT_RULEPOS (rule_pos);
20027 NEXT_RPTOI (rule, rule_pos, upos);
20028 NEXT_RULEPOS (rule_pos);
20029 NEXT_RPTOI (rule, rule_pos, upos2);
20030 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20031 break;
20032
20033 case RULE_OP_MANGLE_CHR_SHIFTL:
20034 NEXT_RULEPOS (rule_pos);
20035 NEXT_RPTOI (rule, rule_pos, upos);
20036 mangle_chr_shiftl ((uint8_t *) out, out_len, upos);
20037 break;
20038
20039 case RULE_OP_MANGLE_CHR_SHIFTR:
20040 NEXT_RULEPOS (rule_pos);
20041 NEXT_RPTOI (rule, rule_pos, upos);
20042 mangle_chr_shiftr ((uint8_t *) out, out_len, upos);
20043 break;
20044
20045 case RULE_OP_MANGLE_CHR_INCR:
20046 NEXT_RULEPOS (rule_pos);
20047 NEXT_RPTOI (rule, rule_pos, upos);
20048 mangle_chr_incr ((uint8_t *) out, out_len, upos);
20049 break;
20050
20051 case RULE_OP_MANGLE_CHR_DECR:
20052 NEXT_RULEPOS (rule_pos);
20053 NEXT_RPTOI (rule, rule_pos, upos);
20054 mangle_chr_decr ((uint8_t *) out, out_len, upos);
20055 break;
20056
20057 case RULE_OP_MANGLE_REPLACE_NP1:
20058 NEXT_RULEPOS (rule_pos);
20059 NEXT_RPTOI (rule, rule_pos, upos);
20060 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20061 break;
20062
20063 case RULE_OP_MANGLE_REPLACE_NM1:
20064 NEXT_RULEPOS (rule_pos);
20065 NEXT_RPTOI (rule, rule_pos, upos);
20066 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20067 break;
20068
20069 case RULE_OP_MANGLE_TITLE:
20070 out_len = mangle_title (out, out_len);
20071 break;
20072
20073 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20074 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20075 NEXT_RULEPOS (rule_pos);
20076 NEXT_RPTOI (rule, rule_pos, upos);
20077 NEXT_RULEPOS (rule_pos);
20078 NEXT_RPTOI (rule, rule_pos, ulen);
20079 NEXT_RULEPOS (rule_pos);
20080 NEXT_RPTOI (rule, rule_pos, upos2);
20081 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20082 break;
20083
20084 case RULE_OP_MANGLE_APPEND_MEMORY:
20085 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20086 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20087 memcpy (out + out_len, mem, mem_len);
20088 out_len += mem_len;
20089 break;
20090
20091 case RULE_OP_MANGLE_PREPEND_MEMORY:
20092 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20093 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20094 memcpy (mem + mem_len, out, out_len);
20095 out_len += mem_len;
20096 memcpy (out, mem, out_len);
20097 break;
20098
20099 case RULE_OP_MEMORIZE_WORD:
20100 memcpy (mem, out, out_len);
20101 mem_len = out_len;
20102 break;
20103
20104 case RULE_OP_REJECT_LESS:
20105 NEXT_RULEPOS (rule_pos);
20106 NEXT_RPTOI (rule, rule_pos, upos);
20107 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20108 break;
20109
20110 case RULE_OP_REJECT_GREATER:
20111 NEXT_RULEPOS (rule_pos);
20112 NEXT_RPTOI (rule, rule_pos, upos);
20113 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20114 break;
20115
20116 case RULE_OP_REJECT_CONTAIN:
20117 NEXT_RULEPOS (rule_pos);
20118 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20119 break;
20120
20121 case RULE_OP_REJECT_NOT_CONTAIN:
20122 NEXT_RULEPOS (rule_pos);
20123 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20124 break;
20125
20126 case RULE_OP_REJECT_EQUAL_FIRST:
20127 NEXT_RULEPOS (rule_pos);
20128 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20129 break;
20130
20131 case RULE_OP_REJECT_EQUAL_LAST:
20132 NEXT_RULEPOS (rule_pos);
20133 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20134 break;
20135
20136 case RULE_OP_REJECT_EQUAL_AT:
20137 NEXT_RULEPOS (rule_pos);
20138 NEXT_RPTOI (rule, rule_pos, upos);
20139 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20140 NEXT_RULEPOS (rule_pos);
20141 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20142 break;
20143
20144 case RULE_OP_REJECT_CONTAINS:
20145 NEXT_RULEPOS (rule_pos);
20146 NEXT_RPTOI (rule, rule_pos, upos);
20147 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20148 NEXT_RULEPOS (rule_pos);
20149 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20150 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20151 break;
20152
20153 case RULE_OP_REJECT_MEMORY:
20154 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20155 break;
20156
20157 default:
20158 return (RULE_RC_SYNTAX_ERROR);
20159 break;
20160 }
20161 }
20162
20163 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20164
20165 return (out_len);
20166 }