59175696a26d853b0d3df5386f401d1f6418f4ed
[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 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9626
9627 salt->salt_len = salt_len;
9628
9629 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9630
9631 salt->salt_len += 22;
9632
9633 return (PARSER_OK);
9634 }
9635
9636 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9637 {
9638 if (data.opts_type & OPTS_TYPE_ST_HEX)
9639 {
9640 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9641 }
9642 else
9643 {
9644 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9645 }
9646
9647 uint32_t *digest = (uint32_t *) hash_buf->digest;
9648
9649 salt_t *salt = hash_buf->salt;
9650
9651 digest[0] = hex_to_uint (&input_buf[ 0]);
9652 digest[1] = hex_to_uint (&input_buf[ 8]);
9653 digest[2] = hex_to_uint (&input_buf[16]);
9654 digest[3] = hex_to_uint (&input_buf[24]);
9655 digest[4] = hex_to_uint (&input_buf[32]);
9656
9657 digest[0] -= SHA1M_A;
9658 digest[1] -= SHA1M_B;
9659 digest[2] -= SHA1M_C;
9660 digest[3] -= SHA1M_D;
9661 digest[4] -= SHA1M_E;
9662
9663 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9664
9665 uint salt_len = input_len - 40 - 1;
9666
9667 char *salt_buf = input_buf + 40 + 1;
9668
9669 char *salt_buf_ptr = (char *) salt->salt_buf;
9670
9671 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9672
9673 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9674
9675 salt->salt_len = salt_len;
9676
9677 return (PARSER_OK);
9678 }
9679
9680 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9681 {
9682 if (data.opts_type & OPTS_TYPE_ST_HEX)
9683 {
9684 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9685 }
9686 else
9687 {
9688 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9689 }
9690
9691 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9692
9693 char *iter_pos = input_buf + 6;
9694
9695 salt_t *salt = hash_buf->salt;
9696
9697 salt->salt_iter = atoi (iter_pos) - 1;
9698
9699 char *salt_pos = strchr (iter_pos, '#');
9700
9701 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9702
9703 salt_pos++;
9704
9705 char *digest_pos = strchr (salt_pos, '#');
9706
9707 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9708
9709 digest_pos++;
9710
9711 uint salt_len = digest_pos - salt_pos - 1;
9712
9713 uint32_t *digest = (uint32_t *) hash_buf->digest;
9714
9715 digest[0] = hex_to_uint (&digest_pos[ 0]);
9716 digest[1] = hex_to_uint (&digest_pos[ 8]);
9717 digest[2] = hex_to_uint (&digest_pos[16]);
9718 digest[3] = hex_to_uint (&digest_pos[24]);
9719
9720 char *salt_buf_ptr = (char *) salt->salt_buf;
9721
9722 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9723
9724 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9725
9726 salt->salt_len = salt_len;
9727
9728 return (PARSER_OK);
9729 }
9730
9731 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9732 {
9733 uint32_t *digest = (uint32_t *) hash_buf->digest;
9734
9735 salt_t *salt = hash_buf->salt;
9736
9737 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9738
9739 hccap_t in;
9740
9741 memcpy (&in, input_buf, input_len);
9742
9743 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9744
9745 memcpy (digest, in.keymic, 16);
9746
9747 /*
9748 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9749 The phrase "Pairwise key expansion"
9750 Access Point Address (Referred to as Authenticator Address AA)
9751 Supplicant Address (referred to as Supplicant Address SA)
9752 Access Point Nonce (referred to as Authenticator Anonce)
9753 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9754 */
9755
9756 uint salt_len = strlen (in.essid);
9757
9758 memcpy (salt->salt_buf, in.essid, salt_len);
9759
9760 salt->salt_len = salt_len;
9761
9762 salt->salt_iter = ROUNDS_WPA2 - 1;
9763
9764 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
9765
9766 memcpy (pke_ptr, "Pairwise key expansion", 23);
9767
9768 if (memcmp (in.mac1, in.mac2, 6) < 0)
9769 {
9770 memcpy (pke_ptr + 23, in.mac1, 6);
9771 memcpy (pke_ptr + 29, in.mac2, 6);
9772 }
9773 else
9774 {
9775 memcpy (pke_ptr + 23, in.mac2, 6);
9776 memcpy (pke_ptr + 29, in.mac1, 6);
9777 }
9778
9779 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
9780 {
9781 memcpy (pke_ptr + 35, in.nonce1, 32);
9782 memcpy (pke_ptr + 67, in.nonce2, 32);
9783 }
9784 else
9785 {
9786 memcpy (pke_ptr + 35, in.nonce2, 32);
9787 memcpy (pke_ptr + 67, in.nonce1, 32);
9788 }
9789
9790 for (int i = 0; i < 25; i++)
9791 {
9792 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
9793 }
9794
9795 wpa->keyver = in.keyver;
9796
9797 if (wpa->keyver > 255)
9798 {
9799 log_info ("ATTENTION!");
9800 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
9801 log_info (" This could be due to a recent aircrack-ng bug.");
9802 log_info (" The key version was automatically reset to a reasonable value.");
9803 log_info ("");
9804
9805 wpa->keyver &= 0xff;
9806 }
9807
9808 wpa->eapol_size = in.eapol_size;
9809
9810 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
9811
9812 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
9813
9814 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
9815
9816 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
9817
9818 if (wpa->keyver == 1)
9819 {
9820 // nothing to do
9821 }
9822 else
9823 {
9824 digest[0] = byte_swap_32 (digest[0]);
9825 digest[1] = byte_swap_32 (digest[1]);
9826 digest[2] = byte_swap_32 (digest[2]);
9827 digest[3] = byte_swap_32 (digest[3]);
9828
9829 for (int i = 0; i < 64; i++)
9830 {
9831 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
9832 }
9833 }
9834
9835 salt->salt_buf[10] = digest[1];
9836 salt->salt_buf[11] = digest[2];
9837
9838 return (PARSER_OK);
9839 }
9840
9841 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9842 {
9843 uint32_t *digest = (uint32_t *) hash_buf->digest;
9844
9845 salt_t *salt = hash_buf->salt;
9846
9847 if (input_len == 0)
9848 {
9849 log_error ("Password Safe v2 container not specified");
9850
9851 exit (-1);
9852 }
9853
9854 FILE *fp = fopen (input_buf, "rb");
9855
9856 if (fp == NULL)
9857 {
9858 log_error ("%s: %s", input_buf, strerror (errno));
9859
9860 exit (-1);
9861 }
9862
9863 typedef struct
9864 {
9865 uint32_t random[2];
9866 uint32_t hash[5];
9867 uint32_t salt[5]; // unused, but makes better valid check
9868 uint32_t iv[2]; // unused, but makes better valid check
9869
9870 } psafe2_hdr;
9871
9872 psafe2_hdr buf;
9873
9874 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
9875
9876 fclose (fp);
9877
9878 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
9879
9880 salt->salt_buf[0] = buf.random[0];
9881 salt->salt_buf[1] = buf.random[1];
9882
9883 salt->salt_len = 8;
9884 salt->salt_iter = 1000;
9885
9886 digest[0] = byte_swap_32 (buf.hash[0]);
9887 digest[1] = byte_swap_32 (buf.hash[1]);
9888 digest[2] = byte_swap_32 (buf.hash[2]);
9889 digest[3] = byte_swap_32 (buf.hash[3]);
9890 digest[4] = byte_swap_32 (buf.hash[4]);
9891
9892 return (PARSER_OK);
9893 }
9894
9895 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9896 {
9897 uint32_t *digest = (uint32_t *) hash_buf->digest;
9898
9899 salt_t *salt = hash_buf->salt;
9900
9901 if (input_len == 0)
9902 {
9903 log_error (".psafe3 not specified");
9904
9905 exit (-1);
9906 }
9907
9908 FILE *fp = fopen (input_buf, "rb");
9909
9910 if (fp == NULL)
9911 {
9912 log_error ("%s: %s", input_buf, strerror (errno));
9913
9914 exit (-1);
9915 }
9916
9917 psafe3_t in;
9918
9919 int n = fread (&in, sizeof (psafe3_t), 1, fp);
9920
9921 fclose (fp);
9922
9923 data.hashfile = input_buf; // we will need this in case it gets cracked
9924
9925 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
9926
9927 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
9928
9929 salt->salt_iter = in.iterations + 1;
9930
9931 salt->salt_buf[0] = in.salt_buf[0];
9932 salt->salt_buf[1] = in.salt_buf[1];
9933 salt->salt_buf[2] = in.salt_buf[2];
9934 salt->salt_buf[3] = in.salt_buf[3];
9935 salt->salt_buf[4] = in.salt_buf[4];
9936 salt->salt_buf[5] = in.salt_buf[5];
9937 salt->salt_buf[6] = in.salt_buf[6];
9938 salt->salt_buf[7] = in.salt_buf[7];
9939
9940 salt->salt_len = 32;
9941
9942 digest[0] = in.hash_buf[0];
9943 digest[1] = in.hash_buf[1];
9944 digest[2] = in.hash_buf[2];
9945 digest[3] = in.hash_buf[3];
9946 digest[4] = in.hash_buf[4];
9947 digest[5] = in.hash_buf[5];
9948 digest[6] = in.hash_buf[6];
9949 digest[7] = in.hash_buf[7];
9950
9951 digest[0] = byte_swap_32 (digest[0]);
9952 digest[1] = byte_swap_32 (digest[1]);
9953 digest[2] = byte_swap_32 (digest[2]);
9954 digest[3] = byte_swap_32 (digest[3]);
9955 digest[4] = byte_swap_32 (digest[4]);
9956 digest[5] = byte_swap_32 (digest[5]);
9957 digest[6] = byte_swap_32 (digest[6]);
9958 digest[7] = byte_swap_32 (digest[7]);
9959
9960 return (PARSER_OK);
9961 }
9962
9963 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9964 {
9965 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
9966
9967 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
9968
9969 uint32_t *digest = (uint32_t *) hash_buf->digest;
9970
9971 salt_t *salt = hash_buf->salt;
9972
9973 char *iter_pos = input_buf + 3;
9974
9975 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
9976
9977 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
9978
9979 memcpy ((char *) salt->salt_sign, input_buf, 4);
9980
9981 salt->salt_iter = salt_iter;
9982
9983 char *salt_pos = iter_pos + 1;
9984
9985 uint salt_len = 8;
9986
9987 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
9988
9989 salt->salt_len = salt_len;
9990
9991 char *hash_pos = salt_pos + salt_len;
9992
9993 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
9994
9995 return (PARSER_OK);
9996 }
9997
9998 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9999 {
10000 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10001
10002 uint32_t *digest = (uint32_t *) hash_buf->digest;
10003
10004 salt_t *salt = hash_buf->salt;
10005
10006 char *salt_pos = input_buf + 3;
10007
10008 uint iterations_len = 0;
10009
10010 if (memcmp (salt_pos, "rounds=", 7) == 0)
10011 {
10012 salt_pos += 7;
10013
10014 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10015
10016 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10017 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10018
10019 salt_pos[0] = 0x0;
10020
10021 salt->salt_iter = atoi (salt_pos - iterations_len);
10022
10023 salt_pos += 1;
10024
10025 iterations_len += 8;
10026 }
10027 else
10028 {
10029 salt->salt_iter = ROUNDS_MD5CRYPT;
10030 }
10031
10032 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10033
10034 char *hash_pos = strchr (salt_pos, '$');
10035
10036 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10037
10038 uint salt_len = hash_pos - salt_pos;
10039
10040 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10041
10042 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10043
10044 salt->salt_len = salt_len;
10045
10046 hash_pos++;
10047
10048 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10049
10050 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10051
10052 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10053
10054 return (PARSER_OK);
10055 }
10056
10057 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10058 {
10059 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10060
10061 uint32_t *digest = (uint32_t *) hash_buf->digest;
10062
10063 salt_t *salt = hash_buf->salt;
10064
10065 char *salt_pos = input_buf + 6;
10066
10067 uint iterations_len = 0;
10068
10069 if (memcmp (salt_pos, "rounds=", 7) == 0)
10070 {
10071 salt_pos += 7;
10072
10073 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10074
10075 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10076 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10077
10078 salt_pos[0] = 0x0;
10079
10080 salt->salt_iter = atoi (salt_pos - iterations_len);
10081
10082 salt_pos += 1;
10083
10084 iterations_len += 8;
10085 }
10086 else
10087 {
10088 salt->salt_iter = ROUNDS_MD5CRYPT;
10089 }
10090
10091 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10092
10093 char *hash_pos = strchr (salt_pos, '$');
10094
10095 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10096
10097 uint salt_len = hash_pos - salt_pos;
10098
10099 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10100
10101 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10102
10103 salt->salt_len = salt_len;
10104
10105 hash_pos++;
10106
10107 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10108
10109 return (PARSER_OK);
10110 }
10111
10112 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10113 {
10114 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10115
10116 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10117
10118 uint32_t *digest = (uint32_t *) hash_buf->digest;
10119
10120 salt_t *salt = hash_buf->salt;
10121
10122 char *salt_pos = input_buf + 14;
10123
10124 char *hash_pos = strchr (salt_pos, '*');
10125
10126 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10127
10128 hash_pos++;
10129
10130 uint salt_len = hash_pos - salt_pos - 1;
10131
10132 char *salt_buf_ptr = (char *) salt->salt_buf;
10133
10134 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10135
10136 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10137
10138 salt->salt_len = salt_len;
10139
10140 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
10141
10142 base64_decode (base64_to_int, hash_pos, 27, tmp_buf);
10143
10144 memcpy (digest, tmp_buf, 20);
10145
10146 digest[0] = byte_swap_32 (digest[0]);
10147 digest[1] = byte_swap_32 (digest[1]);
10148 digest[2] = byte_swap_32 (digest[2]);
10149 digest[3] = byte_swap_32 (digest[3]);
10150 digest[4] = byte_swap_32 (digest[4]);
10151
10152 digest[0] -= SHA1M_A;
10153 digest[1] -= SHA1M_B;
10154 digest[2] -= SHA1M_C;
10155 digest[3] -= SHA1M_D;
10156 digest[4] -= SHA1M_E;
10157
10158 return (PARSER_OK);
10159 }
10160
10161 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10162 {
10163 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10164
10165 unsigned char c12 = itoa64_to_int (input_buf[12]);
10166
10167 if (c12 & 3) return (PARSER_HASH_VALUE);
10168
10169 uint32_t *digest = (uint32_t *) hash_buf->digest;
10170
10171 salt_t *salt = hash_buf->salt;
10172
10173 // for ascii_digest
10174 salt->salt_sign[0] = input_buf[0];
10175 salt->salt_sign[1] = input_buf[1];
10176
10177 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10178 | itoa64_to_int (input_buf[1]) << 6;
10179
10180 salt->salt_len = 2;
10181
10182 char tmp_buf[100];
10183
10184 memset (tmp_buf, 0, sizeof (tmp_buf));
10185
10186 base64_decode (itoa64_to_int, input_buf + 2, 11, tmp_buf);
10187
10188 memcpy (digest, tmp_buf, 8);
10189
10190 uint tt;
10191
10192 IP (digest[0], digest[1], tt);
10193
10194 digest[2] = 0;
10195 digest[3] = 0;
10196
10197 return (PARSER_OK);
10198 }
10199
10200 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10201 {
10202 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10203
10204 uint32_t *digest = (uint32_t *) hash_buf->digest;
10205
10206 digest[0] = hex_to_uint (&input_buf[ 0]);
10207 digest[1] = hex_to_uint (&input_buf[ 8]);
10208 digest[2] = hex_to_uint (&input_buf[16]);
10209 digest[3] = hex_to_uint (&input_buf[24]);
10210
10211 digest[0] = byte_swap_32 (digest[0]);
10212 digest[1] = byte_swap_32 (digest[1]);
10213 digest[2] = byte_swap_32 (digest[2]);
10214 digest[3] = byte_swap_32 (digest[3]);
10215
10216 digest[0] -= MD4M_A;
10217 digest[1] -= MD4M_B;
10218 digest[2] -= MD4M_C;
10219 digest[3] -= MD4M_D;
10220
10221 return (PARSER_OK);
10222 }
10223
10224 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10225 {
10226 if (data.opts_type & OPTS_TYPE_ST_HEX)
10227 {
10228 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10229 }
10230 else
10231 {
10232 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10233 }
10234
10235 uint32_t *digest = (uint32_t *) hash_buf->digest;
10236
10237 salt_t *salt = hash_buf->salt;
10238
10239 digest[0] = hex_to_uint (&input_buf[ 0]);
10240 digest[1] = hex_to_uint (&input_buf[ 8]);
10241 digest[2] = hex_to_uint (&input_buf[16]);
10242 digest[3] = hex_to_uint (&input_buf[24]);
10243
10244 digest[0] = byte_swap_32 (digest[0]);
10245 digest[1] = byte_swap_32 (digest[1]);
10246 digest[2] = byte_swap_32 (digest[2]);
10247 digest[3] = byte_swap_32 (digest[3]);
10248
10249 digest[0] -= MD4M_A;
10250 digest[1] -= MD4M_B;
10251 digest[2] -= MD4M_C;
10252 digest[3] -= MD4M_D;
10253
10254 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10255
10256 uint salt_len = input_len - 32 - 1;
10257
10258 char *salt_buf = input_buf + 32 + 1;
10259
10260 char *salt_buf_ptr = (char *) salt->salt_buf;
10261
10262 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10263
10264 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10265
10266 salt->salt_len = salt_len;
10267
10268 return (PARSER_OK);
10269 }
10270
10271 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10272 {
10273 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10274
10275 uint32_t *digest = (uint32_t *) hash_buf->digest;
10276
10277 digest[0] = hex_to_uint (&input_buf[ 0]);
10278 digest[1] = hex_to_uint (&input_buf[ 8]);
10279 digest[2] = hex_to_uint (&input_buf[16]);
10280 digest[3] = hex_to_uint (&input_buf[24]);
10281
10282 digest[0] = byte_swap_32 (digest[0]);
10283 digest[1] = byte_swap_32 (digest[1]);
10284 digest[2] = byte_swap_32 (digest[2]);
10285 digest[3] = byte_swap_32 (digest[3]);
10286
10287 digest[0] -= MD5M_A;
10288 digest[1] -= MD5M_B;
10289 digest[2] -= MD5M_C;
10290 digest[3] -= MD5M_D;
10291
10292 return (PARSER_OK);
10293 }
10294
10295 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10296 {
10297 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10298
10299 uint32_t *digest = (uint32_t *) hash_buf->digest;
10300
10301 digest[0] = hex_to_uint (&input_buf[0]);
10302 digest[1] = hex_to_uint (&input_buf[8]);
10303 digest[2] = 0;
10304 digest[3] = 0;
10305
10306 digest[0] = byte_swap_32 (digest[0]);
10307 digest[1] = byte_swap_32 (digest[1]);
10308
10309 return (PARSER_OK);
10310 }
10311
10312 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10313 {
10314 if (data.opts_type & OPTS_TYPE_ST_HEX)
10315 {
10316 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10317 }
10318 else
10319 {
10320 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10321 }
10322
10323 uint32_t *digest = (uint32_t *) hash_buf->digest;
10324
10325 salt_t *salt = hash_buf->salt;
10326
10327 digest[0] = hex_to_uint (&input_buf[ 0]);
10328 digest[1] = hex_to_uint (&input_buf[ 8]);
10329 digest[2] = hex_to_uint (&input_buf[16]);
10330 digest[3] = hex_to_uint (&input_buf[24]);
10331
10332 digest[0] = byte_swap_32 (digest[0]);
10333 digest[1] = byte_swap_32 (digest[1]);
10334 digest[2] = byte_swap_32 (digest[2]);
10335 digest[3] = byte_swap_32 (digest[3]);
10336
10337 digest[0] -= MD5M_A;
10338 digest[1] -= MD5M_B;
10339 digest[2] -= MD5M_C;
10340 digest[3] -= MD5M_D;
10341
10342 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10343
10344 uint salt_len = input_len - 32 - 1;
10345
10346 char *salt_buf = input_buf + 32 + 1;
10347
10348 char *salt_buf_ptr = (char *) salt->salt_buf;
10349
10350 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10351
10352 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10353
10354 salt->salt_len = salt_len;
10355
10356 return (PARSER_OK);
10357 }
10358
10359 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10360 {
10361 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10362
10363 uint32_t *digest = (uint32_t *) hash_buf->digest;
10364
10365 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10366 | itoa64_to_int (input_buf[ 1]) << 6
10367 | itoa64_to_int (input_buf[ 2]) << 12
10368 | itoa64_to_int (input_buf[ 3]) << 18;
10369 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10370 | itoa64_to_int (input_buf[ 5]) << 6
10371 | itoa64_to_int (input_buf[ 6]) << 12
10372 | itoa64_to_int (input_buf[ 7]) << 18;
10373 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10374 | itoa64_to_int (input_buf[ 9]) << 6
10375 | itoa64_to_int (input_buf[10]) << 12
10376 | itoa64_to_int (input_buf[11]) << 18;
10377 digest[3] = itoa64_to_int (input_buf[12]) << 0
10378 | itoa64_to_int (input_buf[13]) << 6
10379 | itoa64_to_int (input_buf[14]) << 12
10380 | itoa64_to_int (input_buf[15]) << 18;
10381
10382 digest[0] -= MD5M_A;
10383 digest[1] -= MD5M_B;
10384 digest[2] -= MD5M_C;
10385 digest[3] -= MD5M_D;
10386
10387 digest[0] &= 0x00ffffff;
10388 digest[1] &= 0x00ffffff;
10389 digest[2] &= 0x00ffffff;
10390 digest[3] &= 0x00ffffff;
10391
10392 return (PARSER_OK);
10393 }
10394
10395 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10396 {
10397 if (data.opts_type & OPTS_TYPE_ST_HEX)
10398 {
10399 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10400 }
10401 else
10402 {
10403 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10404 }
10405
10406 uint32_t *digest = (uint32_t *) hash_buf->digest;
10407
10408 salt_t *salt = hash_buf->salt;
10409
10410 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10411 | itoa64_to_int (input_buf[ 1]) << 6
10412 | itoa64_to_int (input_buf[ 2]) << 12
10413 | itoa64_to_int (input_buf[ 3]) << 18;
10414 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10415 | itoa64_to_int (input_buf[ 5]) << 6
10416 | itoa64_to_int (input_buf[ 6]) << 12
10417 | itoa64_to_int (input_buf[ 7]) << 18;
10418 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10419 | itoa64_to_int (input_buf[ 9]) << 6
10420 | itoa64_to_int (input_buf[10]) << 12
10421 | itoa64_to_int (input_buf[11]) << 18;
10422 digest[3] = itoa64_to_int (input_buf[12]) << 0
10423 | itoa64_to_int (input_buf[13]) << 6
10424 | itoa64_to_int (input_buf[14]) << 12
10425 | itoa64_to_int (input_buf[15]) << 18;
10426
10427 digest[0] -= MD5M_A;
10428 digest[1] -= MD5M_B;
10429 digest[2] -= MD5M_C;
10430 digest[3] -= MD5M_D;
10431
10432 digest[0] &= 0x00ffffff;
10433 digest[1] &= 0x00ffffff;
10434 digest[2] &= 0x00ffffff;
10435 digest[3] &= 0x00ffffff;
10436
10437 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10438
10439 uint salt_len = input_len - 16 - 1;
10440
10441 char *salt_buf = input_buf + 16 + 1;
10442
10443 char *salt_buf_ptr = (char *) salt->salt_buf;
10444
10445 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10446
10447 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10448
10449 salt->salt_len = salt_len;
10450
10451 return (PARSER_OK);
10452 }
10453
10454 void transform_netntlmv1_key (const uint8_t *nthash, uint8_t *key)
10455 {
10456 key[0] = (nthash[0] >> 0);
10457 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10458 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10459 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10460 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10461 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10462 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10463 key[7] = (nthash[6] << 1);
10464
10465 key[0] |= 0x01;
10466 key[1] |= 0x01;
10467 key[2] |= 0x01;
10468 key[3] |= 0x01;
10469 key[4] |= 0x01;
10470 key[5] |= 0x01;
10471 key[6] |= 0x01;
10472 key[7] |= 0x01;
10473 }
10474
10475 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10476 {
10477 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10478
10479 uint32_t *digest = (uint32_t *) hash_buf->digest;
10480
10481 salt_t *salt = hash_buf->salt;
10482
10483 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10484
10485 /**
10486 * parse line
10487 */
10488
10489 char *user_pos = input_buf;
10490
10491 char *unused_pos = strchr (user_pos, ':');
10492
10493 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10494
10495 uint user_len = unused_pos - user_pos;
10496
10497 if (user_len > 60) return (PARSER_SALT_LENGTH);
10498
10499 unused_pos++;
10500
10501 char *domain_pos = strchr (unused_pos, ':');
10502
10503 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10504
10505 uint unused_len = domain_pos - unused_pos;
10506
10507 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10508
10509 domain_pos++;
10510
10511 char *srvchall_pos = strchr (domain_pos, ':');
10512
10513 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10514
10515 uint domain_len = srvchall_pos - domain_pos;
10516
10517 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10518
10519 srvchall_pos++;
10520
10521 char *hash_pos = strchr (srvchall_pos, ':');
10522
10523 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10524
10525 uint srvchall_len = hash_pos - srvchall_pos;
10526
10527 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10528
10529 hash_pos++;
10530
10531 char *clichall_pos = strchr (hash_pos, ':');
10532
10533 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10534
10535 uint hash_len = clichall_pos - hash_pos;
10536
10537 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10538
10539 clichall_pos++;
10540
10541 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10542
10543 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10544
10545 /**
10546 * store some data for later use
10547 */
10548
10549 netntlm->user_len = user_len * 2;
10550 netntlm->domain_len = domain_len * 2;
10551 netntlm->srvchall_len = srvchall_len / 2;
10552 netntlm->clichall_len = clichall_len / 2;
10553
10554 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10555 char *chall_ptr = (char *) netntlm->chall_buf;
10556
10557 /**
10558 * handle username and domainname
10559 */
10560
10561 for (uint i = 0; i < user_len; i++)
10562 {
10563 *userdomain_ptr++ = user_pos[i];
10564 *userdomain_ptr++ = 0;
10565 }
10566
10567 for (uint i = 0; i < domain_len; i++)
10568 {
10569 *userdomain_ptr++ = domain_pos[i];
10570 *userdomain_ptr++ = 0;
10571 }
10572
10573 /**
10574 * handle server challenge encoding
10575 */
10576
10577 for (uint i = 0; i < srvchall_len; i += 2)
10578 {
10579 const char p0 = srvchall_pos[i + 0];
10580 const char p1 = srvchall_pos[i + 1];
10581
10582 *chall_ptr++ = hex_convert (p1) << 0
10583 | hex_convert (p0) << 4;
10584 }
10585
10586 /**
10587 * handle client challenge encoding
10588 */
10589
10590 for (uint i = 0; i < clichall_len; i += 2)
10591 {
10592 const char p0 = clichall_pos[i + 0];
10593 const char p1 = clichall_pos[i + 1];
10594
10595 *chall_ptr++ = hex_convert (p1) << 0
10596 | hex_convert (p0) << 4;
10597 }
10598
10599 /**
10600 * store data
10601 */
10602
10603 char *salt_buf_ptr = (char *) salt->salt_buf;
10604
10605 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10606
10607 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10608
10609 salt->salt_len = salt_len;
10610
10611 digest[0] = hex_to_uint (&hash_pos[ 0]);
10612 digest[1] = hex_to_uint (&hash_pos[ 8]);
10613 digest[2] = hex_to_uint (&hash_pos[16]);
10614 digest[3] = hex_to_uint (&hash_pos[24]);
10615
10616 digest[0] = byte_swap_32 (digest[0]);
10617 digest[1] = byte_swap_32 (digest[1]);
10618 digest[2] = byte_swap_32 (digest[2]);
10619 digest[3] = byte_swap_32 (digest[3]);
10620
10621 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10622
10623 uint digest_tmp[2];
10624
10625 digest_tmp[0] = hex_to_uint (&hash_pos[32]);
10626 digest_tmp[1] = hex_to_uint (&hash_pos[40]);
10627
10628 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10629 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10630
10631 /* special case 2: ESS */
10632
10633 if (srvchall_len == 48)
10634 {
10635 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10636 {
10637 uint w[16];
10638
10639 w[ 0] = netntlm->chall_buf[6];
10640 w[ 1] = netntlm->chall_buf[7];
10641 w[ 2] = netntlm->chall_buf[0];
10642 w[ 3] = netntlm->chall_buf[1];
10643 w[ 4] = 0x80;
10644 w[ 5] = 0;
10645 w[ 6] = 0;
10646 w[ 7] = 0;
10647 w[ 8] = 0;
10648 w[ 9] = 0;
10649 w[10] = 0;
10650 w[11] = 0;
10651 w[12] = 0;
10652 w[13] = 0;
10653 w[14] = 16 * 8;
10654 w[15] = 0;
10655
10656 uint dgst[4];
10657
10658 dgst[0] = MAGIC_A;
10659 dgst[1] = MAGIC_B;
10660 dgst[2] = MAGIC_C;
10661 dgst[3] = MAGIC_D;
10662
10663 md5_64 (w, dgst);
10664
10665 salt->salt_buf[0] = dgst[0];
10666 salt->salt_buf[1] = dgst[1];
10667 }
10668 }
10669
10670 /* precompute netntlmv1 exploit start */
10671
10672 for (uint i = 0; i < 0x10000; i++)
10673 {
10674 uint key_md4[2] = { i, 0 };
10675 uint key_des[2] = { 0, 0 };
10676
10677 transform_netntlmv1_key ((uint8_t *) key_md4, (uint8_t *) key_des);
10678
10679 uint Kc[16];
10680 uint Kd[16];
10681
10682 _des_keysetup (key_des, Kc, Kd, c_skb);
10683
10684 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10685
10686 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10687
10688 if (data3[0] != digest_tmp[0]) continue;
10689 if (data3[1] != digest_tmp[1]) continue;
10690
10691 salt->salt_buf[2] = i;
10692
10693 salt->salt_len = 24;
10694
10695 break;
10696 }
10697
10698 salt->salt_buf_pc[0] = digest_tmp[0];
10699 salt->salt_buf_pc[1] = digest_tmp[1];
10700
10701 /* precompute netntlmv1 exploit stop */
10702
10703 uint32_t tt;
10704
10705 IP (digest[0], digest[1], tt);
10706 IP (digest[2], digest[3], tt);
10707
10708 digest[0] = ROTATE_RIGHT (digest[0], 29);
10709 digest[1] = ROTATE_RIGHT (digest[1], 29);
10710 digest[2] = ROTATE_RIGHT (digest[2], 29);
10711 digest[3] = ROTATE_RIGHT (digest[3], 29);
10712
10713 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10714
10715 salt->salt_buf[0] = ROTATE_LEFT (salt->salt_buf[0], 3);
10716 salt->salt_buf[1] = ROTATE_LEFT (salt->salt_buf[1], 3);
10717
10718 return (PARSER_OK);
10719 }
10720
10721 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10722 {
10723 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10724
10725 uint32_t *digest = (uint32_t *) hash_buf->digest;
10726
10727 salt_t *salt = hash_buf->salt;
10728
10729 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10730
10731 /**
10732 * parse line
10733 */
10734
10735 char *user_pos = input_buf;
10736
10737 char *unused_pos = strchr (user_pos, ':');
10738
10739 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10740
10741 uint user_len = unused_pos - user_pos;
10742
10743 if (user_len > 60) return (PARSER_SALT_LENGTH);
10744
10745 unused_pos++;
10746
10747 char *domain_pos = strchr (unused_pos, ':');
10748
10749 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10750
10751 uint unused_len = domain_pos - unused_pos;
10752
10753 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10754
10755 domain_pos++;
10756
10757 char *srvchall_pos = strchr (domain_pos, ':');
10758
10759 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10760
10761 uint domain_len = srvchall_pos - domain_pos;
10762
10763 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10764
10765 srvchall_pos++;
10766
10767 char *hash_pos = strchr (srvchall_pos, ':');
10768
10769 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10770
10771 uint srvchall_len = hash_pos - srvchall_pos;
10772
10773 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
10774
10775 hash_pos++;
10776
10777 char *clichall_pos = strchr (hash_pos, ':');
10778
10779 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10780
10781 uint hash_len = clichall_pos - hash_pos;
10782
10783 if (hash_len != 32) return (PARSER_HASH_LENGTH);
10784
10785 clichall_pos++;
10786
10787 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10788
10789 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
10790
10791 if (clichall_len % 2) return (PARSER_SALT_VALUE);
10792
10793 /**
10794 * store some data for later use
10795 */
10796
10797 netntlm->user_len = user_len * 2;
10798 netntlm->domain_len = domain_len * 2;
10799 netntlm->srvchall_len = srvchall_len / 2;
10800 netntlm->clichall_len = clichall_len / 2;
10801
10802 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10803 char *chall_ptr = (char *) netntlm->chall_buf;
10804
10805 /**
10806 * handle username and domainname
10807 */
10808
10809 for (uint i = 0; i < user_len; i++)
10810 {
10811 *userdomain_ptr++ = toupper (user_pos[i]);
10812 *userdomain_ptr++ = 0;
10813 }
10814
10815 for (uint i = 0; i < domain_len; i++)
10816 {
10817 *userdomain_ptr++ = domain_pos[i];
10818 *userdomain_ptr++ = 0;
10819 }
10820
10821 *userdomain_ptr++ = 0x80;
10822
10823 /**
10824 * handle server challenge encoding
10825 */
10826
10827 for (uint i = 0; i < srvchall_len; i += 2)
10828 {
10829 const char p0 = srvchall_pos[i + 0];
10830 const char p1 = srvchall_pos[i + 1];
10831
10832 *chall_ptr++ = hex_convert (p1) << 0
10833 | hex_convert (p0) << 4;
10834 }
10835
10836 /**
10837 * handle client challenge encoding
10838 */
10839
10840 for (uint i = 0; i < clichall_len; i += 2)
10841 {
10842 const char p0 = clichall_pos[i + 0];
10843 const char p1 = clichall_pos[i + 1];
10844
10845 *chall_ptr++ = hex_convert (p1) << 0
10846 | hex_convert (p0) << 4;
10847 }
10848
10849 *chall_ptr++ = 0x80;
10850
10851 /**
10852 * handle hash itself
10853 */
10854
10855 digest[0] = hex_to_uint (&hash_pos[ 0]);
10856 digest[1] = hex_to_uint (&hash_pos[ 8]);
10857 digest[2] = hex_to_uint (&hash_pos[16]);
10858 digest[3] = hex_to_uint (&hash_pos[24]);
10859
10860 digest[0] = byte_swap_32 (digest[0]);
10861 digest[1] = byte_swap_32 (digest[1]);
10862 digest[2] = byte_swap_32 (digest[2]);
10863 digest[3] = byte_swap_32 (digest[3]);
10864
10865 /**
10866 * reuse challange data as salt_buf, its the buffer that is most likely unique
10867 */
10868
10869 salt->salt_buf[0] = 0;
10870 salt->salt_buf[1] = 0;
10871 salt->salt_buf[2] = 0;
10872 salt->salt_buf[3] = 0;
10873 salt->salt_buf[4] = 0;
10874 salt->salt_buf[5] = 0;
10875 salt->salt_buf[6] = 0;
10876 salt->salt_buf[7] = 0;
10877
10878 uint *uptr;
10879
10880 uptr = (uint *) netntlm->userdomain_buf;
10881
10882 for (uint i = 0; i < 16; i += 16)
10883 {
10884 md5_64 (uptr, salt->salt_buf);
10885 }
10886
10887 uptr = (uint *) netntlm->chall_buf;
10888
10889 for (uint i = 0; i < 256; i += 16)
10890 {
10891 md5_64 (uptr, salt->salt_buf);
10892 }
10893
10894 salt->salt_len = 16;
10895
10896 return (PARSER_OK);
10897 }
10898
10899 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10900 {
10901 if (data.opts_type & OPTS_TYPE_ST_HEX)
10902 {
10903 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
10904 }
10905 else
10906 {
10907 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
10908 }
10909
10910 uint32_t *digest = (uint32_t *) hash_buf->digest;
10911
10912 salt_t *salt = hash_buf->salt;
10913
10914 digest[0] = hex_to_uint (&input_buf[ 0]);
10915 digest[1] = hex_to_uint (&input_buf[ 8]);
10916 digest[2] = hex_to_uint (&input_buf[16]);
10917 digest[3] = hex_to_uint (&input_buf[24]);
10918
10919 digest[0] = byte_swap_32 (digest[0]);
10920 digest[1] = byte_swap_32 (digest[1]);
10921 digest[2] = byte_swap_32 (digest[2]);
10922 digest[3] = byte_swap_32 (digest[3]);
10923
10924 digest[0] -= MD5M_A;
10925 digest[1] -= MD5M_B;
10926 digest[2] -= MD5M_C;
10927 digest[3] -= MD5M_D;
10928
10929 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10930
10931 uint salt_len = input_len - 32 - 1;
10932
10933 char *salt_buf = input_buf + 32 + 1;
10934
10935 char *salt_buf_ptr = (char *) salt->salt_buf;
10936
10937 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10938
10939 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10940
10941 salt->salt_len = salt_len;
10942
10943 return (PARSER_OK);
10944 }
10945
10946 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10947 {
10948 if (data.opts_type & OPTS_TYPE_ST_HEX)
10949 {
10950 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
10951 }
10952 else
10953 {
10954 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
10955 }
10956
10957 uint32_t *digest = (uint32_t *) hash_buf->digest;
10958
10959 salt_t *salt = hash_buf->salt;
10960
10961 digest[0] = hex_to_uint (&input_buf[ 0]);
10962 digest[1] = hex_to_uint (&input_buf[ 8]);
10963 digest[2] = hex_to_uint (&input_buf[16]);
10964 digest[3] = hex_to_uint (&input_buf[24]);
10965
10966 digest[0] = byte_swap_32 (digest[0]);
10967 digest[1] = byte_swap_32 (digest[1]);
10968 digest[2] = byte_swap_32 (digest[2]);
10969 digest[3] = byte_swap_32 (digest[3]);
10970
10971 digest[0] -= MD5M_A;
10972 digest[1] -= MD5M_B;
10973 digest[2] -= MD5M_C;
10974 digest[3] -= MD5M_D;
10975
10976 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10977
10978 uint salt_len = input_len - 32 - 1;
10979
10980 char *salt_buf = input_buf + 32 + 1;
10981
10982 char *salt_buf_ptr = (char *) salt->salt_buf;
10983
10984 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10985
10986 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10987
10988 salt->salt_len = salt_len;
10989
10990 return (PARSER_OK);
10991 }
10992
10993 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10994 {
10995 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
10996
10997 uint32_t *digest = (uint32_t *) hash_buf->digest;
10998
10999 salt_t *salt = hash_buf->salt;
11000
11001 digest[0] = hex_to_uint (&input_buf[ 0]);
11002 digest[1] = hex_to_uint (&input_buf[ 8]);
11003 digest[2] = hex_to_uint (&input_buf[16]);
11004 digest[3] = hex_to_uint (&input_buf[24]);
11005
11006 digest[0] = byte_swap_32 (digest[0]);
11007 digest[1] = byte_swap_32 (digest[1]);
11008 digest[2] = byte_swap_32 (digest[2]);
11009 digest[3] = byte_swap_32 (digest[3]);
11010
11011 digest[0] -= MD5M_A;
11012 digest[1] -= MD5M_B;
11013 digest[2] -= MD5M_C;
11014 digest[3] -= MD5M_D;
11015
11016 /**
11017 * This is a virtual salt. While the algorithm is basically not salted
11018 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11019 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11020 */
11021
11022 char *salt_buf_ptr = (char *) salt->salt_buf;
11023
11024 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11025
11026 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11027
11028 salt->salt_len = salt_len;
11029
11030 return (PARSER_OK);
11031 }
11032
11033 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11034 {
11035 if (data.opts_type & OPTS_TYPE_ST_HEX)
11036 {
11037 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11038 }
11039 else
11040 {
11041 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11042 }
11043
11044 uint32_t *digest = (uint32_t *) hash_buf->digest;
11045
11046 salt_t *salt = hash_buf->salt;
11047
11048 digest[0] = hex_to_uint (&input_buf[ 0]);
11049 digest[1] = hex_to_uint (&input_buf[ 8]);
11050 digest[2] = hex_to_uint (&input_buf[16]);
11051 digest[3] = hex_to_uint (&input_buf[24]);
11052
11053 digest[0] = byte_swap_32 (digest[0]);
11054 digest[1] = byte_swap_32 (digest[1]);
11055 digest[2] = byte_swap_32 (digest[2]);
11056 digest[3] = byte_swap_32 (digest[3]);
11057
11058 digest[0] -= MD5M_A;
11059 digest[1] -= MD5M_B;
11060 digest[2] -= MD5M_C;
11061 digest[3] -= MD5M_D;
11062
11063 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11064
11065 uint salt_len = input_len - 32 - 1;
11066
11067 char *salt_buf = input_buf + 32 + 1;
11068
11069 char *salt_buf_ptr = (char *) salt->salt_buf;
11070
11071 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11072
11073 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11074
11075 salt->salt_len = salt_len;
11076
11077 return (PARSER_OK);
11078 }
11079
11080 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11081 {
11082 if (data.opts_type & OPTS_TYPE_ST_HEX)
11083 {
11084 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11085 }
11086 else
11087 {
11088 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11089 }
11090
11091 uint32_t *digest = (uint32_t *) hash_buf->digest;
11092
11093 salt_t *salt = hash_buf->salt;
11094
11095 digest[0] = hex_to_uint (&input_buf[ 0]);
11096 digest[1] = hex_to_uint (&input_buf[ 8]);
11097 digest[2] = hex_to_uint (&input_buf[16]);
11098 digest[3] = hex_to_uint (&input_buf[24]);
11099
11100 digest[0] = byte_swap_32 (digest[0]);
11101 digest[1] = byte_swap_32 (digest[1]);
11102 digest[2] = byte_swap_32 (digest[2]);
11103 digest[3] = byte_swap_32 (digest[3]);
11104
11105 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11106
11107 uint salt_len = input_len - 32 - 1;
11108
11109 char *salt_buf = input_buf + 32 + 1;
11110
11111 char *salt_buf_ptr = (char *) salt->salt_buf;
11112
11113 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11114
11115 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11116
11117 salt->salt_len = salt_len;
11118
11119 return (PARSER_OK);
11120 }
11121
11122 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11123 {
11124 if (data.opts_type & OPTS_TYPE_ST_HEX)
11125 {
11126 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11127 }
11128 else
11129 {
11130 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11131 }
11132
11133 uint32_t *digest = (uint32_t *) hash_buf->digest;
11134
11135 salt_t *salt = hash_buf->salt;
11136
11137 digest[0] = hex_to_uint (&input_buf[ 0]);
11138 digest[1] = hex_to_uint (&input_buf[ 8]);
11139 digest[2] = hex_to_uint (&input_buf[16]);
11140 digest[3] = hex_to_uint (&input_buf[24]);
11141
11142 digest[0] = byte_swap_32 (digest[0]);
11143 digest[1] = byte_swap_32 (digest[1]);
11144 digest[2] = byte_swap_32 (digest[2]);
11145 digest[3] = byte_swap_32 (digest[3]);
11146
11147 digest[0] -= MD4M_A;
11148 digest[1] -= MD4M_B;
11149 digest[2] -= MD4M_C;
11150 digest[3] -= MD4M_D;
11151
11152 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11153
11154 uint salt_len = input_len - 32 - 1;
11155
11156 char *salt_buf = input_buf + 32 + 1;
11157
11158 char *salt_buf_ptr = (char *) salt->salt_buf;
11159
11160 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11161
11162 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11163
11164 salt->salt_len = salt_len;
11165
11166 return (PARSER_OK);
11167 }
11168
11169 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11170 {
11171 if (data.opts_type & OPTS_TYPE_ST_HEX)
11172 {
11173 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11174 }
11175 else
11176 {
11177 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11178 }
11179
11180 uint32_t *digest = (uint32_t *) hash_buf->digest;
11181
11182 salt_t *salt = hash_buf->salt;
11183
11184 digest[0] = hex_to_uint (&input_buf[ 0]);
11185 digest[1] = hex_to_uint (&input_buf[ 8]);
11186 digest[2] = hex_to_uint (&input_buf[16]);
11187 digest[3] = hex_to_uint (&input_buf[24]);
11188
11189 digest[0] = byte_swap_32 (digest[0]);
11190 digest[1] = byte_swap_32 (digest[1]);
11191 digest[2] = byte_swap_32 (digest[2]);
11192 digest[3] = byte_swap_32 (digest[3]);
11193
11194 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11195
11196 uint salt_len = input_len - 32 - 1;
11197
11198 char *salt_buf = input_buf + 32 + 1;
11199
11200 uint salt_pc_block[16];
11201
11202 memset (salt_pc_block, 0, sizeof (salt_pc_block));
11203
11204 char *salt_pc_block_ptr = (char *) salt_pc_block;
11205
11206 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11207
11208 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11209
11210 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11211
11212 salt_pc_block[14] = salt_len * 8;
11213
11214 uint salt_pc_digest[4];
11215
11216 salt_pc_digest[0] = MAGIC_A;
11217 salt_pc_digest[1] = MAGIC_B;
11218 salt_pc_digest[2] = MAGIC_C;
11219 salt_pc_digest[3] = MAGIC_D;
11220
11221 md5_64 (salt_pc_block, salt_pc_digest);
11222
11223 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11224 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11225 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11226 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11227
11228 char *salt_buf_ptr = (char *) salt->salt_buf;
11229
11230 memcpy (salt_buf_ptr, salt_buf, salt_len);
11231
11232 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
11233
11234 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11235 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11236 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11237 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11238
11239 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11240
11241 return (PARSER_OK);
11242 }
11243
11244 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11245 {
11246 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11247
11248 uint32_t *digest = (uint32_t *) hash_buf->digest;
11249
11250 digest[0] = hex_to_uint (&input_buf[ 0]);
11251 digest[1] = hex_to_uint (&input_buf[ 8]);
11252 digest[2] = hex_to_uint (&input_buf[16]);
11253 digest[3] = hex_to_uint (&input_buf[24]);
11254 digest[4] = hex_to_uint (&input_buf[32]);
11255
11256 digest[0] -= SHA1M_A;
11257 digest[1] -= SHA1M_B;
11258 digest[2] -= SHA1M_C;
11259 digest[3] -= SHA1M_D;
11260 digest[4] -= SHA1M_E;
11261
11262 return (PARSER_OK);
11263 }
11264
11265 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11266 {
11267 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11268
11269 uint32_t *digest = (uint32_t *) hash_buf->digest;
11270
11271 digest[0] = hex_to_uint (&input_buf[ 0]);
11272 digest[1] = hex_to_uint (&input_buf[ 8]);
11273 digest[2] = hex_to_uint (&input_buf[16]);
11274 digest[3] = hex_to_uint (&input_buf[24]);
11275 digest[4] = hex_to_uint (&input_buf[32]);
11276
11277 return (PARSER_OK);
11278 }
11279
11280 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11281 {
11282 if (data.opts_type & OPTS_TYPE_ST_HEX)
11283 {
11284 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11285 }
11286 else
11287 {
11288 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11289 }
11290
11291 uint32_t *digest = (uint32_t *) hash_buf->digest;
11292
11293 salt_t *salt = hash_buf->salt;
11294
11295 digest[0] = hex_to_uint (&input_buf[ 0]);
11296 digest[1] = hex_to_uint (&input_buf[ 8]);
11297 digest[2] = hex_to_uint (&input_buf[16]);
11298 digest[3] = hex_to_uint (&input_buf[24]);
11299 digest[4] = hex_to_uint (&input_buf[32]);
11300
11301 digest[0] -= SHA1M_A;
11302 digest[1] -= SHA1M_B;
11303 digest[2] -= SHA1M_C;
11304 digest[3] -= SHA1M_D;
11305 digest[4] -= SHA1M_E;
11306
11307 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11308
11309 uint salt_len = input_len - 40 - 1;
11310
11311 char *salt_buf = input_buf + 40 + 1;
11312
11313 char *salt_buf_ptr = (char *) salt->salt_buf;
11314
11315 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11316
11317 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11318
11319 salt->salt_len = salt_len;
11320
11321 return (PARSER_OK);
11322 }
11323
11324 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11325 {
11326 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11327
11328 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11329
11330 uint32_t *digest = (uint32_t *) hash_buf->digest;
11331
11332 char tmp_buf[100];
11333
11334 memset (tmp_buf, 0, sizeof (tmp_buf));
11335
11336 base64_decode (base64_to_int, input_buf + 5, input_len - 5, tmp_buf);
11337
11338 memcpy (digest, tmp_buf, 20);
11339
11340 digest[0] = byte_swap_32 (digest[0]);
11341 digest[1] = byte_swap_32 (digest[1]);
11342 digest[2] = byte_swap_32 (digest[2]);
11343 digest[3] = byte_swap_32 (digest[3]);
11344 digest[4] = byte_swap_32 (digest[4]);
11345
11346 digest[0] -= SHA1M_A;
11347 digest[1] -= SHA1M_B;
11348 digest[2] -= SHA1M_C;
11349 digest[3] -= SHA1M_D;
11350 digest[4] -= SHA1M_E;
11351
11352 return (PARSER_OK);
11353 }
11354
11355 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11356 {
11357 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11358
11359 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11360
11361 uint32_t *digest = (uint32_t *) hash_buf->digest;
11362
11363 salt_t *salt = hash_buf->salt;
11364
11365 char tmp_buf[100];
11366
11367 memset (tmp_buf, 0, sizeof (tmp_buf));
11368
11369 int tmp_len = base64_decode (base64_to_int, input_buf + 6, input_len - 6, tmp_buf);
11370
11371 memcpy (digest, tmp_buf, 20);
11372
11373 salt->salt_len = tmp_len - 20;
11374
11375 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11376
11377 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11378 {
11379 char *ptr = (char *) salt->salt_buf;
11380
11381 ptr[salt->salt_len] = 0x80;
11382 }
11383
11384 digest[0] = byte_swap_32 (digest[0]);
11385 digest[1] = byte_swap_32 (digest[1]);
11386 digest[2] = byte_swap_32 (digest[2]);
11387 digest[3] = byte_swap_32 (digest[3]);
11388 digest[4] = byte_swap_32 (digest[4]);
11389
11390 digest[0] -= SHA1M_A;
11391 digest[1] -= SHA1M_B;
11392 digest[2] -= SHA1M_C;
11393 digest[3] -= SHA1M_D;
11394 digest[4] -= SHA1M_E;
11395
11396 return (PARSER_OK);
11397 }
11398
11399 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11400 {
11401 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11402
11403 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11404
11405 uint32_t *digest = (uint32_t *) hash_buf->digest;
11406
11407 salt_t *salt = hash_buf->salt;
11408
11409 char *salt_buf = input_buf + 6;
11410
11411 uint salt_len = 8;
11412
11413 char *salt_buf_ptr = (char *) salt->salt_buf;
11414
11415 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11416
11417 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11418
11419 salt->salt_len = salt_len;
11420
11421 char *hash_pos = input_buf + 6 + 8 + 40;
11422
11423 digest[0] = hex_to_uint (&hash_pos[ 0]);
11424 digest[1] = hex_to_uint (&hash_pos[ 8]);
11425 digest[2] = hex_to_uint (&hash_pos[16]);
11426 digest[3] = hex_to_uint (&hash_pos[24]);
11427 digest[4] = hex_to_uint (&hash_pos[32]);
11428
11429 digest[0] -= SHA1M_A;
11430 digest[1] -= SHA1M_B;
11431 digest[2] -= SHA1M_C;
11432 digest[3] -= SHA1M_D;
11433 digest[4] -= SHA1M_E;
11434
11435 return (PARSER_OK);
11436 }
11437
11438 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11439 {
11440 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11441
11442 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11443
11444 uint32_t *digest = (uint32_t *) hash_buf->digest;
11445
11446 salt_t *salt = hash_buf->salt;
11447
11448 char *salt_buf = input_buf + 6;
11449
11450 uint salt_len = 8;
11451
11452 char *salt_buf_ptr = (char *) salt->salt_buf;
11453
11454 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11455
11456 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11457
11458 salt->salt_len = salt_len;
11459
11460 char *hash_pos = input_buf + 6 + 8;
11461
11462 digest[0] = hex_to_uint (&hash_pos[ 0]);
11463 digest[1] = hex_to_uint (&hash_pos[ 8]);
11464 digest[2] = hex_to_uint (&hash_pos[16]);
11465 digest[3] = hex_to_uint (&hash_pos[24]);
11466 digest[4] = hex_to_uint (&hash_pos[32]);
11467
11468 digest[0] -= SHA1M_A;
11469 digest[1] -= SHA1M_B;
11470 digest[2] -= SHA1M_C;
11471 digest[3] -= SHA1M_D;
11472 digest[4] -= SHA1M_E;
11473
11474 return (PARSER_OK);
11475 }
11476
11477 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11478 {
11479 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11480
11481 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11482
11483 uint64_t *digest = (uint64_t *) hash_buf->digest;
11484
11485 salt_t *salt = hash_buf->salt;
11486
11487 char *salt_buf = input_buf + 6;
11488
11489 uint salt_len = 8;
11490
11491 char *salt_buf_ptr = (char *) salt->salt_buf;
11492
11493 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11494
11495 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11496
11497 salt->salt_len = salt_len;
11498
11499 char *hash_pos = input_buf + 6 + 8;
11500
11501 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
11502 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
11503 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
11504 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
11505 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
11506 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
11507 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
11508 digest[7] = hex_to_uint64_t (&hash_pos[112]);
11509
11510 digest[0] -= SHA512M_A;
11511 digest[1] -= SHA512M_B;
11512 digest[2] -= SHA512M_C;
11513 digest[3] -= SHA512M_D;
11514 digest[4] -= SHA512M_E;
11515 digest[5] -= SHA512M_F;
11516 digest[6] -= SHA512M_G;
11517 digest[7] -= SHA512M_H;
11518
11519 return (PARSER_OK);
11520 }
11521
11522 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11523 {
11524 if (data.opts_type & OPTS_TYPE_ST_HEX)
11525 {
11526 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11527 }
11528 else
11529 {
11530 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11531 }
11532
11533 uint32_t *digest = (uint32_t *) hash_buf->digest;
11534
11535 salt_t *salt = hash_buf->salt;
11536
11537 digest[0] = hex_to_uint (&input_buf[ 0]);
11538 digest[1] = hex_to_uint (&input_buf[ 8]);
11539 digest[2] = 0;
11540 digest[3] = 0;
11541
11542 digest[0] = byte_swap_32 (digest[0]);
11543 digest[1] = byte_swap_32 (digest[1]);
11544
11545 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11546
11547 uint salt_len = input_len - 16 - 1;
11548
11549 char *salt_buf = input_buf + 16 + 1;
11550
11551 char *salt_buf_ptr = (char *) salt->salt_buf;
11552
11553 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11554
11555 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11556
11557 salt->salt_len = salt_len;
11558
11559 return (PARSER_OK);
11560 }
11561
11562 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11563 {
11564 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11565
11566 uint32_t *digest = (uint32_t *) hash_buf->digest;
11567
11568 salt_t *salt = hash_buf->salt;
11569
11570 digest[0] = hex_to_uint (&input_buf[ 0]);
11571 digest[1] = hex_to_uint (&input_buf[ 8]);
11572 digest[2] = hex_to_uint (&input_buf[16]);
11573 digest[3] = hex_to_uint (&input_buf[24]);
11574 digest[4] = hex_to_uint (&input_buf[32]);
11575
11576 digest[0] -= SHA1M_A;
11577 digest[1] -= SHA1M_B;
11578 digest[2] -= SHA1M_C;
11579 digest[3] -= SHA1M_D;
11580 digest[4] -= SHA1M_E;
11581
11582 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11583
11584 uint salt_len = input_len - 40 - 1;
11585
11586 char *salt_buf = input_buf + 40 + 1;
11587
11588 char *salt_buf_ptr = (char *) salt->salt_buf;
11589
11590 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11591
11592 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11593
11594 salt->salt_len = salt_len;
11595
11596 return (PARSER_OK);
11597 }
11598
11599 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11600 {
11601 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11602
11603 uint32_t *digest = (uint32_t *) hash_buf->digest;
11604
11605 salt_t *salt = hash_buf->salt;
11606
11607 char *hash_pos = input_buf;
11608
11609 digest[ 0] = hex_to_uint (&hash_pos[ 0]);
11610 digest[ 1] = hex_to_uint (&hash_pos[ 8]);
11611 digest[ 2] = hex_to_uint (&hash_pos[ 16]);
11612 digest[ 3] = hex_to_uint (&hash_pos[ 24]);
11613 digest[ 4] = hex_to_uint (&hash_pos[ 32]);
11614 digest[ 5] = hex_to_uint (&hash_pos[ 40]);
11615 digest[ 6] = hex_to_uint (&hash_pos[ 48]);
11616 digest[ 7] = hex_to_uint (&hash_pos[ 56]);
11617 digest[ 8] = hex_to_uint (&hash_pos[ 64]);
11618 digest[ 9] = hex_to_uint (&hash_pos[ 72]);
11619 digest[10] = hex_to_uint (&hash_pos[ 80]);
11620 digest[11] = hex_to_uint (&hash_pos[ 88]);
11621 digest[12] = hex_to_uint (&hash_pos[ 96]);
11622 digest[13] = hex_to_uint (&hash_pos[104]);
11623 digest[14] = hex_to_uint (&hash_pos[112]);
11624 digest[15] = hex_to_uint (&hash_pos[120]);
11625
11626 char *salt_pos = input_buf + 128;
11627
11628 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
11629 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
11630 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]);
11631 salt->salt_buf[3] = hex_to_uint (&salt_pos[24]);
11632
11633 salt->salt_iter = ROUNDS_ORACLET - 1;
11634 salt->salt_len = 16;
11635
11636 return (PARSER_OK);
11637 }
11638
11639 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11640 {
11641 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11642
11643 uint32_t *digest = (uint32_t *) hash_buf->digest;
11644
11645 digest[0] = hex_to_uint (&input_buf[ 0]);
11646 digest[1] = hex_to_uint (&input_buf[ 8]);
11647 digest[2] = hex_to_uint (&input_buf[16]);
11648 digest[3] = hex_to_uint (&input_buf[24]);
11649 digest[4] = hex_to_uint (&input_buf[32]);
11650 digest[5] = hex_to_uint (&input_buf[40]);
11651 digest[6] = hex_to_uint (&input_buf[48]);
11652 digest[7] = hex_to_uint (&input_buf[56]);
11653
11654 digest[0] -= SHA256M_A;
11655 digest[1] -= SHA256M_B;
11656 digest[2] -= SHA256M_C;
11657 digest[3] -= SHA256M_D;
11658 digest[4] -= SHA256M_E;
11659 digest[5] -= SHA256M_F;
11660 digest[6] -= SHA256M_G;
11661 digest[7] -= SHA256M_H;
11662
11663 return (PARSER_OK);
11664 }
11665
11666 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11667 {
11668 if (data.opts_type & OPTS_TYPE_ST_HEX)
11669 {
11670 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11671 }
11672 else
11673 {
11674 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11675 }
11676
11677 uint32_t *digest = (uint32_t *) hash_buf->digest;
11678
11679 salt_t *salt = hash_buf->salt;
11680
11681 digest[0] = hex_to_uint (&input_buf[ 0]);
11682 digest[1] = hex_to_uint (&input_buf[ 8]);
11683 digest[2] = hex_to_uint (&input_buf[16]);
11684 digest[3] = hex_to_uint (&input_buf[24]);
11685 digest[4] = hex_to_uint (&input_buf[32]);
11686 digest[5] = hex_to_uint (&input_buf[40]);
11687 digest[6] = hex_to_uint (&input_buf[48]);
11688 digest[7] = hex_to_uint (&input_buf[56]);
11689
11690 digest[0] -= SHA256M_A;
11691 digest[1] -= SHA256M_B;
11692 digest[2] -= SHA256M_C;
11693 digest[3] -= SHA256M_D;
11694 digest[4] -= SHA256M_E;
11695 digest[5] -= SHA256M_F;
11696 digest[6] -= SHA256M_G;
11697 digest[7] -= SHA256M_H;
11698
11699 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11700
11701 uint salt_len = input_len - 64 - 1;
11702
11703 char *salt_buf = input_buf + 64 + 1;
11704
11705 char *salt_buf_ptr = (char *) salt->salt_buf;
11706
11707 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11708
11709 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11710
11711 salt->salt_len = salt_len;
11712
11713 return (PARSER_OK);
11714 }
11715
11716 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11717 {
11718 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11719
11720 uint64_t *digest = (uint64_t *) hash_buf->digest;
11721
11722 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11723 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11724 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11725 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11726 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11727 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11728 digest[6] = 0;
11729 digest[7] = 0;
11730
11731 digest[0] -= SHA384M_A;
11732 digest[1] -= SHA384M_B;
11733 digest[2] -= SHA384M_C;
11734 digest[3] -= SHA384M_D;
11735 digest[4] -= SHA384M_E;
11736 digest[5] -= SHA384M_F;
11737 digest[6] -= 0;
11738 digest[7] -= 0;
11739
11740 return (PARSER_OK);
11741 }
11742
11743 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11744 {
11745 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
11746
11747 uint64_t *digest = (uint64_t *) hash_buf->digest;
11748
11749 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11750 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11751 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11752 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11753 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11754 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11755 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
11756 digest[7] = hex_to_uint64_t (&input_buf[112]);
11757
11758 digest[0] -= SHA512M_A;
11759 digest[1] -= SHA512M_B;
11760 digest[2] -= SHA512M_C;
11761 digest[3] -= SHA512M_D;
11762 digest[4] -= SHA512M_E;
11763 digest[5] -= SHA512M_F;
11764 digest[6] -= SHA512M_G;
11765 digest[7] -= SHA512M_H;
11766
11767 return (PARSER_OK);
11768 }
11769
11770 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11771 {
11772 if (data.opts_type & OPTS_TYPE_ST_HEX)
11773 {
11774 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
11775 }
11776 else
11777 {
11778 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
11779 }
11780
11781 uint64_t *digest = (uint64_t *) hash_buf->digest;
11782
11783 salt_t *salt = hash_buf->salt;
11784
11785 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11786 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11787 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11788 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11789 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11790 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11791 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
11792 digest[7] = hex_to_uint64_t (&input_buf[112]);
11793
11794 digest[0] -= SHA512M_A;
11795 digest[1] -= SHA512M_B;
11796 digest[2] -= SHA512M_C;
11797 digest[3] -= SHA512M_D;
11798 digest[4] -= SHA512M_E;
11799 digest[5] -= SHA512M_F;
11800 digest[6] -= SHA512M_G;
11801 digest[7] -= SHA512M_H;
11802
11803 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11804
11805 uint salt_len = input_len - 128 - 1;
11806
11807 char *salt_buf = input_buf + 128 + 1;
11808
11809 char *salt_buf_ptr = (char *) salt->salt_buf;
11810
11811 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11812
11813 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11814
11815 salt->salt_len = salt_len;
11816
11817 return (PARSER_OK);
11818 }
11819
11820 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11821 {
11822 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
11823
11824 uint64_t *digest = (uint64_t *) hash_buf->digest;
11825
11826 salt_t *salt = hash_buf->salt;
11827
11828 char *salt_pos = input_buf + 3;
11829
11830 uint iterations_len = 0;
11831
11832 if (memcmp (salt_pos, "rounds=", 7) == 0)
11833 {
11834 salt_pos += 7;
11835
11836 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
11837
11838 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
11839 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
11840
11841 salt_pos[0] = 0x0;
11842
11843 salt->salt_iter = atoi (salt_pos - iterations_len);
11844
11845 salt_pos += 1;
11846
11847 iterations_len += 8;
11848 }
11849 else
11850 {
11851 salt->salt_iter = ROUNDS_SHA512CRYPT;
11852 }
11853
11854 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
11855
11856 char *hash_pos = strchr (salt_pos, '$');
11857
11858 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11859
11860 uint salt_len = hash_pos - salt_pos;
11861
11862 if (salt_len > 16) return (PARSER_SALT_LENGTH);
11863
11864 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
11865
11866 salt->salt_len = salt_len;
11867
11868 hash_pos++;
11869
11870 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
11871
11872 return (PARSER_OK);
11873 }
11874
11875 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11876 {
11877 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
11878
11879 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
11880
11881 uint64_t *digest = (uint64_t *) hash_buf->digest;
11882
11883 salt_t *salt = hash_buf->salt;
11884
11885 uint keccak_mdlen = input_len / 2;
11886
11887 for (uint i = 0; i < keccak_mdlen / 8; i++)
11888 {
11889 digest[i] = hex_to_uint64_t (&input_buf[i * 16]);
11890
11891 digest[i] = byte_swap_64 (digest[i]);
11892 }
11893
11894 salt->keccak_mdlen = keccak_mdlen;
11895
11896 return (PARSER_OK);
11897 }
11898
11899 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11900 {
11901 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
11902
11903 uint32_t *digest = (uint32_t *) hash_buf->digest;
11904
11905 salt_t *salt = hash_buf->salt;
11906
11907 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
11908
11909 /**
11910 * Parse that strange long line
11911 */
11912
11913 char *in_off[9];
11914
11915 size_t in_len[9];
11916
11917 in_off[0] = strtok (input_buf, ":");
11918
11919 in_len[0] = strlen (in_off[0]);
11920
11921 size_t i;
11922
11923 for (i = 1; i < 9; i++)
11924 {
11925 in_off[i] = strtok (NULL, ":");
11926
11927 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11928
11929 in_len[i] = strlen (in_off[i]);
11930 }
11931
11932 char *ptr;
11933
11934 ptr = (char *) ikepsk->msg_buf;
11935
11936 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_char (in_off[0] + i);
11937 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_char (in_off[1] + i);
11938 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_char (in_off[2] + i);
11939 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_char (in_off[3] + i);
11940 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_char (in_off[4] + i);
11941 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_char (in_off[5] + i);
11942
11943 *ptr = 0x80;
11944
11945 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
11946
11947 ptr = (char *) ikepsk->nr_buf;
11948
11949 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_char (in_off[6] + i);
11950 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_char (in_off[7] + i);
11951
11952 *ptr = 0x80;
11953
11954 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
11955
11956 /**
11957 * Store to database
11958 */
11959
11960 ptr = in_off[8];
11961
11962 digest[0] = hex_to_uint (&ptr[ 0]);
11963 digest[1] = hex_to_uint (&ptr[ 8]);
11964 digest[2] = hex_to_uint (&ptr[16]);
11965 digest[3] = hex_to_uint (&ptr[24]);
11966
11967 digest[0] = byte_swap_32 (digest[0]);
11968 digest[1] = byte_swap_32 (digest[1]);
11969 digest[2] = byte_swap_32 (digest[2]);
11970 digest[3] = byte_swap_32 (digest[3]);
11971
11972 salt->salt_len = 32;
11973
11974 salt->salt_buf[0] = ikepsk->nr_buf[0];
11975 salt->salt_buf[1] = ikepsk->nr_buf[1];
11976 salt->salt_buf[2] = ikepsk->nr_buf[2];
11977 salt->salt_buf[3] = ikepsk->nr_buf[3];
11978 salt->salt_buf[4] = ikepsk->nr_buf[4];
11979 salt->salt_buf[5] = ikepsk->nr_buf[5];
11980 salt->salt_buf[6] = ikepsk->nr_buf[6];
11981 salt->salt_buf[7] = ikepsk->nr_buf[7];
11982
11983 return (PARSER_OK);
11984 }
11985
11986 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11987 {
11988 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
11989
11990 uint32_t *digest = (uint32_t *) hash_buf->digest;
11991
11992 salt_t *salt = hash_buf->salt;
11993
11994 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
11995
11996 /**
11997 * Parse that strange long line
11998 */
11999
12000 char *in_off[9];
12001
12002 size_t in_len[9];
12003
12004 in_off[0] = strtok (input_buf, ":");
12005
12006 in_len[0] = strlen (in_off[0]);
12007
12008 size_t i;
12009
12010 for (i = 1; i < 9; i++)
12011 {
12012 in_off[i] = strtok (NULL, ":");
12013
12014 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12015
12016 in_len[i] = strlen (in_off[i]);
12017 }
12018
12019 char *ptr;
12020
12021 ptr = (char *) ikepsk->msg_buf;
12022
12023 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_char (in_off[0] + i);
12024 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_char (in_off[1] + i);
12025 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_char (in_off[2] + i);
12026 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_char (in_off[3] + i);
12027 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_char (in_off[4] + i);
12028 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_char (in_off[5] + i);
12029
12030 *ptr = 0x80;
12031
12032 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12033
12034 ptr = (char *) ikepsk->nr_buf;
12035
12036 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_char (in_off[6] + i);
12037 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_char (in_off[7] + i);
12038
12039 *ptr = 0x80;
12040
12041 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12042
12043 /**
12044 * Store to database
12045 */
12046
12047 ptr = in_off[8];
12048
12049 digest[0] = hex_to_uint (&ptr[ 0]);
12050 digest[1] = hex_to_uint (&ptr[ 8]);
12051 digest[2] = hex_to_uint (&ptr[16]);
12052 digest[3] = hex_to_uint (&ptr[24]);
12053 digest[4] = hex_to_uint (&ptr[32]);
12054
12055 salt->salt_len = 32;
12056
12057 salt->salt_buf[0] = ikepsk->nr_buf[0];
12058 salt->salt_buf[1] = ikepsk->nr_buf[1];
12059 salt->salt_buf[2] = ikepsk->nr_buf[2];
12060 salt->salt_buf[3] = ikepsk->nr_buf[3];
12061 salt->salt_buf[4] = ikepsk->nr_buf[4];
12062 salt->salt_buf[5] = ikepsk->nr_buf[5];
12063 salt->salt_buf[6] = ikepsk->nr_buf[6];
12064 salt->salt_buf[7] = ikepsk->nr_buf[7];
12065
12066 return (PARSER_OK);
12067 }
12068
12069 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12070 {
12071 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12072
12073 uint32_t *digest = (uint32_t *) hash_buf->digest;
12074
12075 digest[0] = hex_to_uint (&input_buf[ 0]);
12076 digest[1] = hex_to_uint (&input_buf[ 8]);
12077 digest[2] = hex_to_uint (&input_buf[16]);
12078 digest[3] = hex_to_uint (&input_buf[24]);
12079 digest[4] = hex_to_uint (&input_buf[32]);
12080
12081 digest[0] = byte_swap_32 (digest[0]);
12082 digest[1] = byte_swap_32 (digest[1]);
12083 digest[2] = byte_swap_32 (digest[2]);
12084 digest[3] = byte_swap_32 (digest[3]);
12085 digest[4] = byte_swap_32 (digest[4]);
12086
12087 return (PARSER_OK);
12088 }
12089
12090 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12091 {
12092 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12093
12094 uint32_t *digest = (uint32_t *) hash_buf->digest;
12095
12096 digest[ 0] = hex_to_uint (&input_buf[ 0]);
12097 digest[ 1] = hex_to_uint (&input_buf[ 8]);
12098 digest[ 2] = hex_to_uint (&input_buf[ 16]);
12099 digest[ 3] = hex_to_uint (&input_buf[ 24]);
12100 digest[ 4] = hex_to_uint (&input_buf[ 32]);
12101 digest[ 5] = hex_to_uint (&input_buf[ 40]);
12102 digest[ 6] = hex_to_uint (&input_buf[ 48]);
12103 digest[ 7] = hex_to_uint (&input_buf[ 56]);
12104 digest[ 8] = hex_to_uint (&input_buf[ 64]);
12105 digest[ 9] = hex_to_uint (&input_buf[ 72]);
12106 digest[10] = hex_to_uint (&input_buf[ 80]);
12107 digest[11] = hex_to_uint (&input_buf[ 88]);
12108 digest[12] = hex_to_uint (&input_buf[ 96]);
12109 digest[13] = hex_to_uint (&input_buf[104]);
12110 digest[14] = hex_to_uint (&input_buf[112]);
12111 digest[15] = hex_to_uint (&input_buf[120]);
12112
12113 return (PARSER_OK);
12114 }
12115
12116 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12117 {
12118 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12119
12120 uint32_t *digest = (uint32_t *) hash_buf->digest;
12121
12122 salt_t *salt = hash_buf->salt;
12123
12124 digest[0] = hex_to_uint (&input_buf[ 0]);
12125 digest[1] = hex_to_uint (&input_buf[ 8]);
12126 digest[2] = hex_to_uint (&input_buf[16]);
12127 digest[3] = hex_to_uint (&input_buf[24]);
12128 digest[4] = hex_to_uint (&input_buf[32]);
12129
12130 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12131
12132 uint salt_len = input_len - 40 - 1;
12133
12134 char *salt_buf = input_buf + 40 + 1;
12135
12136 char *salt_buf_ptr = (char *) salt->salt_buf;
12137
12138 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12139
12140 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12141
12142 salt->salt_len = salt_len;
12143
12144 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12145
12146 return (PARSER_OK);
12147 }
12148
12149 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12150 {
12151 uint32_t *digest = (uint32_t *) hash_buf->digest;
12152
12153 salt_t *salt = hash_buf->salt;
12154
12155 tc_t *tc = (tc_t *) hash_buf->esalt;
12156
12157 if (input_len == 0)
12158 {
12159 log_error ("TrueCrypt container not specified");
12160
12161 exit (-1);
12162 }
12163
12164 FILE *fp = fopen (input_buf, "rb");
12165
12166 if (fp == NULL)
12167 {
12168 log_error ("%s: %s", input_buf, strerror (errno));
12169
12170 exit (-1);
12171 }
12172
12173 char buf[512];
12174
12175 int n = fread (buf, 1, sizeof (buf), fp);
12176
12177 fclose (fp);
12178
12179 if (n != 512) return (PARSER_TC_FILE_SIZE);
12180
12181 memcpy (tc->salt_buf, buf, 64);
12182
12183 memcpy (tc->data_buf, buf + 64, 512 - 64);
12184
12185 salt->salt_buf[0] = tc->salt_buf[0];
12186
12187 salt->salt_len = 4;
12188
12189 salt->salt_iter = 1000 - 1;
12190
12191 digest[0] = tc->data_buf[0];
12192
12193 return (PARSER_OK);
12194 }
12195
12196 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12197 {
12198 uint32_t *digest = (uint32_t *) hash_buf->digest;
12199
12200 salt_t *salt = hash_buf->salt;
12201
12202 tc_t *tc = (tc_t *) hash_buf->esalt;
12203
12204 if (input_len == 0)
12205 {
12206 log_error ("TrueCrypt container not specified");
12207
12208 exit (-1);
12209 }
12210
12211 FILE *fp = fopen (input_buf, "rb");
12212
12213 if (fp == NULL)
12214 {
12215 log_error ("%s: %s", input_buf, strerror (errno));
12216
12217 exit (-1);
12218 }
12219
12220 char buf[512];
12221
12222 int n = fread (buf, 1, sizeof (buf), fp);
12223
12224 fclose (fp);
12225
12226 if (n != 512) return (PARSER_TC_FILE_SIZE);
12227
12228 memcpy (tc->salt_buf, buf, 64);
12229
12230 memcpy (tc->data_buf, buf + 64, 512 - 64);
12231
12232 salt->salt_buf[0] = tc->salt_buf[0];
12233
12234 salt->salt_len = 4;
12235
12236 salt->salt_iter = 2000 - 1;
12237
12238 digest[0] = tc->data_buf[0];
12239
12240 return (PARSER_OK);
12241 }
12242
12243 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12244 {
12245 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12246
12247 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12248
12249 uint32_t *digest = (uint32_t *) hash_buf->digest;
12250
12251 salt_t *salt = hash_buf->salt;
12252
12253 char *salt_pos = input_buf + 6;
12254
12255 char *hash_pos = strchr (salt_pos, '$');
12256
12257 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12258
12259 uint salt_len = hash_pos - salt_pos;
12260
12261 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12262
12263 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12264
12265 salt->salt_len = salt_len;
12266
12267 salt->salt_iter = 1000;
12268
12269 hash_pos++;
12270
12271 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12272
12273 return (PARSER_OK);
12274 }
12275
12276 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12277 {
12278 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12279
12280 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12281
12282 uint32_t *digest = (uint32_t *) hash_buf->digest;
12283
12284 salt_t *salt = hash_buf->salt;
12285
12286 char *iter_pos = input_buf + 7;
12287
12288 char *salt_pos = strchr (iter_pos, '$');
12289
12290 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12291
12292 salt_pos++;
12293
12294 char *hash_pos = strchr (salt_pos, '$');
12295
12296 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12297
12298 uint salt_len = hash_pos - salt_pos;
12299
12300 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12301
12302 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12303
12304 salt->salt_len = salt_len;
12305
12306 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12307
12308 salt->salt_sign[0] = atoi (salt_iter);
12309
12310 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12311
12312 hash_pos++;
12313
12314 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12315
12316 digest[0] = byte_swap_32 (digest[0]);
12317 digest[1] = byte_swap_32 (digest[1]);
12318 digest[2] = byte_swap_32 (digest[2]);
12319 digest[3] = byte_swap_32 (digest[3]);
12320 digest[4] = byte_swap_32 (digest[4]);
12321
12322 return (PARSER_OK);
12323 }
12324
12325 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12326 {
12327 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12328
12329 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12330
12331 uint32_t *digest = (uint32_t *) hash_buf->digest;
12332
12333 salt_t *salt = hash_buf->salt;
12334
12335 char *iter_pos = input_buf + 9;
12336
12337 char *salt_pos = strchr (iter_pos, '$');
12338
12339 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12340
12341 salt_pos++;
12342
12343 char *hash_pos = strchr (salt_pos, '$');
12344
12345 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12346
12347 uint salt_len = hash_pos - salt_pos;
12348
12349 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12350
12351 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12352
12353 salt->salt_len = salt_len;
12354
12355 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12356
12357 salt->salt_sign[0] = atoi (salt_iter);
12358
12359 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12360
12361 hash_pos++;
12362
12363 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12364
12365 digest[0] = byte_swap_32 (digest[0]);
12366 digest[1] = byte_swap_32 (digest[1]);
12367 digest[2] = byte_swap_32 (digest[2]);
12368 digest[3] = byte_swap_32 (digest[3]);
12369 digest[4] = byte_swap_32 (digest[4]);
12370 digest[5] = byte_swap_32 (digest[5]);
12371 digest[6] = byte_swap_32 (digest[6]);
12372 digest[7] = byte_swap_32 (digest[7]);
12373
12374 return (PARSER_OK);
12375 }
12376
12377 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12378 {
12379 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12380
12381 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12382
12383 uint64_t *digest = (uint64_t *) hash_buf->digest;
12384
12385 salt_t *salt = hash_buf->salt;
12386
12387 char *iter_pos = input_buf + 9;
12388
12389 char *salt_pos = strchr (iter_pos, '$');
12390
12391 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12392
12393 salt_pos++;
12394
12395 char *hash_pos = strchr (salt_pos, '$');
12396
12397 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12398
12399 uint salt_len = hash_pos - salt_pos;
12400
12401 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12402
12403 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12404
12405 salt->salt_len = salt_len;
12406
12407 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12408
12409 salt->salt_sign[0] = atoi (salt_iter);
12410
12411 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12412
12413 hash_pos++;
12414
12415 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12416
12417 digest[0] = byte_swap_64 (digest[0]);
12418 digest[1] = byte_swap_64 (digest[1]);
12419 digest[2] = byte_swap_64 (digest[2]);
12420 digest[3] = byte_swap_64 (digest[3]);
12421 digest[4] = byte_swap_64 (digest[4]);
12422 digest[5] = byte_swap_64 (digest[5]);
12423 digest[6] = byte_swap_64 (digest[6]);
12424 digest[7] = byte_swap_64 (digest[7]);
12425
12426 return (PARSER_OK);
12427 }
12428
12429 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12430 {
12431 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12432
12433 uint32_t *digest = (uint32_t *) hash_buf->digest;
12434
12435 salt_t *salt = hash_buf->salt;
12436
12437 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12438
12439 /**
12440 * parse line
12441 */
12442
12443 char *iterations_pos = input_buf;
12444
12445 char *saltbuf_pos = strchr (iterations_pos, ':');
12446
12447 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12448
12449 uint iterations_len = saltbuf_pos - iterations_pos;
12450
12451 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12452
12453 saltbuf_pos++;
12454
12455 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12456
12457 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12458
12459 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12460
12461 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12462
12463 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12464
12465 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12466
12467 cipherbuf_pos++;
12468
12469 /**
12470 * pbkdf2 iterations
12471 */
12472
12473 salt->salt_iter = atoi (iterations_pos) - 1;
12474
12475 /**
12476 * handle salt encoding
12477 */
12478
12479 char *saltbuf_ptr = (char *) salt->salt_buf;
12480
12481 for (uint i = 0; i < saltbuf_len; i += 2)
12482 {
12483 const char p0 = saltbuf_pos[i + 0];
12484 const char p1 = saltbuf_pos[i + 1];
12485
12486 *saltbuf_ptr++ = hex_convert (p1) << 0
12487 | hex_convert (p0) << 4;
12488 }
12489
12490 salt->salt_len = saltbuf_len / 2;
12491
12492 /**
12493 * handle cipher encoding
12494 */
12495
12496 uint *tmp = (uint *) mymalloc (32);
12497
12498 char *cipherbuf_ptr = (char *) tmp;
12499
12500 for (uint i = 2016; i < cipherbuf_len; i += 2)
12501 {
12502 const char p0 = cipherbuf_pos[i + 0];
12503 const char p1 = cipherbuf_pos[i + 1];
12504
12505 *cipherbuf_ptr++ = hex_convert (p1) << 0
12506 | hex_convert (p0) << 4;
12507 }
12508
12509 // iv is stored at salt_buf 4 (length 16)
12510 // data is stored at salt_buf 8 (length 16)
12511
12512 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12513 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12514 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12515 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12516
12517 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12518 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12519 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12520 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12521
12522 free (tmp);
12523
12524 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12525 {
12526 const char p0 = cipherbuf_pos[j + 0];
12527 const char p1 = cipherbuf_pos[j + 1];
12528
12529 agilekey->cipher[i] = hex_convert (p1) << 0
12530 | hex_convert (p0) << 4;
12531 }
12532
12533 /**
12534 * digest buf
12535 */
12536
12537 digest[0] = 0x10101010;
12538 digest[1] = 0x10101010;
12539 digest[2] = 0x10101010;
12540 digest[3] = 0x10101010;
12541
12542 return (PARSER_OK);
12543 }
12544
12545 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12546 {
12547 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12548
12549 uint32_t *digest = (uint32_t *) hash_buf->digest;
12550
12551 salt_t *salt = hash_buf->salt;
12552
12553 char *hashbuf_pos = input_buf;
12554
12555 char *iterations_pos = strchr (hashbuf_pos, ':');
12556
12557 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12558
12559 uint hash_len = iterations_pos - hashbuf_pos;
12560
12561 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12562
12563 iterations_pos++;
12564
12565 char *saltbuf_pos = strchr (iterations_pos, ':');
12566
12567 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12568
12569 uint iterations_len = saltbuf_pos - iterations_pos;
12570
12571 saltbuf_pos++;
12572
12573 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12574
12575 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12576
12577 char *salt_buf_ptr = (char *) salt->salt_buf;
12578
12579 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12580
12581 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12582
12583 salt->salt_len = salt_len;
12584
12585 salt->salt_iter = atoi (iterations_pos) - 1;
12586
12587 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
12588 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
12589 digest[2] = hex_to_uint (&hashbuf_pos[16]);
12590 digest[3] = hex_to_uint (&hashbuf_pos[24]);
12591
12592 return (PARSER_OK);
12593 }
12594
12595 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12596 {
12597 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12598
12599 uint32_t *digest = (uint32_t *) hash_buf->digest;
12600
12601 digest[0] = hex_to_uint (&input_buf[ 0]);
12602 digest[1] = hex_to_uint (&input_buf[ 8]);
12603 digest[2] = hex_to_uint (&input_buf[16]);
12604 digest[3] = hex_to_uint (&input_buf[24]);
12605 digest[4] = hex_to_uint (&input_buf[32]);
12606 digest[5] = hex_to_uint (&input_buf[40]);
12607 digest[6] = hex_to_uint (&input_buf[48]);
12608 digest[7] = hex_to_uint (&input_buf[56]);
12609
12610 digest[0] = byte_swap_32 (digest[0]);
12611 digest[1] = byte_swap_32 (digest[1]);
12612 digest[2] = byte_swap_32 (digest[2]);
12613 digest[3] = byte_swap_32 (digest[3]);
12614 digest[4] = byte_swap_32 (digest[4]);
12615 digest[5] = byte_swap_32 (digest[5]);
12616 digest[6] = byte_swap_32 (digest[6]);
12617 digest[7] = byte_swap_32 (digest[7]);
12618
12619 return (PARSER_OK);
12620 }
12621
12622 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12623 {
12624 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12625
12626 uint32_t *digest = (uint32_t *) hash_buf->digest;
12627
12628 salt_t *salt = hash_buf->salt;
12629
12630 char *salt_pos = input_buf + 3;
12631
12632 uint iterations_len = 0;
12633
12634 if (memcmp (salt_pos, "rounds=", 7) == 0)
12635 {
12636 salt_pos += 7;
12637
12638 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12639
12640 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12641 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12642
12643 salt_pos[0] = 0x0;
12644
12645 salt->salt_iter = atoi (salt_pos - iterations_len);
12646
12647 salt_pos += 1;
12648
12649 iterations_len += 8;
12650 }
12651 else
12652 {
12653 salt->salt_iter = ROUNDS_SHA256CRYPT;
12654 }
12655
12656 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12657
12658 char *hash_pos = strchr (salt_pos, '$');
12659
12660 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12661
12662 uint salt_len = hash_pos - salt_pos;
12663
12664 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12665
12666 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12667
12668 salt->salt_len = salt_len;
12669
12670 hash_pos++;
12671
12672 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12673
12674 return (PARSER_OK);
12675 }
12676
12677 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12678 {
12679 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12680
12681 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12682
12683 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12684
12685 uint64_t *digest = (uint64_t *) hash_buf->digest;
12686
12687 salt_t *salt = hash_buf->salt;
12688
12689 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12690
12691 char *iter_pos = input_buf + 4;
12692
12693 char *salt_pos = strchr (iter_pos, '$');
12694
12695 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12696
12697 salt_pos++;
12698
12699 char *hash_pos = strchr (salt_pos, '$');
12700
12701 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12702
12703 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12704
12705 hash_pos++;
12706
12707 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
12708 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
12709 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
12710 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
12711 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
12712 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
12713 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
12714 digest[7] = hex_to_uint64_t (&hash_pos[112]);
12715
12716 uint salt_len = hash_pos - salt_pos - 1;
12717
12718 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12719
12720 salt->salt_len = salt_len / 2;
12721
12722 pbkdf2_sha512->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
12723 pbkdf2_sha512->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
12724 pbkdf2_sha512->salt_buf[2] = hex_to_uint (&salt_pos[16]);
12725 pbkdf2_sha512->salt_buf[3] = hex_to_uint (&salt_pos[24]);
12726 pbkdf2_sha512->salt_buf[4] = hex_to_uint (&salt_pos[32]);
12727 pbkdf2_sha512->salt_buf[5] = hex_to_uint (&salt_pos[40]);
12728 pbkdf2_sha512->salt_buf[6] = hex_to_uint (&salt_pos[48]);
12729 pbkdf2_sha512->salt_buf[7] = hex_to_uint (&salt_pos[56]);
12730
12731 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12732 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12733 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12734 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12735 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12736 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12737 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12738 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12739 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12740 pbkdf2_sha512->salt_buf[9] = 0x80;
12741
12742 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12743
12744 salt->salt_iter = atoi (iter_pos) - 1;
12745
12746 return (PARSER_OK);
12747 }
12748
12749 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12750 {
12751 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12752
12753 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12754
12755 uint32_t *digest = (uint32_t *) hash_buf->digest;
12756
12757 salt_t *salt = hash_buf->salt;
12758
12759 char *salt_pos = input_buf + 14;
12760
12761 char *hash_pos = strchr (salt_pos, '*');
12762
12763 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12764
12765 hash_pos++;
12766
12767 uint salt_len = hash_pos - salt_pos - 1;
12768
12769 char *salt_buf_ptr = (char *) salt->salt_buf;
12770
12771 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
12772
12773 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12774
12775 salt->salt_len = salt_len;
12776
12777 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
12778
12779 base64_decode (base64_to_int, hash_pos, 43, tmp_buf);
12780
12781 memcpy (digest, tmp_buf, 32);
12782
12783 digest[0] = byte_swap_32 (digest[0]);
12784 digest[1] = byte_swap_32 (digest[1]);
12785 digest[2] = byte_swap_32 (digest[2]);
12786 digest[3] = byte_swap_32 (digest[3]);
12787 digest[4] = byte_swap_32 (digest[4]);
12788 digest[5] = byte_swap_32 (digest[5]);
12789 digest[6] = byte_swap_32 (digest[6]);
12790 digest[7] = byte_swap_32 (digest[7]);
12791
12792 digest[0] -= SHA256M_A;
12793 digest[1] -= SHA256M_B;
12794 digest[2] -= SHA256M_C;
12795 digest[3] -= SHA256M_D;
12796 digest[4] -= SHA256M_E;
12797 digest[5] -= SHA256M_F;
12798 digest[6] -= SHA256M_G;
12799 digest[7] -= SHA256M_H;
12800
12801 return (PARSER_OK);
12802 }
12803
12804 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12805 {
12806 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
12807
12808 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12809
12810 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
12811
12812 uint64_t *digest = (uint64_t *) hash_buf->digest;
12813
12814 salt_t *salt = hash_buf->salt;
12815
12816 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12817
12818 char *iter_pos = input_buf + 19;
12819
12820 char *salt_pos = strchr (iter_pos, '.');
12821
12822 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12823
12824 salt_pos++;
12825
12826 char *hash_pos = strchr (salt_pos, '.');
12827
12828 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12829
12830 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12831
12832 hash_pos++;
12833
12834 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
12835 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
12836 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
12837 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
12838 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
12839 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
12840 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
12841 digest[7] = hex_to_uint64_t (&hash_pos[112]);
12842
12843 uint salt_len = hash_pos - salt_pos - 1;
12844
12845 salt_len /= 2;
12846
12847 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
12848
12849 uint i;
12850
12851 for (i = 0; i < salt_len; i++)
12852 {
12853 salt_buf_ptr[i] = hex_to_char (&salt_pos[i * 2]);
12854 }
12855
12856 salt_buf_ptr[salt_len + 3] = 0x01;
12857 salt_buf_ptr[salt_len + 4] = 0x80;
12858
12859 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12860
12861 salt->salt_len = salt_len;
12862
12863 salt->salt_iter = atoi (iter_pos) - 1;
12864
12865 return (PARSER_OK);
12866 }
12867
12868 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12869 {
12870 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
12871
12872 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12873
12874 uint64_t *digest = (uint64_t *) hash_buf->digest;
12875
12876 salt_t *salt = hash_buf->salt;
12877
12878 char tmp_buf[120];
12879
12880 memset (tmp_buf, 0, sizeof (tmp_buf));
12881
12882 int tmp_len = base64_decode (base64_to_int, input_buf + 9, input_len - 9, tmp_buf);
12883
12884 memcpy (digest, tmp_buf, 64);
12885
12886 digest[0] = byte_swap_64 (digest[0]);
12887 digest[1] = byte_swap_64 (digest[1]);
12888 digest[2] = byte_swap_64 (digest[2]);
12889 digest[3] = byte_swap_64 (digest[3]);
12890 digest[4] = byte_swap_64 (digest[4]);
12891 digest[5] = byte_swap_64 (digest[5]);
12892 digest[6] = byte_swap_64 (digest[6]);
12893 digest[7] = byte_swap_64 (digest[7]);
12894
12895 digest[0] -= SHA512M_A;
12896 digest[1] -= SHA512M_B;
12897 digest[2] -= SHA512M_C;
12898 digest[3] -= SHA512M_D;
12899 digest[4] -= SHA512M_E;
12900 digest[5] -= SHA512M_F;
12901 digest[6] -= SHA512M_G;
12902 digest[7] -= SHA512M_H;
12903
12904 salt->salt_len = tmp_len - 64;
12905
12906 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
12907
12908 if (data.opts_type & OPTS_TYPE_ST_ADD80)
12909 {
12910 char *ptr = (char *) salt->salt_buf;
12911
12912 ptr[salt->salt_len] = 0x80;
12913 }
12914
12915 return (PARSER_OK);
12916 }
12917
12918 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12919 {
12920 if (data.opts_type & OPTS_TYPE_ST_HEX)
12921 {
12922 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
12923 }
12924 else
12925 {
12926 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
12927 }
12928
12929 uint32_t *digest = (uint32_t *) hash_buf->digest;
12930
12931 salt_t *salt = hash_buf->salt;
12932
12933 digest[0] = hex_to_uint (&input_buf[ 0]);
12934 digest[1] = hex_to_uint (&input_buf[ 8]);
12935 digest[2] = hex_to_uint (&input_buf[16]);
12936 digest[3] = hex_to_uint (&input_buf[24]);
12937
12938 digest[0] = byte_swap_32 (digest[0]);
12939 digest[1] = byte_swap_32 (digest[1]);
12940 digest[2] = byte_swap_32 (digest[2]);
12941 digest[3] = byte_swap_32 (digest[3]);
12942
12943 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12944
12945 uint salt_len = input_len - 32 - 1;
12946
12947 char *salt_buf = input_buf + 32 + 1;
12948
12949 char *salt_buf_ptr = (char *) salt->salt_buf;
12950
12951 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12952
12953 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12954
12955 salt->salt_len = salt_len;
12956
12957 return (PARSER_OK);
12958 }
12959
12960 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12961 {
12962 if (data.opts_type & OPTS_TYPE_ST_HEX)
12963 {
12964 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
12965 }
12966 else
12967 {
12968 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
12969 }
12970
12971 uint32_t *digest = (uint32_t *) hash_buf->digest;
12972
12973 salt_t *salt = hash_buf->salt;
12974
12975 digest[0] = hex_to_uint (&input_buf[ 0]);
12976 digest[1] = hex_to_uint (&input_buf[ 8]);
12977 digest[2] = hex_to_uint (&input_buf[16]);
12978 digest[3] = hex_to_uint (&input_buf[24]);
12979 digest[4] = hex_to_uint (&input_buf[32]);
12980
12981 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12982
12983 uint salt_len = input_len - 40 - 1;
12984
12985 char *salt_buf = input_buf + 40 + 1;
12986
12987 char *salt_buf_ptr = (char *) salt->salt_buf;
12988
12989 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12990
12991 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12992
12993 salt->salt_len = salt_len;
12994
12995 return (PARSER_OK);
12996 }
12997
12998 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12999 {
13000 if (data.opts_type & OPTS_TYPE_ST_HEX)
13001 {
13002 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13003 }
13004 else
13005 {
13006 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13007 }
13008
13009 uint32_t *digest = (uint32_t *) hash_buf->digest;
13010
13011 salt_t *salt = hash_buf->salt;
13012
13013 digest[0] = hex_to_uint (&input_buf[ 0]);
13014 digest[1] = hex_to_uint (&input_buf[ 8]);
13015 digest[2] = hex_to_uint (&input_buf[16]);
13016 digest[3] = hex_to_uint (&input_buf[24]);
13017 digest[4] = hex_to_uint (&input_buf[32]);
13018 digest[5] = hex_to_uint (&input_buf[40]);
13019 digest[6] = hex_to_uint (&input_buf[48]);
13020 digest[7] = hex_to_uint (&input_buf[56]);
13021
13022 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13023
13024 uint salt_len = input_len - 64 - 1;
13025
13026 char *salt_buf = input_buf + 64 + 1;
13027
13028 char *salt_buf_ptr = (char *) salt->salt_buf;
13029
13030 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13031
13032 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13033
13034 salt->salt_len = salt_len;
13035
13036 return (PARSER_OK);
13037 }
13038
13039 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13040 {
13041 if (data.opts_type & OPTS_TYPE_ST_HEX)
13042 {
13043 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13044 }
13045 else
13046 {
13047 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13048 }
13049
13050 uint64_t *digest = (uint64_t *) hash_buf->digest;
13051
13052 salt_t *salt = hash_buf->salt;
13053
13054 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
13055 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
13056 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
13057 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
13058 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
13059 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
13060 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
13061 digest[7] = hex_to_uint64_t (&input_buf[112]);
13062
13063 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13064
13065 uint salt_len = input_len - 128 - 1;
13066
13067 char *salt_buf = input_buf + 128 + 1;
13068
13069 char *salt_buf_ptr = (char *) salt->salt_buf;
13070
13071 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13072
13073 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13074
13075 salt->salt_len = salt_len;
13076
13077 return (PARSER_OK);
13078 }
13079
13080 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13081 {
13082 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13083
13084 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13085
13086 uint32_t *digest = (uint32_t *) hash_buf->digest;
13087
13088 salt_t *salt = hash_buf->salt;
13089
13090 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13091
13092 /**
13093 * parse line
13094 */
13095
13096 char *user_pos = input_buf + 10 + 1;
13097
13098 char *realm_pos = strchr (user_pos, '$');
13099
13100 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13101
13102 uint user_len = realm_pos - user_pos;
13103
13104 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13105
13106 realm_pos++;
13107
13108 char *salt_pos = strchr (realm_pos, '$');
13109
13110 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13111
13112 uint realm_len = salt_pos - realm_pos;
13113
13114 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13115
13116 salt_pos++;
13117
13118 char *data_pos = strchr (salt_pos, '$');
13119
13120 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13121
13122 uint salt_len = data_pos - salt_pos;
13123
13124 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13125
13126 data_pos++;
13127
13128 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13129
13130 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13131
13132 /**
13133 * copy data
13134 */
13135
13136 memcpy (krb5pa->user, user_pos, user_len);
13137 memcpy (krb5pa->realm, realm_pos, realm_len);
13138 memcpy (krb5pa->salt, salt_pos, salt_len);
13139
13140 char *timestamp_ptr = (char *) krb5pa->timestamp;
13141
13142 for (uint i = 0; i < (36 * 2); i += 2)
13143 {
13144 const char p0 = data_pos[i + 0];
13145 const char p1 = data_pos[i + 1];
13146
13147 *timestamp_ptr++ = hex_convert (p1) << 0
13148 | hex_convert (p0) << 4;
13149 }
13150
13151 char *checksum_ptr = (char *) krb5pa->checksum;
13152
13153 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13154 {
13155 const char p0 = data_pos[i + 0];
13156 const char p1 = data_pos[i + 1];
13157
13158 *checksum_ptr++ = hex_convert (p1) << 0
13159 | hex_convert (p0) << 4;
13160 }
13161
13162 /**
13163 * copy some data to generic buffers to make sorting happy
13164 */
13165
13166 salt->salt_buf[0] = krb5pa->timestamp[0];
13167 salt->salt_buf[1] = krb5pa->timestamp[1];
13168 salt->salt_buf[2] = krb5pa->timestamp[2];
13169 salt->salt_buf[3] = krb5pa->timestamp[3];
13170 salt->salt_buf[4] = krb5pa->timestamp[4];
13171 salt->salt_buf[5] = krb5pa->timestamp[5];
13172 salt->salt_buf[6] = krb5pa->timestamp[6];
13173 salt->salt_buf[7] = krb5pa->timestamp[7];
13174 salt->salt_buf[8] = krb5pa->timestamp[8];
13175
13176 salt->salt_len = 36;
13177
13178 digest[0] = krb5pa->checksum[0];
13179 digest[1] = krb5pa->checksum[1];
13180 digest[2] = krb5pa->checksum[2];
13181 digest[3] = krb5pa->checksum[3];
13182
13183 return (PARSER_OK);
13184 }
13185
13186 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13187 {
13188 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13189
13190 uint32_t *digest = (uint32_t *) hash_buf->digest;
13191
13192 salt_t *salt = hash_buf->salt;
13193
13194 /**
13195 * parse line
13196 */
13197
13198 char *salt_pos = input_buf;
13199
13200 char *hash_pos = strchr (salt_pos, '$');
13201
13202 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13203
13204 uint salt_len = hash_pos - salt_pos;
13205
13206 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13207
13208 hash_pos++;
13209
13210 uint hash_len = input_len - 1 - salt_len;
13211
13212 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13213
13214 /**
13215 * valid some data
13216 */
13217
13218 uint user_len = 0;
13219
13220 for (uint i = 0; i < salt_len; i++)
13221 {
13222 if (salt_pos[i] == ' ') continue;
13223
13224 user_len++;
13225 }
13226
13227 // SAP user names cannot be longer than 12 characters
13228 if (user_len > 12) return (PARSER_SALT_LENGTH);
13229
13230 // SAP user name cannot start with ! or ?
13231 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13232
13233 /**
13234 * copy data
13235 */
13236
13237 char *salt_buf_ptr = (char *) salt->salt_buf;
13238
13239 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13240
13241 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13242
13243 salt->salt_len = salt_len;
13244
13245 digest[0] = hex_to_uint (&hash_pos[0]);
13246 digest[1] = hex_to_uint (&hash_pos[8]);
13247 digest[2] = 0;
13248 digest[3] = 0;
13249
13250 digest[0] = byte_swap_32 (digest[0]);
13251 digest[1] = byte_swap_32 (digest[1]);
13252
13253 return (PARSER_OK);
13254 }
13255
13256 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13257 {
13258 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13259
13260 uint32_t *digest = (uint32_t *) hash_buf->digest;
13261
13262 salt_t *salt = hash_buf->salt;
13263
13264 /**
13265 * parse line
13266 */
13267
13268 char *salt_pos = input_buf;
13269
13270 char *hash_pos = strchr (salt_pos, '$');
13271
13272 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13273
13274 uint salt_len = hash_pos - salt_pos;
13275
13276 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13277
13278 hash_pos++;
13279
13280 uint hash_len = input_len - 1 - salt_len;
13281
13282 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13283
13284 /**
13285 * valid some data
13286 */
13287
13288 uint user_len = 0;
13289
13290 for (uint i = 0; i < salt_len; i++)
13291 {
13292 if (salt_pos[i] == ' ') continue;
13293
13294 user_len++;
13295 }
13296
13297 // SAP user names cannot be longer than 12 characters
13298 if (user_len > 12) return (PARSER_SALT_LENGTH);
13299
13300 // SAP user name cannot start with ! or ?
13301 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13302
13303 /**
13304 * copy data
13305 */
13306
13307 char *salt_buf_ptr = (char *) salt->salt_buf;
13308
13309 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13310
13311 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13312
13313 salt->salt_len = salt_len;
13314
13315 digest[0] = hex_to_uint (&hash_pos[ 0]);
13316 digest[1] = hex_to_uint (&hash_pos[ 8]);
13317 digest[2] = hex_to_uint (&hash_pos[16]);
13318 digest[3] = hex_to_uint (&hash_pos[24]);
13319 digest[4] = hex_to_uint (&hash_pos[32]);
13320
13321 return (PARSER_OK);
13322 }
13323
13324 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13325 {
13326 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13327
13328 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13329
13330 uint64_t *digest = (uint64_t *) hash_buf->digest;
13331
13332 salt_t *salt = hash_buf->salt;
13333
13334 char *iter_pos = input_buf + 3;
13335
13336 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13337
13338 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13339
13340 memcpy ((char *) salt->salt_sign, input_buf, 4);
13341
13342 salt->salt_iter = salt_iter;
13343
13344 char *salt_pos = iter_pos + 1;
13345
13346 uint salt_len = 8;
13347
13348 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13349
13350 salt->salt_len = salt_len;
13351
13352 char *hash_pos = salt_pos + salt_len;
13353
13354 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13355
13356 // ugly hack start
13357
13358 char *tmp = (char *) salt->salt_buf_pc;
13359
13360 tmp[0] = hash_pos[42];
13361
13362 // ugly hack end
13363
13364 digest[ 0] = byte_swap_64 (digest[ 0]);
13365 digest[ 1] = byte_swap_64 (digest[ 1]);
13366 digest[ 2] = byte_swap_64 (digest[ 2]);
13367 digest[ 3] = byte_swap_64 (digest[ 3]);
13368 digest[ 4] = 0;
13369 digest[ 5] = 0;
13370 digest[ 6] = 0;
13371 digest[ 7] = 0;
13372
13373 return (PARSER_OK);
13374 }
13375
13376 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13377 {
13378 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13379
13380 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13381
13382 uint32_t *digest = (uint32_t *) hash_buf->digest;
13383
13384 salt_t *salt = hash_buf->salt;
13385
13386 char *salt_buf = input_buf + 6;
13387
13388 uint salt_len = 16;
13389
13390 char *salt_buf_ptr = (char *) salt->salt_buf;
13391
13392 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13393
13394 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13395
13396 salt->salt_len = salt_len;
13397
13398 char *hash_pos = input_buf + 6 + 16;
13399
13400 digest[0] = hex_to_uint (&hash_pos[ 0]);
13401 digest[1] = hex_to_uint (&hash_pos[ 8]);
13402 digest[2] = hex_to_uint (&hash_pos[16]);
13403 digest[3] = hex_to_uint (&hash_pos[24]);
13404 digest[4] = hex_to_uint (&hash_pos[32]);
13405 digest[5] = hex_to_uint (&hash_pos[40]);
13406 digest[6] = hex_to_uint (&hash_pos[48]);
13407 digest[7] = hex_to_uint (&hash_pos[56]);
13408
13409 return (PARSER_OK);
13410 }
13411
13412 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13413 {
13414 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13415
13416 uint32_t *digest = (uint32_t *) hash_buf->digest;
13417
13418 digest[0] = hex_to_uint (&input_buf[ 0]);
13419 digest[1] = hex_to_uint (&input_buf[ 8]);
13420 digest[2] = 0;
13421 digest[3] = 0;
13422
13423 return (PARSER_OK);
13424 }
13425
13426 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13427 {
13428 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13429
13430 uint32_t *digest = (uint32_t *) hash_buf->digest;
13431
13432 salt_t *salt = hash_buf->salt;
13433
13434 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13435
13436 char *saltbuf_pos = input_buf;
13437
13438 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13439
13440 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13441
13442 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13443
13444 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13445 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13446
13447 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13448
13449 hashbuf_pos++;
13450
13451 uint hashbuf_len = input_len - saltbuf_len - 1;
13452
13453 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13454
13455 char *salt_ptr = (char *) saltbuf_pos;
13456 char *rakp_ptr = (char *) rakp->salt_buf;
13457
13458 uint i;
13459 uint j;
13460
13461 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13462 {
13463 rakp_ptr[j] = hex_to_char (&salt_ptr[i]);
13464 }
13465
13466 rakp_ptr[j] = 0x80;
13467
13468 rakp->salt_len = j;
13469
13470 for (i = 0; i < 64; i++)
13471 {
13472 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13473 }
13474
13475 salt->salt_buf[0] = rakp->salt_buf[0];
13476 salt->salt_buf[1] = rakp->salt_buf[1];
13477 salt->salt_buf[2] = rakp->salt_buf[2];
13478 salt->salt_buf[3] = rakp->salt_buf[3];
13479 salt->salt_buf[4] = rakp->salt_buf[4];
13480 salt->salt_buf[5] = rakp->salt_buf[5];
13481 salt->salt_buf[6] = rakp->salt_buf[6];
13482 salt->salt_buf[7] = rakp->salt_buf[7];
13483
13484 salt->salt_len = 32; // muss min. 32 haben
13485
13486 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
13487 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
13488 digest[2] = hex_to_uint (&hashbuf_pos[16]);
13489 digest[3] = hex_to_uint (&hashbuf_pos[24]);
13490 digest[4] = hex_to_uint (&hashbuf_pos[32]);
13491
13492 return (PARSER_OK);
13493 }
13494
13495 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13496 {
13497 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13498
13499 uint32_t *digest = (uint32_t *) hash_buf->digest;
13500
13501 salt_t *salt = hash_buf->salt;
13502
13503 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13504
13505 char *salt_pos = input_buf + 1;
13506
13507 memcpy (salt->salt_buf, salt_pos, 8);
13508
13509 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13510 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13511
13512 salt->salt_len = 8;
13513
13514 char *hash_pos = salt_pos + 8;
13515
13516 digest[0] = hex_to_uint (&hash_pos[ 0]);
13517 digest[1] = hex_to_uint (&hash_pos[ 8]);
13518 digest[2] = hex_to_uint (&hash_pos[16]);
13519 digest[3] = hex_to_uint (&hash_pos[24]);
13520 digest[4] = hex_to_uint (&hash_pos[32]);
13521
13522 digest[0] -= SHA1M_A;
13523 digest[1] -= SHA1M_B;
13524 digest[2] -= SHA1M_C;
13525 digest[3] -= SHA1M_D;
13526 digest[4] -= SHA1M_E;
13527
13528 return (PARSER_OK);
13529 }
13530
13531 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13532 {
13533 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13534
13535 uint32_t *digest = (uint32_t *) hash_buf->digest;
13536
13537 salt_t *salt = hash_buf->salt;
13538
13539 digest[0] = hex_to_uint (&input_buf[ 0]);
13540 digest[1] = hex_to_uint (&input_buf[ 8]);
13541 digest[2] = hex_to_uint (&input_buf[16]);
13542 digest[3] = hex_to_uint (&input_buf[24]);
13543
13544 digest[0] = byte_swap_32 (digest[0]);
13545 digest[1] = byte_swap_32 (digest[1]);
13546 digest[2] = byte_swap_32 (digest[2]);
13547 digest[3] = byte_swap_32 (digest[3]);
13548
13549 digest[0] -= MD5M_A;
13550 digest[1] -= MD5M_B;
13551 digest[2] -= MD5M_C;
13552 digest[3] -= MD5M_D;
13553
13554 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13555
13556 char *salt_buf_ptr = input_buf + 32 + 1;
13557
13558 uint32_t *salt_buf = salt->salt_buf;
13559
13560 salt_buf[0] = hex_to_uint (&salt_buf_ptr[ 0]);
13561 salt_buf[1] = hex_to_uint (&salt_buf_ptr[ 8]);
13562 salt_buf[2] = hex_to_uint (&salt_buf_ptr[16]);
13563 salt_buf[3] = hex_to_uint (&salt_buf_ptr[24]);
13564
13565 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13566 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13567 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13568 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13569
13570 salt->salt_len = 16 + 1;
13571
13572 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13573
13574 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13575
13576 salt_buf[4] = hex_to_char (&idbyte_buf_ptr[0]) & 0xff;
13577
13578 return (PARSER_OK);
13579 }
13580
13581 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13582 {
13583 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13584
13585 uint32_t *digest = (uint32_t *) hash_buf->digest;
13586
13587 salt_t *salt = hash_buf->salt;
13588
13589 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13590
13591 /**
13592 * parse line
13593 */
13594
13595 char *hashbuf_pos = input_buf;
13596
13597 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13598
13599 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13600
13601 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13602
13603 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13604
13605 saltbuf_pos++;
13606
13607 char *iteration_pos = strchr (saltbuf_pos, ':');
13608
13609 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13610
13611 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13612
13613 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13614
13615 iteration_pos++;
13616
13617 char *databuf_pos = strchr (iteration_pos, ':');
13618
13619 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13620
13621 const uint iteration_len = databuf_pos - iteration_pos;
13622
13623 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13624 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13625
13626 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13627
13628 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13629 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13630
13631 databuf_pos++;
13632
13633 // digest
13634
13635 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
13636 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
13637 digest[2] = hex_to_uint (&hashbuf_pos[16]);
13638 digest[3] = hex_to_uint (&hashbuf_pos[24]);
13639 digest[4] = hex_to_uint (&hashbuf_pos[32]);
13640 digest[5] = hex_to_uint (&hashbuf_pos[40]);
13641 digest[6] = hex_to_uint (&hashbuf_pos[48]);
13642 digest[7] = hex_to_uint (&hashbuf_pos[56]);
13643
13644 // salt
13645
13646 char *saltbuf_ptr = (char *) salt->salt_buf;
13647
13648 for (uint i = 0; i < saltbuf_len; i += 2)
13649 {
13650 const char p0 = saltbuf_pos[i + 0];
13651 const char p1 = saltbuf_pos[i + 1];
13652
13653 *saltbuf_ptr++ = hex_convert (p1) << 0
13654 | hex_convert (p0) << 4;
13655 }
13656
13657 salt->salt_buf[4] = 0x01000000;
13658 salt->salt_buf[5] = 0x80;
13659
13660 salt->salt_len = saltbuf_len / 2;
13661
13662 // iteration
13663
13664 salt->salt_iter = atoi (iteration_pos) - 1;
13665
13666 // data
13667
13668 char *databuf_ptr = (char *) cloudkey->data_buf;
13669
13670 for (uint i = 0; i < databuf_len; i += 2)
13671 {
13672 const char p0 = databuf_pos[i + 0];
13673 const char p1 = databuf_pos[i + 1];
13674
13675 *databuf_ptr++ = hex_convert (p1) << 0
13676 | hex_convert (p0) << 4;
13677 }
13678
13679 *databuf_ptr++ = 0x80;
13680
13681 for (uint i = 0; i < 512; i++)
13682 {
13683 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13684 }
13685
13686 cloudkey->data_len = databuf_len / 2;
13687
13688 return (PARSER_OK);
13689 }
13690
13691 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13692 {
13693 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13694
13695 uint32_t *digest = (uint32_t *) hash_buf->digest;
13696
13697 salt_t *salt = hash_buf->salt;
13698
13699 /**
13700 * parse line
13701 */
13702
13703 char *hashbuf_pos = input_buf;
13704
13705 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13706
13707 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13708
13709 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13710
13711 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13712
13713 domainbuf_pos++;
13714
13715 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13716
13717 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13718
13719 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13720
13721 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13722
13723 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13724
13725 saltbuf_pos++;
13726
13727 char *iteration_pos = strchr (saltbuf_pos, ':');
13728
13729 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13730
13731 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13732
13733 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13734
13735 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13736
13737 iteration_pos++;
13738
13739 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13740
13741 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13742 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13743
13744 // ok, the plan for this algorithm is the following:
13745 // we have 2 salts here, the domain-name and a random salt
13746 // while both are used in the initial transformation,
13747 // only the random salt is used in the following iterations
13748 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13749 // and one that includes only the real salt (stored into salt_buf[]).
13750 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13751
13752 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
13753
13754 base32_decode (itoa32_to_int, hashbuf_pos, 32, tmp_buf);
13755
13756 memcpy (digest, tmp_buf, 20);
13757
13758 digest[0] = byte_swap_32 (digest[0]);
13759 digest[1] = byte_swap_32 (digest[1]);
13760 digest[2] = byte_swap_32 (digest[2]);
13761 digest[3] = byte_swap_32 (digest[3]);
13762 digest[4] = byte_swap_32 (digest[4]);
13763
13764 // domain
13765
13766 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13767
13768 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
13769
13770 char *len_ptr = NULL;
13771
13772 for (uint i = 0; i < domainbuf_len; i++)
13773 {
13774 if (salt_buf_pc_ptr[i] == '.')
13775 {
13776 len_ptr = &salt_buf_pc_ptr[i];
13777
13778 *len_ptr = 0;
13779 }
13780 else
13781 {
13782 *len_ptr += 1;
13783 }
13784 }
13785
13786 salt->salt_buf_pc[7] = domainbuf_len;
13787
13788 // "real" salt
13789
13790 char *salt_buf_ptr = (char *) salt->salt_buf;
13791
13792 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
13793
13794 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13795
13796 salt->salt_len = salt_len;
13797
13798 // iteration
13799
13800 salt->salt_iter = atoi (iteration_pos);
13801
13802 return (PARSER_OK);
13803 }
13804
13805 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13806 {
13807 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
13808
13809 uint32_t *digest = (uint32_t *) hash_buf->digest;
13810
13811 salt_t *salt = hash_buf->salt;
13812
13813 digest[0] = hex_to_uint (&input_buf[ 0]);
13814 digest[1] = hex_to_uint (&input_buf[ 8]);
13815 digest[2] = hex_to_uint (&input_buf[16]);
13816 digest[3] = hex_to_uint (&input_buf[24]);
13817 digest[4] = hex_to_uint (&input_buf[32]);
13818
13819 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13820
13821 uint salt_len = input_len - 40 - 1;
13822
13823 char *salt_buf = input_buf + 40 + 1;
13824
13825 char *salt_buf_ptr = (char *) salt->salt_buf;
13826
13827 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13828
13829 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13830
13831 salt->salt_len = salt_len;
13832
13833 return (PARSER_OK);
13834 }
13835
13836 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13837 {
13838 const uint8_t ascii_to_ebcdic[] =
13839 {
13840 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
13841 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
13842 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
13843 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
13844 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
13845 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
13846 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
13847 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
13848 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
13849 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
13850 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
13851 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
13852 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
13853 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
13854 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
13855 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
13856 };
13857
13858 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
13859
13860 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13861
13862 uint32_t *digest = (uint32_t *) hash_buf->digest;
13863
13864 salt_t *salt = hash_buf->salt;
13865
13866 char *salt_pos = input_buf + 6 + 1;
13867
13868 char *digest_pos = strchr (salt_pos, '*');
13869
13870 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13871
13872 uint salt_len = digest_pos - salt_pos;
13873
13874 if (salt_len > 8) return (PARSER_SALT_LENGTH);
13875
13876 uint hash_len = input_len - 1 - salt_len - 1 - 6;
13877
13878 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13879
13880 digest_pos++;
13881
13882 char *salt_buf_ptr = (char *) salt->salt_buf;
13883 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13884
13885 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13886
13887 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13888
13889 salt->salt_len = salt_len;
13890
13891 for (uint i = 0; i < salt_len; i++)
13892 {
13893 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
13894 }
13895 for (uint i = salt_len; i < 8; i++)
13896 {
13897 salt_buf_pc_ptr[i] = 0x40;
13898 }
13899
13900 uint tt;
13901
13902 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
13903
13904 salt->salt_buf_pc[0] = ROTATE_LEFT (salt->salt_buf_pc[0], 3u);
13905 salt->salt_buf_pc[1] = ROTATE_LEFT (salt->salt_buf_pc[1], 3u);
13906
13907 digest[0] = hex_to_uint (&digest_pos[ 0]);
13908 digest[1] = hex_to_uint (&digest_pos[ 8]);
13909
13910 digest[0] = byte_swap_32 (digest[0]);
13911 digest[1] = byte_swap_32 (digest[1]);
13912
13913 IP (digest[0], digest[1], tt);
13914
13915 digest[0] = ROTATE_RIGHT (digest[0], 29);
13916 digest[1] = ROTATE_RIGHT (digest[1], 29);
13917 digest[2] = 0;
13918 digest[3] = 0;
13919
13920 return (PARSER_OK);
13921 }
13922
13923 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13924 {
13925 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
13926
13927 uint32_t *digest = (uint32_t *) hash_buf->digest;
13928
13929 digest[0] = hex_to_uint (&input_buf[ 0]);
13930 digest[1] = hex_to_uint (&input_buf[ 8]);
13931 digest[2] = hex_to_uint (&input_buf[16]);
13932 digest[3] = hex_to_uint (&input_buf[24]);
13933
13934 digest[0] = byte_swap_32 (digest[0]);
13935 digest[1] = byte_swap_32 (digest[1]);
13936 digest[2] = byte_swap_32 (digest[2]);
13937 digest[3] = byte_swap_32 (digest[3]);
13938
13939 return (PARSER_OK);
13940 }
13941
13942 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13943 {
13944 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
13945
13946 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
13947
13948 uint32_t *digest = (uint32_t *) hash_buf->digest;
13949
13950 salt_t *salt = hash_buf->salt;
13951
13952 char tmp_buf[120];
13953
13954 memset (tmp_buf, 0, sizeof (tmp_buf));
13955
13956 base64_decode (lotus64_to_int, input_buf + 2, input_len - 3, tmp_buf);
13957
13958 tmp_buf[3] += -4; // dont ask!
13959
13960 memcpy (salt->salt_buf, tmp_buf, 5);
13961
13962 salt->salt_len = 5;
13963
13964 memcpy (digest, tmp_buf + 5, 9);
13965
13966 // yes, only 9 byte are needed to crack, but 10 to display
13967
13968 salt->salt_buf_pc[7] = input_buf[20];
13969
13970 return (PARSER_OK);
13971 }
13972
13973 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13974 {
13975 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
13976
13977 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
13978
13979 uint32_t *digest = (uint32_t *) hash_buf->digest;
13980
13981 salt_t *salt = hash_buf->salt;
13982
13983 char tmp_buf[120];
13984
13985 memset (tmp_buf, 0, sizeof (tmp_buf));
13986
13987 base64_decode (lotus64_to_int, input_buf + 2, input_len - 3, tmp_buf);
13988
13989 tmp_buf[3] += -4; // dont ask!
13990
13991 // salt
13992
13993 memcpy (salt->salt_buf, tmp_buf, 16);
13994
13995 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)
13996
13997 // iteration
13998
13999 char tmp_iter_buf[11];
14000
14001 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14002
14003 tmp_iter_buf[10] = 0;
14004
14005 salt->salt_iter = atoi (tmp_iter_buf);
14006
14007 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14008 {
14009 return (PARSER_SALT_ITERATION);
14010 }
14011
14012 salt->salt_iter--; // first round in init
14013
14014 // 2 additional bytes for display only
14015
14016 salt->salt_buf_pc[0] = tmp_buf[26];
14017 salt->salt_buf_pc[1] = tmp_buf[27];
14018
14019 // digest
14020
14021 memcpy (digest, tmp_buf + 28, 8);
14022
14023 digest[0] = byte_swap_32 (digest[0]);
14024 digest[1] = byte_swap_32 (digest[1]);
14025 digest[2] = 0;
14026 digest[3] = 0;
14027
14028 return (PARSER_OK);
14029 }
14030
14031 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14032 {
14033 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14034
14035 uint32_t *digest = (uint32_t *) hash_buf->digest;
14036
14037 salt_t *salt = hash_buf->salt;
14038
14039 char *salt_buf_pos = input_buf;
14040
14041 char *hash_buf_pos = salt_buf_pos + 6;
14042
14043 digest[0] = hex_to_uint (&hash_buf_pos[ 0]);
14044 digest[1] = hex_to_uint (&hash_buf_pos[ 8]);
14045 digest[2] = hex_to_uint (&hash_buf_pos[16]);
14046 digest[3] = hex_to_uint (&hash_buf_pos[24]);
14047 digest[4] = hex_to_uint (&hash_buf_pos[32]);
14048 digest[5] = hex_to_uint (&hash_buf_pos[40]);
14049 digest[6] = hex_to_uint (&hash_buf_pos[48]);
14050 digest[7] = hex_to_uint (&hash_buf_pos[56]);
14051
14052 digest[0] -= SHA256M_A;
14053 digest[1] -= SHA256M_B;
14054 digest[2] -= SHA256M_C;
14055 digest[3] -= SHA256M_D;
14056 digest[4] -= SHA256M_E;
14057 digest[5] -= SHA256M_F;
14058 digest[6] -= SHA256M_G;
14059 digest[7] -= SHA256M_H;
14060
14061 char *salt_buf_ptr = (char *) salt->salt_buf;
14062
14063 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14064
14065 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14066
14067 salt->salt_len = salt_len;
14068
14069 return (PARSER_OK);
14070 }
14071
14072 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14073 {
14074 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14075
14076 uint32_t *digest = (uint32_t *) hash_buf->digest;
14077
14078 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14079
14080 salt_t *salt = hash_buf->salt;
14081
14082 char *salt_buf = input_buf + 6;
14083
14084 char *digest_buf = strchr (salt_buf, '$');
14085
14086 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14087
14088 uint salt_len = digest_buf - salt_buf;
14089
14090 digest_buf++; // skip the '$' symbol
14091
14092 char *salt_buf_ptr = (char *) salt->salt_buf;
14093
14094 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14095
14096 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14097
14098 salt->salt_len = salt_len;
14099
14100 digest[0] = hex_to_uint (&digest_buf[ 0]);
14101 digest[1] = hex_to_uint (&digest_buf[ 8]);
14102 digest[2] = hex_to_uint (&digest_buf[16]);
14103 digest[3] = hex_to_uint (&digest_buf[24]);
14104
14105 digest[0] = byte_swap_32 (digest[0]);
14106 digest[1] = byte_swap_32 (digest[1]);
14107 digest[2] = byte_swap_32 (digest[2]);
14108 digest[3] = byte_swap_32 (digest[3]);
14109
14110 digest[0] -= MD5M_A;
14111 digest[1] -= MD5M_B;
14112 digest[2] -= MD5M_C;
14113 digest[3] -= MD5M_D;
14114
14115 return (PARSER_OK);
14116 }
14117
14118 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14119 {
14120 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14121
14122 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14123
14124 uint32_t *digest = (uint32_t *) hash_buf->digest;
14125
14126 salt_t *salt = hash_buf->salt;
14127
14128 char *salt_buf = input_buf + 3;
14129
14130 char *digest_buf = strchr (salt_buf, '$');
14131
14132 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14133
14134 uint salt_len = digest_buf - salt_buf;
14135
14136 digest_buf++; // skip the '$' symbol
14137
14138 char *salt_buf_ptr = (char *) salt->salt_buf;
14139
14140 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14141
14142 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14143
14144 salt_buf_ptr[salt_len] = 0x2d;
14145
14146 salt->salt_len = salt_len + 1;
14147
14148 digest[0] = hex_to_uint (&digest_buf[ 0]);
14149 digest[1] = hex_to_uint (&digest_buf[ 8]);
14150 digest[2] = hex_to_uint (&digest_buf[16]);
14151 digest[3] = hex_to_uint (&digest_buf[24]);
14152
14153 digest[0] = byte_swap_32 (digest[0]);
14154 digest[1] = byte_swap_32 (digest[1]);
14155 digest[2] = byte_swap_32 (digest[2]);
14156 digest[3] = byte_swap_32 (digest[3]);
14157
14158 digest[0] -= MD5M_A;
14159 digest[1] -= MD5M_B;
14160 digest[2] -= MD5M_C;
14161 digest[3] -= MD5M_D;
14162
14163 return (PARSER_OK);
14164 }
14165
14166 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14167 {
14168 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14169
14170 uint32_t *digest = (uint32_t *) hash_buf->digest;
14171
14172 char tmp_buf[100];
14173
14174 memset (tmp_buf, 0, sizeof (tmp_buf));
14175
14176 base64_decode (base64_to_int, input_buf, input_len, tmp_buf);
14177
14178 memcpy (digest, tmp_buf, 20);
14179
14180 digest[0] = byte_swap_32 (digest[0]);
14181 digest[1] = byte_swap_32 (digest[1]);
14182 digest[2] = byte_swap_32 (digest[2]);
14183 digest[3] = byte_swap_32 (digest[3]);
14184 digest[4] = byte_swap_32 (digest[4]);
14185
14186 digest[0] -= SHA1M_A;
14187 digest[1] -= SHA1M_B;
14188 digest[2] -= SHA1M_C;
14189 digest[3] -= SHA1M_D;
14190 digest[4] -= SHA1M_E;
14191
14192 return (PARSER_OK);
14193 }
14194
14195 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14196 {
14197 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14198
14199 uint32_t *digest = (uint32_t *) hash_buf->digest;
14200
14201 salt_t *salt = hash_buf->salt;
14202
14203 digest[0] = hex_to_uint (&input_buf[ 0]);
14204 digest[1] = hex_to_uint (&input_buf[ 8]);
14205 digest[2] = hex_to_uint (&input_buf[16]);
14206 digest[3] = hex_to_uint (&input_buf[24]);
14207
14208 digest[0] = byte_swap_32 (digest[0]);
14209 digest[1] = byte_swap_32 (digest[1]);
14210 digest[2] = byte_swap_32 (digest[2]);
14211 digest[3] = byte_swap_32 (digest[3]);
14212
14213 digest[0] -= MD5M_A;
14214 digest[1] -= MD5M_B;
14215 digest[2] -= MD5M_C;
14216 digest[3] -= MD5M_D;
14217
14218 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14219
14220 uint salt_len = input_len - 32 - 1;
14221
14222 char *salt_buf = input_buf + 32 + 1;
14223
14224 char *salt_buf_ptr = (char *) salt->salt_buf;
14225
14226 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14227
14228 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14229
14230 /*
14231 * add static "salt" part
14232 */
14233
14234 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14235
14236 salt_len += 8;
14237
14238 salt->salt_len = salt_len;
14239
14240 return (PARSER_OK);
14241 }
14242
14243 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14244 {
14245 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14246
14247 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14248
14249 uint32_t *digest = (uint32_t *) hash_buf->digest;
14250
14251 salt_t *salt = hash_buf->salt;
14252
14253 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14254
14255 /**
14256 * parse line
14257 */
14258
14259 char *saltlen_pos = input_buf + 1 + 3 + 1;
14260
14261 char *saltbuf_pos = strchr (saltlen_pos, '$');
14262
14263 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14264
14265 uint saltlen_len = saltbuf_pos - saltlen_pos;
14266
14267 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14268
14269 saltbuf_pos++;
14270
14271 char *keylen_pos = strchr (saltbuf_pos, '$');
14272
14273 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14274
14275 uint saltbuf_len = keylen_pos - saltbuf_pos;
14276
14277 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14278
14279 keylen_pos++;
14280
14281 char *keybuf_pos = strchr (keylen_pos, '$');
14282
14283 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14284
14285 uint keylen_len = keybuf_pos - keylen_pos;
14286
14287 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14288
14289 keybuf_pos++;
14290
14291 char *databuf_pos = strchr (keybuf_pos, '$');
14292
14293 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14294
14295 uint keybuf_len = databuf_pos - keybuf_pos;
14296
14297 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14298
14299 databuf_pos++;
14300
14301 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14302
14303 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14304
14305 /**
14306 * copy data
14307 */
14308
14309 digest[0] = hex_to_uint (&keybuf_pos[ 0]);
14310 digest[1] = hex_to_uint (&keybuf_pos[ 8]);
14311 digest[2] = hex_to_uint (&keybuf_pos[16]);
14312 digest[3] = hex_to_uint (&keybuf_pos[24]);
14313
14314 salt->salt_buf[0] = hex_to_uint (&saltbuf_pos[ 0]);
14315 salt->salt_buf[1] = hex_to_uint (&saltbuf_pos[ 8]);
14316 salt->salt_buf[2] = hex_to_uint (&saltbuf_pos[16]);
14317 salt->salt_buf[3] = hex_to_uint (&saltbuf_pos[24]);
14318
14319 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14320 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14321 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14322 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14323
14324 salt->salt_len = 16;
14325 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14326
14327 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14328 {
14329 androidfde->data[j] = hex_to_uint (&databuf_pos[i]);
14330 }
14331
14332 return (PARSER_OK);
14333 }
14334
14335 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14336 {
14337 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14338
14339 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14340
14341 uint32_t *digest = (uint32_t *) hash_buf->digest;
14342
14343 salt_t *salt = hash_buf->salt;
14344
14345 /**
14346 * parse line
14347 */
14348
14349 // first is the N salt parameter
14350
14351 char *N_pos = input_buf + 6;
14352
14353 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14354
14355 N_pos++;
14356
14357 salt->scrypt_N = atoi (N_pos);
14358
14359 // r
14360
14361 char *r_pos = strchr (N_pos, ':');
14362
14363 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14364
14365 r_pos++;
14366
14367 salt->scrypt_r = atoi (r_pos);
14368
14369 // p
14370
14371 char *p_pos = strchr (r_pos, ':');
14372
14373 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14374
14375 p_pos++;
14376
14377 salt->scrypt_p = atoi (p_pos);
14378
14379 // salt
14380
14381 char *saltbuf_pos = strchr (p_pos, ':');
14382
14383 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14384
14385 saltbuf_pos++;
14386
14387 char *hash_pos = strchr (saltbuf_pos, ':');
14388
14389 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14390
14391 hash_pos++;
14392
14393 // base64 decode
14394
14395 char tmp_buf[32];
14396
14397 memset (tmp_buf, 0, sizeof (tmp_buf));
14398
14399 int tmp_len = base64_decode (base64_to_int, saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14400
14401 char *salt_buf_ptr = (char *) salt->salt_buf;
14402
14403 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14404
14405 salt->salt_len = tmp_len;
14406 salt->salt_iter = 1;
14407
14408 // digest - base64 decode
14409
14410 memset (tmp_buf, 0, sizeof (tmp_buf));
14411
14412 tmp_len = input_len - (hash_pos - input_buf);
14413
14414 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14415
14416 base64_decode (base64_to_int, hash_pos, tmp_len, tmp_buf);
14417
14418 memcpy (digest, tmp_buf, 32);
14419
14420 return (PARSER_OK);
14421 }
14422
14423 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14424 {
14425 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14426
14427 uint32_t *digest = (uint32_t *) hash_buf->digest;
14428
14429 salt_t *salt = hash_buf->salt;
14430
14431 /**
14432 * parse line
14433 */
14434
14435 char decrypted[76]; // iv + hash
14436
14437 juniper_decrypt_hash (input_buf, decrypted);
14438
14439 char *md5crypt_hash = decrypted + 12;
14440
14441 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14442
14443 salt->salt_iter = ROUNDS_MD5CRYPT;
14444
14445 char *salt_pos = md5crypt_hash + 3;
14446
14447 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14448
14449 salt->salt_len = hash_pos - salt_pos; // should be 8
14450
14451 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14452
14453 hash_pos++;
14454
14455 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14456
14457 return (PARSER_OK);
14458 }
14459
14460 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14461 {
14462 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14463
14464 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14465
14466 uint32_t *digest = (uint32_t *) hash_buf->digest;
14467
14468 salt_t *salt = hash_buf->salt;
14469
14470 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14471
14472 /**
14473 * parse line
14474 */
14475
14476 // first is *raw* salt
14477
14478 char *salt_pos = input_buf + 3;
14479
14480 char *hash_pos = strchr (salt_pos, '$');
14481
14482 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14483
14484 uint salt_len = hash_pos - salt_pos;
14485
14486 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14487
14488 hash_pos++;
14489
14490 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14491
14492 memcpy (salt_buf_ptr, salt_pos, 14);
14493
14494 salt_buf_ptr[17] = 0x01;
14495 salt_buf_ptr[18] = 0x80;
14496
14497 // add some stuff to normal salt to make sorted happy
14498
14499 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14500 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14501 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14502 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14503
14504 salt->salt_len = salt_len;
14505 salt->salt_iter = ROUNDS_CISCO8 - 1;
14506
14507 // base64 decode hash
14508
14509 char tmp_buf[100];
14510
14511 memset (tmp_buf, 0, sizeof (tmp_buf));
14512
14513 uint hash_len = input_len - 3 - salt_len - 1;
14514
14515 int tmp_len = base64_decode (itoa64_to_int, hash_pos, hash_len, tmp_buf);
14516
14517 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14518
14519 memcpy (digest, tmp_buf, 32);
14520
14521 digest[0] = byte_swap_32 (digest[0]);
14522 digest[1] = byte_swap_32 (digest[1]);
14523 digest[2] = byte_swap_32 (digest[2]);
14524 digest[3] = byte_swap_32 (digest[3]);
14525 digest[4] = byte_swap_32 (digest[4]);
14526 digest[5] = byte_swap_32 (digest[5]);
14527 digest[6] = byte_swap_32 (digest[6]);
14528 digest[7] = byte_swap_32 (digest[7]);
14529
14530 return (PARSER_OK);
14531 }
14532
14533 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14534 {
14535 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14536
14537 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14538
14539 uint32_t *digest = (uint32_t *) hash_buf->digest;
14540
14541 salt_t *salt = hash_buf->salt;
14542
14543 /**
14544 * parse line
14545 */
14546
14547 // first is *raw* salt
14548
14549 char *salt_pos = input_buf + 3;
14550
14551 char *hash_pos = strchr (salt_pos, '$');
14552
14553 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14554
14555 uint salt_len = hash_pos - salt_pos;
14556
14557 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14558
14559 salt->salt_len = salt_len;
14560 hash_pos++;
14561
14562 char *salt_buf_ptr = (char *) salt->salt_buf;
14563
14564 memcpy (salt_buf_ptr, salt_pos, salt_len);
14565 salt_buf_ptr[salt_len] = 0;
14566
14567 // base64 decode hash
14568
14569 char tmp_buf[100];
14570
14571 memset (tmp_buf, 0, sizeof (tmp_buf));
14572
14573 uint hash_len = input_len - 3 - salt_len - 1;
14574
14575 int tmp_len = base64_decode (itoa64_to_int, hash_pos, hash_len, tmp_buf);
14576
14577 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14578
14579 memcpy (digest, tmp_buf, 32);
14580
14581 // fixed:
14582 salt->scrypt_N = 16384;
14583 salt->scrypt_r = 1;
14584 salt->scrypt_p = 1;
14585 salt->salt_iter = 1;
14586
14587 return (PARSER_OK);
14588 }
14589
14590 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14591 {
14592 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14593
14594 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14595
14596 uint32_t *digest = (uint32_t *) hash_buf->digest;
14597
14598 salt_t *salt = hash_buf->salt;
14599
14600 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14601
14602 /**
14603 * parse line
14604 */
14605
14606 char *version_pos = input_buf + 8 + 1;
14607
14608 char *verifierHashSize_pos = strchr (version_pos, '*');
14609
14610 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14611
14612 uint32_t version_len = verifierHashSize_pos - version_pos;
14613
14614 if (version_len != 4) return (PARSER_SALT_LENGTH);
14615
14616 verifierHashSize_pos++;
14617
14618 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14619
14620 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14621
14622 uint32_t verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14623
14624 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14625
14626 keySize_pos++;
14627
14628 char *saltSize_pos = strchr (keySize_pos, '*');
14629
14630 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14631
14632 uint32_t keySize_len = saltSize_pos - keySize_pos;
14633
14634 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14635
14636 saltSize_pos++;
14637
14638 char *osalt_pos = strchr (saltSize_pos, '*');
14639
14640 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14641
14642 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14643
14644 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14645
14646 osalt_pos++;
14647
14648 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14649
14650 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14651
14652 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14653
14654 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14655
14656 encryptedVerifier_pos++;
14657
14658 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14659
14660 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14661
14662 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14663
14664 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14665
14666 encryptedVerifierHash_pos++;
14667
14668 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;
14669
14670 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14671
14672 const uint version = atoi (version_pos);
14673
14674 if (version != 2007) return (PARSER_SALT_VALUE);
14675
14676 const uint verifierHashSize = atoi (verifierHashSize_pos);
14677
14678 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14679
14680 const uint keySize = atoi (keySize_pos);
14681
14682 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14683
14684 office2007->keySize = keySize;
14685
14686 const uint saltSize = atoi (saltSize_pos);
14687
14688 if (saltSize != 16) return (PARSER_SALT_VALUE);
14689
14690 /**
14691 * salt
14692 */
14693
14694 salt->salt_len = 16;
14695 salt->salt_iter = ROUNDS_OFFICE2007;
14696
14697 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14698 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14699 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14700 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14701
14702 /**
14703 * esalt
14704 */
14705
14706 office2007->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14707 office2007->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14708 office2007->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14709 office2007->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14710
14711 office2007->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14712 office2007->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14713 office2007->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14714 office2007->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14715 office2007->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14716
14717 /**
14718 * digest
14719 */
14720
14721 digest[0] = office2007->encryptedVerifierHash[0];
14722 digest[1] = office2007->encryptedVerifierHash[1];
14723 digest[2] = office2007->encryptedVerifierHash[2];
14724 digest[3] = office2007->encryptedVerifierHash[3];
14725
14726 return (PARSER_OK);
14727 }
14728
14729 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14730 {
14731 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14732
14733 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14734
14735 uint32_t *digest = (uint32_t *) hash_buf->digest;
14736
14737 salt_t *salt = hash_buf->salt;
14738
14739 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14740
14741 /**
14742 * parse line
14743 */
14744
14745 char *version_pos = input_buf + 8 + 1;
14746
14747 char *spinCount_pos = strchr (version_pos, '*');
14748
14749 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14750
14751 uint32_t version_len = spinCount_pos - version_pos;
14752
14753 if (version_len != 4) return (PARSER_SALT_LENGTH);
14754
14755 spinCount_pos++;
14756
14757 char *keySize_pos = strchr (spinCount_pos, '*');
14758
14759 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14760
14761 uint32_t spinCount_len = keySize_pos - spinCount_pos;
14762
14763 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14764
14765 keySize_pos++;
14766
14767 char *saltSize_pos = strchr (keySize_pos, '*');
14768
14769 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14770
14771 uint32_t keySize_len = saltSize_pos - keySize_pos;
14772
14773 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14774
14775 saltSize_pos++;
14776
14777 char *osalt_pos = strchr (saltSize_pos, '*');
14778
14779 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14780
14781 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14782
14783 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14784
14785 osalt_pos++;
14786
14787 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14788
14789 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14790
14791 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14792
14793 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14794
14795 encryptedVerifier_pos++;
14796
14797 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14798
14799 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14800
14801 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14802
14803 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14804
14805 encryptedVerifierHash_pos++;
14806
14807 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;
14808
14809 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14810
14811 const uint version = atoi (version_pos);
14812
14813 if (version != 2010) return (PARSER_SALT_VALUE);
14814
14815 const uint spinCount = atoi (spinCount_pos);
14816
14817 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14818
14819 const uint keySize = atoi (keySize_pos);
14820
14821 if (keySize != 128) return (PARSER_SALT_VALUE);
14822
14823 const uint saltSize = atoi (saltSize_pos);
14824
14825 if (saltSize != 16) return (PARSER_SALT_VALUE);
14826
14827 /**
14828 * salt
14829 */
14830
14831 salt->salt_len = 16;
14832 salt->salt_iter = spinCount;
14833
14834 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14835 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14836 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14837 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14838
14839 /**
14840 * esalt
14841 */
14842
14843 office2010->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14844 office2010->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14845 office2010->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14846 office2010->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14847
14848 office2010->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14849 office2010->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14850 office2010->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14851 office2010->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14852 office2010->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14853 office2010->encryptedVerifierHash[5] = hex_to_uint (&encryptedVerifierHash_pos[40]);
14854 office2010->encryptedVerifierHash[6] = hex_to_uint (&encryptedVerifierHash_pos[48]);
14855 office2010->encryptedVerifierHash[7] = hex_to_uint (&encryptedVerifierHash_pos[56]);
14856
14857 /**
14858 * digest
14859 */
14860
14861 digest[0] = office2010->encryptedVerifierHash[0];
14862 digest[1] = office2010->encryptedVerifierHash[1];
14863 digest[2] = office2010->encryptedVerifierHash[2];
14864 digest[3] = office2010->encryptedVerifierHash[3];
14865
14866 return (PARSER_OK);
14867 }
14868
14869 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14870 {
14871 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
14872
14873 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14874
14875 uint32_t *digest = (uint32_t *) hash_buf->digest;
14876
14877 salt_t *salt = hash_buf->salt;
14878
14879 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
14880
14881 /**
14882 * parse line
14883 */
14884
14885 char *version_pos = input_buf + 8 + 1;
14886
14887 char *spinCount_pos = strchr (version_pos, '*');
14888
14889 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14890
14891 uint32_t version_len = spinCount_pos - version_pos;
14892
14893 if (version_len != 4) return (PARSER_SALT_LENGTH);
14894
14895 spinCount_pos++;
14896
14897 char *keySize_pos = strchr (spinCount_pos, '*');
14898
14899 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14900
14901 uint32_t spinCount_len = keySize_pos - spinCount_pos;
14902
14903 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14904
14905 keySize_pos++;
14906
14907 char *saltSize_pos = strchr (keySize_pos, '*');
14908
14909 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14910
14911 uint32_t keySize_len = saltSize_pos - keySize_pos;
14912
14913 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14914
14915 saltSize_pos++;
14916
14917 char *osalt_pos = strchr (saltSize_pos, '*');
14918
14919 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14920
14921 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14922
14923 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14924
14925 osalt_pos++;
14926
14927 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14928
14929 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14930
14931 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14932
14933 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14934
14935 encryptedVerifier_pos++;
14936
14937 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14938
14939 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14940
14941 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14942
14943 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14944
14945 encryptedVerifierHash_pos++;
14946
14947 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;
14948
14949 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14950
14951 const uint version = atoi (version_pos);
14952
14953 if (version != 2013) return (PARSER_SALT_VALUE);
14954
14955 const uint spinCount = atoi (spinCount_pos);
14956
14957 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14958
14959 const uint keySize = atoi (keySize_pos);
14960
14961 if (keySize != 256) return (PARSER_SALT_VALUE);
14962
14963 const uint saltSize = atoi (saltSize_pos);
14964
14965 if (saltSize != 16) return (PARSER_SALT_VALUE);
14966
14967 /**
14968 * salt
14969 */
14970
14971 salt->salt_len = 16;
14972 salt->salt_iter = spinCount;
14973
14974 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14975 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14976 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14977 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14978
14979 /**
14980 * esalt
14981 */
14982
14983 office2013->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14984 office2013->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14985 office2013->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14986 office2013->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14987
14988 office2013->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14989 office2013->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14990 office2013->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14991 office2013->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14992 office2013->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14993 office2013->encryptedVerifierHash[5] = hex_to_uint (&encryptedVerifierHash_pos[40]);
14994 office2013->encryptedVerifierHash[6] = hex_to_uint (&encryptedVerifierHash_pos[48]);
14995 office2013->encryptedVerifierHash[7] = hex_to_uint (&encryptedVerifierHash_pos[56]);
14996
14997 /**
14998 * digest
14999 */
15000
15001 digest[0] = office2013->encryptedVerifierHash[0];
15002 digest[1] = office2013->encryptedVerifierHash[1];
15003 digest[2] = office2013->encryptedVerifierHash[2];
15004 digest[3] = office2013->encryptedVerifierHash[3];
15005
15006 return (PARSER_OK);
15007 }
15008
15009 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15010 {
15011 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15012
15013 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15014
15015 uint32_t *digest = (uint32_t *) hash_buf->digest;
15016
15017 salt_t *salt = hash_buf->salt;
15018
15019 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15020
15021 /**
15022 * parse line
15023 */
15024
15025 char *version_pos = input_buf + 11;
15026
15027 char *osalt_pos = strchr (version_pos, '*');
15028
15029 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15030
15031 uint32_t version_len = osalt_pos - version_pos;
15032
15033 if (version_len != 1) return (PARSER_SALT_LENGTH);
15034
15035 osalt_pos++;
15036
15037 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15038
15039 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15040
15041 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15042
15043 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15044
15045 encryptedVerifier_pos++;
15046
15047 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15048
15049 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15050
15051 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15052
15053 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15054
15055 encryptedVerifierHash_pos++;
15056
15057 uint32_t encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15058
15059 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15060
15061 const uint version = *version_pos - 0x30;
15062
15063 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15064
15065 /**
15066 * esalt
15067 */
15068
15069 oldoffice01->version = version;
15070
15071 oldoffice01->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15072 oldoffice01->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15073 oldoffice01->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15074 oldoffice01->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15075
15076 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15077 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15078 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15079 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15080
15081 oldoffice01->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15082 oldoffice01->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15083 oldoffice01->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15084 oldoffice01->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15085
15086 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15087 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15088 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15089 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15090
15091 /**
15092 * salt
15093 */
15094
15095 salt->salt_len = 16;
15096
15097 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15098 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15099 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15100 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15101
15102 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15103 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15104 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15105 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15106
15107 // this is a workaround as office produces multiple documents with the same salt
15108
15109 salt->salt_len += 32;
15110
15111 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15112 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15113 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15114 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15115 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15116 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15117 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15118 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15119
15120 /**
15121 * digest
15122 */
15123
15124 digest[0] = oldoffice01->encryptedVerifierHash[0];
15125 digest[1] = oldoffice01->encryptedVerifierHash[1];
15126 digest[2] = oldoffice01->encryptedVerifierHash[2];
15127 digest[3] = oldoffice01->encryptedVerifierHash[3];
15128
15129 return (PARSER_OK);
15130 }
15131
15132 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15133 {
15134 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15135 }
15136
15137 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15138 {
15139 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15140
15141 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15142
15143 uint32_t *digest = (uint32_t *) hash_buf->digest;
15144
15145 salt_t *salt = hash_buf->salt;
15146
15147 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15148
15149 /**
15150 * parse line
15151 */
15152
15153 char *version_pos = input_buf + 11;
15154
15155 char *osalt_pos = strchr (version_pos, '*');
15156
15157 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15158
15159 uint32_t version_len = osalt_pos - version_pos;
15160
15161 if (version_len != 1) return (PARSER_SALT_LENGTH);
15162
15163 osalt_pos++;
15164
15165 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15166
15167 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15168
15169 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15170
15171 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15172
15173 encryptedVerifier_pos++;
15174
15175 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15176
15177 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15178
15179 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15180
15181 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15182
15183 encryptedVerifierHash_pos++;
15184
15185 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15186
15187 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15188
15189 uint32_t encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15190
15191 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15192
15193 rc4key_pos++;
15194
15195 uint32_t rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15196
15197 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15198
15199 const uint version = *version_pos - 0x30;
15200
15201 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15202
15203 /**
15204 * esalt
15205 */
15206
15207 oldoffice01->version = version;
15208
15209 oldoffice01->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15210 oldoffice01->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15211 oldoffice01->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15212 oldoffice01->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15213
15214 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15215 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15216 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15217 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15218
15219 oldoffice01->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15220 oldoffice01->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15221 oldoffice01->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15222 oldoffice01->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15223
15224 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15225 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15226 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15227 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15228
15229 oldoffice01->rc4key[1] = 0;
15230 oldoffice01->rc4key[0] = 0;
15231
15232 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15233 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15234 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15235 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15236 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15237 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15238 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15239 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15240 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15241 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15242
15243 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15244 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15245
15246 /**
15247 * salt
15248 */
15249
15250 salt->salt_len = 16;
15251
15252 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15253 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15254 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15255 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15256
15257 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15258 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15259 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15260 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15261
15262 // this is a workaround as office produces multiple documents with the same salt
15263
15264 salt->salt_len += 32;
15265
15266 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15267 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15268 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15269 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15270 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15271 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15272 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15273 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15274
15275 /**
15276 * digest
15277 */
15278
15279 digest[0] = oldoffice01->rc4key[0];
15280 digest[1] = oldoffice01->rc4key[1];
15281 digest[2] = 0;
15282 digest[3] = 0;
15283
15284 return (PARSER_OK);
15285 }
15286
15287 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15288 {
15289 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15290
15291 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15292
15293 uint32_t *digest = (uint32_t *) hash_buf->digest;
15294
15295 salt_t *salt = hash_buf->salt;
15296
15297 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15298
15299 /**
15300 * parse line
15301 */
15302
15303 char *version_pos = input_buf + 11;
15304
15305 char *osalt_pos = strchr (version_pos, '*');
15306
15307 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15308
15309 uint32_t version_len = osalt_pos - version_pos;
15310
15311 if (version_len != 1) return (PARSER_SALT_LENGTH);
15312
15313 osalt_pos++;
15314
15315 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15316
15317 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15318
15319 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15320
15321 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15322
15323 encryptedVerifier_pos++;
15324
15325 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15326
15327 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15328
15329 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15330
15331 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15332
15333 encryptedVerifierHash_pos++;
15334
15335 uint32_t encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15336
15337 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15338
15339 const uint version = *version_pos - 0x30;
15340
15341 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15342
15343 /**
15344 * esalt
15345 */
15346
15347 oldoffice34->version = version;
15348
15349 oldoffice34->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15350 oldoffice34->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15351 oldoffice34->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15352 oldoffice34->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15353
15354 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15355 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15356 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15357 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15358
15359 oldoffice34->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15360 oldoffice34->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15361 oldoffice34->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15362 oldoffice34->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15363 oldoffice34->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15364
15365 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15366 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15367 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15368 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15369 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15370
15371 /**
15372 * salt
15373 */
15374
15375 salt->salt_len = 16;
15376
15377 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15378 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15379 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15380 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15381
15382 // this is a workaround as office produces multiple documents with the same salt
15383
15384 salt->salt_len += 32;
15385
15386 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15387 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15388 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15389 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15390 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15391 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15392 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15393 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15394
15395 /**
15396 * digest
15397 */
15398
15399 digest[0] = oldoffice34->encryptedVerifierHash[0];
15400 digest[1] = oldoffice34->encryptedVerifierHash[1];
15401 digest[2] = oldoffice34->encryptedVerifierHash[2];
15402 digest[3] = oldoffice34->encryptedVerifierHash[3];
15403
15404 return (PARSER_OK);
15405 }
15406
15407 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15408 {
15409 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15410
15411 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15412 }
15413
15414 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15415 {
15416 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15417
15418 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15419
15420 uint32_t *digest = (uint32_t *) hash_buf->digest;
15421
15422 salt_t *salt = hash_buf->salt;
15423
15424 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15425
15426 /**
15427 * parse line
15428 */
15429
15430 char *version_pos = input_buf + 11;
15431
15432 char *osalt_pos = strchr (version_pos, '*');
15433
15434 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15435
15436 uint32_t version_len = osalt_pos - version_pos;
15437
15438 if (version_len != 1) return (PARSER_SALT_LENGTH);
15439
15440 osalt_pos++;
15441
15442 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15443
15444 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15445
15446 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15447
15448 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15449
15450 encryptedVerifier_pos++;
15451
15452 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15453
15454 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15455
15456 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15457
15458 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15459
15460 encryptedVerifierHash_pos++;
15461
15462 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15463
15464 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15465
15466 uint32_t encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15467
15468 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15469
15470 rc4key_pos++;
15471
15472 uint32_t rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15473
15474 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15475
15476 const uint version = *version_pos - 0x30;
15477
15478 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15479
15480 /**
15481 * esalt
15482 */
15483
15484 oldoffice34->version = version;
15485
15486 oldoffice34->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15487 oldoffice34->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15488 oldoffice34->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15489 oldoffice34->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15490
15491 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15492 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15493 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15494 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15495
15496 oldoffice34->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15497 oldoffice34->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15498 oldoffice34->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15499 oldoffice34->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15500 oldoffice34->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15501
15502 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15503 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15504 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15505 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15506 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15507
15508 oldoffice34->rc4key[1] = 0;
15509 oldoffice34->rc4key[0] = 0;
15510
15511 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15512 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15513 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15514 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15515 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15516 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15517 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15518 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15519 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15520 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15521
15522 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15523 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15524
15525 /**
15526 * salt
15527 */
15528
15529 salt->salt_len = 16;
15530
15531 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15532 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15533 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15534 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15535
15536 // this is a workaround as office produces multiple documents with the same salt
15537
15538 salt->salt_len += 32;
15539
15540 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15541 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15542 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15543 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15544 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15545 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15546 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15547 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15548
15549 /**
15550 * digest
15551 */
15552
15553 digest[0] = oldoffice34->rc4key[0];
15554 digest[1] = oldoffice34->rc4key[1];
15555 digest[2] = 0;
15556 digest[3] = 0;
15557
15558 return (PARSER_OK);
15559 }
15560
15561 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15562 {
15563 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15564
15565 uint32_t *digest = (uint32_t *) hash_buf->digest;
15566
15567 digest[0] = hex_to_uint (&input_buf[ 0]);
15568 digest[1] = hex_to_uint (&input_buf[ 8]);
15569 digest[2] = hex_to_uint (&input_buf[16]);
15570 digest[3] = hex_to_uint (&input_buf[24]);
15571
15572 digest[0] = byte_swap_32 (digest[0]);
15573 digest[1] = byte_swap_32 (digest[1]);
15574 digest[2] = byte_swap_32 (digest[2]);
15575 digest[3] = byte_swap_32 (digest[3]);
15576
15577 return (PARSER_OK);
15578 }
15579
15580 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15581 {
15582 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15583
15584 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15585
15586 uint32_t *digest = (uint32_t *) hash_buf->digest;
15587
15588 salt_t *salt = hash_buf->salt;
15589
15590 char *signature_pos = input_buf;
15591
15592 char *salt_pos = strchr (signature_pos, '$');
15593
15594 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15595
15596 uint32_t signature_len = salt_pos - signature_pos;
15597
15598 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15599
15600 salt_pos++;
15601
15602 char *hash_pos = strchr (salt_pos, '$');
15603
15604 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15605
15606 uint32_t salt_len = hash_pos - salt_pos;
15607
15608 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15609
15610 hash_pos++;
15611
15612 uint32_t hash_len = input_len - signature_len - 1 - salt_len - 1;
15613
15614 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15615
15616 digest[0] = hex_to_uint (&hash_pos[ 0]);
15617 digest[1] = hex_to_uint (&hash_pos[ 8]);
15618 digest[2] = hex_to_uint (&hash_pos[16]);
15619 digest[3] = hex_to_uint (&hash_pos[24]);
15620 digest[4] = hex_to_uint (&hash_pos[32]);
15621
15622 digest[0] -= SHA1M_A;
15623 digest[1] -= SHA1M_B;
15624 digest[2] -= SHA1M_C;
15625 digest[3] -= SHA1M_D;
15626 digest[4] -= SHA1M_E;
15627
15628 char *salt_buf_ptr = (char *) salt->salt_buf;
15629
15630 memcpy (salt_buf_ptr, salt_pos, salt_len);
15631
15632 salt->salt_len = salt_len;
15633
15634 return (PARSER_OK);
15635 }
15636
15637 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15638 {
15639 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15640
15641 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15642
15643 uint32_t *digest = (uint32_t *) hash_buf->digest;
15644
15645 salt_t *salt = hash_buf->salt;
15646
15647 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15648
15649 /**
15650 * parse line
15651 */
15652
15653 char *iter_pos = input_buf + 14;
15654
15655 const int iter = atoi (iter_pos);
15656
15657 if (iter < 1) return (PARSER_SALT_ITERATION);
15658
15659 salt->salt_iter = iter - 1;
15660
15661 char *salt_pos = strchr (iter_pos, '$');
15662
15663 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15664
15665 salt_pos++;
15666
15667 char *hash_pos = strchr (salt_pos, '$');
15668
15669 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15670
15671 const uint salt_len = hash_pos - salt_pos;
15672
15673 hash_pos++;
15674
15675 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15676
15677 memcpy (salt_buf_ptr, salt_pos, salt_len);
15678
15679 salt->salt_len = salt_len;
15680
15681 salt_buf_ptr[salt_len + 3] = 0x01;
15682 salt_buf_ptr[salt_len + 4] = 0x80;
15683
15684 // add some stuff to normal salt to make sorted happy
15685
15686 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15687 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15688 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15689 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15690 salt->salt_buf[4] = salt->salt_iter;
15691
15692 // base64 decode hash
15693
15694 char tmp_buf[100];
15695
15696 memset (tmp_buf, 0, sizeof (tmp_buf));
15697
15698 uint hash_len = input_len - (hash_pos - input_buf);
15699
15700 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15701
15702 base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf);
15703
15704 memcpy (digest, tmp_buf, 32);
15705
15706 digest[0] = byte_swap_32 (digest[0]);
15707 digest[1] = byte_swap_32 (digest[1]);
15708 digest[2] = byte_swap_32 (digest[2]);
15709 digest[3] = byte_swap_32 (digest[3]);
15710 digest[4] = byte_swap_32 (digest[4]);
15711 digest[5] = byte_swap_32 (digest[5]);
15712 digest[6] = byte_swap_32 (digest[6]);
15713 digest[7] = byte_swap_32 (digest[7]);
15714
15715 return (PARSER_OK);
15716 }
15717
15718 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15719 {
15720 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15721
15722 uint32_t *digest = (uint32_t *) hash_buf->digest;
15723
15724 salt_t *salt = hash_buf->salt;
15725
15726 digest[0] = hex_to_uint (&input_buf[ 0]);
15727 digest[1] = hex_to_uint (&input_buf[ 8]);
15728 digest[2] = 0;
15729 digest[3] = 0;
15730
15731 digest[0] = byte_swap_32 (digest[0]);
15732 digest[1] = byte_swap_32 (digest[1]);
15733
15734 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15735 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15736 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15737
15738 char iter_c = input_buf[17];
15739 char iter_d = input_buf[19];
15740
15741 // atm only defaults, let's see if there's more request
15742 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15743 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15744
15745 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15746
15747 salt->salt_buf[0] = hex_to_uint (&salt_buf[ 0]);
15748 salt->salt_buf[1] = hex_to_uint (&salt_buf[ 8]);
15749 salt->salt_buf[2] = hex_to_uint (&salt_buf[16]);
15750 salt->salt_buf[3] = hex_to_uint (&salt_buf[24]);
15751
15752 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15753 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15754 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15755 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15756
15757 salt->salt_len = 16;
15758
15759 return (PARSER_OK);
15760 }
15761
15762 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15763 {
15764 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
15765
15766 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15767
15768 uint32_t *digest = (uint32_t *) hash_buf->digest;
15769
15770 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
15771
15772 salt_t *salt = hash_buf->salt;
15773
15774 char *salt_pos = input_buf + 10;
15775
15776 char *hash_pos = strchr (salt_pos, '$');
15777
15778 uint salt_len = hash_pos - salt_pos;
15779
15780 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15781
15782 hash_pos++;
15783
15784 uint hash_len = input_len - 10 - salt_len - 1;
15785
15786 // base64 decode salt
15787
15788 char tmp_buf[100];
15789
15790 memset (tmp_buf, 0, sizeof (tmp_buf));
15791
15792 salt_len = base64_decode (base64_to_int, salt_pos, salt_len, tmp_buf);
15793
15794 if (salt_len > 55) return (PARSER_SALT_LENGTH);
15795
15796 tmp_buf[salt_len] = 0x80;
15797
15798 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
15799
15800 salt->salt_len = salt_len;
15801
15802 // base64 decode salt
15803
15804 memset (tmp_buf, 0, sizeof (tmp_buf));
15805
15806 hash_len = base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf);
15807
15808 uint user_len = hash_len - 32;
15809
15810 char *tmp_hash = tmp_buf + user_len;
15811
15812 user_len--; // skip the trailing space
15813
15814 digest[0] = hex_to_uint (&tmp_hash[ 0]);
15815 digest[1] = hex_to_uint (&tmp_hash[ 8]);
15816 digest[2] = hex_to_uint (&tmp_hash[16]);
15817 digest[3] = hex_to_uint (&tmp_hash[24]);
15818
15819 digest[0] = byte_swap_32 (digest[0]);
15820 digest[1] = byte_swap_32 (digest[1]);
15821 digest[2] = byte_swap_32 (digest[2]);
15822 digest[3] = byte_swap_32 (digest[3]);
15823
15824 // store username for host only (output hash if cracked)
15825
15826 memset (cram_md5->user, 0, sizeof (cram_md5->user));
15827 memcpy (cram_md5->user, tmp_buf, user_len);
15828
15829 return (PARSER_OK);
15830 }
15831
15832 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15833 {
15834 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
15835
15836 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15837
15838 uint32_t *digest = (uint32_t *) hash_buf->digest;
15839
15840 salt_t *salt = hash_buf->salt;
15841
15842 char *iter_pos = input_buf + 10;
15843
15844 uint32_t iter = atoi (iter_pos);
15845
15846 if (iter < 1)
15847 {
15848 return (PARSER_SALT_ITERATION);
15849 }
15850
15851 iter--; // first iteration is special
15852
15853 salt->salt_iter = iter;
15854
15855 char *base64_pos = strchr (iter_pos, '}');
15856
15857 if (base64_pos == NULL)
15858 {
15859 return (PARSER_SIGNATURE_UNMATCHED);
15860 }
15861
15862 base64_pos++;
15863
15864 // base64 decode salt
15865
15866 uint32_t base64_len = input_len - (base64_pos - input_buf);
15867
15868 char tmp_buf[100];
15869
15870 memset (tmp_buf, 0, sizeof (tmp_buf));
15871
15872 uint32_t decoded_len = base64_decode (base64_to_int, base64_pos, base64_len, tmp_buf);
15873
15874 if (decoded_len < 24)
15875 {
15876 return (PARSER_SALT_LENGTH);
15877 }
15878
15879 // copy the salt
15880
15881 uint salt_len = decoded_len - 20;
15882
15883 if (salt_len < 4) return (PARSER_SALT_LENGTH);
15884 if (salt_len > 16) return (PARSER_SALT_LENGTH);
15885
15886 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
15887
15888 salt->salt_len = salt_len;
15889
15890 // set digest
15891
15892 uint32_t *digest_ptr = (uint32_t*) tmp_buf;
15893
15894 digest[0] = byte_swap_32 (digest_ptr[0]);
15895 digest[1] = byte_swap_32 (digest_ptr[1]);
15896 digest[2] = byte_swap_32 (digest_ptr[2]);
15897 digest[3] = byte_swap_32 (digest_ptr[3]);
15898 digest[4] = byte_swap_32 (digest_ptr[4]);
15899
15900 return (PARSER_OK);
15901 }
15902
15903 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15904 {
15905 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
15906
15907 uint32_t *digest = (uint32_t *) hash_buf->digest;
15908
15909 salt_t *salt = hash_buf->salt;
15910
15911 digest[0] = hex_to_uint (&input_buf[ 0]);
15912 digest[1] = hex_to_uint (&input_buf[ 8]);
15913 digest[2] = hex_to_uint (&input_buf[16]);
15914 digest[3] = hex_to_uint (&input_buf[24]);
15915 digest[4] = hex_to_uint (&input_buf[32]);
15916
15917 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15918
15919 uint salt_len = input_len - 40 - 1;
15920
15921 char *salt_buf = input_buf + 40 + 1;
15922
15923 char *salt_buf_ptr = (char *) salt->salt_buf;
15924
15925 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15926
15927 if (salt_len != 32) return (PARSER_SALT_LENGTH);
15928
15929 salt->salt_len = salt_len;
15930
15931 return (PARSER_OK);
15932 }
15933
15934 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15935 {
15936 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
15937
15938 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15939
15940 uint32_t *digest = (uint32_t *) hash_buf->digest;
15941
15942 salt_t *salt = hash_buf->salt;
15943
15944 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
15945
15946 /**
15947 * parse line
15948 */
15949
15950 char *V_pos = input_buf + 5;
15951
15952 char *R_pos = strchr (V_pos, '*');
15953
15954 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15955
15956 uint32_t V_len = R_pos - V_pos;
15957
15958 R_pos++;
15959
15960 char *bits_pos = strchr (R_pos, '*');
15961
15962 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15963
15964 uint32_t R_len = bits_pos - R_pos;
15965
15966 bits_pos++;
15967
15968 char *P_pos = strchr (bits_pos, '*');
15969
15970 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15971
15972 uint32_t bits_len = P_pos - bits_pos;
15973
15974 P_pos++;
15975
15976 char *enc_md_pos = strchr (P_pos, '*');
15977
15978 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15979
15980 uint32_t P_len = enc_md_pos - P_pos;
15981
15982 enc_md_pos++;
15983
15984 char *id_len_pos = strchr (enc_md_pos, '*');
15985
15986 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15987
15988 uint32_t enc_md_len = id_len_pos - enc_md_pos;
15989
15990 id_len_pos++;
15991
15992 char *id_buf_pos = strchr (id_len_pos, '*');
15993
15994 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15995
15996 uint32_t id_len_len = id_buf_pos - id_len_pos;
15997
15998 id_buf_pos++;
15999
16000 char *u_len_pos = strchr (id_buf_pos, '*');
16001
16002 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16003
16004 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16005
16006 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16007
16008 u_len_pos++;
16009
16010 char *u_buf_pos = strchr (u_len_pos, '*');
16011
16012 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16013
16014 uint32_t u_len_len = u_buf_pos - u_len_pos;
16015
16016 u_buf_pos++;
16017
16018 char *o_len_pos = strchr (u_buf_pos, '*');
16019
16020 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16021
16022 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16023
16024 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16025
16026 o_len_pos++;
16027
16028 char *o_buf_pos = strchr (o_len_pos, '*');
16029
16030 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16031
16032 uint32_t o_len_len = o_buf_pos - o_len_pos;
16033
16034 o_buf_pos++;
16035
16036 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;
16037
16038 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16039
16040 // validate data
16041
16042 const int V = atoi (V_pos);
16043 const int R = atoi (R_pos);
16044 const int P = atoi (P_pos);
16045
16046 if (V != 1) return (PARSER_SALT_VALUE);
16047 if (R != 2) return (PARSER_SALT_VALUE);
16048
16049 const int enc_md = atoi (enc_md_pos);
16050
16051 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16052
16053 const int id_len = atoi (id_len_pos);
16054 const int u_len = atoi (u_len_pos);
16055 const int o_len = atoi (o_len_pos);
16056
16057 if (id_len != 16) return (PARSER_SALT_VALUE);
16058 if (u_len != 32) return (PARSER_SALT_VALUE);
16059 if (o_len != 32) return (PARSER_SALT_VALUE);
16060
16061 const int bits = atoi (bits_pos);
16062
16063 if (bits != 40) return (PARSER_SALT_VALUE);
16064
16065 // copy data to esalt
16066
16067 pdf->V = V;
16068 pdf->R = R;
16069 pdf->P = P;
16070
16071 pdf->enc_md = enc_md;
16072
16073 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16074 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16075 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16076 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16077 pdf->id_len = id_len;
16078
16079 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16080 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16081 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16082 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16083 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16084 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16085 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16086 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16087 pdf->u_len = u_len;
16088
16089 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16090 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16091 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16092 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16093 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16094 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16095 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16096 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16097 pdf->o_len = o_len;
16098
16099 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16100 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16101 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16102 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16103
16104 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16105 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16106 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16107 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16108 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16109 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16110 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16111 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16112
16113 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16114 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16115 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16116 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16117 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16118 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16119 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16120 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16121
16122 // we use ID for salt, maybe needs to change, we will see...
16123
16124 salt->salt_buf[0] = pdf->id_buf[0];
16125 salt->salt_buf[1] = pdf->id_buf[1];
16126 salt->salt_buf[2] = pdf->id_buf[2];
16127 salt->salt_buf[3] = pdf->id_buf[3];
16128 salt->salt_len = pdf->id_len;
16129
16130 digest[0] = pdf->u_buf[0];
16131 digest[1] = pdf->u_buf[1];
16132 digest[2] = pdf->u_buf[2];
16133 digest[3] = pdf->u_buf[3];
16134
16135 return (PARSER_OK);
16136 }
16137
16138 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16139 {
16140 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16141 }
16142
16143 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16144 {
16145 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16146
16147 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16148
16149 uint32_t *digest = (uint32_t *) hash_buf->digest;
16150
16151 salt_t *salt = hash_buf->salt;
16152
16153 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16154
16155 /**
16156 * parse line
16157 */
16158
16159 char *V_pos = input_buf + 5;
16160
16161 char *R_pos = strchr (V_pos, '*');
16162
16163 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16164
16165 uint32_t V_len = R_pos - V_pos;
16166
16167 R_pos++;
16168
16169 char *bits_pos = strchr (R_pos, '*');
16170
16171 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16172
16173 uint32_t R_len = bits_pos - R_pos;
16174
16175 bits_pos++;
16176
16177 char *P_pos = strchr (bits_pos, '*');
16178
16179 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16180
16181 uint32_t bits_len = P_pos - bits_pos;
16182
16183 P_pos++;
16184
16185 char *enc_md_pos = strchr (P_pos, '*');
16186
16187 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16188
16189 uint32_t P_len = enc_md_pos - P_pos;
16190
16191 enc_md_pos++;
16192
16193 char *id_len_pos = strchr (enc_md_pos, '*');
16194
16195 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16196
16197 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16198
16199 id_len_pos++;
16200
16201 char *id_buf_pos = strchr (id_len_pos, '*');
16202
16203 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16204
16205 uint32_t id_len_len = id_buf_pos - id_len_pos;
16206
16207 id_buf_pos++;
16208
16209 char *u_len_pos = strchr (id_buf_pos, '*');
16210
16211 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16212
16213 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16214
16215 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16216
16217 u_len_pos++;
16218
16219 char *u_buf_pos = strchr (u_len_pos, '*');
16220
16221 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16222
16223 uint32_t u_len_len = u_buf_pos - u_len_pos;
16224
16225 u_buf_pos++;
16226
16227 char *o_len_pos = strchr (u_buf_pos, '*');
16228
16229 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16230
16231 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16232
16233 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16234
16235 o_len_pos++;
16236
16237 char *o_buf_pos = strchr (o_len_pos, '*');
16238
16239 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16240
16241 uint32_t o_len_len = o_buf_pos - o_len_pos;
16242
16243 o_buf_pos++;
16244
16245 char *rc4key_pos = strchr (o_buf_pos, ':');
16246
16247 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16248
16249 uint32_t o_buf_len = rc4key_pos - o_buf_pos;
16250
16251 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16252
16253 rc4key_pos++;
16254
16255 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;
16256
16257 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16258
16259 // validate data
16260
16261 const int V = atoi (V_pos);
16262 const int R = atoi (R_pos);
16263 const int P = atoi (P_pos);
16264
16265 if (V != 1) return (PARSER_SALT_VALUE);
16266 if (R != 2) return (PARSER_SALT_VALUE);
16267
16268 const int enc_md = atoi (enc_md_pos);
16269
16270 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16271
16272 const int id_len = atoi (id_len_pos);
16273 const int u_len = atoi (u_len_pos);
16274 const int o_len = atoi (o_len_pos);
16275
16276 if (id_len != 16) return (PARSER_SALT_VALUE);
16277 if (u_len != 32) return (PARSER_SALT_VALUE);
16278 if (o_len != 32) return (PARSER_SALT_VALUE);
16279
16280 const int bits = atoi (bits_pos);
16281
16282 if (bits != 40) return (PARSER_SALT_VALUE);
16283
16284 // copy data to esalt
16285
16286 pdf->V = V;
16287 pdf->R = R;
16288 pdf->P = P;
16289
16290 pdf->enc_md = enc_md;
16291
16292 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16293 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16294 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16295 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16296 pdf->id_len = id_len;
16297
16298 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16299 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16300 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16301 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16302 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16303 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16304 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16305 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16306 pdf->u_len = u_len;
16307
16308 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16309 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16310 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16311 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16312 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16313 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16314 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16315 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16316 pdf->o_len = o_len;
16317
16318 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16319 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16320 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16321 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16322
16323 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16324 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16325 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16326 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16327 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16328 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16329 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16330 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16331
16332 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16333 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16334 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16335 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16336 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16337 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16338 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16339 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16340
16341 pdf->rc4key[1] = 0;
16342 pdf->rc4key[0] = 0;
16343
16344 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16345 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16346 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16347 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16348 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16349 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16350 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16351 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16352 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16353 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16354
16355 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16356 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16357
16358 // we use ID for salt, maybe needs to change, we will see...
16359
16360 salt->salt_buf[0] = pdf->id_buf[0];
16361 salt->salt_buf[1] = pdf->id_buf[1];
16362 salt->salt_buf[2] = pdf->id_buf[2];
16363 salt->salt_buf[3] = pdf->id_buf[3];
16364 salt->salt_buf[4] = pdf->u_buf[0];
16365 salt->salt_buf[5] = pdf->u_buf[1];
16366 salt->salt_buf[6] = pdf->o_buf[0];
16367 salt->salt_buf[7] = pdf->o_buf[1];
16368 salt->salt_len = pdf->id_len + 16;
16369
16370 digest[0] = pdf->rc4key[0];
16371 digest[1] = pdf->rc4key[1];
16372 digest[2] = 0;
16373 digest[3] = 0;
16374
16375 return (PARSER_OK);
16376 }
16377
16378 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16379 {
16380 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16381
16382 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16383
16384 uint32_t *digest = (uint32_t *) hash_buf->digest;
16385
16386 salt_t *salt = hash_buf->salt;
16387
16388 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16389
16390 /**
16391 * parse line
16392 */
16393
16394 char *V_pos = input_buf + 5;
16395
16396 char *R_pos = strchr (V_pos, '*');
16397
16398 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16399
16400 uint32_t V_len = R_pos - V_pos;
16401
16402 R_pos++;
16403
16404 char *bits_pos = strchr (R_pos, '*');
16405
16406 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16407
16408 uint32_t R_len = bits_pos - R_pos;
16409
16410 bits_pos++;
16411
16412 char *P_pos = strchr (bits_pos, '*');
16413
16414 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16415
16416 uint32_t bits_len = P_pos - bits_pos;
16417
16418 P_pos++;
16419
16420 char *enc_md_pos = strchr (P_pos, '*');
16421
16422 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16423
16424 uint32_t P_len = enc_md_pos - P_pos;
16425
16426 enc_md_pos++;
16427
16428 char *id_len_pos = strchr (enc_md_pos, '*');
16429
16430 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16431
16432 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16433
16434 id_len_pos++;
16435
16436 char *id_buf_pos = strchr (id_len_pos, '*');
16437
16438 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16439
16440 uint32_t id_len_len = id_buf_pos - id_len_pos;
16441
16442 id_buf_pos++;
16443
16444 char *u_len_pos = strchr (id_buf_pos, '*');
16445
16446 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16447
16448 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16449
16450 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16451
16452 u_len_pos++;
16453
16454 char *u_buf_pos = strchr (u_len_pos, '*');
16455
16456 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16457
16458 uint32_t u_len_len = u_buf_pos - u_len_pos;
16459
16460 u_buf_pos++;
16461
16462 char *o_len_pos = strchr (u_buf_pos, '*');
16463
16464 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16465
16466 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16467
16468 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16469
16470 o_len_pos++;
16471
16472 char *o_buf_pos = strchr (o_len_pos, '*');
16473
16474 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16475
16476 uint32_t o_len_len = o_buf_pos - o_len_pos;
16477
16478 o_buf_pos++;
16479
16480 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;
16481
16482 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16483
16484 // validate data
16485
16486 const int V = atoi (V_pos);
16487 const int R = atoi (R_pos);
16488 const int P = atoi (P_pos);
16489
16490 int vr_ok = 0;
16491
16492 if ((V == 2) && (R == 3)) vr_ok = 1;
16493 if ((V == 4) && (R == 4)) vr_ok = 1;
16494
16495 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16496
16497 const int id_len = atoi (id_len_pos);
16498 const int u_len = atoi (u_len_pos);
16499 const int o_len = atoi (o_len_pos);
16500
16501 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16502
16503 if (u_len != 32) return (PARSER_SALT_VALUE);
16504 if (o_len != 32) return (PARSER_SALT_VALUE);
16505
16506 const int bits = atoi (bits_pos);
16507
16508 if (bits != 128) return (PARSER_SALT_VALUE);
16509
16510 int enc_md = 1;
16511
16512 if (R >= 4)
16513 {
16514 enc_md = atoi (enc_md_pos);
16515 }
16516
16517 // copy data to esalt
16518
16519 pdf->V = V;
16520 pdf->R = R;
16521 pdf->P = P;
16522
16523 pdf->enc_md = enc_md;
16524
16525 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16526 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16527 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16528 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16529
16530 if (id_len == 32)
16531 {
16532 pdf->id_buf[4] = hex_to_uint (&id_buf_pos[32]);
16533 pdf->id_buf[5] = hex_to_uint (&id_buf_pos[40]);
16534 pdf->id_buf[6] = hex_to_uint (&id_buf_pos[48]);
16535 pdf->id_buf[7] = hex_to_uint (&id_buf_pos[56]);
16536 }
16537
16538 pdf->id_len = id_len;
16539
16540 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16541 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16542 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16543 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16544 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16545 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16546 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16547 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16548 pdf->u_len = u_len;
16549
16550 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16551 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16552 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16553 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16554 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16555 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16556 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16557 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16558 pdf->o_len = o_len;
16559
16560 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16561 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16562 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16563 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16564
16565 if (id_len == 32)
16566 {
16567 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16568 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16569 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16570 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16571 }
16572
16573 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16574 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16575 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16576 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16577 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16578 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16579 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16580 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16581
16582 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16583 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16584 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16585 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16586 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16587 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16588 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16589 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16590
16591 // precompute rc4 data for later use
16592
16593 uint padding[8] =
16594 {
16595 0x5e4ebf28,
16596 0x418a754e,
16597 0x564e0064,
16598 0x0801faff,
16599 0xb6002e2e,
16600 0x803e68d0,
16601 0xfea90c2f,
16602 0x7a695364
16603 };
16604
16605 // md5
16606
16607 uint salt_pc_block[32];
16608
16609 char *salt_pc_ptr = (char *) salt_pc_block;
16610
16611 memcpy (salt_pc_ptr, padding, 32);
16612 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16613
16614 uint salt_pc_digest[4];
16615
16616 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16617
16618 pdf->rc4data[0] = salt_pc_digest[0];
16619 pdf->rc4data[1] = salt_pc_digest[1];
16620
16621 // we use ID for salt, maybe needs to change, we will see...
16622
16623 salt->salt_buf[0] = pdf->id_buf[0];
16624 salt->salt_buf[1] = pdf->id_buf[1];
16625 salt->salt_buf[2] = pdf->id_buf[2];
16626 salt->salt_buf[3] = pdf->id_buf[3];
16627 salt->salt_buf[4] = pdf->u_buf[0];
16628 salt->salt_buf[5] = pdf->u_buf[1];
16629 salt->salt_buf[6] = pdf->o_buf[0];
16630 salt->salt_buf[7] = pdf->o_buf[1];
16631 salt->salt_len = pdf->id_len + 16;
16632
16633 salt->salt_iter = ROUNDS_PDF14;
16634
16635 digest[0] = pdf->u_buf[0];
16636 digest[1] = pdf->u_buf[1];
16637 digest[2] = 0;
16638 digest[3] = 0;
16639
16640 return (PARSER_OK);
16641 }
16642
16643 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16644 {
16645 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16646
16647 if (ret != PARSER_OK)
16648 {
16649 return ret;
16650 }
16651
16652 uint32_t *digest = (uint32_t *) hash_buf->digest;
16653
16654 salt_t *salt = hash_buf->salt;
16655
16656 digest[0] -= SHA256M_A;
16657 digest[1] -= SHA256M_B;
16658 digest[2] -= SHA256M_C;
16659 digest[3] -= SHA256M_D;
16660 digest[4] -= SHA256M_E;
16661 digest[5] -= SHA256M_F;
16662 digest[6] -= SHA256M_G;
16663 digest[7] -= SHA256M_H;
16664
16665 salt->salt_buf[2] = 0x80;
16666
16667 return (PARSER_OK);
16668 }
16669
16670 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16671 {
16672 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16673
16674 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16675
16676 uint32_t *digest = (uint32_t *) hash_buf->digest;
16677
16678 salt_t *salt = hash_buf->salt;
16679
16680 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16681
16682 /**
16683 * parse line
16684 */
16685
16686 char *V_pos = input_buf + 5;
16687
16688 char *R_pos = strchr (V_pos, '*');
16689
16690 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16691
16692 uint32_t V_len = R_pos - V_pos;
16693
16694 R_pos++;
16695
16696 char *bits_pos = strchr (R_pos, '*');
16697
16698 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16699
16700 uint32_t R_len = bits_pos - R_pos;
16701
16702 bits_pos++;
16703
16704 char *P_pos = strchr (bits_pos, '*');
16705
16706 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16707
16708 uint32_t bits_len = P_pos - bits_pos;
16709
16710 P_pos++;
16711
16712 char *enc_md_pos = strchr (P_pos, '*');
16713
16714 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16715
16716 uint32_t P_len = enc_md_pos - P_pos;
16717
16718 enc_md_pos++;
16719
16720 char *id_len_pos = strchr (enc_md_pos, '*');
16721
16722 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16723
16724 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16725
16726 id_len_pos++;
16727
16728 char *id_buf_pos = strchr (id_len_pos, '*');
16729
16730 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16731
16732 uint32_t id_len_len = id_buf_pos - id_len_pos;
16733
16734 id_buf_pos++;
16735
16736 char *u_len_pos = strchr (id_buf_pos, '*');
16737
16738 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16739
16740 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16741
16742 u_len_pos++;
16743
16744 char *u_buf_pos = strchr (u_len_pos, '*');
16745
16746 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16747
16748 uint32_t u_len_len = u_buf_pos - u_len_pos;
16749
16750 u_buf_pos++;
16751
16752 char *o_len_pos = strchr (u_buf_pos, '*');
16753
16754 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16755
16756 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16757
16758 o_len_pos++;
16759
16760 char *o_buf_pos = strchr (o_len_pos, '*');
16761
16762 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16763
16764 uint32_t o_len_len = o_buf_pos - o_len_pos;
16765
16766 o_buf_pos++;
16767
16768 char *last = strchr (o_buf_pos, '*');
16769
16770 if (last == NULL) last = input_buf + input_len;
16771
16772 uint32_t o_buf_len = last - o_buf_pos;
16773
16774 // validate data
16775
16776 const int V = atoi (V_pos);
16777 const int R = atoi (R_pos);
16778
16779 int vr_ok = 0;
16780
16781 if ((V == 5) && (R == 5)) vr_ok = 1;
16782 if ((V == 5) && (R == 6)) vr_ok = 1;
16783
16784 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16785
16786 const int bits = atoi (bits_pos);
16787
16788 if (bits != 256) return (PARSER_SALT_VALUE);
16789
16790 int enc_md = atoi (enc_md_pos);
16791
16792 if (enc_md != 1) return (PARSER_SALT_VALUE);
16793
16794 const uint id_len = atoi (id_len_pos);
16795 const uint u_len = atoi (u_len_pos);
16796 const uint o_len = atoi (o_len_pos);
16797
16798 if (V_len > 6) return (PARSER_SALT_LENGTH);
16799 if (R_len > 6) return (PARSER_SALT_LENGTH);
16800 if (P_len > 6) return (PARSER_SALT_LENGTH);
16801 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
16802 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
16803 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
16804 if (bits_len > 6) return (PARSER_SALT_LENGTH);
16805 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
16806
16807 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
16808 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
16809 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
16810
16811 // copy data to esalt
16812
16813 if (u_len < 40) return (PARSER_SALT_VALUE);
16814
16815 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
16816 {
16817 pdf->u_buf[i] = hex_to_uint (&u_buf_pos[j]);
16818 }
16819
16820 salt->salt_buf[0] = pdf->u_buf[8];
16821 salt->salt_buf[1] = pdf->u_buf[9];
16822
16823 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16824 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16825
16826 salt->salt_len = 8;
16827 salt->salt_iter = ROUNDS_PDF17L8;
16828
16829 digest[0] = pdf->u_buf[0];
16830 digest[1] = pdf->u_buf[1];
16831 digest[2] = pdf->u_buf[2];
16832 digest[3] = pdf->u_buf[3];
16833 digest[4] = pdf->u_buf[4];
16834 digest[5] = pdf->u_buf[5];
16835 digest[6] = pdf->u_buf[6];
16836 digest[7] = pdf->u_buf[7];
16837
16838 return (PARSER_OK);
16839 }
16840
16841 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16842 {
16843 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
16844
16845 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
16846
16847 uint32_t *digest = (uint32_t *) hash_buf->digest;
16848
16849 salt_t *salt = hash_buf->salt;
16850
16851 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16852
16853 /**
16854 * parse line
16855 */
16856
16857 // iterations
16858
16859 char *iter_pos = input_buf + 7;
16860
16861 uint32_t iter = atoi (iter_pos);
16862
16863 if (iter < 1) return (PARSER_SALT_ITERATION);
16864 if (iter > 999999) return (PARSER_SALT_ITERATION);
16865
16866 // first is *raw* salt
16867
16868 char *salt_pos = strchr (iter_pos, ':');
16869
16870 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16871
16872 salt_pos++;
16873
16874 char *hash_pos = strchr (salt_pos, ':');
16875
16876 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16877
16878 uint32_t salt_len = hash_pos - salt_pos;
16879
16880 if (salt_len > 64) return (PARSER_SALT_LENGTH);
16881
16882 hash_pos++;
16883
16884 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
16885
16886 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
16887
16888 // decode salt
16889
16890 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16891
16892 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
16893
16894 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
16895
16896 salt_buf_ptr[salt_len + 3] = 0x01;
16897 salt_buf_ptr[salt_len + 4] = 0x80;
16898
16899 salt->salt_len = salt_len;
16900 salt->salt_iter = iter - 1;
16901
16902 // decode hash
16903
16904 char tmp_buf[100];
16905
16906 memset (tmp_buf, 0, sizeof (tmp_buf));
16907
16908 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
16909
16910 if (hash_len < 16) return (PARSER_HASH_LENGTH);
16911
16912 memcpy (digest, tmp_buf, 16);
16913
16914 digest[0] = byte_swap_32 (digest[0]);
16915 digest[1] = byte_swap_32 (digest[1]);
16916 digest[2] = byte_swap_32 (digest[2]);
16917 digest[3] = byte_swap_32 (digest[3]);
16918
16919 // add some stuff to normal salt to make sorted happy
16920
16921 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16922 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16923 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16924 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16925 salt->salt_buf[4] = salt->salt_iter;
16926
16927 return (PARSER_OK);
16928 }
16929
16930 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16931 {
16932 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
16933
16934 uint32_t *digest = (uint32_t *) hash_buf->digest;
16935
16936 salt_t *salt = hash_buf->salt;
16937
16938 digest[0] = hex_to_uint (&input_buf[ 0]);
16939 digest[1] = hex_to_uint (&input_buf[ 8]);
16940 digest[2] = hex_to_uint (&input_buf[16]);
16941 digest[3] = hex_to_uint (&input_buf[24]);
16942
16943 digest[0] = byte_swap_32 (digest[0]);
16944 digest[1] = byte_swap_32 (digest[1]);
16945 digest[2] = byte_swap_32 (digest[2]);
16946 digest[3] = byte_swap_32 (digest[3]);
16947
16948 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16949
16950 uint salt_len = input_len - 32 - 1;
16951
16952 char *salt_buf = input_buf + 32 + 1;
16953
16954 char *salt_buf_ptr = (char *) salt->salt_buf;
16955
16956 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16957
16958 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
16959
16960 salt->salt_len = salt_len;
16961
16962 return (PARSER_OK);
16963 }
16964
16965 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16966 {
16967 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
16968
16969 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16970
16971 uint32_t *digest = (uint32_t *) hash_buf->digest;
16972
16973 salt_t *salt = hash_buf->salt;
16974
16975 char *user_pos = input_buf + 10;
16976
16977 char *salt_pos = strchr (user_pos, '*');
16978
16979 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16980
16981 salt_pos++;
16982
16983 char *hash_pos = strchr (salt_pos, '*');
16984
16985 hash_pos++;
16986
16987 uint hash_len = input_len - (hash_pos - input_buf);
16988
16989 if (hash_len != 32) return (PARSER_HASH_LENGTH);
16990
16991 uint user_len = salt_pos - user_pos - 1;
16992
16993 uint salt_len = hash_pos - salt_pos - 1;
16994
16995 if (salt_len != 8) return (PARSER_SALT_LENGTH);
16996
16997 /*
16998 * store digest
16999 */
17000
17001 digest[0] = hex_to_uint (&hash_pos[ 0]);
17002 digest[1] = hex_to_uint (&hash_pos[ 8]);
17003 digest[2] = hex_to_uint (&hash_pos[16]);
17004 digest[3] = hex_to_uint (&hash_pos[24]);
17005
17006 digest[0] = byte_swap_32 (digest[0]);
17007 digest[1] = byte_swap_32 (digest[1]);
17008 digest[2] = byte_swap_32 (digest[2]);
17009 digest[3] = byte_swap_32 (digest[3]);
17010
17011 digest[0] -= MD5M_A;
17012 digest[1] -= MD5M_B;
17013 digest[2] -= MD5M_C;
17014 digest[3] -= MD5M_D;
17015
17016 /*
17017 * store salt
17018 */
17019
17020 char *salt_buf_ptr = (char *) salt->salt_buf;
17021
17022 // first 4 bytes are the "challenge"
17023
17024 salt_buf_ptr[0] = hex_to_char (&salt_pos[0]);
17025 salt_buf_ptr[1] = hex_to_char (&salt_pos[2]);
17026 salt_buf_ptr[2] = hex_to_char (&salt_pos[4]);
17027 salt_buf_ptr[3] = hex_to_char (&salt_pos[6]);
17028
17029 // append the user name
17030
17031 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17032
17033 salt->salt_len = 4 + user_len;
17034
17035 return (PARSER_OK);
17036 }
17037
17038 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17039 {
17040 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17041
17042 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17043
17044 uint32_t *digest = (uint32_t *) hash_buf->digest;
17045
17046 salt_t *salt = hash_buf->salt;
17047
17048 char *salt_pos = input_buf + 9;
17049
17050 char *hash_pos = strchr (salt_pos, '*');
17051
17052 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17053
17054 hash_pos++;
17055
17056 uint hash_len = input_len - (hash_pos - input_buf);
17057
17058 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17059
17060 uint salt_len = hash_pos - salt_pos - 1;
17061
17062 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17063
17064 /*
17065 * store digest
17066 */
17067
17068 digest[0] = hex_to_uint (&hash_pos[ 0]);
17069 digest[1] = hex_to_uint (&hash_pos[ 8]);
17070 digest[2] = hex_to_uint (&hash_pos[16]);
17071 digest[3] = hex_to_uint (&hash_pos[24]);
17072 digest[4] = hex_to_uint (&hash_pos[32]);
17073
17074 /*
17075 * store salt
17076 */
17077
17078 char *salt_buf_ptr = (char *) salt->salt_buf;
17079
17080 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17081
17082 salt->salt_len = salt_len;
17083
17084 return (PARSER_OK);
17085 }
17086
17087 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17088 {
17089 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17090
17091 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17092
17093 uint32_t *digest = (uint32_t *) hash_buf->digest;
17094
17095 salt_t *salt = hash_buf->salt;
17096
17097 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17098
17099 /**
17100 * parse line
17101 */
17102
17103 char *cry_master_len_pos = input_buf + 9;
17104
17105 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17106
17107 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17108
17109 uint32_t cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17110
17111 cry_master_buf_pos++;
17112
17113 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17114
17115 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17116
17117 uint32_t cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17118
17119 cry_salt_len_pos++;
17120
17121 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17122
17123 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17124
17125 uint32_t cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17126
17127 cry_salt_buf_pos++;
17128
17129 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17130
17131 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17132
17133 uint32_t cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17134
17135 cry_rounds_pos++;
17136
17137 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17138
17139 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17140
17141 uint32_t cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17142
17143 ckey_len_pos++;
17144
17145 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17146
17147 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17148
17149 uint32_t ckey_len_len = ckey_buf_pos - ckey_len_pos;
17150
17151 ckey_buf_pos++;
17152
17153 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17154
17155 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17156
17157 uint32_t ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17158
17159 public_key_len_pos++;
17160
17161 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17162
17163 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17164
17165 uint32_t public_key_len_len = public_key_buf_pos - public_key_len_pos;
17166
17167 public_key_buf_pos++;
17168
17169 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;
17170
17171 const uint cry_master_len = atoi (cry_master_len_pos);
17172 const uint cry_salt_len = atoi (cry_salt_len_pos);
17173 const uint ckey_len = atoi (ckey_len_pos);
17174 const uint public_key_len = atoi (public_key_len_pos);
17175
17176 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17177 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17178 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17179 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17180
17181 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 8)
17182 {
17183 bitcoin_wallet->cry_master_buf[i] = hex_to_uint (&cry_master_buf_pos[j]);
17184
17185 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17186 }
17187
17188 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 8)
17189 {
17190 bitcoin_wallet->ckey_buf[i] = hex_to_uint (&ckey_buf_pos[j]);
17191
17192 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17193 }
17194
17195 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 8)
17196 {
17197 bitcoin_wallet->public_key_buf[i] = hex_to_uint (&public_key_buf_pos[j]);
17198
17199 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17200 }
17201
17202 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17203 bitcoin_wallet->ckey_len = ckey_len / 2;
17204 bitcoin_wallet->public_key_len = public_key_len / 2;
17205
17206 /*
17207 * store digest (should be unique enought, hopefully)
17208 */
17209
17210 digest[0] = bitcoin_wallet->cry_master_buf[0];
17211 digest[1] = bitcoin_wallet->cry_master_buf[1];
17212 digest[2] = bitcoin_wallet->cry_master_buf[2];
17213 digest[3] = bitcoin_wallet->cry_master_buf[3];
17214
17215 /*
17216 * store salt
17217 */
17218
17219 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17220
17221 const uint cry_rounds = atoi (cry_rounds_pos);
17222
17223 salt->salt_iter = cry_rounds - 1;
17224
17225 char *salt_buf_ptr = (char *) salt->salt_buf;
17226
17227 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17228
17229 salt->salt_len = salt_len;
17230
17231 return (PARSER_OK);
17232 }
17233
17234 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17235 {
17236 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17237
17238 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17239
17240 uint32_t *digest = (uint32_t *) hash_buf->digest;
17241
17242 salt_t *salt = hash_buf->salt;
17243
17244 sip_t *sip = (sip_t *) hash_buf->esalt;
17245
17246 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17247
17248 char temp_input_buf[input_len + 1];
17249
17250 memset (temp_input_buf, 0, sizeof (temp_input_buf));
17251 memcpy (temp_input_buf, input_buf, input_len);
17252
17253 // URI_server:
17254
17255 char *URI_server_pos = temp_input_buf + 6;
17256
17257 char *URI_client_pos = strchr (URI_server_pos, '*');
17258
17259 if (URI_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17260
17261 URI_client_pos[0] = 0;
17262 URI_client_pos++;
17263
17264 uint URI_server_len = strlen (URI_server_pos);
17265
17266 if (URI_server_len > 512) return (PARSER_SALT_LENGTH);
17267
17268 // URI_client:
17269
17270 char *user_pos = strchr (URI_client_pos, '*');
17271
17272 if (user_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17273
17274 user_pos[0] = 0;
17275 user_pos++;
17276
17277 uint URI_client_len = strlen (URI_client_pos);
17278
17279 if (URI_client_len > 512) return (PARSER_SALT_LENGTH);
17280
17281 // user:
17282
17283 char *realm_pos = strchr (user_pos, '*');
17284
17285 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17286
17287 realm_pos[0] = 0;
17288 realm_pos++;
17289
17290 uint user_len = strlen (user_pos);
17291
17292 if (user_len > 116) return (PARSER_SALT_LENGTH);
17293
17294 // realm:
17295
17296 char *method_pos = strchr (realm_pos, '*');
17297
17298 if (method_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17299
17300 method_pos[0] = 0;
17301 method_pos++;
17302
17303 uint realm_len = strlen (realm_pos);
17304
17305 if (realm_len > 116) return (PARSER_SALT_LENGTH);
17306
17307 // method:
17308
17309 char *URI_prefix_pos = strchr (method_pos, '*');
17310
17311 if (URI_prefix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17312
17313 URI_prefix_pos[0] = 0;
17314 URI_prefix_pos++;
17315
17316 uint method_len = strlen (method_pos);
17317
17318 if (method_len > 246) return (PARSER_SALT_LENGTH);
17319
17320 // URI_prefix:
17321
17322 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17323
17324 if (URI_resource_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17325
17326 URI_resource_pos[0] = 0;
17327 URI_resource_pos++;
17328
17329 uint URI_prefix_len = strlen (URI_prefix_pos);
17330
17331 if (URI_prefix_len > 245) return (PARSER_SALT_LENGTH);
17332
17333 // URI_resource:
17334
17335 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17336
17337 if (URI_suffix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17338
17339 URI_suffix_pos[0] = 0;
17340 URI_suffix_pos++;
17341
17342 uint URI_resource_len = strlen (URI_resource_pos);
17343
17344 if (URI_resource_len < 1) return (PARSER_SALT_LENGTH);
17345 if (URI_resource_len > 246) return (PARSER_SALT_LENGTH);
17346
17347 // URI_suffix:
17348
17349 char *nonce_pos = strchr (URI_suffix_pos, '*');
17350
17351 if (nonce_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17352
17353 nonce_pos[0] = 0;
17354 nonce_pos++;
17355
17356 uint URI_suffix_len = strlen (URI_suffix_pos);
17357
17358 if (URI_suffix_len > 245) return (PARSER_SALT_LENGTH);
17359
17360 // nonce:
17361
17362 char *nonce_client_pos = strchr (nonce_pos, '*');
17363
17364 if (nonce_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17365
17366 nonce_client_pos[0] = 0;
17367 nonce_client_pos++;
17368
17369 uint nonce_len = strlen (nonce_pos);
17370
17371 if (nonce_len < 1) return (PARSER_SALT_LENGTH);
17372 if (nonce_len > 50) return (PARSER_SALT_LENGTH);
17373
17374 // nonce_client:
17375
17376 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17377
17378 if (nonce_count_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17379
17380 nonce_count_pos[0] = 0;
17381 nonce_count_pos++;
17382
17383 uint nonce_client_len = strlen (nonce_client_pos);
17384
17385 if (nonce_client_len > 50) return (PARSER_SALT_LENGTH);
17386
17387 // nonce_count:
17388
17389 char *qop_pos = strchr (nonce_count_pos, '*');
17390
17391 if (qop_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17392
17393 qop_pos[0] = 0;
17394 qop_pos++;
17395
17396 uint nonce_count_len = strlen (nonce_count_pos);
17397
17398 if (nonce_count_len > 50) return (PARSER_SALT_LENGTH);
17399
17400 // qop:
17401
17402 char *directive_pos = strchr (qop_pos, '*');
17403
17404 if (directive_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17405
17406 directive_pos[0] = 0;
17407 directive_pos++;
17408
17409 uint qop_len = strlen (qop_pos);
17410
17411 if (qop_len > 50) return (PARSER_SALT_LENGTH);
17412
17413 // directive
17414
17415 char *digest_pos = strchr (directive_pos, '*');
17416
17417 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17418
17419 digest_pos[0] = 0;
17420 digest_pos++;
17421
17422 uint directive_len = strlen (directive_pos);
17423
17424 if (directive_len != 3) return (PARSER_SALT_LENGTH);
17425
17426 if (memcmp (directive_pos, "MD5", 3))
17427 {
17428 log_info ("ERROR: only the MD5 directive is currently supported\n");
17429
17430 return (PARSER_SIP_AUTH_DIRECTIVE);
17431 }
17432
17433 /*
17434 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17435 */
17436
17437 uint md5_len = 0;
17438
17439 uint md5_max_len = 4 * 64;
17440
17441 uint md5_remaining_len = md5_max_len;
17442
17443 uint tmp_md5_buf[md5_max_len / 4];
17444
17445 memset (tmp_md5_buf, 0, sizeof (tmp_md5_buf));
17446
17447 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17448
17449 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17450
17451 md5_len += method_len + 1;
17452 tmp_md5_ptr += method_len + 1;
17453
17454 if (URI_prefix_len > 0)
17455 {
17456 md5_remaining_len = md5_max_len - md5_len;
17457
17458 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17459
17460 md5_len += URI_prefix_len + 1;
17461 tmp_md5_ptr += URI_prefix_len + 1;
17462 }
17463
17464 md5_remaining_len = md5_max_len - md5_len;
17465
17466 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17467
17468 md5_len += URI_resource_len;
17469 tmp_md5_ptr += URI_resource_len;
17470
17471 if (URI_suffix_len > 0)
17472 {
17473 md5_remaining_len = md5_max_len - md5_len;
17474
17475 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17476
17477 md5_len += 1 + URI_suffix_len;
17478 }
17479
17480 uint tmp_digest[4];
17481
17482 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17483
17484 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17485 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17486 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17487 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17488
17489 /*
17490 * esalt
17491 */
17492
17493 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17494
17495 uint esalt_len = 0;
17496
17497 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17498
17499 // there are 2 possibilities for the esalt:
17500
17501 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17502 {
17503 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17504
17505 if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH);
17506
17507 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17508 nonce_pos,
17509 nonce_count_pos,
17510 nonce_client_pos,
17511 qop_pos,
17512 tmp_digest[0],
17513 tmp_digest[1],
17514 tmp_digest[2],
17515 tmp_digest[3]);
17516 }
17517 else
17518 {
17519 esalt_len = 1 + nonce_len + 1 + 32;
17520
17521 if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH);
17522
17523 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17524 nonce_pos,
17525 tmp_digest[0],
17526 tmp_digest[1],
17527 tmp_digest[2],
17528 tmp_digest[3]);
17529 }
17530
17531 // add 0x80 to esalt
17532
17533 esalt_buf_ptr[esalt_len] = 0x80;
17534
17535 sip->esalt_len = esalt_len;
17536
17537 /*
17538 * actual salt
17539 */
17540
17541 char *sip_salt_ptr = (char *) sip->salt_buf;
17542
17543 uint salt_len = user_len + 1 + realm_len + 1;
17544
17545 uint max_salt_len = 119;
17546
17547 if (salt_len > max_salt_len) return (PARSER_SALT_LENGTH);
17548
17549 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17550
17551 sip->salt_len = salt_len;
17552
17553 /*
17554 * fake salt (for sorting)
17555 */
17556
17557 char *salt_buf_ptr = (char *) salt->salt_buf;
17558
17559 max_salt_len = 55;
17560
17561 uint fake_salt_len = salt_len;
17562
17563 if (fake_salt_len > max_salt_len)
17564 {
17565 fake_salt_len = max_salt_len;
17566 }
17567
17568 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17569
17570 salt->salt_len = fake_salt_len;
17571
17572 /*
17573 * digest
17574 */
17575
17576 digest[0] = hex_to_uint (&digest_pos[ 0]);
17577 digest[1] = hex_to_uint (&digest_pos[ 8]);
17578 digest[2] = hex_to_uint (&digest_pos[16]);
17579 digest[3] = hex_to_uint (&digest_pos[24]);
17580
17581 digest[0] = byte_swap_32 (digest[0]);
17582 digest[1] = byte_swap_32 (digest[1]);
17583 digest[2] = byte_swap_32 (digest[2]);
17584 digest[3] = byte_swap_32 (digest[3]);
17585
17586 return (PARSER_OK);
17587 }
17588
17589 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17590 {
17591 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17592
17593 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17594
17595 uint32_t *digest = (uint32_t *) hash_buf->digest;
17596
17597 salt_t *salt = hash_buf->salt;
17598
17599 // digest
17600
17601 char *digest_pos = input_buf;
17602
17603 digest[0] = hex_to_uint (&digest_pos[0]);
17604 digest[1] = 0;
17605 digest[2] = 0;
17606 digest[3] = 0;
17607
17608 // salt
17609
17610 char *salt_buf = input_buf + 8 + 1;
17611
17612 uint salt_len = 8;
17613
17614 char *salt_buf_ptr = (char *) salt->salt_buf;
17615
17616 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17617
17618 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17619
17620 salt->salt_len = salt_len;
17621
17622 return (PARSER_OK);
17623 }
17624
17625 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17626 {
17627 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
17628
17629 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17630
17631 uint32_t *digest = (uint32_t *) hash_buf->digest;
17632
17633 salt_t *salt = hash_buf->salt;
17634
17635 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
17636
17637 /**
17638 * parse line
17639 */
17640
17641 char *p_buf_pos = input_buf + 4;
17642
17643 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
17644
17645 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17646
17647 uint32_t p_buf_len = NumCyclesPower_pos - p_buf_pos;
17648
17649 NumCyclesPower_pos++;
17650
17651 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
17652
17653 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17654
17655 uint32_t NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
17656
17657 salt_len_pos++;
17658
17659 char *salt_buf_pos = strchr (salt_len_pos, '$');
17660
17661 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17662
17663 uint32_t salt_len_len = salt_buf_pos - salt_len_pos;
17664
17665 salt_buf_pos++;
17666
17667 char *iv_len_pos = strchr (salt_buf_pos, '$');
17668
17669 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17670
17671 uint32_t salt_buf_len = iv_len_pos - salt_buf_pos;
17672
17673 iv_len_pos++;
17674
17675 char *iv_buf_pos = strchr (iv_len_pos, '$');
17676
17677 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17678
17679 uint32_t iv_len_len = iv_buf_pos - iv_len_pos;
17680
17681 iv_buf_pos++;
17682
17683 char *crc_buf_pos = strchr (iv_buf_pos, '$');
17684
17685 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17686
17687 uint32_t iv_buf_len = crc_buf_pos - iv_buf_pos;
17688
17689 crc_buf_pos++;
17690
17691 char *data_len_pos = strchr (crc_buf_pos, '$');
17692
17693 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17694
17695 uint32_t crc_buf_len = data_len_pos - crc_buf_pos;
17696
17697 data_len_pos++;
17698
17699 char *unpack_size_pos = strchr (data_len_pos, '$');
17700
17701 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17702
17703 uint32_t data_len_len = unpack_size_pos - data_len_pos;
17704
17705 unpack_size_pos++;
17706
17707 char *data_buf_pos = strchr (unpack_size_pos, '$');
17708
17709 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17710
17711 uint32_t unpack_size_len = data_buf_pos - unpack_size_pos;
17712
17713 data_buf_pos++;
17714
17715 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;
17716
17717 const uint iter = atoi (NumCyclesPower_pos);
17718 const uint crc = atoi (crc_buf_pos);
17719 const uint p_buf = atoi (p_buf_pos);
17720 const uint salt_len = atoi (salt_len_pos);
17721 const uint iv_len = atoi (iv_len_pos);
17722 const uint unpack_size = atoi (unpack_size_pos);
17723 const uint data_len = atoi (data_len_pos);
17724
17725 /**
17726 * verify some data
17727 */
17728
17729 if (p_buf != 0) return (PARSER_SALT_VALUE);
17730 if (salt_len != 0) return (PARSER_SALT_VALUE);
17731
17732 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
17733
17734 if (data_len > 384) return (PARSER_SALT_VALUE);
17735
17736 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
17737
17738 /**
17739 * store data
17740 */
17741
17742 seven_zip->iv_buf[0] = hex_to_uint (&iv_buf_pos[ 0]);
17743 seven_zip->iv_buf[1] = hex_to_uint (&iv_buf_pos[ 8]);
17744 seven_zip->iv_buf[2] = hex_to_uint (&iv_buf_pos[16]);
17745 seven_zip->iv_buf[3] = hex_to_uint (&iv_buf_pos[24]);
17746
17747 seven_zip->iv_len = iv_len;
17748
17749 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
17750
17751 seven_zip->salt_len = 0;
17752
17753 seven_zip->crc = crc;
17754
17755 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
17756 {
17757 seven_zip->data_buf[i] = hex_to_uint (&data_buf_pos[j]);
17758
17759 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
17760 }
17761
17762 seven_zip->data_len = data_len;
17763
17764 seven_zip->unpack_size = unpack_size;
17765
17766 // real salt
17767
17768 salt->salt_buf[0] = seven_zip->data_buf[0];
17769 salt->salt_buf[1] = seven_zip->data_buf[1];
17770 salt->salt_buf[2] = seven_zip->data_buf[2];
17771 salt->salt_buf[3] = seven_zip->data_buf[3];
17772
17773 salt->salt_len = 16;
17774
17775 salt->salt_sign[0] = iter;
17776
17777 salt->salt_iter = 1 << iter;
17778
17779 /**
17780 * digest
17781 */
17782
17783 digest[0] = crc;
17784 digest[1] = 0;
17785 digest[2] = 0;
17786 digest[3] = 0;
17787
17788 return (PARSER_OK);
17789 }
17790
17791 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17792 {
17793 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
17794
17795 uint32_t *digest = (uint32_t *) hash_buf->digest;
17796
17797 digest[0] = hex_to_uint (&input_buf[ 0]);
17798 digest[1] = hex_to_uint (&input_buf[ 8]);
17799 digest[2] = hex_to_uint (&input_buf[16]);
17800 digest[3] = hex_to_uint (&input_buf[24]);
17801 digest[4] = hex_to_uint (&input_buf[32]);
17802 digest[5] = hex_to_uint (&input_buf[40]);
17803 digest[6] = hex_to_uint (&input_buf[48]);
17804 digest[7] = hex_to_uint (&input_buf[56]);
17805
17806 digest[0] = byte_swap_32 (digest[0]);
17807 digest[1] = byte_swap_32 (digest[1]);
17808 digest[2] = byte_swap_32 (digest[2]);
17809 digest[3] = byte_swap_32 (digest[3]);
17810 digest[4] = byte_swap_32 (digest[4]);
17811 digest[5] = byte_swap_32 (digest[5]);
17812 digest[6] = byte_swap_32 (digest[6]);
17813 digest[7] = byte_swap_32 (digest[7]);
17814
17815 return (PARSER_OK);
17816 }
17817
17818 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17819 {
17820 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
17821
17822 uint32_t *digest = (uint32_t *) hash_buf->digest;
17823
17824 digest[ 0] = hex_to_uint (&input_buf[ 0]);
17825 digest[ 1] = hex_to_uint (&input_buf[ 8]);
17826 digest[ 2] = hex_to_uint (&input_buf[ 16]);
17827 digest[ 3] = hex_to_uint (&input_buf[ 24]);
17828 digest[ 4] = hex_to_uint (&input_buf[ 32]);
17829 digest[ 5] = hex_to_uint (&input_buf[ 40]);
17830 digest[ 6] = hex_to_uint (&input_buf[ 48]);
17831 digest[ 7] = hex_to_uint (&input_buf[ 56]);
17832 digest[ 8] = hex_to_uint (&input_buf[ 64]);
17833 digest[ 9] = hex_to_uint (&input_buf[ 72]);
17834 digest[10] = hex_to_uint (&input_buf[ 80]);
17835 digest[11] = hex_to_uint (&input_buf[ 88]);
17836 digest[12] = hex_to_uint (&input_buf[ 96]);
17837 digest[13] = hex_to_uint (&input_buf[104]);
17838 digest[14] = hex_to_uint (&input_buf[112]);
17839 digest[15] = hex_to_uint (&input_buf[120]);
17840
17841 digest[ 0] = byte_swap_32 (digest[ 0]);
17842 digest[ 1] = byte_swap_32 (digest[ 1]);
17843 digest[ 2] = byte_swap_32 (digest[ 2]);
17844 digest[ 3] = byte_swap_32 (digest[ 3]);
17845 digest[ 4] = byte_swap_32 (digest[ 4]);
17846 digest[ 5] = byte_swap_32 (digest[ 5]);
17847 digest[ 6] = byte_swap_32 (digest[ 6]);
17848 digest[ 7] = byte_swap_32 (digest[ 7]);
17849 digest[ 8] = byte_swap_32 (digest[ 8]);
17850 digest[ 9] = byte_swap_32 (digest[ 9]);
17851 digest[10] = byte_swap_32 (digest[10]);
17852 digest[11] = byte_swap_32 (digest[11]);
17853 digest[12] = byte_swap_32 (digest[12]);
17854 digest[13] = byte_swap_32 (digest[13]);
17855 digest[14] = byte_swap_32 (digest[14]);
17856 digest[15] = byte_swap_32 (digest[15]);
17857
17858 return (PARSER_OK);
17859 }
17860
17861 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17862 {
17863 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
17864
17865 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17866
17867 uint32_t *digest = (uint32_t *) hash_buf->digest;
17868
17869 salt_t *salt = hash_buf->salt;
17870
17871 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
17872
17873 /**
17874 * parse line
17875 */
17876
17877 // iterations
17878
17879 char *iter_pos = input_buf + 4;
17880
17881 uint32_t iter = atoi (iter_pos);
17882
17883 if (iter < 1) return (PARSER_SALT_ITERATION);
17884 if (iter > 999999) return (PARSER_SALT_ITERATION);
17885
17886 // first is *raw* salt
17887
17888 char *salt_pos = strchr (iter_pos, ':');
17889
17890 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17891
17892 salt_pos++;
17893
17894 char *hash_pos = strchr (salt_pos, ':');
17895
17896 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17897
17898 uint32_t salt_len = hash_pos - salt_pos;
17899
17900 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17901
17902 hash_pos++;
17903
17904 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
17905
17906 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17907
17908 // decode salt
17909
17910 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
17911
17912 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17913
17914 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17915
17916 salt_buf_ptr[salt_len + 3] = 0x01;
17917 salt_buf_ptr[salt_len + 4] = 0x80;
17918
17919 salt->salt_len = salt_len;
17920 salt->salt_iter = iter - 1;
17921
17922 // decode hash
17923
17924 char tmp_buf[100];
17925
17926 memset (tmp_buf, 0, sizeof (tmp_buf));
17927
17928 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
17929
17930 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17931
17932 memcpy (digest, tmp_buf, 16);
17933
17934 // add some stuff to normal salt to make sorted happy
17935
17936 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
17937 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
17938 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
17939 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
17940 salt->salt_buf[4] = salt->salt_iter;
17941
17942 return (PARSER_OK);
17943 }
17944
17945 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17946 {
17947 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
17948
17949 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
17950
17951 uint32_t *digest = (uint32_t *) hash_buf->digest;
17952
17953 salt_t *salt = hash_buf->salt;
17954
17955 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
17956
17957 /**
17958 * parse line
17959 */
17960
17961 // iterations
17962
17963 char *iter_pos = input_buf + 5;
17964
17965 uint32_t iter = atoi (iter_pos);
17966
17967 if (iter < 1) return (PARSER_SALT_ITERATION);
17968 if (iter > 999999) return (PARSER_SALT_ITERATION);
17969
17970 // first is *raw* salt
17971
17972 char *salt_pos = strchr (iter_pos, ':');
17973
17974 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17975
17976 salt_pos++;
17977
17978 char *hash_pos = strchr (salt_pos, ':');
17979
17980 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17981
17982 uint32_t salt_len = hash_pos - salt_pos;
17983
17984 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17985
17986 hash_pos++;
17987
17988 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
17989
17990 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17991
17992 // decode salt
17993
17994 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
17995
17996 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17997
17998 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17999
18000 salt_buf_ptr[salt_len + 3] = 0x01;
18001 salt_buf_ptr[salt_len + 4] = 0x80;
18002
18003 salt->salt_len = salt_len;
18004 salt->salt_iter = iter - 1;
18005
18006 // decode hash
18007
18008 char tmp_buf[100];
18009
18010 memset (tmp_buf, 0, sizeof (tmp_buf));
18011
18012 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
18013
18014 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18015
18016 memcpy (digest, tmp_buf, 16);
18017
18018 digest[0] = byte_swap_32 (digest[0]);
18019 digest[1] = byte_swap_32 (digest[1]);
18020 digest[2] = byte_swap_32 (digest[2]);
18021 digest[3] = byte_swap_32 (digest[3]);
18022
18023 // add some stuff to normal salt to make sorted happy
18024
18025 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18026 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18027 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18028 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18029 salt->salt_buf[4] = salt->salt_iter;
18030
18031 return (PARSER_OK);
18032 }
18033
18034 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18035 {
18036 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18037
18038 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18039
18040 uint64_t *digest = (uint64_t *) hash_buf->digest;
18041
18042 salt_t *salt = hash_buf->salt;
18043
18044 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18045
18046 /**
18047 * parse line
18048 */
18049
18050 // iterations
18051
18052 char *iter_pos = input_buf + 7;
18053
18054 uint32_t iter = atoi (iter_pos);
18055
18056 if (iter < 1) return (PARSER_SALT_ITERATION);
18057 if (iter > 999999) return (PARSER_SALT_ITERATION);
18058
18059 // first is *raw* salt
18060
18061 char *salt_pos = strchr (iter_pos, ':');
18062
18063 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18064
18065 salt_pos++;
18066
18067 char *hash_pos = strchr (salt_pos, ':');
18068
18069 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18070
18071 uint32_t salt_len = hash_pos - salt_pos;
18072
18073 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18074
18075 hash_pos++;
18076
18077 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
18078
18079 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18080
18081 // decode salt
18082
18083 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18084
18085 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18086
18087 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18088
18089 salt_buf_ptr[salt_len + 3] = 0x01;
18090 salt_buf_ptr[salt_len + 4] = 0x80;
18091
18092 salt->salt_len = salt_len;
18093 salt->salt_iter = iter - 1;
18094
18095 // decode hash
18096
18097 char tmp_buf[100];
18098
18099 memset (tmp_buf, 0, sizeof (tmp_buf));
18100
18101 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
18102
18103 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18104
18105 memcpy (digest, tmp_buf, 64);
18106
18107 digest[0] = byte_swap_64 (digest[0]);
18108 digest[1] = byte_swap_64 (digest[1]);
18109 digest[2] = byte_swap_64 (digest[2]);
18110 digest[3] = byte_swap_64 (digest[3]);
18111 digest[4] = byte_swap_64 (digest[4]);
18112 digest[5] = byte_swap_64 (digest[5]);
18113 digest[6] = byte_swap_64 (digest[6]);
18114 digest[7] = byte_swap_64 (digest[7]);
18115
18116 // add some stuff to normal salt to make sorted happy
18117
18118 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18119 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18120 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18121 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18122 salt->salt_buf[4] = salt->salt_iter;
18123
18124 return (PARSER_OK);
18125 }
18126
18127 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18128 {
18129 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18130
18131 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18132
18133 uint *digest = (uint *) hash_buf->digest;
18134
18135 salt_t *salt = hash_buf->salt;
18136
18137 /**
18138 * parse line
18139 */
18140
18141 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18142
18143 char *hash_pos = strchr (salt_pos, '$');
18144
18145 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18146
18147 uint32_t salt_len = hash_pos - salt_pos;
18148
18149 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18150
18151 hash_pos++;
18152
18153 uint32_t hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18154
18155 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18156
18157 // decode hash
18158
18159 digest[ 0] = hex_to_uint (&hash_pos[0]);
18160 digest[ 1] = hex_to_uint (&hash_pos[8]);
18161 digest[ 2] = 0;
18162 digest[ 3] = 0;
18163 digest[ 4] = 0;
18164 digest[ 5] = 0;
18165 digest[ 6] = 0;
18166 digest[ 7] = 0;
18167 digest[ 8] = 0;
18168 digest[ 9] = 0;
18169 digest[10] = 0;
18170 digest[11] = 0;
18171 digest[12] = 0;
18172 digest[13] = 0;
18173 digest[14] = 0;
18174 digest[15] = 0;
18175
18176 // decode salt
18177
18178 salt->salt_buf[0] = hex_to_uint (&salt_pos[0]);
18179 salt->salt_buf[1] = hex_to_uint (&salt_pos[8]);
18180
18181 salt->salt_iter = ROUNDS_ECRYPTFS;
18182 salt->salt_len = 8;
18183
18184 return (PARSER_OK);
18185 }
18186
18187 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18188 {
18189 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18190
18191 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18192
18193 unsigned char c19 = itoa64_to_int (input_buf[19]);
18194
18195 if (c19 & 3) return (PARSER_HASH_VALUE);
18196
18197 salt_t *salt = hash_buf->salt;
18198
18199 uint32_t *digest = (uint32_t *) hash_buf->digest;
18200
18201 // iteration count
18202
18203 salt->salt_iter = itoa64_to_int (input_buf[1])
18204 | itoa64_to_int (input_buf[2]) << 6
18205 | itoa64_to_int (input_buf[3]) << 12
18206 | itoa64_to_int (input_buf[4]) << 18;
18207
18208 // set salt
18209
18210 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18211 | itoa64_to_int (input_buf[6]) << 6
18212 | itoa64_to_int (input_buf[7]) << 12
18213 | itoa64_to_int (input_buf[8]) << 18;
18214
18215 salt->salt_len = 4;
18216
18217 char tmp_buf[100];
18218
18219 memset (tmp_buf, 0, sizeof (tmp_buf));
18220
18221 base64_decode (itoa64_to_int, input_buf + 9, 11, tmp_buf);
18222
18223 memcpy (digest, tmp_buf, 8);
18224
18225 uint tt;
18226
18227 IP (digest[0], digest[1], tt);
18228
18229 digest[0] = ROTATE_RIGHT (digest[0], 31);
18230 digest[1] = ROTATE_RIGHT (digest[1], 31);
18231 digest[2] = 0;
18232 digest[3] = 0;
18233
18234 return (PARSER_OK);
18235 }
18236
18237 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18238 {
18239 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18240
18241 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18242
18243 uint32_t *digest = (uint32_t *) hash_buf->digest;
18244
18245 salt_t *salt = hash_buf->salt;
18246
18247 /**
18248 * parse line
18249 */
18250
18251 char *type_pos = input_buf + 6 + 1;
18252
18253 char *salt_pos = strchr (type_pos, '*');
18254
18255 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18256
18257 uint32_t type_len = salt_pos - type_pos;
18258
18259 if (type_len != 1) return (PARSER_SALT_LENGTH);
18260
18261 salt_pos++;
18262
18263 char *crypted_pos = strchr (salt_pos, '*');
18264
18265 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18266
18267 uint32_t salt_len = crypted_pos - salt_pos;
18268
18269 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18270
18271 crypted_pos++;
18272
18273 uint32_t crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18274
18275 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18276
18277 /**
18278 * copy data
18279 */
18280
18281 salt->salt_buf[0] = hex_to_uint (&salt_pos[0]);
18282 salt->salt_buf[1] = hex_to_uint (&salt_pos[8]);
18283
18284 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18285 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18286
18287 salt->salt_buf[2] = hex_to_uint (&crypted_pos[ 0]);
18288 salt->salt_buf[3] = hex_to_uint (&crypted_pos[ 8]);
18289 salt->salt_buf[4] = hex_to_uint (&crypted_pos[16]);
18290 salt->salt_buf[5] = hex_to_uint (&crypted_pos[24]);
18291
18292 salt->salt_len = 24;
18293 salt->salt_iter = ROUNDS_RAR3;
18294
18295 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18296 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18297
18298 digest[0] = 0xc43d7b00;
18299 digest[1] = 0x40070000;
18300 digest[2] = 0;
18301 digest[3] = 0;
18302
18303 return (PARSER_OK);
18304 }
18305
18306 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18307 {
18308 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18309
18310 uint32_t *digest = (uint32_t *) hash_buf->digest;
18311
18312 salt_t *salt = hash_buf->salt;
18313
18314 digest[0] = hex_to_uint (&input_buf[ 0]);
18315 digest[1] = hex_to_uint (&input_buf[ 8]);
18316 digest[2] = hex_to_uint (&input_buf[16]);
18317 digest[3] = hex_to_uint (&input_buf[24]);
18318 digest[4] = hex_to_uint (&input_buf[32]);
18319 digest[5] = hex_to_uint (&input_buf[40]);
18320 digest[6] = hex_to_uint (&input_buf[48]);
18321 digest[7] = hex_to_uint (&input_buf[56]);
18322
18323 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18324
18325 uint salt_len = input_len - 64 - 1;
18326
18327 char *salt_buf = input_buf + 64 + 1;
18328
18329 char *salt_buf_ptr = (char *) salt->salt_buf;
18330
18331 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18332
18333 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18334
18335 salt->salt_len = salt_len;
18336
18337 /**
18338 * we can precompute the first sha256 transform
18339 */
18340
18341 uint w[16];
18342
18343 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18344 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18345 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18346 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18347 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18348 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18349 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18350 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18351 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18352 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18353 w[10] = byte_swap_32 (salt->salt_buf[10]);
18354 w[11] = byte_swap_32 (salt->salt_buf[11]);
18355 w[12] = byte_swap_32 (salt->salt_buf[12]);
18356 w[13] = byte_swap_32 (salt->salt_buf[13]);
18357 w[14] = byte_swap_32 (salt->salt_buf[14]);
18358 w[15] = byte_swap_32 (salt->salt_buf[15]);
18359
18360 uint pc256[8];
18361
18362 pc256[0] = SHA256M_A;
18363 pc256[1] = SHA256M_B;
18364 pc256[2] = SHA256M_C;
18365 pc256[3] = SHA256M_D;
18366 pc256[4] = SHA256M_E;
18367 pc256[5] = SHA256M_F;
18368 pc256[6] = SHA256M_G;
18369 pc256[7] = SHA256M_H;
18370
18371 sha256_64 (w, pc256);
18372
18373 salt->salt_buf_pc[0] = pc256[0];
18374 salt->salt_buf_pc[1] = pc256[1];
18375 salt->salt_buf_pc[2] = pc256[2];
18376 salt->salt_buf_pc[3] = pc256[3];
18377 salt->salt_buf_pc[4] = pc256[4];
18378 salt->salt_buf_pc[5] = pc256[5];
18379 salt->salt_buf_pc[6] = pc256[6];
18380 salt->salt_buf_pc[7] = pc256[7];
18381
18382 digest[0] -= pc256[0];
18383 digest[1] -= pc256[1];
18384 digest[2] -= pc256[2];
18385 digest[3] -= pc256[3];
18386 digest[4] -= pc256[4];
18387 digest[5] -= pc256[5];
18388 digest[6] -= pc256[6];
18389 digest[7] -= pc256[7];
18390
18391 return (PARSER_OK);
18392 }
18393
18394 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18395 {
18396 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18397
18398 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18399
18400 uint32_t *digest = (uint32_t *) hash_buf->digest;
18401
18402 salt_t *salt = hash_buf->salt;
18403
18404 /**
18405 * parse line
18406 */
18407
18408 char *data_len_pos = input_buf + 1 + 10 + 1;
18409
18410 char *data_buf_pos = strchr (data_len_pos, '$');
18411
18412 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18413
18414 uint32_t data_len_len = data_buf_pos - data_len_pos;
18415
18416 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18417 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18418
18419 data_buf_pos++;
18420
18421 uint32_t data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18422
18423 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18424
18425 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18426
18427 uint32_t data_len = atoi (data_len_pos);
18428
18429 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18430
18431 /**
18432 * salt
18433 */
18434
18435 char *salt_pos = data_buf_pos;
18436
18437 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
18438 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
18439 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]);
18440 salt->salt_buf[3] = hex_to_uint (&salt_pos[24]);
18441
18442 // this is actually the CT, which is also the hash later (if matched)
18443
18444 salt->salt_buf[4] = hex_to_uint (&salt_pos[32]);
18445 salt->salt_buf[5] = hex_to_uint (&salt_pos[40]);
18446 salt->salt_buf[6] = hex_to_uint (&salt_pos[48]);
18447 salt->salt_buf[7] = hex_to_uint (&salt_pos[56]);
18448
18449 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18450
18451 salt->salt_iter = 10 - 1;
18452
18453 /**
18454 * digest buf
18455 */
18456
18457 digest[0] = salt->salt_buf[4];
18458 digest[1] = salt->salt_buf[5];
18459 digest[2] = salt->salt_buf[6];
18460 digest[3] = salt->salt_buf[7];
18461
18462 return (PARSER_OK);
18463 }
18464
18465 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18466 {
18467 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
18468
18469 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18470
18471 uint32_t *digest = (uint32_t *) hash_buf->digest;
18472
18473 salt_t *salt = hash_buf->salt;
18474
18475 /**
18476 * parse line
18477 */
18478
18479 char *salt_pos = input_buf + 11 + 1;
18480
18481 char *iter_pos = strchr (salt_pos, ',');
18482
18483 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18484
18485 uint32_t salt_len = iter_pos - salt_pos;
18486
18487 if (salt_len != 20) return (PARSER_SALT_LENGTH);
18488
18489 iter_pos++;
18490
18491 char *hash_pos = strchr (iter_pos, ',');
18492
18493 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18494
18495 uint32_t iter_len = hash_pos - iter_pos;
18496
18497 if (iter_len > 5) return (PARSER_SALT_LENGTH);
18498
18499 hash_pos++;
18500
18501 uint32_t hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
18502
18503 if (hash_len != 64) return (PARSER_HASH_LENGTH);
18504
18505 /**
18506 * salt
18507 */
18508
18509 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
18510 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
18511 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]) & 0xffff0000;
18512 salt->salt_buf[3] = 0x00018000;
18513
18514 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18515 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18516 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
18517 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
18518
18519 salt->salt_len = salt_len / 2;
18520
18521 salt->salt_iter = atoi (iter_pos) - 1;
18522
18523 /**
18524 * digest buf
18525 */
18526
18527 digest[0] = hex_to_uint (&hash_pos[ 0]);
18528 digest[1] = hex_to_uint (&hash_pos[ 8]);
18529 digest[2] = hex_to_uint (&hash_pos[16]);
18530 digest[3] = hex_to_uint (&hash_pos[24]);
18531 digest[4] = hex_to_uint (&hash_pos[32]);
18532 digest[5] = hex_to_uint (&hash_pos[40]);
18533 digest[6] = hex_to_uint (&hash_pos[48]);
18534 digest[7] = hex_to_uint (&hash_pos[56]);
18535
18536 return (PARSER_OK);
18537 }
18538
18539 /**
18540 * parallel running threads
18541 */
18542
18543 #ifdef WIN
18544
18545 BOOL WINAPI sigHandler_default (DWORD sig)
18546 {
18547 switch (sig)
18548 {
18549 case CTRL_CLOSE_EVENT:
18550
18551 /*
18552 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
18553 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
18554 * function otherwise it is to late (e.g. after returning from this function)
18555 */
18556
18557 myabort ();
18558
18559 SetConsoleCtrlHandler (NULL, TRUE);
18560
18561 hc_sleep (10);
18562
18563 return TRUE;
18564
18565 case CTRL_C_EVENT:
18566 case CTRL_LOGOFF_EVENT:
18567 case CTRL_SHUTDOWN_EVENT:
18568
18569 myabort ();
18570
18571 SetConsoleCtrlHandler (NULL, TRUE);
18572
18573 return TRUE;
18574 }
18575
18576 return FALSE;
18577 }
18578
18579 BOOL WINAPI sigHandler_benchmark (DWORD sig)
18580 {
18581 switch (sig)
18582 {
18583 case CTRL_CLOSE_EVENT:
18584
18585 myabort ();
18586
18587 SetConsoleCtrlHandler (NULL, TRUE);
18588
18589 hc_sleep (10);
18590
18591 return TRUE;
18592
18593 case CTRL_C_EVENT:
18594 case CTRL_LOGOFF_EVENT:
18595 case CTRL_SHUTDOWN_EVENT:
18596
18597 myquit ();
18598
18599 SetConsoleCtrlHandler (NULL, TRUE);
18600
18601 return TRUE;
18602 }
18603
18604 return FALSE;
18605 }
18606
18607 void hc_signal (BOOL WINAPI (callback) (DWORD))
18608 {
18609 if (callback == NULL)
18610 {
18611 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
18612 }
18613 else
18614 {
18615 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
18616 }
18617 }
18618
18619 #else
18620
18621 void sigHandler_default (int sig)
18622 {
18623 myabort ();
18624
18625 signal (sig, NULL);
18626 }
18627
18628 void sigHandler_benchmark (int sig)
18629 {
18630 myquit ();
18631
18632 signal (sig, NULL);
18633 }
18634
18635 void hc_signal (void (callback) (int))
18636 {
18637 if (callback == NULL) callback = SIG_DFL;
18638
18639 signal (SIGINT, callback);
18640 signal (SIGTERM, callback);
18641 signal (SIGABRT, callback);
18642 }
18643
18644 #endif
18645
18646 void status_display ();
18647
18648 void *thread_keypress (void *p)
18649 {
18650 int benchmark = *((int *) p);
18651
18652 uint quiet = data.quiet;
18653
18654 tty_break();
18655
18656 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
18657 {
18658 int ch = tty_getchar();
18659
18660 if (ch == -1) break;
18661
18662 if (ch == 0) continue;
18663
18664 #ifdef _POSIX
18665 if (ch != '\n')
18666 #endif
18667
18668 hc_thread_mutex_lock (mux_display);
18669
18670 log_info ("");
18671
18672 switch (ch)
18673 {
18674 case 's':
18675 case '\n':
18676
18677 log_info ("");
18678
18679 status_display ();
18680
18681 log_info ("");
18682
18683 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18684 if (quiet == 0) fflush (stdout);
18685
18686 break;
18687
18688 case 'b':
18689
18690 log_info ("");
18691
18692 bypass ();
18693
18694 log_info ("");
18695
18696 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18697 if (quiet == 0) fflush (stdout);
18698
18699 break;
18700
18701 case 'p':
18702
18703 log_info ("");
18704
18705 SuspendThreads ();
18706
18707 log_info ("");
18708
18709 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18710 if (quiet == 0) fflush (stdout);
18711
18712 break;
18713
18714 case 'r':
18715
18716 log_info ("");
18717
18718 ResumeThreads ();
18719
18720 log_info ("");
18721
18722 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18723 if (quiet == 0) fflush (stdout);
18724
18725 break;
18726
18727 case 'c':
18728
18729 log_info ("");
18730
18731 if (benchmark == 1) break;
18732
18733 stop_at_checkpoint ();
18734
18735 log_info ("");
18736
18737 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18738 if (quiet == 0) fflush (stdout);
18739
18740 break;
18741
18742 case 'q':
18743
18744 log_info ("");
18745
18746 if (benchmark == 1)
18747 {
18748 myquit ();
18749 }
18750 else
18751 {
18752 myabort ();
18753 }
18754
18755 break;
18756 }
18757
18758 hc_thread_mutex_unlock (mux_display);
18759 }
18760
18761 tty_fix();
18762
18763 return (p);
18764 }
18765
18766 /**
18767 * rules common
18768 */
18769
18770 bool class_num (char c)
18771 {
18772 return ((c >= '0') && (c <= '9'));
18773 }
18774
18775 bool class_lower (char c)
18776 {
18777 return ((c >= 'a') && (c <= 'z'));
18778 }
18779
18780 bool class_upper (char c)
18781 {
18782 return ((c >= 'A') && (c <= 'Z'));
18783 }
18784
18785 bool class_alpha (char c)
18786 {
18787 return (class_lower (c) || class_upper (c));
18788 }
18789
18790 char conv_ctoi (char c)
18791 {
18792 if (class_num (c))
18793 {
18794 return c - '0';
18795 }
18796 else if (class_upper (c))
18797 {
18798 return c - 'A' + (char) 10;
18799 }
18800
18801 return (char) (-1);
18802 }
18803
18804 char conv_itoc (char c)
18805 {
18806 if (c < 10)
18807 {
18808 return c + '0';
18809 }
18810 else if (c < 37)
18811 {
18812 return c + 'A' - (char) 10;
18813 }
18814
18815 return (char) (-1);
18816 }
18817
18818 /**
18819 * GPU rules
18820 */
18821
18822 #define INCR_POS if (++rule_pos == rule_len) return (-1)
18823 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
18824 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
18825 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
18826 #define MAX_GPU_RULES 14
18827 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
18828 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
18829 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
18830
18831 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
18832 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
18833 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
18834 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
18835
18836 int cpu_rule_to_gpu_rule (char rule_buf[BUFSIZ], uint rule_len, gpu_rule_t *rule)
18837 {
18838 uint rule_pos;
18839 uint rule_cnt;
18840
18841 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_GPU_RULES; rule_pos++, rule_cnt++)
18842 {
18843 switch (rule_buf[rule_pos])
18844 {
18845 case ' ':
18846 rule_cnt--;
18847 break;
18848
18849 case RULE_OP_MANGLE_NOOP:
18850 SET_NAME (rule, rule_buf[rule_pos]);
18851 break;
18852
18853 case RULE_OP_MANGLE_LREST:
18854 SET_NAME (rule, rule_buf[rule_pos]);
18855 break;
18856
18857 case RULE_OP_MANGLE_UREST:
18858 SET_NAME (rule, rule_buf[rule_pos]);
18859 break;
18860
18861 case RULE_OP_MANGLE_LREST_UFIRST:
18862 SET_NAME (rule, rule_buf[rule_pos]);
18863 break;
18864
18865 case RULE_OP_MANGLE_UREST_LFIRST:
18866 SET_NAME (rule, rule_buf[rule_pos]);
18867 break;
18868
18869 case RULE_OP_MANGLE_TREST:
18870 SET_NAME (rule, rule_buf[rule_pos]);
18871 break;
18872
18873 case RULE_OP_MANGLE_TOGGLE_AT:
18874 SET_NAME (rule, rule_buf[rule_pos]);
18875 SET_P0_CONV (rule, rule_buf[rule_pos]);
18876 break;
18877
18878 case RULE_OP_MANGLE_REVERSE:
18879 SET_NAME (rule, rule_buf[rule_pos]);
18880 break;
18881
18882 case RULE_OP_MANGLE_DUPEWORD:
18883 SET_NAME (rule, rule_buf[rule_pos]);
18884 break;
18885
18886 case RULE_OP_MANGLE_DUPEWORD_TIMES:
18887 SET_NAME (rule, rule_buf[rule_pos]);
18888 SET_P0_CONV (rule, rule_buf[rule_pos]);
18889 break;
18890
18891 case RULE_OP_MANGLE_REFLECT:
18892 SET_NAME (rule, rule_buf[rule_pos]);
18893 break;
18894
18895 case RULE_OP_MANGLE_ROTATE_LEFT:
18896 SET_NAME (rule, rule_buf[rule_pos]);
18897 break;
18898
18899 case RULE_OP_MANGLE_ROTATE_RIGHT:
18900 SET_NAME (rule, rule_buf[rule_pos]);
18901 break;
18902
18903 case RULE_OP_MANGLE_APPEND:
18904 SET_NAME (rule, rule_buf[rule_pos]);
18905 SET_P0 (rule, rule_buf[rule_pos]);
18906 break;
18907
18908 case RULE_OP_MANGLE_PREPEND:
18909 SET_NAME (rule, rule_buf[rule_pos]);
18910 SET_P0 (rule, rule_buf[rule_pos]);
18911 break;
18912
18913 case RULE_OP_MANGLE_DELETE_FIRST:
18914 SET_NAME (rule, rule_buf[rule_pos]);
18915 break;
18916
18917 case RULE_OP_MANGLE_DELETE_LAST:
18918 SET_NAME (rule, rule_buf[rule_pos]);
18919 break;
18920
18921 case RULE_OP_MANGLE_DELETE_AT:
18922 SET_NAME (rule, rule_buf[rule_pos]);
18923 SET_P0_CONV (rule, rule_buf[rule_pos]);
18924 break;
18925
18926 case RULE_OP_MANGLE_EXTRACT:
18927 SET_NAME (rule, rule_buf[rule_pos]);
18928 SET_P0_CONV (rule, rule_buf[rule_pos]);
18929 SET_P1_CONV (rule, rule_buf[rule_pos]);
18930 break;
18931
18932 case RULE_OP_MANGLE_OMIT:
18933 SET_NAME (rule, rule_buf[rule_pos]);
18934 SET_P0_CONV (rule, rule_buf[rule_pos]);
18935 SET_P1_CONV (rule, rule_buf[rule_pos]);
18936 break;
18937
18938 case RULE_OP_MANGLE_INSERT:
18939 SET_NAME (rule, rule_buf[rule_pos]);
18940 SET_P0_CONV (rule, rule_buf[rule_pos]);
18941 SET_P1 (rule, rule_buf[rule_pos]);
18942 break;
18943
18944 case RULE_OP_MANGLE_OVERSTRIKE:
18945 SET_NAME (rule, rule_buf[rule_pos]);
18946 SET_P0_CONV (rule, rule_buf[rule_pos]);
18947 SET_P1 (rule, rule_buf[rule_pos]);
18948 break;
18949
18950 case RULE_OP_MANGLE_TRUNCATE_AT:
18951 SET_NAME (rule, rule_buf[rule_pos]);
18952 SET_P0_CONV (rule, rule_buf[rule_pos]);
18953 break;
18954
18955 case RULE_OP_MANGLE_REPLACE:
18956 SET_NAME (rule, rule_buf[rule_pos]);
18957 SET_P0 (rule, rule_buf[rule_pos]);
18958 SET_P1 (rule, rule_buf[rule_pos]);
18959 break;
18960
18961 case RULE_OP_MANGLE_PURGECHAR:
18962 return (-1);
18963 break;
18964
18965 case RULE_OP_MANGLE_TOGGLECASE_REC:
18966 return (-1);
18967 break;
18968
18969 case RULE_OP_MANGLE_DUPECHAR_FIRST:
18970 SET_NAME (rule, rule_buf[rule_pos]);
18971 SET_P0_CONV (rule, rule_buf[rule_pos]);
18972 break;
18973
18974 case RULE_OP_MANGLE_DUPECHAR_LAST:
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_ALL:
18980 SET_NAME (rule, rule_buf[rule_pos]);
18981 break;
18982
18983 case RULE_OP_MANGLE_SWITCH_FIRST:
18984 SET_NAME (rule, rule_buf[rule_pos]);
18985 break;
18986
18987 case RULE_OP_MANGLE_SWITCH_LAST:
18988 SET_NAME (rule, rule_buf[rule_pos]);
18989 break;
18990
18991 case RULE_OP_MANGLE_SWITCH_AT:
18992 SET_NAME (rule, rule_buf[rule_pos]);
18993 SET_P0_CONV (rule, rule_buf[rule_pos]);
18994 SET_P1_CONV (rule, rule_buf[rule_pos]);
18995 break;
18996
18997 case RULE_OP_MANGLE_CHR_SHIFTL:
18998 SET_NAME (rule, rule_buf[rule_pos]);
18999 SET_P0_CONV (rule, rule_buf[rule_pos]);
19000 break;
19001
19002 case RULE_OP_MANGLE_CHR_SHIFTR:
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_INCR:
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_DECR:
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_REPLACE_NP1:
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_NM1:
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_DUPEBLOCK_FIRST:
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_LAST:
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_TITLE:
19038 SET_NAME (rule, rule_buf[rule_pos]);
19039 break;
19040
19041 default:
19042 return (-1);
19043 break;
19044 }
19045 }
19046
19047 if (rule_pos < rule_len) return (-1);
19048
19049 return (0);
19050 }
19051
19052 int gpu_rule_to_cpu_rule (char rule_buf[BUFSIZ], gpu_rule_t *rule)
19053 {
19054 uint rule_cnt;
19055 uint rule_pos;
19056 uint rule_len = BUFSIZ - 1; // maximum possible len
19057
19058 char rule_cmd;
19059
19060 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_GPU_RULES; rule_pos++, rule_cnt++)
19061 {
19062 GET_NAME (rule);
19063
19064 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19065
19066 switch (rule_cmd)
19067 {
19068 case RULE_OP_MANGLE_NOOP:
19069 rule_buf[rule_pos] = rule_cmd;
19070 break;
19071
19072 case RULE_OP_MANGLE_LREST:
19073 rule_buf[rule_pos] = rule_cmd;
19074 break;
19075
19076 case RULE_OP_MANGLE_UREST:
19077 rule_buf[rule_pos] = rule_cmd;
19078 break;
19079
19080 case RULE_OP_MANGLE_LREST_UFIRST:
19081 rule_buf[rule_pos] = rule_cmd;
19082 break;
19083
19084 case RULE_OP_MANGLE_UREST_LFIRST:
19085 rule_buf[rule_pos] = rule_cmd;
19086 break;
19087
19088 case RULE_OP_MANGLE_TREST:
19089 rule_buf[rule_pos] = rule_cmd;
19090 break;
19091
19092 case RULE_OP_MANGLE_TOGGLE_AT:
19093 rule_buf[rule_pos] = rule_cmd;
19094 GET_P0_CONV (rule);
19095 break;
19096
19097 case RULE_OP_MANGLE_REVERSE:
19098 rule_buf[rule_pos] = rule_cmd;
19099 break;
19100
19101 case RULE_OP_MANGLE_DUPEWORD:
19102 rule_buf[rule_pos] = rule_cmd;
19103 break;
19104
19105 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19106 rule_buf[rule_pos] = rule_cmd;
19107 GET_P0_CONV (rule);
19108 break;
19109
19110 case RULE_OP_MANGLE_REFLECT:
19111 rule_buf[rule_pos] = rule_cmd;
19112 break;
19113
19114 case RULE_OP_MANGLE_ROTATE_LEFT:
19115 rule_buf[rule_pos] = rule_cmd;
19116 break;
19117
19118 case RULE_OP_MANGLE_ROTATE_RIGHT:
19119 rule_buf[rule_pos] = rule_cmd;
19120 break;
19121
19122 case RULE_OP_MANGLE_APPEND:
19123 rule_buf[rule_pos] = rule_cmd;
19124 GET_P0 (rule);
19125 break;
19126
19127 case RULE_OP_MANGLE_PREPEND:
19128 rule_buf[rule_pos] = rule_cmd;
19129 GET_P0 (rule);
19130 break;
19131
19132 case RULE_OP_MANGLE_DELETE_FIRST:
19133 rule_buf[rule_pos] = rule_cmd;
19134 break;
19135
19136 case RULE_OP_MANGLE_DELETE_LAST:
19137 rule_buf[rule_pos] = rule_cmd;
19138 break;
19139
19140 case RULE_OP_MANGLE_DELETE_AT:
19141 rule_buf[rule_pos] = rule_cmd;
19142 GET_P0_CONV (rule);
19143 break;
19144
19145 case RULE_OP_MANGLE_EXTRACT:
19146 rule_buf[rule_pos] = rule_cmd;
19147 GET_P0_CONV (rule);
19148 GET_P1_CONV (rule);
19149 break;
19150
19151 case RULE_OP_MANGLE_OMIT:
19152 rule_buf[rule_pos] = rule_cmd;
19153 GET_P0_CONV (rule);
19154 GET_P1_CONV (rule);
19155 break;
19156
19157 case RULE_OP_MANGLE_INSERT:
19158 rule_buf[rule_pos] = rule_cmd;
19159 GET_P0_CONV (rule);
19160 GET_P1 (rule);
19161 break;
19162
19163 case RULE_OP_MANGLE_OVERSTRIKE:
19164 rule_buf[rule_pos] = rule_cmd;
19165 GET_P0_CONV (rule);
19166 GET_P1 (rule);
19167 break;
19168
19169 case RULE_OP_MANGLE_TRUNCATE_AT:
19170 rule_buf[rule_pos] = rule_cmd;
19171 GET_P0_CONV (rule);
19172 break;
19173
19174 case RULE_OP_MANGLE_REPLACE:
19175 rule_buf[rule_pos] = rule_cmd;
19176 GET_P0 (rule);
19177 GET_P1 (rule);
19178 break;
19179
19180 case RULE_OP_MANGLE_PURGECHAR:
19181 return (-1);
19182 break;
19183
19184 case RULE_OP_MANGLE_TOGGLECASE_REC:
19185 return (-1);
19186 break;
19187
19188 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19189 rule_buf[rule_pos] = rule_cmd;
19190 GET_P0_CONV (rule);
19191 break;
19192
19193 case RULE_OP_MANGLE_DUPECHAR_LAST:
19194 rule_buf[rule_pos] = rule_cmd;
19195 GET_P0_CONV (rule);
19196 break;
19197
19198 case RULE_OP_MANGLE_DUPECHAR_ALL:
19199 rule_buf[rule_pos] = rule_cmd;
19200 break;
19201
19202 case RULE_OP_MANGLE_SWITCH_FIRST:
19203 rule_buf[rule_pos] = rule_cmd;
19204 break;
19205
19206 case RULE_OP_MANGLE_SWITCH_LAST:
19207 rule_buf[rule_pos] = rule_cmd;
19208 break;
19209
19210 case RULE_OP_MANGLE_SWITCH_AT:
19211 rule_buf[rule_pos] = rule_cmd;
19212 GET_P0_CONV (rule);
19213 GET_P1_CONV (rule);
19214 break;
19215
19216 case RULE_OP_MANGLE_CHR_SHIFTL:
19217 rule_buf[rule_pos] = rule_cmd;
19218 GET_P0_CONV (rule);
19219 break;
19220
19221 case RULE_OP_MANGLE_CHR_SHIFTR:
19222 rule_buf[rule_pos] = rule_cmd;
19223 GET_P0_CONV (rule);
19224 break;
19225
19226 case RULE_OP_MANGLE_CHR_INCR:
19227 rule_buf[rule_pos] = rule_cmd;
19228 GET_P0_CONV (rule);
19229 break;
19230
19231 case RULE_OP_MANGLE_CHR_DECR:
19232 rule_buf[rule_pos] = rule_cmd;
19233 GET_P0_CONV (rule);
19234 break;
19235
19236 case RULE_OP_MANGLE_REPLACE_NP1:
19237 rule_buf[rule_pos] = rule_cmd;
19238 GET_P0_CONV (rule);
19239 break;
19240
19241 case RULE_OP_MANGLE_REPLACE_NM1:
19242 rule_buf[rule_pos] = rule_cmd;
19243 GET_P0_CONV (rule);
19244 break;
19245
19246 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19247 rule_buf[rule_pos] = rule_cmd;
19248 GET_P0_CONV (rule);
19249 break;
19250
19251 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19252 rule_buf[rule_pos] = rule_cmd;
19253 GET_P0_CONV (rule);
19254 break;
19255
19256 case RULE_OP_MANGLE_TITLE:
19257 rule_buf[rule_pos] = rule_cmd;
19258 break;
19259
19260 case 0:
19261 return rule_pos - 1;
19262 break;
19263
19264 default:
19265 return (-1);
19266 break;
19267 }
19268 }
19269
19270 if (rule_cnt > 0)
19271 {
19272 return rule_pos;
19273 }
19274
19275 return (-1);
19276 }
19277
19278 /**
19279 * CPU rules : this is from hashcat sources, cpu based rules
19280 */
19281
19282 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19283 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19284
19285 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19286 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19287 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19288
19289 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19290 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19291 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19292
19293 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19294 {
19295 int pos;
19296
19297 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19298
19299 return (arr_len);
19300 }
19301
19302 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19303 {
19304 int pos;
19305
19306 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19307
19308 return (arr_len);
19309 }
19310
19311 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19312 {
19313 int pos;
19314
19315 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19316
19317 return (arr_len);
19318 }
19319
19320 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19321 {
19322 int l;
19323 int r;
19324
19325 for (l = 0; l < arr_len; l++)
19326 {
19327 r = arr_len - 1 - l;
19328
19329 if (l >= r) break;
19330
19331 MANGLE_SWITCH (arr, l, r);
19332 }
19333
19334 return (arr_len);
19335 }
19336
19337 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19338 {
19339 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19340
19341 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19342
19343 return (arr_len * 2);
19344 }
19345
19346 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19347 {
19348 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19349
19350 int orig_len = arr_len;
19351
19352 int i;
19353
19354 for (i = 0; i < times; i++)
19355 {
19356 memcpy (&arr[arr_len], arr, orig_len);
19357
19358 arr_len += orig_len;
19359 }
19360
19361 return (arr_len);
19362 }
19363
19364 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19365 {
19366 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19367
19368 mangle_double (arr, arr_len);
19369
19370 mangle_reverse (arr + arr_len, arr_len);
19371
19372 return (arr_len * 2);
19373 }
19374
19375 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19376 {
19377 int l;
19378 int r;
19379
19380 for (l = 0, r = arr_len - 1; r > 0; r--)
19381 {
19382 MANGLE_SWITCH (arr, l, r);
19383 }
19384
19385 return (arr_len);
19386 }
19387
19388 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19389 {
19390 int l;
19391 int r;
19392
19393 for (l = 0, r = arr_len - 1; l < r; l++)
19394 {
19395 MANGLE_SWITCH (arr, l, r);
19396 }
19397
19398 return (arr_len);
19399 }
19400
19401 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19402 {
19403 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19404
19405 arr[arr_len] = c;
19406
19407 return (arr_len + 1);
19408 }
19409
19410 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19411 {
19412 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19413
19414 int arr_pos;
19415
19416 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19417 {
19418 arr[arr_pos + 1] = arr[arr_pos];
19419 }
19420
19421 arr[0] = c;
19422
19423 return (arr_len + 1);
19424 }
19425
19426 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19427 {
19428 if (upos >= arr_len) return (arr_len);
19429
19430 int arr_pos;
19431
19432 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
19433 {
19434 arr[arr_pos] = arr[arr_pos + 1];
19435 }
19436
19437 return (arr_len - 1);
19438 }
19439
19440 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19441 {
19442 if (upos >= arr_len) return (arr_len);
19443
19444 if ((upos + ulen) > arr_len) return (arr_len);
19445
19446 int arr_pos;
19447
19448 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
19449 {
19450 arr[arr_pos] = arr[upos + arr_pos];
19451 }
19452
19453 return (ulen);
19454 }
19455
19456 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19457 {
19458 if (upos >= arr_len) return (arr_len);
19459
19460 if ((upos + ulen) >= arr_len) return (arr_len);
19461
19462 int arr_pos;
19463
19464 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
19465 {
19466 arr[arr_pos] = arr[arr_pos + ulen];
19467 }
19468
19469 return (arr_len - ulen);
19470 }
19471
19472 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19473 {
19474 if (upos >= arr_len) return (arr_len);
19475
19476 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19477
19478 int arr_pos;
19479
19480 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
19481 {
19482 arr[arr_pos + 1] = arr[arr_pos];
19483 }
19484
19485 arr[upos] = c;
19486
19487 return (arr_len + 1);
19488 }
19489
19490 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)
19491 {
19492 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
19493
19494 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
19495
19496 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
19497
19498 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
19499
19500 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
19501
19502 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
19503
19504 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
19505
19506 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
19507
19508 return (arr_len + arr2_cpy);
19509 }
19510
19511 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19512 {
19513 if (upos >= arr_len) return (arr_len);
19514
19515 arr[upos] = c;
19516
19517 return (arr_len);
19518 }
19519
19520 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19521 {
19522 if (upos >= arr_len) return (arr_len);
19523
19524 memset (arr + upos, 0, arr_len - upos);
19525
19526 return (upos);
19527 }
19528
19529 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
19530 {
19531 int arr_pos;
19532
19533 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
19534 {
19535 if (arr[arr_pos] != oldc) continue;
19536
19537 arr[arr_pos] = newc;
19538 }
19539
19540 return (arr_len);
19541 }
19542
19543 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
19544 {
19545 int arr_pos;
19546
19547 int ret_len;
19548
19549 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
19550 {
19551 if (arr[arr_pos] == c) continue;
19552
19553 arr[ret_len] = arr[arr_pos];
19554
19555 ret_len++;
19556 }
19557
19558 return (ret_len);
19559 }
19560
19561 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
19562 {
19563 if (ulen > arr_len) return (arr_len);
19564
19565 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19566
19567 char cs[100];
19568
19569 memcpy (cs, arr, ulen);
19570
19571 int i;
19572
19573 for (i = 0; i < ulen; i++)
19574 {
19575 char c = cs[i];
19576
19577 arr_len = mangle_insert (arr, arr_len, i, c);
19578 }
19579
19580 return (arr_len);
19581 }
19582
19583 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
19584 {
19585 if (ulen > arr_len) return (arr_len);
19586
19587 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19588
19589 int upos = arr_len - ulen;
19590
19591 int i;
19592
19593 for (i = 0; i < ulen; i++)
19594 {
19595 char c = arr[upos + i];
19596
19597 arr_len = mangle_append (arr, arr_len, c);
19598 }
19599
19600 return (arr_len);
19601 }
19602
19603 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19604 {
19605 if ( arr_len == 0) return (arr_len);
19606 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19607
19608 char c = arr[upos];
19609
19610 int i;
19611
19612 for (i = 0; i < ulen; i++)
19613 {
19614 arr_len = mangle_insert (arr, arr_len, upos, c);
19615 }
19616
19617 return (arr_len);
19618 }
19619
19620 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
19621 {
19622 if ( arr_len == 0) return (arr_len);
19623 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
19624
19625 int arr_pos;
19626
19627 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19628 {
19629 int new_pos = arr_pos * 2;
19630
19631 arr[new_pos] = arr[arr_pos];
19632
19633 arr[new_pos + 1] = arr[arr_pos];
19634 }
19635
19636 return (arr_len * 2);
19637 }
19638
19639 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
19640 {
19641 if (upos >= arr_len) return (arr_len);
19642 if (upos2 >= arr_len) return (arr_len);
19643
19644 MANGLE_SWITCH (arr, upos, upos2);
19645
19646 return (arr_len);
19647 }
19648
19649 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
19650 {
19651 MANGLE_SWITCH (arr, upos, upos2);
19652
19653 return (arr_len);
19654 }
19655
19656 int mangle_chr_shiftl (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19657 {
19658 if (upos >= arr_len) return (arr_len);
19659
19660 arr[upos] <<= 1;
19661
19662 return (arr_len);
19663 }
19664
19665 int mangle_chr_shiftr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19666 {
19667 if (upos >= arr_len) return (arr_len);
19668
19669 arr[upos] >>= 1;
19670
19671 return (arr_len);
19672 }
19673
19674 int mangle_chr_incr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19675 {
19676 if (upos >= arr_len) return (arr_len);
19677
19678 arr[upos] += 1;
19679
19680 return (arr_len);
19681 }
19682
19683 int mangle_chr_decr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19684 {
19685 if (upos >= arr_len) return (arr_len);
19686
19687 arr[upos] -= 1;
19688
19689 return (arr_len);
19690 }
19691
19692 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
19693 {
19694 int upper_next = 1;
19695
19696 int pos;
19697
19698 for (pos = 0; pos < arr_len; pos++)
19699 {
19700 if (arr[pos] == ' ')
19701 {
19702 upper_next = 1;
19703
19704 continue;
19705 }
19706
19707 if (upper_next)
19708 {
19709 upper_next = 0;
19710
19711 MANGLE_UPPER_AT (arr, pos);
19712 }
19713 else
19714 {
19715 MANGLE_LOWER_AT (arr, pos);
19716 }
19717 }
19718
19719 return (arr_len);
19720 }
19721
19722 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], uint32_t rp_gen_func_min, uint32_t rp_gen_func_max)
19723 {
19724 uint32_t rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
19725
19726 uint32_t j;
19727
19728 uint32_t rule_pos = 0;
19729
19730 for (j = 0; j < rp_gen_num; j++)
19731 {
19732 uint32_t r = 0;
19733 uint32_t p1 = 0;
19734 uint32_t p2 = 0;
19735 uint32_t p3 = 0;
19736
19737 switch ((char) get_random_num (0, 9))
19738 {
19739 case 0:
19740 r = get_random_num (0, sizeof (grp_op_nop));
19741 rule_buf[rule_pos++] = grp_op_nop[r];
19742 break;
19743
19744 case 1:
19745 r = get_random_num (0, sizeof (grp_op_pos_p0));
19746 rule_buf[rule_pos++] = grp_op_pos_p0[r];
19747 p1 = get_random_num (0, sizeof (grp_pos));
19748 rule_buf[rule_pos++] = grp_pos[p1];
19749 break;
19750
19751 case 2:
19752 r = get_random_num (0, sizeof (grp_op_pos_p1));
19753 rule_buf[rule_pos++] = grp_op_pos_p1[r];
19754 p1 = get_random_num (1, 6);
19755 rule_buf[rule_pos++] = grp_pos[p1];
19756 break;
19757
19758 case 3:
19759 r = get_random_num (0, sizeof (grp_op_chr));
19760 rule_buf[rule_pos++] = grp_op_chr[r];
19761 p1 = get_random_num (0x20, 0x7e);
19762 rule_buf[rule_pos++] = (char) p1;
19763 break;
19764
19765 case 4:
19766 r = get_random_num (0, sizeof (grp_op_chr_chr));
19767 rule_buf[rule_pos++] = grp_op_chr_chr[r];
19768 p1 = get_random_num (0x20, 0x7e);
19769 rule_buf[rule_pos++] = (char) p1;
19770 p2 = get_random_num (0x20, 0x7e);
19771 while (p1 == p2)
19772 p2 = get_random_num (0x20, 0x7e);
19773 rule_buf[rule_pos++] = (char) p2;
19774 break;
19775
19776 case 5:
19777 r = get_random_num (0, sizeof (grp_op_pos_chr));
19778 rule_buf[rule_pos++] = grp_op_pos_chr[r];
19779 p1 = get_random_num (0, sizeof (grp_pos));
19780 rule_buf[rule_pos++] = grp_pos[p1];
19781 p2 = get_random_num (0x20, 0x7e);
19782 rule_buf[rule_pos++] = (char) p2;
19783 break;
19784
19785 case 6:
19786 r = get_random_num (0, sizeof (grp_op_pos_pos0));
19787 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
19788 p1 = get_random_num (0, sizeof (grp_pos));
19789 rule_buf[rule_pos++] = grp_pos[p1];
19790 p2 = get_random_num (0, sizeof (grp_pos));
19791 while (p1 == p2)
19792 p2 = get_random_num (0, sizeof (grp_pos));
19793 rule_buf[rule_pos++] = grp_pos[p2];
19794 break;
19795
19796 case 7:
19797 r = get_random_num (0, sizeof (grp_op_pos_pos1));
19798 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
19799 p1 = get_random_num (0, sizeof (grp_pos));
19800 rule_buf[rule_pos++] = grp_pos[p1];
19801 p2 = get_random_num (1, sizeof (grp_pos));
19802 while (p1 == p2)
19803 p2 = get_random_num (1, sizeof (grp_pos));
19804 rule_buf[rule_pos++] = grp_pos[p2];
19805 break;
19806
19807 case 8:
19808 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
19809 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
19810 p1 = get_random_num (0, sizeof (grp_pos));
19811 rule_buf[rule_pos++] = grp_pos[p1];
19812 p2 = get_random_num (1, sizeof (grp_pos));
19813 rule_buf[rule_pos++] = grp_pos[p1];
19814 p3 = get_random_num (0, sizeof (grp_pos));
19815 rule_buf[rule_pos++] = grp_pos[p3];
19816 break;
19817 }
19818 }
19819
19820 return (rule_pos);
19821 }
19822
19823 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
19824 {
19825 char mem[BLOCK_SIZE];
19826
19827 if (in == NULL) return (RULE_RC_REJECT_ERROR);
19828
19829 if (out == NULL) return (RULE_RC_REJECT_ERROR);
19830
19831 if (in_len < 1) return (RULE_RC_REJECT_ERROR);
19832
19833 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
19834
19835 int out_len = in_len;
19836 int mem_len = in_len;
19837
19838 memcpy (out, in, out_len);
19839
19840 int rule_pos;
19841
19842 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
19843 {
19844 int upos; int upos2;
19845 int ulen;
19846
19847 switch (rule[rule_pos])
19848 {
19849 case ' ':
19850 break;
19851
19852 case RULE_OP_MANGLE_NOOP:
19853 break;
19854
19855 case RULE_OP_MANGLE_LREST:
19856 out_len = mangle_lrest (out, out_len);
19857 break;
19858
19859 case RULE_OP_MANGLE_UREST:
19860 out_len = mangle_urest (out, out_len);
19861 break;
19862
19863 case RULE_OP_MANGLE_LREST_UFIRST:
19864 out_len = mangle_lrest (out, out_len);
19865 if (out_len) MANGLE_UPPER_AT (out, 0);
19866 break;
19867
19868 case RULE_OP_MANGLE_UREST_LFIRST:
19869 out_len = mangle_urest (out, out_len);
19870 if (out_len) MANGLE_LOWER_AT (out, 0);
19871 break;
19872
19873 case RULE_OP_MANGLE_TREST:
19874 out_len = mangle_trest (out, out_len);
19875 break;
19876
19877 case RULE_OP_MANGLE_TOGGLE_AT:
19878 NEXT_RULEPOS (rule_pos);
19879 NEXT_RPTOI (rule, rule_pos, upos);
19880 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
19881 break;
19882
19883 case RULE_OP_MANGLE_REVERSE:
19884 out_len = mangle_reverse (out, out_len);
19885 break;
19886
19887 case RULE_OP_MANGLE_DUPEWORD:
19888 out_len = mangle_double (out, out_len);
19889 break;
19890
19891 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19892 NEXT_RULEPOS (rule_pos);
19893 NEXT_RPTOI (rule, rule_pos, ulen);
19894 out_len = mangle_double_times (out, out_len, ulen);
19895 break;
19896
19897 case RULE_OP_MANGLE_REFLECT:
19898 out_len = mangle_reflect (out, out_len);
19899 break;
19900
19901 case RULE_OP_MANGLE_ROTATE_LEFT:
19902 mangle_rotate_left (out, out_len);
19903 break;
19904
19905 case RULE_OP_MANGLE_ROTATE_RIGHT:
19906 mangle_rotate_right (out, out_len);
19907 break;
19908
19909 case RULE_OP_MANGLE_APPEND:
19910 NEXT_RULEPOS (rule_pos);
19911 out_len = mangle_append (out, out_len, rule[rule_pos]);
19912 break;
19913
19914 case RULE_OP_MANGLE_PREPEND:
19915 NEXT_RULEPOS (rule_pos);
19916 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
19917 break;
19918
19919 case RULE_OP_MANGLE_DELETE_FIRST:
19920 out_len = mangle_delete_at (out, out_len, 0);
19921 break;
19922
19923 case RULE_OP_MANGLE_DELETE_LAST:
19924 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
19925 break;
19926
19927 case RULE_OP_MANGLE_DELETE_AT:
19928 NEXT_RULEPOS (rule_pos);
19929 NEXT_RPTOI (rule, rule_pos, upos);
19930 out_len = mangle_delete_at (out, out_len, upos);
19931 break;
19932
19933 case RULE_OP_MANGLE_EXTRACT:
19934 NEXT_RULEPOS (rule_pos);
19935 NEXT_RPTOI (rule, rule_pos, upos);
19936 NEXT_RULEPOS (rule_pos);
19937 NEXT_RPTOI (rule, rule_pos, ulen);
19938 out_len = mangle_extract (out, out_len, upos, ulen);
19939 break;
19940
19941 case RULE_OP_MANGLE_OMIT:
19942 NEXT_RULEPOS (rule_pos);
19943 NEXT_RPTOI (rule, rule_pos, upos);
19944 NEXT_RULEPOS (rule_pos);
19945 NEXT_RPTOI (rule, rule_pos, ulen);
19946 out_len = mangle_omit (out, out_len, upos, ulen);
19947 break;
19948
19949 case RULE_OP_MANGLE_INSERT:
19950 NEXT_RULEPOS (rule_pos);
19951 NEXT_RPTOI (rule, rule_pos, upos);
19952 NEXT_RULEPOS (rule_pos);
19953 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
19954 break;
19955
19956 case RULE_OP_MANGLE_OVERSTRIKE:
19957 NEXT_RULEPOS (rule_pos);
19958 NEXT_RPTOI (rule, rule_pos, upos);
19959 NEXT_RULEPOS (rule_pos);
19960 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
19961 break;
19962
19963 case RULE_OP_MANGLE_TRUNCATE_AT:
19964 NEXT_RULEPOS (rule_pos);
19965 NEXT_RPTOI (rule, rule_pos, upos);
19966 out_len = mangle_truncate_at (out, out_len, upos);
19967 break;
19968
19969 case RULE_OP_MANGLE_REPLACE:
19970 NEXT_RULEPOS (rule_pos);
19971 NEXT_RULEPOS (rule_pos);
19972 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
19973 break;
19974
19975 case RULE_OP_MANGLE_PURGECHAR:
19976 NEXT_RULEPOS (rule_pos);
19977 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
19978 break;
19979
19980 case RULE_OP_MANGLE_TOGGLECASE_REC:
19981 /* todo */
19982 break;
19983
19984 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19985 NEXT_RULEPOS (rule_pos);
19986 NEXT_RPTOI (rule, rule_pos, ulen);
19987 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
19988 break;
19989
19990 case RULE_OP_MANGLE_DUPECHAR_LAST:
19991 NEXT_RULEPOS (rule_pos);
19992 NEXT_RPTOI (rule, rule_pos, ulen);
19993 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
19994 break;
19995
19996 case RULE_OP_MANGLE_DUPECHAR_ALL:
19997 out_len = mangle_dupechar (out, out_len);
19998 break;
19999
20000 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20001 NEXT_RULEPOS (rule_pos);
20002 NEXT_RPTOI (rule, rule_pos, ulen);
20003 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20004 break;
20005
20006 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20007 NEXT_RULEPOS (rule_pos);
20008 NEXT_RPTOI (rule, rule_pos, ulen);
20009 out_len = mangle_dupeblock_append (out, out_len, ulen);
20010 break;
20011
20012 case RULE_OP_MANGLE_SWITCH_FIRST:
20013 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20014 break;
20015
20016 case RULE_OP_MANGLE_SWITCH_LAST:
20017 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20018 break;
20019
20020 case RULE_OP_MANGLE_SWITCH_AT:
20021 NEXT_RULEPOS (rule_pos);
20022 NEXT_RPTOI (rule, rule_pos, upos);
20023 NEXT_RULEPOS (rule_pos);
20024 NEXT_RPTOI (rule, rule_pos, upos2);
20025 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20026 break;
20027
20028 case RULE_OP_MANGLE_CHR_SHIFTL:
20029 NEXT_RULEPOS (rule_pos);
20030 NEXT_RPTOI (rule, rule_pos, upos);
20031 mangle_chr_shiftl ((uint8_t *) out, out_len, upos);
20032 break;
20033
20034 case RULE_OP_MANGLE_CHR_SHIFTR:
20035 NEXT_RULEPOS (rule_pos);
20036 NEXT_RPTOI (rule, rule_pos, upos);
20037 mangle_chr_shiftr ((uint8_t *) out, out_len, upos);
20038 break;
20039
20040 case RULE_OP_MANGLE_CHR_INCR:
20041 NEXT_RULEPOS (rule_pos);
20042 NEXT_RPTOI (rule, rule_pos, upos);
20043 mangle_chr_incr ((uint8_t *) out, out_len, upos);
20044 break;
20045
20046 case RULE_OP_MANGLE_CHR_DECR:
20047 NEXT_RULEPOS (rule_pos);
20048 NEXT_RPTOI (rule, rule_pos, upos);
20049 mangle_chr_decr ((uint8_t *) out, out_len, upos);
20050 break;
20051
20052 case RULE_OP_MANGLE_REPLACE_NP1:
20053 NEXT_RULEPOS (rule_pos);
20054 NEXT_RPTOI (rule, rule_pos, upos);
20055 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20056 break;
20057
20058 case RULE_OP_MANGLE_REPLACE_NM1:
20059 NEXT_RULEPOS (rule_pos);
20060 NEXT_RPTOI (rule, rule_pos, upos);
20061 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20062 break;
20063
20064 case RULE_OP_MANGLE_TITLE:
20065 out_len = mangle_title (out, out_len);
20066 break;
20067
20068 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20069 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20070 NEXT_RULEPOS (rule_pos);
20071 NEXT_RPTOI (rule, rule_pos, upos);
20072 NEXT_RULEPOS (rule_pos);
20073 NEXT_RPTOI (rule, rule_pos, ulen);
20074 NEXT_RULEPOS (rule_pos);
20075 NEXT_RPTOI (rule, rule_pos, upos2);
20076 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20077 break;
20078
20079 case RULE_OP_MANGLE_APPEND_MEMORY:
20080 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20081 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20082 memcpy (out + out_len, mem, mem_len);
20083 out_len += mem_len;
20084 break;
20085
20086 case RULE_OP_MANGLE_PREPEND_MEMORY:
20087 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20088 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20089 memcpy (mem + mem_len, out, out_len);
20090 out_len += mem_len;
20091 memcpy (out, mem, out_len);
20092 break;
20093
20094 case RULE_OP_MEMORIZE_WORD:
20095 memcpy (mem, out, out_len);
20096 mem_len = out_len;
20097 break;
20098
20099 case RULE_OP_REJECT_LESS:
20100 NEXT_RULEPOS (rule_pos);
20101 NEXT_RPTOI (rule, rule_pos, upos);
20102 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20103 break;
20104
20105 case RULE_OP_REJECT_GREATER:
20106 NEXT_RULEPOS (rule_pos);
20107 NEXT_RPTOI (rule, rule_pos, upos);
20108 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20109 break;
20110
20111 case RULE_OP_REJECT_CONTAIN:
20112 NEXT_RULEPOS (rule_pos);
20113 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20114 break;
20115
20116 case RULE_OP_REJECT_NOT_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_EQUAL_FIRST:
20122 NEXT_RULEPOS (rule_pos);
20123 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20124 break;
20125
20126 case RULE_OP_REJECT_EQUAL_LAST:
20127 NEXT_RULEPOS (rule_pos);
20128 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20129 break;
20130
20131 case RULE_OP_REJECT_EQUAL_AT:
20132 NEXT_RULEPOS (rule_pos);
20133 NEXT_RPTOI (rule, rule_pos, upos);
20134 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20135 NEXT_RULEPOS (rule_pos);
20136 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20137 break;
20138
20139 case RULE_OP_REJECT_CONTAINS:
20140 NEXT_RULEPOS (rule_pos);
20141 NEXT_RPTOI (rule, rule_pos, upos);
20142 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20143 NEXT_RULEPOS (rule_pos);
20144 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20145 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20146 break;
20147
20148 case RULE_OP_REJECT_MEMORY:
20149 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20150 break;
20151
20152 default:
20153 return (RULE_RC_SYNTAX_ERROR);
20154 break;
20155 }
20156 }
20157
20158 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20159
20160 return (out_len);
20161 }