Merge pull request #33 from philsmd/GetRidOfCUDA
[hashcat.git] / src / shared.c
1 /**
2 * Author......: Jens Steube <jens.steube@gmail.com>
3 * License.....: MIT
4 */
5
6 #include <shared.h>
7 #include <limits.h>
8
9 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
10 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
11
12 /**
13 * tuning tools
14 */
15
16 #define GET_ACCEL(x) GPU_ACCEL_AMD_ ## x
17 #define GET_LOOPS(x) GPU_LOOPS_AMD_ ## x
18
19 /**
20 * bit rotate
21 */
22
23 uint32_t rotl32 (const uint32_t a, const uint n)
24 {
25 return ((a << n) | (a >> (32 - n)));
26 }
27
28 uint32_t rotr32 (const uint32_t a, const uint n)
29 {
30 return ((a >> n) | (a << (32 - n)));
31 }
32
33 uint64_t rotl64 (const uint64_t a, const uint n)
34 {
35 return ((a << n) | (a >> (64 - n)));
36 }
37
38 uint64_t rotr64 (const uint64_t a, const uint n)
39 {
40 return ((a >> n) | (a << (64 - n)));
41 }
42
43 /**
44 * ciphers for use on cpu
45 */
46
47 #include "cpu-des.c"
48 #include "cpu-aes.c"
49
50 /**
51 * hashes for use on cpu
52 */
53
54 #include "cpu-md5.c"
55 #include "cpu-sha256.c"
56
57 /**
58 * logging
59 */
60
61 int last_len = 0;
62
63 void log_final (FILE *fp, const char *fmt, va_list ap)
64 {
65 if (last_len)
66 {
67 fputc ('\r', fp);
68
69 for (int i = 0; i < last_len; i++)
70 {
71 fputc (' ', fp);
72 }
73
74 fputc ('\r', fp);
75 }
76
77 char s[4096];
78
79 int max_len = (int) sizeof (s);
80
81 int len = vsnprintf (s, max_len, fmt, ap);
82
83 if (len > max_len) len = max_len;
84
85 fwrite (s, len, 1, fp);
86
87 fflush (fp);
88
89 last_len = len;
90 }
91
92 void log_out_nn (FILE *fp, const char *fmt, ...)
93 {
94 if (SUPPRESS_OUTPUT) return;
95
96 va_list ap;
97
98 va_start (ap, fmt);
99
100 log_final (fp, fmt, ap);
101
102 va_end (ap);
103 }
104
105 void log_info_nn (const char *fmt, ...)
106 {
107 if (SUPPRESS_OUTPUT) return;
108
109 va_list ap;
110
111 va_start (ap, fmt);
112
113 log_final (stdout, fmt, ap);
114
115 va_end (ap);
116 }
117
118 void log_error_nn (const char *fmt, ...)
119 {
120 if (SUPPRESS_OUTPUT) return;
121
122 va_list ap;
123
124 va_start (ap, fmt);
125
126 log_final (stderr, fmt, ap);
127
128 va_end (ap);
129 }
130
131 void log_out (FILE *fp, const char *fmt, ...)
132 {
133 if (SUPPRESS_OUTPUT) return;
134
135 va_list ap;
136
137 va_start (ap, fmt);
138
139 log_final (fp, fmt, ap);
140
141 va_end (ap);
142
143 fputc ('\n', fp);
144
145 last_len = 0;
146 }
147
148 void log_info (const char *fmt, ...)
149 {
150 if (SUPPRESS_OUTPUT) return;
151
152 va_list ap;
153
154 va_start (ap, fmt);
155
156 log_final (stdout, fmt, ap);
157
158 va_end (ap);
159
160 fputc ('\n', stdout);
161
162 last_len = 0;
163 }
164
165 void log_error (const char *fmt, ...)
166 {
167 if (SUPPRESS_OUTPUT) return;
168
169 fputc ('\n', stderr);
170 fputc ('\n', stderr);
171
172 va_list ap;
173
174 va_start (ap, fmt);
175
176 log_final (stderr, fmt, ap);
177
178 va_end (ap);
179
180 fputc ('\n', stderr);
181 fputc ('\n', stderr);
182
183 last_len = 0;
184 }
185
186 /**
187 * converter
188 */
189
190 uint byte_swap_32 (const uint n)
191 {
192 return (n & 0xff000000) >> 24
193 | (n & 0x00ff0000) >> 8
194 | (n & 0x0000ff00) << 8
195 | (n & 0x000000ff) << 24;
196 }
197
198 uint64_t byte_swap_64 (const uint64_t n)
199 {
200 return (n & 0xff00000000000000ULL) >> 56
201 | (n & 0x00ff000000000000ULL) >> 40
202 | (n & 0x0000ff0000000000ULL) >> 24
203 | (n & 0x000000ff00000000ULL) >> 8
204 | (n & 0x00000000ff000000ULL) << 8
205 | (n & 0x0000000000ff0000ULL) << 24
206 | (n & 0x000000000000ff00ULL) << 40
207 | (n & 0x00000000000000ffULL) << 56;
208 }
209
210 char int_to_base32 (const char c)
211 {
212 static const char tbl[0x20] =
213 {
214 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
215 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
216 };
217
218 return tbl[(const uint8_t) c];
219 }
220
221 char base32_to_int (const char c)
222 {
223 if ((c >= 'A') && (c <= 'Z')) return c - 'A';
224 else if ((c >= '2') && (c <= '7')) return c - '2' + 26;
225
226 return 0;
227 }
228
229 char int_to_itoa32 (const char c)
230 {
231 static const char tbl[0x20] =
232 {
233 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
234 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
235 };
236
237 return tbl[(const uint8_t) c];
238 }
239
240 char itoa32_to_int (const char c)
241 {
242 if ((c >= '0') && (c <= '9')) return c - '0';
243 else if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10;
244
245 return 0;
246 }
247
248 char int_to_itoa64 (const char c)
249 {
250 static const char tbl[0x40] =
251 {
252 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
253 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
254 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
255 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
256 };
257
258 return tbl[(const uint8_t) c];
259 }
260
261 char itoa64_to_int (const char c)
262 {
263 static const char tbl[0x100] =
264 {
265 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
266 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
267 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01,
268 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
269 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
270 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
271 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
272 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
273 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
274 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
275 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
276 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
277 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
278 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
279 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
280 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
281 };
282
283 return tbl[(const uint8_t) c];
284 }
285
286 char int_to_base64 (const char c)
287 {
288 static const char tbl[0x40] =
289 {
290 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
291 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
292 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
293 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f,
294 };
295
296 return tbl[(const uint8_t) c];
297 }
298
299 char base64_to_int (const char c)
300 {
301 static const char tbl[0x100] =
302 {
303 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
304 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
305 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
306 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
308 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
309 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
310 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319 };
320
321 return tbl[(const uint8_t) c];
322 }
323
324 char int_to_bf64 (const char c)
325 {
326 static const char tbl[0x40] =
327 {
328 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
329 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
330 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
331 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
332 };
333
334 return tbl[(const uint8_t) c];
335 }
336
337 char bf64_to_int (const char c)
338 {
339 static const char tbl[0x100] =
340 {
341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
342 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
344 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
346 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
347 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
348 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00,
349 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 };
358
359 return tbl[(const uint8_t) c];
360 }
361
362 char int_to_lotus64 (const char c)
363 {
364 if (c < 10) return '0' + c;
365 else if (c < 36) return 'A' + c - 10;
366 else if (c < 62) return 'a' + c - 36;
367 else if (c == 62) return '+';
368 else if (c == 63) return '/';
369
370 return 0;
371 }
372
373 char lotus64_to_int (const char c)
374 {
375 if ((c >= '0') && (c <= '9')) return c - '0';
376 else if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10;
377 else if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36;
378 else if (c == '+') return 62;
379 else if (c == '/') return 63;
380 else
381
382 return 0;
383 }
384
385 int base32_decode (char (*f) (const char), char *in_buf, int in_len, char *out_buf)
386 {
387 char *in_ptr = in_buf;
388
389 char *out_ptr = out_buf;
390
391 for (int i = 0; i < in_len; i += 8)
392 {
393 char out_val0 = f (in_ptr[0] & 0x7f);
394 char out_val1 = f (in_ptr[1] & 0x7f);
395 char out_val2 = f (in_ptr[2] & 0x7f);
396 char out_val3 = f (in_ptr[3] & 0x7f);
397 char out_val4 = f (in_ptr[4] & 0x7f);
398 char out_val5 = f (in_ptr[5] & 0x7f);
399 char out_val6 = f (in_ptr[6] & 0x7f);
400 char out_val7 = f (in_ptr[7] & 0x7f);
401
402 out_ptr[0] = ((out_val0 << 3) & 0xf8) | ((out_val1 >> 2) & 0x07);
403 out_ptr[1] = ((out_val1 << 6) & 0xc0) | ((out_val2 << 1) & 0x3e) | ((out_val3 >> 4) & 0x01);
404 out_ptr[2] = ((out_val3 << 4) & 0xf0) | ((out_val4 >> 1) & 0x0f);
405 out_ptr[3] = ((out_val4 << 7) & 0x80) | ((out_val5 << 2) & 0x7c) | ((out_val6 >> 3) & 0x03);
406 out_ptr[4] = ((out_val6 << 5) & 0xe0) | ((out_val7 >> 0) & 0x1f);
407
408 in_ptr += 8;
409 out_ptr += 5;
410 }
411
412 for (int i = 0; i < in_len; i++)
413 {
414 if (in_buf[i] != '=') continue;
415
416 in_len = i;
417 }
418
419 int out_len = (in_len * 5) / 8;
420
421 return out_len;
422 }
423
424 int base32_encode (char (*f) (const char), char *in_buf, int in_len, char *out_buf)
425 {
426 char *in_ptr = in_buf;
427
428 char *out_ptr = out_buf;
429
430 for (int i = 0; i < in_len; i += 5)
431 {
432 char out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f));
433 char out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03));
434 char out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f));
435 char out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f));
436 char out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01));
437 char out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f));
438 char out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07));
439 char out_val7 = f ( ((in_ptr[4] >> 0) & 0x1f));
440
441 out_ptr[0] = out_val0 & 0x7f;
442 out_ptr[1] = out_val1 & 0x7f;
443 out_ptr[2] = out_val2 & 0x7f;
444 out_ptr[3] = out_val3 & 0x7f;
445 out_ptr[4] = out_val4 & 0x7f;
446 out_ptr[5] = out_val5 & 0x7f;
447 out_ptr[6] = out_val6 & 0x7f;
448 out_ptr[7] = out_val7 & 0x7f;
449
450 in_ptr += 5;
451 out_ptr += 8;
452 }
453
454 int out_len = (in_len * 8) / 5;
455
456 for (int i = 0; i < (7 - (in_len % 7)); i++)
457 {
458 out_len++;
459
460 out_buf[out_len] = '=';
461 }
462
463 return out_len;
464 }
465
466 int base64_decode (char (*f) (const char), char *in_buf, int in_len, char *out_buf)
467 {
468 char *in_ptr = in_buf;
469
470 char *out_ptr = out_buf;
471
472 for (int i = 0; i < in_len; i += 4)
473 {
474 char out_val0 = f (in_ptr[0] & 0x7f);
475 char out_val1 = f (in_ptr[1] & 0x7f);
476 char out_val2 = f (in_ptr[2] & 0x7f);
477 char out_val3 = f (in_ptr[3] & 0x7f);
478
479 out_ptr[0] = ((out_val0 << 2) & 0xfc) | ((out_val1 >> 4) & 0x03);
480 out_ptr[1] = ((out_val1 << 4) & 0xf0) | ((out_val2 >> 2) & 0x0f);
481 out_ptr[2] = ((out_val2 << 6) & 0xc0) | ((out_val3 >> 0) & 0x3f);
482
483 in_ptr += 4;
484 out_ptr += 3;
485 }
486
487 for (int i = 0; i < in_len; i++)
488 {
489 if (in_buf[i] != '=') continue;
490
491 in_len = i;
492 }
493
494 int out_len = (in_len * 6) / 8;
495
496 return out_len;
497 }
498
499 int base64_encode (char (*f) (const char), char *in_buf, int in_len, char *out_buf)
500 {
501 char *in_ptr = in_buf;
502
503 char *out_ptr = out_buf;
504
505 for (int i = 0; i < in_len; i += 3)
506 {
507 char out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f));
508 char out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f));
509 char out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03));
510 char out_val3 = f ( ((in_ptr[2] >> 0) & 0x3f));
511
512 out_ptr[0] = out_val0 & 0x7f;
513 out_ptr[1] = out_val1 & 0x7f;
514 out_ptr[2] = out_val2 & 0x7f;
515 out_ptr[3] = out_val3 & 0x7f;
516
517 in_ptr += 3;
518 out_ptr += 4;
519 }
520
521 int out_len = (in_len * 8) / 6;
522
523 for (int i = 0; i < (3 - (in_len % 3)); i++)
524 {
525 out_len++;
526
527 out_buf[out_len] = '=';
528 }
529
530 return out_len;
531 }
532
533 static void AES128_decrypt_cbc (const uint key[4], const uint iv[4], const uint in[16], uint out[16])
534 {
535 AES_KEY skey;
536
537 AES_set_decrypt_key ((unsigned char *) key, 128, &skey);
538
539 uint _iv[4];
540
541 _iv[0] = iv[0];
542 _iv[1] = iv[1];
543 _iv[2] = iv[2];
544 _iv[3] = iv[3];
545
546 for (int i = 0; i < 16; i += 4)
547 {
548 uint _in[4];
549 uint _out[4];
550
551 _in[0] = in[i + 0];
552 _in[1] = in[i + 1];
553 _in[2] = in[i + 2];
554 _in[3] = in[i + 3];
555
556 AES_decrypt (&skey, (char *) _in, (char *) _out);
557
558 _out[0] ^= _iv[0];
559 _out[1] ^= _iv[1];
560 _out[2] ^= _iv[2];
561 _out[3] ^= _iv[3];
562
563 out[i + 0] = _out[0];
564 out[i + 1] = _out[1];
565 out[i + 2] = _out[2];
566 out[i + 3] = _out[3];
567
568 _iv[0] = _in[0];
569 _iv[1] = _in[1];
570 _iv[2] = _in[2];
571 _iv[3] = _in[3];
572 }
573 }
574
575 static void juniper_decrypt_hash (char *in, char *out)
576 {
577 // base64 decode
578
579 char base64_buf[100];
580
581 memset (base64_buf, 0, sizeof (base64_buf));
582
583 base64_decode (base64_to_int, in, DISPLAY_LEN_MIN_501, base64_buf);
584
585 // iv stuff
586
587 uint juniper_iv[4] = { 0 };
588
589 memcpy (juniper_iv, base64_buf, 12);
590
591 memcpy (out, juniper_iv, 12);
592
593 // reversed key
594
595 uint juniper_key[4];
596
597 juniper_key[0] = byte_swap_32 (0xa6707a7e);
598 juniper_key[1] = byte_swap_32 (0x8df91059);
599 juniper_key[2] = byte_swap_32 (0xdea70ae5);
600 juniper_key[3] = byte_swap_32 (0x2f9c2442);
601
602 // AES decrypt
603
604 uint *in_ptr = (uint *) (base64_buf + 12);
605 uint *out_ptr = (uint *) (out + 12);
606
607 AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr);
608 }
609
610 uint is_valid_hex_char (const char c)
611 {
612 if ((c >= '0') && (c <= '9')) return 1;
613 if ((c >= 'A') && (c <= 'F')) return 1;
614 if ((c >= 'a') && (c <= 'f')) return 1;
615
616 return 0;
617 }
618
619 char hex_convert (const char c)
620 {
621 return (c & 15) + (c >> 6) * 9;
622 }
623
624 char hex_to_char (const char hex[2])
625 {
626 char v = 0;
627
628 v |= (hex_convert (hex[1]) << 0);
629 v |= (hex_convert (hex[0]) << 4);
630
631 return (v);
632 }
633
634 uint hex_to_uint (const char hex[8])
635 {
636 uint v = 0;
637
638 v |= hex_convert (hex[7]) << 0;
639 v |= hex_convert (hex[6]) << 4;
640 v |= hex_convert (hex[5]) << 8;
641 v |= hex_convert (hex[4]) << 12;
642 v |= hex_convert (hex[3]) << 16;
643 v |= hex_convert (hex[2]) << 20;
644 v |= hex_convert (hex[1]) << 24;
645 v |= hex_convert (hex[0]) << 28;
646
647 return (v);
648 }
649
650 uint64_t hex_to_uint64_t (const char hex[16])
651 {
652 uint64_t v = 0;
653
654 v |= ((uint64_t) hex_convert (hex[15]) << 0);
655 v |= ((uint64_t) hex_convert (hex[14]) << 4);
656 v |= ((uint64_t) hex_convert (hex[13]) << 8);
657 v |= ((uint64_t) hex_convert (hex[12]) << 12);
658 v |= ((uint64_t) hex_convert (hex[11]) << 16);
659 v |= ((uint64_t) hex_convert (hex[10]) << 20);
660 v |= ((uint64_t) hex_convert (hex[ 9]) << 24);
661 v |= ((uint64_t) hex_convert (hex[ 8]) << 28);
662 v |= ((uint64_t) hex_convert (hex[ 7]) << 32);
663 v |= ((uint64_t) hex_convert (hex[ 6]) << 36);
664 v |= ((uint64_t) hex_convert (hex[ 5]) << 40);
665 v |= ((uint64_t) hex_convert (hex[ 4]) << 44);
666 v |= ((uint64_t) hex_convert (hex[ 3]) << 48);
667 v |= ((uint64_t) hex_convert (hex[ 2]) << 52);
668 v |= ((uint64_t) hex_convert (hex[ 1]) << 56);
669 v |= ((uint64_t) hex_convert (hex[ 0]) << 60);
670
671 return (v);
672 }
673
674 void bin_to_hex_lower (uint v, char hex[8])
675 {
676 hex[0] = v >> 28 & 15;
677 hex[1] = v >> 24 & 15;
678 hex[2] = v >> 20 & 15;
679 hex[3] = v >> 16 & 15;
680 hex[4] = v >> 12 & 15;
681 hex[5] = v >> 8 & 15;
682 hex[6] = v >> 4 & 15;
683 hex[7] = v >> 0 & 15;
684
685 uint add;
686
687 hex[0] += 6; add = ((hex[0] & 0x10) >> 4) * 39; hex[0] += 42 + add;
688 hex[1] += 6; add = ((hex[1] & 0x10) >> 4) * 39; hex[1] += 42 + add;
689 hex[2] += 6; add = ((hex[2] & 0x10) >> 4) * 39; hex[2] += 42 + add;
690 hex[3] += 6; add = ((hex[3] & 0x10) >> 4) * 39; hex[3] += 42 + add;
691 hex[4] += 6; add = ((hex[4] & 0x10) >> 4) * 39; hex[4] += 42 + add;
692 hex[5] += 6; add = ((hex[5] & 0x10) >> 4) * 39; hex[5] += 42 + add;
693 hex[6] += 6; add = ((hex[6] & 0x10) >> 4) * 39; hex[6] += 42 + add;
694 hex[7] += 6; add = ((hex[7] & 0x10) >> 4) * 39; hex[7] += 42 + add;
695 }
696
697 void phpass_decode (unsigned char digest[16], unsigned char buf[22])
698 {
699 int l;
700
701 l = itoa64_to_int (buf[ 0]) << 0;
702 l |= itoa64_to_int (buf[ 1]) << 6;
703 l |= itoa64_to_int (buf[ 2]) << 12;
704 l |= itoa64_to_int (buf[ 3]) << 18;
705
706 digest[ 0] = (l >> 0) & 0xff;
707 digest[ 1] = (l >> 8) & 0xff;
708 digest[ 2] = (l >> 16) & 0xff;
709
710 l = itoa64_to_int (buf[ 4]) << 0;
711 l |= itoa64_to_int (buf[ 5]) << 6;
712 l |= itoa64_to_int (buf[ 6]) << 12;
713 l |= itoa64_to_int (buf[ 7]) << 18;
714
715 digest[ 3] = (l >> 0) & 0xff;
716 digest[ 4] = (l >> 8) & 0xff;
717 digest[ 5] = (l >> 16) & 0xff;
718
719 l = itoa64_to_int (buf[ 8]) << 0;
720 l |= itoa64_to_int (buf[ 9]) << 6;
721 l |= itoa64_to_int (buf[10]) << 12;
722 l |= itoa64_to_int (buf[11]) << 18;
723
724 digest[ 6] = (l >> 0) & 0xff;
725 digest[ 7] = (l >> 8) & 0xff;
726 digest[ 8] = (l >> 16) & 0xff;
727
728 l = itoa64_to_int (buf[12]) << 0;
729 l |= itoa64_to_int (buf[13]) << 6;
730 l |= itoa64_to_int (buf[14]) << 12;
731 l |= itoa64_to_int (buf[15]) << 18;
732
733 digest[ 9] = (l >> 0) & 0xff;
734 digest[10] = (l >> 8) & 0xff;
735 digest[11] = (l >> 16) & 0xff;
736
737 l = itoa64_to_int (buf[16]) << 0;
738 l |= itoa64_to_int (buf[17]) << 6;
739 l |= itoa64_to_int (buf[18]) << 12;
740 l |= itoa64_to_int (buf[19]) << 18;
741
742 digest[12] = (l >> 0) & 0xff;
743 digest[13] = (l >> 8) & 0xff;
744 digest[14] = (l >> 16) & 0xff;
745
746 l = itoa64_to_int (buf[20]) << 0;
747 l |= itoa64_to_int (buf[21]) << 6;
748
749 digest[15] = (l >> 0) & 0xff;
750 }
751
752 void phpass_encode (unsigned char digest[16], unsigned char buf[22])
753 {
754 int l;
755
756 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
757
758 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
759 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
760 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
761 buf[ 3] = int_to_itoa64 (l & 0x3f);
762
763 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
764
765 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
766 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
767 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
768 buf[ 7] = int_to_itoa64 (l & 0x3f);
769
770 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
771
772 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
773 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
774 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
775 buf[11] = int_to_itoa64 (l & 0x3f);
776
777 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
778
779 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
780 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
781 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
782 buf[15] = int_to_itoa64 (l & 0x3f);
783
784 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
785
786 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
787 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
788 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
789 buf[19] = int_to_itoa64 (l & 0x3f);
790
791 l = (digest[15] << 0);
792
793 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
794 buf[21] = int_to_itoa64 (l & 0x3f);
795 }
796
797 void md5crypt_decode (unsigned char digest[16], unsigned char buf[22])
798 {
799 int l;
800
801 l = itoa64_to_int (buf[ 0]) << 0;
802 l |= itoa64_to_int (buf[ 1]) << 6;
803 l |= itoa64_to_int (buf[ 2]) << 12;
804 l |= itoa64_to_int (buf[ 3]) << 18;
805
806 digest[ 0] = (l >> 16) & 0xff;
807 digest[ 6] = (l >> 8) & 0xff;
808 digest[12] = (l >> 0) & 0xff;
809
810 l = itoa64_to_int (buf[ 4]) << 0;
811 l |= itoa64_to_int (buf[ 5]) << 6;
812 l |= itoa64_to_int (buf[ 6]) << 12;
813 l |= itoa64_to_int (buf[ 7]) << 18;
814
815 digest[ 1] = (l >> 16) & 0xff;
816 digest[ 7] = (l >> 8) & 0xff;
817 digest[13] = (l >> 0) & 0xff;
818
819 l = itoa64_to_int (buf[ 8]) << 0;
820 l |= itoa64_to_int (buf[ 9]) << 6;
821 l |= itoa64_to_int (buf[10]) << 12;
822 l |= itoa64_to_int (buf[11]) << 18;
823
824 digest[ 2] = (l >> 16) & 0xff;
825 digest[ 8] = (l >> 8) & 0xff;
826 digest[14] = (l >> 0) & 0xff;
827
828 l = itoa64_to_int (buf[12]) << 0;
829 l |= itoa64_to_int (buf[13]) << 6;
830 l |= itoa64_to_int (buf[14]) << 12;
831 l |= itoa64_to_int (buf[15]) << 18;
832
833 digest[ 3] = (l >> 16) & 0xff;
834 digest[ 9] = (l >> 8) & 0xff;
835 digest[15] = (l >> 0) & 0xff;
836
837 l = itoa64_to_int (buf[16]) << 0;
838 l |= itoa64_to_int (buf[17]) << 6;
839 l |= itoa64_to_int (buf[18]) << 12;
840 l |= itoa64_to_int (buf[19]) << 18;
841
842 digest[ 4] = (l >> 16) & 0xff;
843 digest[10] = (l >> 8) & 0xff;
844 digest[ 5] = (l >> 0) & 0xff;
845
846 l = itoa64_to_int (buf[20]) << 0;
847 l |= itoa64_to_int (buf[21]) << 6;
848
849 digest[11] = (l >> 0) & 0xff;
850 }
851
852 void md5crypt_encode (unsigned char digest[16], unsigned char buf[22])
853 {
854 int l;
855
856 l = (digest[ 0] << 16) | (digest[ 6] << 8) | (digest[12] << 0);
857
858 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
859 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
860 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
861 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
862
863 l = (digest[ 1] << 16) | (digest[ 7] << 8) | (digest[13] << 0);
864
865 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
866 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
867 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
868 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
869
870 l = (digest[ 2] << 16) | (digest[ 8] << 8) | (digest[14] << 0);
871
872 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
873 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
874 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
875 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
876
877 l = (digest[ 3] << 16) | (digest[ 9] << 8) | (digest[15] << 0);
878
879 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
880 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
881 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
882 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
883
884 l = (digest[ 4] << 16) | (digest[10] << 8) | (digest[ 5] << 0);
885
886 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
887 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
888 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
889 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
890
891 l = (digest[11] << 0);
892
893 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
894 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
895 }
896
897 void sha512crypt_decode (unsigned char digest[64], unsigned char buf[86])
898 {
899 int l;
900
901 l = itoa64_to_int (buf[ 0]) << 0;
902 l |= itoa64_to_int (buf[ 1]) << 6;
903 l |= itoa64_to_int (buf[ 2]) << 12;
904 l |= itoa64_to_int (buf[ 3]) << 18;
905
906 digest[ 0] = (l >> 16) & 0xff;
907 digest[21] = (l >> 8) & 0xff;
908 digest[42] = (l >> 0) & 0xff;
909
910 l = itoa64_to_int (buf[ 4]) << 0;
911 l |= itoa64_to_int (buf[ 5]) << 6;
912 l |= itoa64_to_int (buf[ 6]) << 12;
913 l |= itoa64_to_int (buf[ 7]) << 18;
914
915 digest[22] = (l >> 16) & 0xff;
916 digest[43] = (l >> 8) & 0xff;
917 digest[ 1] = (l >> 0) & 0xff;
918
919 l = itoa64_to_int (buf[ 8]) << 0;
920 l |= itoa64_to_int (buf[ 9]) << 6;
921 l |= itoa64_to_int (buf[10]) << 12;
922 l |= itoa64_to_int (buf[11]) << 18;
923
924 digest[44] = (l >> 16) & 0xff;
925 digest[ 2] = (l >> 8) & 0xff;
926 digest[23] = (l >> 0) & 0xff;
927
928 l = itoa64_to_int (buf[12]) << 0;
929 l |= itoa64_to_int (buf[13]) << 6;
930 l |= itoa64_to_int (buf[14]) << 12;
931 l |= itoa64_to_int (buf[15]) << 18;
932
933 digest[ 3] = (l >> 16) & 0xff;
934 digest[24] = (l >> 8) & 0xff;
935 digest[45] = (l >> 0) & 0xff;
936
937 l = itoa64_to_int (buf[16]) << 0;
938 l |= itoa64_to_int (buf[17]) << 6;
939 l |= itoa64_to_int (buf[18]) << 12;
940 l |= itoa64_to_int (buf[19]) << 18;
941
942 digest[25] = (l >> 16) & 0xff;
943 digest[46] = (l >> 8) & 0xff;
944 digest[ 4] = (l >> 0) & 0xff;
945
946 l = itoa64_to_int (buf[20]) << 0;
947 l |= itoa64_to_int (buf[21]) << 6;
948 l |= itoa64_to_int (buf[22]) << 12;
949 l |= itoa64_to_int (buf[23]) << 18;
950
951 digest[47] = (l >> 16) & 0xff;
952 digest[ 5] = (l >> 8) & 0xff;
953 digest[26] = (l >> 0) & 0xff;
954
955 l = itoa64_to_int (buf[24]) << 0;
956 l |= itoa64_to_int (buf[25]) << 6;
957 l |= itoa64_to_int (buf[26]) << 12;
958 l |= itoa64_to_int (buf[27]) << 18;
959
960 digest[ 6] = (l >> 16) & 0xff;
961 digest[27] = (l >> 8) & 0xff;
962 digest[48] = (l >> 0) & 0xff;
963
964 l = itoa64_to_int (buf[28]) << 0;
965 l |= itoa64_to_int (buf[29]) << 6;
966 l |= itoa64_to_int (buf[30]) << 12;
967 l |= itoa64_to_int (buf[31]) << 18;
968
969 digest[28] = (l >> 16) & 0xff;
970 digest[49] = (l >> 8) & 0xff;
971 digest[ 7] = (l >> 0) & 0xff;
972
973 l = itoa64_to_int (buf[32]) << 0;
974 l |= itoa64_to_int (buf[33]) << 6;
975 l |= itoa64_to_int (buf[34]) << 12;
976 l |= itoa64_to_int (buf[35]) << 18;
977
978 digest[50] = (l >> 16) & 0xff;
979 digest[ 8] = (l >> 8) & 0xff;
980 digest[29] = (l >> 0) & 0xff;
981
982 l = itoa64_to_int (buf[36]) << 0;
983 l |= itoa64_to_int (buf[37]) << 6;
984 l |= itoa64_to_int (buf[38]) << 12;
985 l |= itoa64_to_int (buf[39]) << 18;
986
987 digest[ 9] = (l >> 16) & 0xff;
988 digest[30] = (l >> 8) & 0xff;
989 digest[51] = (l >> 0) & 0xff;
990
991 l = itoa64_to_int (buf[40]) << 0;
992 l |= itoa64_to_int (buf[41]) << 6;
993 l |= itoa64_to_int (buf[42]) << 12;
994 l |= itoa64_to_int (buf[43]) << 18;
995
996 digest[31] = (l >> 16) & 0xff;
997 digest[52] = (l >> 8) & 0xff;
998 digest[10] = (l >> 0) & 0xff;
999
1000 l = itoa64_to_int (buf[44]) << 0;
1001 l |= itoa64_to_int (buf[45]) << 6;
1002 l |= itoa64_to_int (buf[46]) << 12;
1003 l |= itoa64_to_int (buf[47]) << 18;
1004
1005 digest[53] = (l >> 16) & 0xff;
1006 digest[11] = (l >> 8) & 0xff;
1007 digest[32] = (l >> 0) & 0xff;
1008
1009 l = itoa64_to_int (buf[48]) << 0;
1010 l |= itoa64_to_int (buf[49]) << 6;
1011 l |= itoa64_to_int (buf[50]) << 12;
1012 l |= itoa64_to_int (buf[51]) << 18;
1013
1014 digest[12] = (l >> 16) & 0xff;
1015 digest[33] = (l >> 8) & 0xff;
1016 digest[54] = (l >> 0) & 0xff;
1017
1018 l = itoa64_to_int (buf[52]) << 0;
1019 l |= itoa64_to_int (buf[53]) << 6;
1020 l |= itoa64_to_int (buf[54]) << 12;
1021 l |= itoa64_to_int (buf[55]) << 18;
1022
1023 digest[34] = (l >> 16) & 0xff;
1024 digest[55] = (l >> 8) & 0xff;
1025 digest[13] = (l >> 0) & 0xff;
1026
1027 l = itoa64_to_int (buf[56]) << 0;
1028 l |= itoa64_to_int (buf[57]) << 6;
1029 l |= itoa64_to_int (buf[58]) << 12;
1030 l |= itoa64_to_int (buf[59]) << 18;
1031
1032 digest[56] = (l >> 16) & 0xff;
1033 digest[14] = (l >> 8) & 0xff;
1034 digest[35] = (l >> 0) & 0xff;
1035
1036 l = itoa64_to_int (buf[60]) << 0;
1037 l |= itoa64_to_int (buf[61]) << 6;
1038 l |= itoa64_to_int (buf[62]) << 12;
1039 l |= itoa64_to_int (buf[63]) << 18;
1040
1041 digest[15] = (l >> 16) & 0xff;
1042 digest[36] = (l >> 8) & 0xff;
1043 digest[57] = (l >> 0) & 0xff;
1044
1045 l = itoa64_to_int (buf[64]) << 0;
1046 l |= itoa64_to_int (buf[65]) << 6;
1047 l |= itoa64_to_int (buf[66]) << 12;
1048 l |= itoa64_to_int (buf[67]) << 18;
1049
1050 digest[37] = (l >> 16) & 0xff;
1051 digest[58] = (l >> 8) & 0xff;
1052 digest[16] = (l >> 0) & 0xff;
1053
1054 l = itoa64_to_int (buf[68]) << 0;
1055 l |= itoa64_to_int (buf[69]) << 6;
1056 l |= itoa64_to_int (buf[70]) << 12;
1057 l |= itoa64_to_int (buf[71]) << 18;
1058
1059 digest[59] = (l >> 16) & 0xff;
1060 digest[17] = (l >> 8) & 0xff;
1061 digest[38] = (l >> 0) & 0xff;
1062
1063 l = itoa64_to_int (buf[72]) << 0;
1064 l |= itoa64_to_int (buf[73]) << 6;
1065 l |= itoa64_to_int (buf[74]) << 12;
1066 l |= itoa64_to_int (buf[75]) << 18;
1067
1068 digest[18] = (l >> 16) & 0xff;
1069 digest[39] = (l >> 8) & 0xff;
1070 digest[60] = (l >> 0) & 0xff;
1071
1072 l = itoa64_to_int (buf[76]) << 0;
1073 l |= itoa64_to_int (buf[77]) << 6;
1074 l |= itoa64_to_int (buf[78]) << 12;
1075 l |= itoa64_to_int (buf[79]) << 18;
1076
1077 digest[40] = (l >> 16) & 0xff;
1078 digest[61] = (l >> 8) & 0xff;
1079 digest[19] = (l >> 0) & 0xff;
1080
1081 l = itoa64_to_int (buf[80]) << 0;
1082 l |= itoa64_to_int (buf[81]) << 6;
1083 l |= itoa64_to_int (buf[82]) << 12;
1084 l |= itoa64_to_int (buf[83]) << 18;
1085
1086 digest[62] = (l >> 16) & 0xff;
1087 digest[20] = (l >> 8) & 0xff;
1088 digest[41] = (l >> 0) & 0xff;
1089
1090 l = itoa64_to_int (buf[84]) << 0;
1091 l |= itoa64_to_int (buf[85]) << 6;
1092
1093 digest[63] = (l >> 0) & 0xff;
1094 }
1095
1096 void sha512crypt_encode (unsigned char digest[64], unsigned char buf[86])
1097 {
1098 int l;
1099
1100 l = (digest[ 0] << 16) | (digest[21] << 8) | (digest[42] << 0);
1101
1102 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1103 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1104 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1105 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
1106
1107 l = (digest[22] << 16) | (digest[43] << 8) | (digest[ 1] << 0);
1108
1109 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1110 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1111 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1112 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
1113
1114 l = (digest[44] << 16) | (digest[ 2] << 8) | (digest[23] << 0);
1115
1116 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1117 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1118 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1119 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
1120
1121 l = (digest[ 3] << 16) | (digest[24] << 8) | (digest[45] << 0);
1122
1123 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1124 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1125 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1126 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
1127
1128 l = (digest[25] << 16) | (digest[46] << 8) | (digest[ 4] << 0);
1129
1130 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1131 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1132 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1133 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
1134
1135 l = (digest[47] << 16) | (digest[ 5] << 8) | (digest[26] << 0);
1136
1137 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1138 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1139 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1140 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
1141
1142 l = (digest[ 6] << 16) | (digest[27] << 8) | (digest[48] << 0);
1143
1144 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1145 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1146 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1147 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
1148
1149 l = (digest[28] << 16) | (digest[49] << 8) | (digest[ 7] << 0);
1150
1151 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1152 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1153 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1154 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
1155
1156 l = (digest[50] << 16) | (digest[ 8] << 8) | (digest[29] << 0);
1157
1158 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1159 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1160 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1161 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
1162
1163 l = (digest[ 9] << 16) | (digest[30] << 8) | (digest[51] << 0);
1164
1165 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1166 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1167 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1168 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
1169
1170 l = (digest[31] << 16) | (digest[52] << 8) | (digest[10] << 0);
1171
1172 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1173 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1174 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1175 buf[43] = int_to_itoa64 (l & 0x3f); l >>= 6;
1176
1177 l = (digest[53] << 16) | (digest[11] << 8) | (digest[32] << 0);
1178
1179 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1180 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1181 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1182 buf[47] = int_to_itoa64 (l & 0x3f); l >>= 6;
1183
1184 l = (digest[12] << 16) | (digest[33] << 8) | (digest[54] << 0);
1185
1186 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1187 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1188 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1189 buf[51] = int_to_itoa64 (l & 0x3f); l >>= 6;
1190
1191 l = (digest[34] << 16) | (digest[55] << 8) | (digest[13] << 0);
1192
1193 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1194 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1195 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1196 buf[55] = int_to_itoa64 (l & 0x3f); l >>= 6;
1197
1198 l = (digest[56] << 16) | (digest[14] << 8) | (digest[35] << 0);
1199
1200 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1201 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1202 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1203 buf[59] = int_to_itoa64 (l & 0x3f); l >>= 6;
1204
1205 l = (digest[15] << 16) | (digest[36] << 8) | (digest[57] << 0);
1206
1207 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1208 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1209 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1210 buf[63] = int_to_itoa64 (l & 0x3f); l >>= 6;
1211
1212 l = (digest[37] << 16) | (digest[58] << 8) | (digest[16] << 0);
1213
1214 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1215 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1216 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1217 buf[67] = int_to_itoa64 (l & 0x3f); l >>= 6;
1218
1219 l = (digest[59] << 16) | (digest[17] << 8) | (digest[38] << 0);
1220
1221 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1222 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1223 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1224 buf[71] = int_to_itoa64 (l & 0x3f); l >>= 6;
1225
1226 l = (digest[18] << 16) | (digest[39] << 8) | (digest[60] << 0);
1227
1228 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1229 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1230 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1231 buf[75] = int_to_itoa64 (l & 0x3f); l >>= 6;
1232
1233 l = (digest[40] << 16) | (digest[61] << 8) | (digest[19] << 0);
1234
1235 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1236 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1237 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1238 buf[79] = int_to_itoa64 (l & 0x3f); l >>= 6;
1239
1240 l = (digest[62] << 16) | (digest[20] << 8) | (digest[41] << 0);
1241
1242 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1243 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1244 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1245 buf[83] = int_to_itoa64 (l & 0x3f); l >>= 6;
1246
1247 l = 0 | 0 | (digest[63] << 0);
1248
1249 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1250 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1251 }
1252
1253 void sha1aix_decode (unsigned char digest[20], unsigned char buf[27])
1254 {
1255 int l;
1256
1257 l = itoa64_to_int (buf[ 0]) << 0;
1258 l |= itoa64_to_int (buf[ 1]) << 6;
1259 l |= itoa64_to_int (buf[ 2]) << 12;
1260 l |= itoa64_to_int (buf[ 3]) << 18;
1261
1262 digest[ 2] = (l >> 0) & 0xff;
1263 digest[ 1] = (l >> 8) & 0xff;
1264 digest[ 0] = (l >> 16) & 0xff;
1265
1266 l = itoa64_to_int (buf[ 4]) << 0;
1267 l |= itoa64_to_int (buf[ 5]) << 6;
1268 l |= itoa64_to_int (buf[ 6]) << 12;
1269 l |= itoa64_to_int (buf[ 7]) << 18;
1270
1271 digest[ 5] = (l >> 0) & 0xff;
1272 digest[ 4] = (l >> 8) & 0xff;
1273 digest[ 3] = (l >> 16) & 0xff;
1274
1275 l = itoa64_to_int (buf[ 8]) << 0;
1276 l |= itoa64_to_int (buf[ 9]) << 6;
1277 l |= itoa64_to_int (buf[10]) << 12;
1278 l |= itoa64_to_int (buf[11]) << 18;
1279
1280 digest[ 8] = (l >> 0) & 0xff;
1281 digest[ 7] = (l >> 8) & 0xff;
1282 digest[ 6] = (l >> 16) & 0xff;
1283
1284 l = itoa64_to_int (buf[12]) << 0;
1285 l |= itoa64_to_int (buf[13]) << 6;
1286 l |= itoa64_to_int (buf[14]) << 12;
1287 l |= itoa64_to_int (buf[15]) << 18;
1288
1289 digest[11] = (l >> 0) & 0xff;
1290 digest[10] = (l >> 8) & 0xff;
1291 digest[ 9] = (l >> 16) & 0xff;
1292
1293 l = itoa64_to_int (buf[16]) << 0;
1294 l |= itoa64_to_int (buf[17]) << 6;
1295 l |= itoa64_to_int (buf[18]) << 12;
1296 l |= itoa64_to_int (buf[19]) << 18;
1297
1298 digest[14] = (l >> 0) & 0xff;
1299 digest[13] = (l >> 8) & 0xff;
1300 digest[12] = (l >> 16) & 0xff;
1301
1302 l = itoa64_to_int (buf[20]) << 0;
1303 l |= itoa64_to_int (buf[21]) << 6;
1304 l |= itoa64_to_int (buf[22]) << 12;
1305 l |= itoa64_to_int (buf[23]) << 18;
1306
1307 digest[17] = (l >> 0) & 0xff;
1308 digest[16] = (l >> 8) & 0xff;
1309 digest[15] = (l >> 16) & 0xff;
1310
1311 l = itoa64_to_int (buf[24]) << 0;
1312 l |= itoa64_to_int (buf[25]) << 6;
1313 l |= itoa64_to_int (buf[26]) << 12;
1314
1315 digest[19] = (l >> 8) & 0xff;
1316 digest[18] = (l >> 16) & 0xff;
1317 }
1318
1319 void sha1aix_encode (unsigned char digest[20], unsigned char buf[27])
1320 {
1321 int l;
1322
1323 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1324
1325 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1326 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1327 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1328 buf[ 3] = int_to_itoa64 (l & 0x3f);
1329
1330 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1331
1332 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1333 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1334 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1335 buf[ 7] = int_to_itoa64 (l & 0x3f);
1336
1337 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1338
1339 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1340 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1341 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1342 buf[11] = int_to_itoa64 (l & 0x3f);
1343
1344 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1345
1346 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1347 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1348 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1349 buf[15] = int_to_itoa64 (l & 0x3f);
1350
1351 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1352
1353 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1354 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1355 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1356 buf[19] = int_to_itoa64 (l & 0x3f);
1357
1358 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1359
1360 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1361 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1362 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1363 buf[23] = int_to_itoa64 (l & 0x3f);
1364
1365 l = 0 | (digest[19] << 8) | (digest[18] << 16);
1366
1367 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1368 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1369 buf[26] = int_to_itoa64 (l & 0x3f);
1370 }
1371
1372 void sha256aix_decode (unsigned char digest[32], unsigned char buf[43])
1373 {
1374 int l;
1375
1376 l = itoa64_to_int (buf[ 0]) << 0;
1377 l |= itoa64_to_int (buf[ 1]) << 6;
1378 l |= itoa64_to_int (buf[ 2]) << 12;
1379 l |= itoa64_to_int (buf[ 3]) << 18;
1380
1381 digest[ 2] = (l >> 0) & 0xff;
1382 digest[ 1] = (l >> 8) & 0xff;
1383 digest[ 0] = (l >> 16) & 0xff;
1384
1385 l = itoa64_to_int (buf[ 4]) << 0;
1386 l |= itoa64_to_int (buf[ 5]) << 6;
1387 l |= itoa64_to_int (buf[ 6]) << 12;
1388 l |= itoa64_to_int (buf[ 7]) << 18;
1389
1390 digest[ 5] = (l >> 0) & 0xff;
1391 digest[ 4] = (l >> 8) & 0xff;
1392 digest[ 3] = (l >> 16) & 0xff;
1393
1394 l = itoa64_to_int (buf[ 8]) << 0;
1395 l |= itoa64_to_int (buf[ 9]) << 6;
1396 l |= itoa64_to_int (buf[10]) << 12;
1397 l |= itoa64_to_int (buf[11]) << 18;
1398
1399 digest[ 8] = (l >> 0) & 0xff;
1400 digest[ 7] = (l >> 8) & 0xff;
1401 digest[ 6] = (l >> 16) & 0xff;
1402
1403 l = itoa64_to_int (buf[12]) << 0;
1404 l |= itoa64_to_int (buf[13]) << 6;
1405 l |= itoa64_to_int (buf[14]) << 12;
1406 l |= itoa64_to_int (buf[15]) << 18;
1407
1408 digest[11] = (l >> 0) & 0xff;
1409 digest[10] = (l >> 8) & 0xff;
1410 digest[ 9] = (l >> 16) & 0xff;
1411
1412 l = itoa64_to_int (buf[16]) << 0;
1413 l |= itoa64_to_int (buf[17]) << 6;
1414 l |= itoa64_to_int (buf[18]) << 12;
1415 l |= itoa64_to_int (buf[19]) << 18;
1416
1417 digest[14] = (l >> 0) & 0xff;
1418 digest[13] = (l >> 8) & 0xff;
1419 digest[12] = (l >> 16) & 0xff;
1420
1421 l = itoa64_to_int (buf[20]) << 0;
1422 l |= itoa64_to_int (buf[21]) << 6;
1423 l |= itoa64_to_int (buf[22]) << 12;
1424 l |= itoa64_to_int (buf[23]) << 18;
1425
1426 digest[17] = (l >> 0) & 0xff;
1427 digest[16] = (l >> 8) & 0xff;
1428 digest[15] = (l >> 16) & 0xff;
1429
1430 l = itoa64_to_int (buf[24]) << 0;
1431 l |= itoa64_to_int (buf[25]) << 6;
1432 l |= itoa64_to_int (buf[26]) << 12;
1433 l |= itoa64_to_int (buf[27]) << 18;
1434
1435 digest[20] = (l >> 0) & 0xff;
1436 digest[19] = (l >> 8) & 0xff;
1437 digest[18] = (l >> 16) & 0xff;
1438
1439 l = itoa64_to_int (buf[28]) << 0;
1440 l |= itoa64_to_int (buf[29]) << 6;
1441 l |= itoa64_to_int (buf[30]) << 12;
1442 l |= itoa64_to_int (buf[31]) << 18;
1443
1444 digest[23] = (l >> 0) & 0xff;
1445 digest[22] = (l >> 8) & 0xff;
1446 digest[21] = (l >> 16) & 0xff;
1447
1448 l = itoa64_to_int (buf[32]) << 0;
1449 l |= itoa64_to_int (buf[33]) << 6;
1450 l |= itoa64_to_int (buf[34]) << 12;
1451 l |= itoa64_to_int (buf[35]) << 18;
1452
1453 digest[26] = (l >> 0) & 0xff;
1454 digest[25] = (l >> 8) & 0xff;
1455 digest[24] = (l >> 16) & 0xff;
1456
1457 l = itoa64_to_int (buf[36]) << 0;
1458 l |= itoa64_to_int (buf[37]) << 6;
1459 l |= itoa64_to_int (buf[38]) << 12;
1460 l |= itoa64_to_int (buf[39]) << 18;
1461
1462 digest[29] = (l >> 0) & 0xff;
1463 digest[28] = (l >> 8) & 0xff;
1464 digest[27] = (l >> 16) & 0xff;
1465
1466 l = itoa64_to_int (buf[40]) << 0;
1467 l |= itoa64_to_int (buf[41]) << 6;
1468 l |= itoa64_to_int (buf[42]) << 12;
1469
1470 //digest[32] = (l >> 0) & 0xff;
1471 digest[31] = (l >> 8) & 0xff;
1472 digest[30] = (l >> 16) & 0xff;
1473 }
1474
1475 void sha256aix_encode (unsigned char digest[32], unsigned char buf[43])
1476 {
1477 int l;
1478
1479 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1480
1481 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1482 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1483 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1484 buf[ 3] = int_to_itoa64 (l & 0x3f);
1485
1486 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1487
1488 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1489 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1490 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1491 buf[ 7] = int_to_itoa64 (l & 0x3f);
1492
1493 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1494
1495 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1496 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1497 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1498 buf[11] = int_to_itoa64 (l & 0x3f);
1499
1500 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1501
1502 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1503 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1504 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1505 buf[15] = int_to_itoa64 (l & 0x3f);
1506
1507 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1508
1509 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1510 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1511 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1512 buf[19] = int_to_itoa64 (l & 0x3f);
1513
1514 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1515
1516 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1517 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1518 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1519 buf[23] = int_to_itoa64 (l & 0x3f);
1520
1521 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1522
1523 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1524 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1525 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1526 buf[27] = int_to_itoa64 (l & 0x3f);
1527
1528 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1529
1530 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1531 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1532 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1533 buf[31] = int_to_itoa64 (l & 0x3f);
1534
1535 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1536
1537 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1538 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1539 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1540 buf[35] = int_to_itoa64 (l & 0x3f);
1541
1542 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1543
1544 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1545 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1546 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1547 buf[39] = int_to_itoa64 (l & 0x3f);
1548
1549 l = 0 | (digest[31] << 8) | (digest[30] << 16);
1550
1551 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1552 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1553 buf[42] = int_to_itoa64 (l & 0x3f);
1554 }
1555
1556 void sha512aix_decode (unsigned char digest[64], unsigned char buf[86])
1557 {
1558 int l;
1559
1560 l = itoa64_to_int (buf[ 0]) << 0;
1561 l |= itoa64_to_int (buf[ 1]) << 6;
1562 l |= itoa64_to_int (buf[ 2]) << 12;
1563 l |= itoa64_to_int (buf[ 3]) << 18;
1564
1565 digest[ 2] = (l >> 0) & 0xff;
1566 digest[ 1] = (l >> 8) & 0xff;
1567 digest[ 0] = (l >> 16) & 0xff;
1568
1569 l = itoa64_to_int (buf[ 4]) << 0;
1570 l |= itoa64_to_int (buf[ 5]) << 6;
1571 l |= itoa64_to_int (buf[ 6]) << 12;
1572 l |= itoa64_to_int (buf[ 7]) << 18;
1573
1574 digest[ 5] = (l >> 0) & 0xff;
1575 digest[ 4] = (l >> 8) & 0xff;
1576 digest[ 3] = (l >> 16) & 0xff;
1577
1578 l = itoa64_to_int (buf[ 8]) << 0;
1579 l |= itoa64_to_int (buf[ 9]) << 6;
1580 l |= itoa64_to_int (buf[10]) << 12;
1581 l |= itoa64_to_int (buf[11]) << 18;
1582
1583 digest[ 8] = (l >> 0) & 0xff;
1584 digest[ 7] = (l >> 8) & 0xff;
1585 digest[ 6] = (l >> 16) & 0xff;
1586
1587 l = itoa64_to_int (buf[12]) << 0;
1588 l |= itoa64_to_int (buf[13]) << 6;
1589 l |= itoa64_to_int (buf[14]) << 12;
1590 l |= itoa64_to_int (buf[15]) << 18;
1591
1592 digest[11] = (l >> 0) & 0xff;
1593 digest[10] = (l >> 8) & 0xff;
1594 digest[ 9] = (l >> 16) & 0xff;
1595
1596 l = itoa64_to_int (buf[16]) << 0;
1597 l |= itoa64_to_int (buf[17]) << 6;
1598 l |= itoa64_to_int (buf[18]) << 12;
1599 l |= itoa64_to_int (buf[19]) << 18;
1600
1601 digest[14] = (l >> 0) & 0xff;
1602 digest[13] = (l >> 8) & 0xff;
1603 digest[12] = (l >> 16) & 0xff;
1604
1605 l = itoa64_to_int (buf[20]) << 0;
1606 l |= itoa64_to_int (buf[21]) << 6;
1607 l |= itoa64_to_int (buf[22]) << 12;
1608 l |= itoa64_to_int (buf[23]) << 18;
1609
1610 digest[17] = (l >> 0) & 0xff;
1611 digest[16] = (l >> 8) & 0xff;
1612 digest[15] = (l >> 16) & 0xff;
1613
1614 l = itoa64_to_int (buf[24]) << 0;
1615 l |= itoa64_to_int (buf[25]) << 6;
1616 l |= itoa64_to_int (buf[26]) << 12;
1617 l |= itoa64_to_int (buf[27]) << 18;
1618
1619 digest[20] = (l >> 0) & 0xff;
1620 digest[19] = (l >> 8) & 0xff;
1621 digest[18] = (l >> 16) & 0xff;
1622
1623 l = itoa64_to_int (buf[28]) << 0;
1624 l |= itoa64_to_int (buf[29]) << 6;
1625 l |= itoa64_to_int (buf[30]) << 12;
1626 l |= itoa64_to_int (buf[31]) << 18;
1627
1628 digest[23] = (l >> 0) & 0xff;
1629 digest[22] = (l >> 8) & 0xff;
1630 digest[21] = (l >> 16) & 0xff;
1631
1632 l = itoa64_to_int (buf[32]) << 0;
1633 l |= itoa64_to_int (buf[33]) << 6;
1634 l |= itoa64_to_int (buf[34]) << 12;
1635 l |= itoa64_to_int (buf[35]) << 18;
1636
1637 digest[26] = (l >> 0) & 0xff;
1638 digest[25] = (l >> 8) & 0xff;
1639 digest[24] = (l >> 16) & 0xff;
1640
1641 l = itoa64_to_int (buf[36]) << 0;
1642 l |= itoa64_to_int (buf[37]) << 6;
1643 l |= itoa64_to_int (buf[38]) << 12;
1644 l |= itoa64_to_int (buf[39]) << 18;
1645
1646 digest[29] = (l >> 0) & 0xff;
1647 digest[28] = (l >> 8) & 0xff;
1648 digest[27] = (l >> 16) & 0xff;
1649
1650 l = itoa64_to_int (buf[40]) << 0;
1651 l |= itoa64_to_int (buf[41]) << 6;
1652 l |= itoa64_to_int (buf[42]) << 12;
1653 l |= itoa64_to_int (buf[43]) << 18;
1654
1655 digest[32] = (l >> 0) & 0xff;
1656 digest[31] = (l >> 8) & 0xff;
1657 digest[30] = (l >> 16) & 0xff;
1658
1659 l = itoa64_to_int (buf[44]) << 0;
1660 l |= itoa64_to_int (buf[45]) << 6;
1661 l |= itoa64_to_int (buf[46]) << 12;
1662 l |= itoa64_to_int (buf[47]) << 18;
1663
1664 digest[35] = (l >> 0) & 0xff;
1665 digest[34] = (l >> 8) & 0xff;
1666 digest[33] = (l >> 16) & 0xff;
1667
1668 l = itoa64_to_int (buf[48]) << 0;
1669 l |= itoa64_to_int (buf[49]) << 6;
1670 l |= itoa64_to_int (buf[50]) << 12;
1671 l |= itoa64_to_int (buf[51]) << 18;
1672
1673 digest[38] = (l >> 0) & 0xff;
1674 digest[37] = (l >> 8) & 0xff;
1675 digest[36] = (l >> 16) & 0xff;
1676
1677 l = itoa64_to_int (buf[52]) << 0;
1678 l |= itoa64_to_int (buf[53]) << 6;
1679 l |= itoa64_to_int (buf[54]) << 12;
1680 l |= itoa64_to_int (buf[55]) << 18;
1681
1682 digest[41] = (l >> 0) & 0xff;
1683 digest[40] = (l >> 8) & 0xff;
1684 digest[39] = (l >> 16) & 0xff;
1685
1686 l = itoa64_to_int (buf[56]) << 0;
1687 l |= itoa64_to_int (buf[57]) << 6;
1688 l |= itoa64_to_int (buf[58]) << 12;
1689 l |= itoa64_to_int (buf[59]) << 18;
1690
1691 digest[44] = (l >> 0) & 0xff;
1692 digest[43] = (l >> 8) & 0xff;
1693 digest[42] = (l >> 16) & 0xff;
1694
1695 l = itoa64_to_int (buf[60]) << 0;
1696 l |= itoa64_to_int (buf[61]) << 6;
1697 l |= itoa64_to_int (buf[62]) << 12;
1698 l |= itoa64_to_int (buf[63]) << 18;
1699
1700 digest[47] = (l >> 0) & 0xff;
1701 digest[46] = (l >> 8) & 0xff;
1702 digest[45] = (l >> 16) & 0xff;
1703
1704 l = itoa64_to_int (buf[64]) << 0;
1705 l |= itoa64_to_int (buf[65]) << 6;
1706 l |= itoa64_to_int (buf[66]) << 12;
1707 l |= itoa64_to_int (buf[67]) << 18;
1708
1709 digest[50] = (l >> 0) & 0xff;
1710 digest[49] = (l >> 8) & 0xff;
1711 digest[48] = (l >> 16) & 0xff;
1712
1713 l = itoa64_to_int (buf[68]) << 0;
1714 l |= itoa64_to_int (buf[69]) << 6;
1715 l |= itoa64_to_int (buf[70]) << 12;
1716 l |= itoa64_to_int (buf[71]) << 18;
1717
1718 digest[53] = (l >> 0) & 0xff;
1719 digest[52] = (l >> 8) & 0xff;
1720 digest[51] = (l >> 16) & 0xff;
1721
1722 l = itoa64_to_int (buf[72]) << 0;
1723 l |= itoa64_to_int (buf[73]) << 6;
1724 l |= itoa64_to_int (buf[74]) << 12;
1725 l |= itoa64_to_int (buf[75]) << 18;
1726
1727 digest[56] = (l >> 0) & 0xff;
1728 digest[55] = (l >> 8) & 0xff;
1729 digest[54] = (l >> 16) & 0xff;
1730
1731 l = itoa64_to_int (buf[76]) << 0;
1732 l |= itoa64_to_int (buf[77]) << 6;
1733 l |= itoa64_to_int (buf[78]) << 12;
1734 l |= itoa64_to_int (buf[79]) << 18;
1735
1736 digest[59] = (l >> 0) & 0xff;
1737 digest[58] = (l >> 8) & 0xff;
1738 digest[57] = (l >> 16) & 0xff;
1739
1740 l = itoa64_to_int (buf[80]) << 0;
1741 l |= itoa64_to_int (buf[81]) << 6;
1742 l |= itoa64_to_int (buf[82]) << 12;
1743 l |= itoa64_to_int (buf[83]) << 18;
1744
1745 digest[62] = (l >> 0) & 0xff;
1746 digest[61] = (l >> 8) & 0xff;
1747 digest[60] = (l >> 16) & 0xff;
1748
1749 l = itoa64_to_int (buf[84]) << 0;
1750 l |= itoa64_to_int (buf[85]) << 6;
1751
1752 digest[63] = (l >> 16) & 0xff;
1753 }
1754
1755 void sha512aix_encode (unsigned char digest[64], unsigned char buf[86])
1756 {
1757 int l;
1758
1759 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1760
1761 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1762 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1763 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1764 buf[ 3] = int_to_itoa64 (l & 0x3f);
1765
1766 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1767
1768 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1769 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1770 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1771 buf[ 7] = int_to_itoa64 (l & 0x3f);
1772
1773 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1774
1775 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1776 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1777 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1778 buf[11] = int_to_itoa64 (l & 0x3f);
1779
1780 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1781
1782 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1783 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1784 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1785 buf[15] = int_to_itoa64 (l & 0x3f);
1786
1787 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1788
1789 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1790 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1791 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1792 buf[19] = int_to_itoa64 (l & 0x3f);
1793
1794 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1795
1796 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1797 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1798 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1799 buf[23] = int_to_itoa64 (l & 0x3f);
1800
1801 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1802
1803 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1804 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1805 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1806 buf[27] = int_to_itoa64 (l & 0x3f);
1807
1808 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1809
1810 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1811 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1812 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1813 buf[31] = int_to_itoa64 (l & 0x3f);
1814
1815 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1816
1817 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1818 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1819 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1820 buf[35] = int_to_itoa64 (l & 0x3f);
1821
1822 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1823
1824 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1825 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1826 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1827 buf[39] = int_to_itoa64 (l & 0x3f);
1828
1829 l = (digest[32] << 0) | (digest[31] << 8) | (digest[30] << 16);
1830
1831 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1832 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1833 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1834 buf[43] = int_to_itoa64 (l & 0x3f);
1835
1836 l = (digest[35] << 0) | (digest[34] << 8) | (digest[33] << 16);
1837
1838 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1839 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1840 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1841 buf[47] = int_to_itoa64 (l & 0x3f);
1842
1843 l = (digest[38] << 0) | (digest[37] << 8) | (digest[36] << 16);
1844
1845 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1846 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1847 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1848 buf[51] = int_to_itoa64 (l & 0x3f);
1849
1850 l = (digest[41] << 0) | (digest[40] << 8) | (digest[39] << 16);
1851
1852 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1853 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1854 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1855 buf[55] = int_to_itoa64 (l & 0x3f);
1856
1857 l = (digest[44] << 0) | (digest[43] << 8) | (digest[42] << 16);
1858
1859 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1860 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1861 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1862 buf[59] = int_to_itoa64 (l & 0x3f);
1863
1864 l = (digest[47] << 0) | (digest[46] << 8) | (digest[45] << 16);
1865
1866 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1867 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1868 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1869 buf[63] = int_to_itoa64 (l & 0x3f);
1870
1871 l = (digest[50] << 0) | (digest[49] << 8) | (digest[48] << 16);
1872
1873 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1874 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1875 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1876 buf[67] = int_to_itoa64 (l & 0x3f);
1877
1878 l = (digest[53] << 0) | (digest[52] << 8) | (digest[51] << 16);
1879
1880 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1881 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1882 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1883 buf[71] = int_to_itoa64 (l & 0x3f);
1884
1885 l = (digest[56] << 0) | (digest[55] << 8) | (digest[54] << 16);
1886
1887 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1888 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1889 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1890 buf[75] = int_to_itoa64 (l & 0x3f);
1891
1892 l = (digest[59] << 0) | (digest[58] << 8) | (digest[57] << 16);
1893
1894 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1895 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1896 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1897 buf[79] = int_to_itoa64 (l & 0x3f);
1898
1899 l = (digest[62] << 0) | (digest[61] << 8) | (digest[60] << 16);
1900
1901 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1902 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1903 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1904 buf[83] = int_to_itoa64 (l & 0x3f);
1905
1906 l = 0 | 0 | (digest[63] << 16);
1907
1908 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1909 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1910 }
1911
1912 void sha256crypt_decode (unsigned char digest[32], unsigned char buf[43])
1913 {
1914 int l;
1915
1916 l = itoa64_to_int (buf[ 0]) << 0;
1917 l |= itoa64_to_int (buf[ 1]) << 6;
1918 l |= itoa64_to_int (buf[ 2]) << 12;
1919 l |= itoa64_to_int (buf[ 3]) << 18;
1920
1921 digest[ 0] = (l >> 16) & 0xff;
1922 digest[10] = (l >> 8) & 0xff;
1923 digest[20] = (l >> 0) & 0xff;
1924
1925 l = itoa64_to_int (buf[ 4]) << 0;
1926 l |= itoa64_to_int (buf[ 5]) << 6;
1927 l |= itoa64_to_int (buf[ 6]) << 12;
1928 l |= itoa64_to_int (buf[ 7]) << 18;
1929
1930 digest[21] = (l >> 16) & 0xff;
1931 digest[ 1] = (l >> 8) & 0xff;
1932 digest[11] = (l >> 0) & 0xff;
1933
1934 l = itoa64_to_int (buf[ 8]) << 0;
1935 l |= itoa64_to_int (buf[ 9]) << 6;
1936 l |= itoa64_to_int (buf[10]) << 12;
1937 l |= itoa64_to_int (buf[11]) << 18;
1938
1939 digest[12] = (l >> 16) & 0xff;
1940 digest[22] = (l >> 8) & 0xff;
1941 digest[ 2] = (l >> 0) & 0xff;
1942
1943 l = itoa64_to_int (buf[12]) << 0;
1944 l |= itoa64_to_int (buf[13]) << 6;
1945 l |= itoa64_to_int (buf[14]) << 12;
1946 l |= itoa64_to_int (buf[15]) << 18;
1947
1948 digest[ 3] = (l >> 16) & 0xff;
1949 digest[13] = (l >> 8) & 0xff;
1950 digest[23] = (l >> 0) & 0xff;
1951
1952 l = itoa64_to_int (buf[16]) << 0;
1953 l |= itoa64_to_int (buf[17]) << 6;
1954 l |= itoa64_to_int (buf[18]) << 12;
1955 l |= itoa64_to_int (buf[19]) << 18;
1956
1957 digest[24] = (l >> 16) & 0xff;
1958 digest[ 4] = (l >> 8) & 0xff;
1959 digest[14] = (l >> 0) & 0xff;
1960
1961 l = itoa64_to_int (buf[20]) << 0;
1962 l |= itoa64_to_int (buf[21]) << 6;
1963 l |= itoa64_to_int (buf[22]) << 12;
1964 l |= itoa64_to_int (buf[23]) << 18;
1965
1966 digest[15] = (l >> 16) & 0xff;
1967 digest[25] = (l >> 8) & 0xff;
1968 digest[ 5] = (l >> 0) & 0xff;
1969
1970 l = itoa64_to_int (buf[24]) << 0;
1971 l |= itoa64_to_int (buf[25]) << 6;
1972 l |= itoa64_to_int (buf[26]) << 12;
1973 l |= itoa64_to_int (buf[27]) << 18;
1974
1975 digest[ 6] = (l >> 16) & 0xff;
1976 digest[16] = (l >> 8) & 0xff;
1977 digest[26] = (l >> 0) & 0xff;
1978
1979 l = itoa64_to_int (buf[28]) << 0;
1980 l |= itoa64_to_int (buf[29]) << 6;
1981 l |= itoa64_to_int (buf[30]) << 12;
1982 l |= itoa64_to_int (buf[31]) << 18;
1983
1984 digest[27] = (l >> 16) & 0xff;
1985 digest[ 7] = (l >> 8) & 0xff;
1986 digest[17] = (l >> 0) & 0xff;
1987
1988 l = itoa64_to_int (buf[32]) << 0;
1989 l |= itoa64_to_int (buf[33]) << 6;
1990 l |= itoa64_to_int (buf[34]) << 12;
1991 l |= itoa64_to_int (buf[35]) << 18;
1992
1993 digest[18] = (l >> 16) & 0xff;
1994 digest[28] = (l >> 8) & 0xff;
1995 digest[ 8] = (l >> 0) & 0xff;
1996
1997 l = itoa64_to_int (buf[36]) << 0;
1998 l |= itoa64_to_int (buf[37]) << 6;
1999 l |= itoa64_to_int (buf[38]) << 12;
2000 l |= itoa64_to_int (buf[39]) << 18;
2001
2002 digest[ 9] = (l >> 16) & 0xff;
2003 digest[19] = (l >> 8) & 0xff;
2004 digest[29] = (l >> 0) & 0xff;
2005
2006 l = itoa64_to_int (buf[40]) << 0;
2007 l |= itoa64_to_int (buf[41]) << 6;
2008 l |= itoa64_to_int (buf[42]) << 12;
2009
2010 digest[31] = (l >> 8) & 0xff;
2011 digest[30] = (l >> 0) & 0xff;
2012 }
2013
2014 void sha256crypt_encode (unsigned char digest[32], unsigned char buf[43])
2015 {
2016 int l;
2017
2018 l = (digest[ 0] << 16) | (digest[10] << 8) | (digest[20] << 0);
2019
2020 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2021 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2022 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2023 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
2024
2025 l = (digest[21] << 16) | (digest[ 1] << 8) | (digest[11] << 0);
2026
2027 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2028 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2029 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2030 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
2031
2032 l = (digest[12] << 16) | (digest[22] << 8) | (digest[ 2] << 0);
2033
2034 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2035 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2036 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2037 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
2038
2039 l = (digest[ 3] << 16) | (digest[13] << 8) | (digest[23] << 0);
2040
2041 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2042 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2043 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2044 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
2045
2046 l = (digest[24] << 16) | (digest[ 4] << 8) | (digest[14] << 0);
2047
2048 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2049 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2050 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2051 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
2052
2053 l = (digest[15] << 16) | (digest[25] << 8) | (digest[ 5] << 0);
2054
2055 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2056 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2057 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2058 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
2059
2060 l = (digest[ 6] << 16) | (digest[16] << 8) | (digest[26] << 0);
2061
2062 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2063 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2064 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2065 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
2066
2067 l = (digest[27] << 16) | (digest[ 7] << 8) | (digest[17] << 0);
2068
2069 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2070 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2071 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2072 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
2073
2074 l = (digest[18] << 16) | (digest[28] << 8) | (digest[ 8] << 0);
2075
2076 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2077 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2078 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2079 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
2080
2081 l = (digest[ 9] << 16) | (digest[19] << 8) | (digest[29] << 0);
2082
2083 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2084 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2085 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2086 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
2087
2088 l = 0 | (digest[31] << 8) | (digest[30] << 0);
2089
2090 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2091 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2092 buf[42] = int_to_itoa64 (l & 0x3f);
2093 }
2094
2095 void drupal7_decode (unsigned char digest[64], unsigned char buf[44])
2096 {
2097 int l;
2098
2099 l = itoa64_to_int (buf[ 0]) << 0;
2100 l |= itoa64_to_int (buf[ 1]) << 6;
2101 l |= itoa64_to_int (buf[ 2]) << 12;
2102 l |= itoa64_to_int (buf[ 3]) << 18;
2103
2104 digest[ 0] = (l >> 0) & 0xff;
2105 digest[ 1] = (l >> 8) & 0xff;
2106 digest[ 2] = (l >> 16) & 0xff;
2107
2108 l = itoa64_to_int (buf[ 4]) << 0;
2109 l |= itoa64_to_int (buf[ 5]) << 6;
2110 l |= itoa64_to_int (buf[ 6]) << 12;
2111 l |= itoa64_to_int (buf[ 7]) << 18;
2112
2113 digest[ 3] = (l >> 0) & 0xff;
2114 digest[ 4] = (l >> 8) & 0xff;
2115 digest[ 5] = (l >> 16) & 0xff;
2116
2117 l = itoa64_to_int (buf[ 8]) << 0;
2118 l |= itoa64_to_int (buf[ 9]) << 6;
2119 l |= itoa64_to_int (buf[10]) << 12;
2120 l |= itoa64_to_int (buf[11]) << 18;
2121
2122 digest[ 6] = (l >> 0) & 0xff;
2123 digest[ 7] = (l >> 8) & 0xff;
2124 digest[ 8] = (l >> 16) & 0xff;
2125
2126 l = itoa64_to_int (buf[12]) << 0;
2127 l |= itoa64_to_int (buf[13]) << 6;
2128 l |= itoa64_to_int (buf[14]) << 12;
2129 l |= itoa64_to_int (buf[15]) << 18;
2130
2131 digest[ 9] = (l >> 0) & 0xff;
2132 digest[10] = (l >> 8) & 0xff;
2133 digest[11] = (l >> 16) & 0xff;
2134
2135 l = itoa64_to_int (buf[16]) << 0;
2136 l |= itoa64_to_int (buf[17]) << 6;
2137 l |= itoa64_to_int (buf[18]) << 12;
2138 l |= itoa64_to_int (buf[19]) << 18;
2139
2140 digest[12] = (l >> 0) & 0xff;
2141 digest[13] = (l >> 8) & 0xff;
2142 digest[14] = (l >> 16) & 0xff;
2143
2144 l = itoa64_to_int (buf[20]) << 0;
2145 l |= itoa64_to_int (buf[21]) << 6;
2146 l |= itoa64_to_int (buf[22]) << 12;
2147 l |= itoa64_to_int (buf[23]) << 18;
2148
2149 digest[15] = (l >> 0) & 0xff;
2150 digest[16] = (l >> 8) & 0xff;
2151 digest[17] = (l >> 16) & 0xff;
2152
2153 l = itoa64_to_int (buf[24]) << 0;
2154 l |= itoa64_to_int (buf[25]) << 6;
2155 l |= itoa64_to_int (buf[26]) << 12;
2156 l |= itoa64_to_int (buf[27]) << 18;
2157
2158 digest[18] = (l >> 0) & 0xff;
2159 digest[19] = (l >> 8) & 0xff;
2160 digest[20] = (l >> 16) & 0xff;
2161
2162 l = itoa64_to_int (buf[28]) << 0;
2163 l |= itoa64_to_int (buf[29]) << 6;
2164 l |= itoa64_to_int (buf[30]) << 12;
2165 l |= itoa64_to_int (buf[31]) << 18;
2166
2167 digest[21] = (l >> 0) & 0xff;
2168 digest[22] = (l >> 8) & 0xff;
2169 digest[23] = (l >> 16) & 0xff;
2170
2171 l = itoa64_to_int (buf[32]) << 0;
2172 l |= itoa64_to_int (buf[33]) << 6;
2173 l |= itoa64_to_int (buf[34]) << 12;
2174 l |= itoa64_to_int (buf[35]) << 18;
2175
2176 digest[24] = (l >> 0) & 0xff;
2177 digest[25] = (l >> 8) & 0xff;
2178 digest[26] = (l >> 16) & 0xff;
2179
2180 l = itoa64_to_int (buf[36]) << 0;
2181 l |= itoa64_to_int (buf[37]) << 6;
2182 l |= itoa64_to_int (buf[38]) << 12;
2183 l |= itoa64_to_int (buf[39]) << 18;
2184
2185 digest[27] = (l >> 0) & 0xff;
2186 digest[28] = (l >> 8) & 0xff;
2187 digest[29] = (l >> 16) & 0xff;
2188
2189 l = itoa64_to_int (buf[40]) << 0;
2190 l |= itoa64_to_int (buf[41]) << 6;
2191 l |= itoa64_to_int (buf[42]) << 12;
2192 l |= itoa64_to_int (buf[43]) << 18;
2193
2194 digest[30] = (l >> 0) & 0xff;
2195 digest[31] = (l >> 8) & 0xff;
2196 digest[32] = (l >> 16) & 0xff;
2197
2198 digest[33] = 0;
2199 digest[34] = 0;
2200 digest[35] = 0;
2201 digest[36] = 0;
2202 digest[37] = 0;
2203 digest[38] = 0;
2204 digest[39] = 0;
2205 digest[40] = 0;
2206 digest[41] = 0;
2207 digest[42] = 0;
2208 digest[43] = 0;
2209 digest[44] = 0;
2210 digest[45] = 0;
2211 digest[46] = 0;
2212 digest[47] = 0;
2213 digest[48] = 0;
2214 digest[49] = 0;
2215 digest[50] = 0;
2216 digest[51] = 0;
2217 digest[52] = 0;
2218 digest[53] = 0;
2219 digest[54] = 0;
2220 digest[55] = 0;
2221 digest[56] = 0;
2222 digest[57] = 0;
2223 digest[58] = 0;
2224 digest[59] = 0;
2225 digest[60] = 0;
2226 digest[61] = 0;
2227 digest[62] = 0;
2228 digest[63] = 0;
2229 }
2230
2231 void drupal7_encode (unsigned char digest[64], unsigned char buf[43])
2232 {
2233 int l;
2234
2235 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
2236
2237 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2238 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2239 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2240 buf[ 3] = int_to_itoa64 (l & 0x3f);
2241
2242 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
2243
2244 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2245 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2246 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2247 buf[ 7] = int_to_itoa64 (l & 0x3f);
2248
2249 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
2250
2251 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2252 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2253 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2254 buf[11] = int_to_itoa64 (l & 0x3f);
2255
2256 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
2257
2258 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2259 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2260 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2261 buf[15] = int_to_itoa64 (l & 0x3f);
2262
2263 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
2264
2265 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2266 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2267 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2268 buf[19] = int_to_itoa64 (l & 0x3f);
2269
2270 l = (digest[15] << 0) | (digest[16] << 8) | (digest[17] << 16);
2271
2272 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2273 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2274 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2275 buf[23] = int_to_itoa64 (l & 0x3f);
2276
2277 l = (digest[18] << 0) | (digest[19] << 8) | (digest[20] << 16);
2278
2279 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2280 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2281 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2282 buf[27] = int_to_itoa64 (l & 0x3f);
2283
2284 l = (digest[21] << 0) | (digest[22] << 8) | (digest[23] << 16);
2285
2286 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2287 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2288 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2289 buf[31] = int_to_itoa64 (l & 0x3f);
2290
2291 l = (digest[24] << 0) | (digest[25] << 8) | (digest[26] << 16);
2292
2293 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2294 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2295 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2296 buf[35] = int_to_itoa64 (l & 0x3f);
2297
2298 l = (digest[27] << 0) | (digest[28] << 8) | (digest[29] << 16);
2299
2300 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2301 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2302 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2303 buf[39] = int_to_itoa64 (l & 0x3f);
2304
2305 l = (digest[30] << 0) | (digest[31] << 8) | (digest[32] << 16);
2306
2307 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2308 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2309 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
2310 //buf[43] = int_to_itoa64 (l & 0x3f);
2311 }
2312
2313 /**
2314 * tty
2315 */
2316
2317 #ifdef LINUX
2318 static struct termio savemodes;
2319 static int havemodes = 0;
2320
2321 int tty_break()
2322 {
2323 struct termio modmodes;
2324
2325 if (ioctl (fileno (stdin), TCGETA, &savemodes) < 0) return -1;
2326
2327 havemodes = 1;
2328
2329 modmodes = savemodes;
2330 modmodes.c_lflag &= ~ICANON;
2331 modmodes.c_cc[VMIN] = 1;
2332 modmodes.c_cc[VTIME] = 0;
2333
2334 return ioctl (fileno (stdin), TCSETAW, &modmodes);
2335 }
2336
2337 int tty_getchar()
2338 {
2339 fd_set rfds;
2340
2341 FD_ZERO (&rfds);
2342
2343 FD_SET (fileno (stdin), &rfds);
2344
2345 struct timeval tv;
2346
2347 tv.tv_sec = 1;
2348 tv.tv_usec = 0;
2349
2350 int retval = select (1, &rfds, NULL, NULL, &tv);
2351
2352 if (retval == 0) return 0;
2353 if (retval == -1) return -1;
2354
2355 return getchar();
2356 }
2357
2358 int tty_fix()
2359 {
2360 if (!havemodes) return 0;
2361
2362 return ioctl (fileno (stdin), TCSETAW, &savemodes);
2363 }
2364 #endif
2365
2366 #ifdef OSX
2367 static struct termios savemodes;
2368 static int havemodes = 0;
2369
2370 int tty_break()
2371 {
2372 struct termios modmodes;
2373
2374 if (ioctl (fileno (stdin), TIOCGETA, &savemodes) < 0) return -1;
2375
2376 havemodes = 1;
2377
2378 modmodes = savemodes;
2379 modmodes.c_lflag &= ~ICANON;
2380 modmodes.c_cc[VMIN] = 1;
2381 modmodes.c_cc[VTIME] = 0;
2382
2383 return ioctl (fileno (stdin), TIOCSETAW, &modmodes);
2384 }
2385
2386 int tty_getchar()
2387 {
2388 fd_set rfds;
2389
2390 FD_ZERO (&rfds);
2391
2392 FD_SET (fileno (stdin), &rfds);
2393
2394 struct timeval tv;
2395
2396 tv.tv_sec = 1;
2397 tv.tv_usec = 0;
2398
2399 int retval = select (1, &rfds, NULL, NULL, &tv);
2400
2401 if (retval == 0) return 0;
2402 if (retval == -1) return -1;
2403
2404 return getchar();
2405 }
2406
2407 int tty_fix()
2408 {
2409 if (!havemodes) return 0;
2410
2411 return ioctl (fileno (stdin), TIOCSETAW, &savemodes);
2412 }
2413 #endif
2414
2415 #ifdef WIN
2416 static DWORD saveMode = 0;
2417
2418 int tty_break()
2419 {
2420 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2421
2422 GetConsoleMode (stdinHandle, &saveMode);
2423 SetConsoleMode (stdinHandle, ENABLE_PROCESSED_INPUT);
2424
2425 return 0;
2426 }
2427
2428 int tty_getchar()
2429 {
2430 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2431
2432 DWORD rc = WaitForSingleObject (stdinHandle, 1000);
2433
2434 if (rc == WAIT_TIMEOUT) return 0;
2435 if (rc == WAIT_ABANDONED) return -1;
2436 if (rc == WAIT_FAILED) return -1;
2437
2438 // The whole ReadConsoleInput () part is a workaround.
2439 // For some unknown reason, maybe a mingw bug, a random signal
2440 // is sent to stdin which unblocks WaitForSingleObject () and sets rc 0.
2441 // Then it wants to read with getche () a keyboard input
2442 // which has never been made.
2443
2444 INPUT_RECORD buf[100];
2445
2446 DWORD num = 0;
2447
2448 ReadConsoleInput (stdinHandle, buf, 100, &num);
2449
2450 FlushConsoleInputBuffer (stdinHandle);
2451
2452 for (uint i = 0; i < num; i++)
2453 {
2454 if (buf[i].EventType != KEY_EVENT) continue;
2455
2456 KEY_EVENT_RECORD KeyEvent = buf[i].Event.KeyEvent;
2457
2458 if (KeyEvent.bKeyDown != TRUE) continue;
2459
2460 return KeyEvent.uChar.AsciiChar;
2461 }
2462
2463 return 0;
2464 }
2465
2466 int tty_fix()
2467 {
2468 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2469
2470 SetConsoleMode (stdinHandle, saveMode);
2471
2472 return 0;
2473 }
2474 #endif
2475
2476 /**
2477 * mem alloc
2478 */
2479
2480 #define MSG_ENOMEM "Insufficient memory available"
2481
2482 void *mycalloc (size_t nmemb, size_t size)
2483 {
2484 void *p = calloc (nmemb, size);
2485
2486 if (p == NULL)
2487 {
2488 log_error ("ERROR: %s", MSG_ENOMEM);
2489
2490 exit (-1);
2491 }
2492
2493 return (p);
2494 }
2495
2496 void *mymalloc (size_t size)
2497 {
2498 void *p = malloc (size);
2499
2500 if (p == NULL)
2501 {
2502 log_error ("ERROR: %s", MSG_ENOMEM);
2503
2504 exit (-1);
2505 }
2506
2507 memset (p, 0, size);
2508
2509 return (p);
2510 }
2511
2512 void myfree (void *ptr)
2513 {
2514 if (ptr == NULL) return;
2515
2516 free (ptr);
2517 }
2518
2519 void *myrealloc (void *ptr, size_t oldsz, size_t add)
2520 {
2521 void *p = realloc (ptr, oldsz + add);
2522
2523 if (p == NULL)
2524 {
2525 log_error ("ERROR: %s", MSG_ENOMEM);
2526
2527 exit (-1);
2528 }
2529
2530 memset ((char *) p + oldsz, 0, add);
2531
2532 return (p);
2533 }
2534
2535 char *mystrdup (const char *s)
2536 {
2537 const size_t len = strlen (s);
2538
2539 char *b = (char *) mymalloc (len + 1);
2540
2541 memcpy (b, s, len);
2542
2543 return (b);
2544 }
2545
2546 FILE *logfile_open (char *logfile)
2547 {
2548 FILE *fp = fopen (logfile, "ab");
2549
2550 if (fp == NULL)
2551 {
2552 fp = stdout;
2553 }
2554
2555 return fp;
2556 }
2557
2558 void logfile_close (FILE *fp)
2559 {
2560 if (fp == stdout) return;
2561
2562 fclose (fp);
2563 }
2564
2565 void logfile_append (const char *fmt, ...)
2566 {
2567 if (data.logfile_disable == 1) return;
2568
2569 FILE *fp = logfile_open (data.logfile);
2570
2571 va_list ap;
2572
2573 va_start (ap, fmt);
2574
2575 vfprintf (fp, fmt, ap);
2576
2577 va_end (ap);
2578
2579 fputc ('\n', fp);
2580
2581 fflush (fp);
2582
2583 logfile_close (fp);
2584 }
2585
2586 int logfile_generate_id ()
2587 {
2588 const int n = rand ();
2589
2590 time_t t;
2591
2592 time (&t);
2593
2594 return t + n;
2595 }
2596
2597 char *logfile_generate_topid ()
2598 {
2599 const int id = logfile_generate_id ();
2600
2601 char *topid = (char *) mymalloc (1 + 16 + 1);
2602
2603 sprintf (topid, "TOP%08x", id);
2604
2605 return topid;
2606 }
2607
2608 char *logfile_generate_subid ()
2609 {
2610 const int id = logfile_generate_id ();
2611
2612 char *subid = (char *) mymalloc (1 + 16 + 1);
2613
2614 sprintf (subid, "SUB%08x", id);
2615
2616 return subid;
2617 }
2618
2619 /**
2620 * system
2621 */
2622
2623 #ifdef _WIN
2624 void fsync (int fd)
2625 {
2626 HANDLE h = (HANDLE) _get_osfhandle (fd);
2627
2628 FlushFileBuffers (h);
2629 }
2630 #endif
2631
2632 /**
2633 * thermal
2634 */
2635
2636 #ifdef _WIN
2637 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2638 {
2639 NvU32 pGpuCount;
2640
2641 if (hc_NvAPI_EnumPhysicalGPUs (nvGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2642
2643 if (pGpuCount == 0)
2644 {
2645 log_info ("WARN: No NvAPI adapters found");
2646
2647 return (0);
2648 }
2649
2650 return (pGpuCount);
2651 }
2652 #endif
2653
2654 #ifdef LINUX
2655 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2656 {
2657 int pGpuCount = 0;
2658
2659 for (uint i = 0; i < DEVICES_MAX; i++)
2660 {
2661 if (hc_NVML_nvmlDeviceGetHandleByIndex (data.hm_dll, 1, i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2662
2663 //can be used to determine if the device by index matches the cuda device by index
2664 //char name[100]; memset (name, 0, sizeof (name));
2665 //hc_NVML_nvmlDeviceGetName (data.hm_dll, nvGPUHandle[i], name, sizeof (name) - 1);
2666
2667 pGpuCount++;
2668 }
2669
2670 if (pGpuCount == 0)
2671 {
2672 log_info ("WARN: No NVML adapters found");
2673
2674 return (0);
2675 }
2676
2677 return (pGpuCount);
2678 }
2679 #endif
2680
2681 void hm_close (HM_LIB hm_dll)
2682 {
2683 #ifdef _POSIX
2684 dlclose (hm_dll);
2685
2686 #elif _WIN
2687 FreeLibrary (hm_dll);
2688
2689 #endif
2690 }
2691
2692 HM_LIB hm_init ()
2693 {
2694 HM_LIB hm_dll = NULL;
2695
2696 if (data.vendor_id == VENDOR_ID_AMD)
2697 {
2698 #ifdef _POSIX
2699 hm_dll = dlopen ("libatiadlxx.so", RTLD_LAZY | RTLD_GLOBAL);
2700
2701 #elif _WIN
2702 hm_dll = LoadLibrary ("atiadlxx.dll");
2703
2704 if (hm_dll == NULL)
2705 {
2706 hm_dll = LoadLibrary ("atiadlxy.dll");
2707 }
2708
2709 #endif
2710 }
2711
2712 #ifdef LINUX
2713 if (data.vendor_id == VENDOR_ID_NV)
2714 {
2715 hm_dll = dlopen ("libnvidia-ml.so", RTLD_LAZY | RTLD_GLOBAL);
2716 }
2717 #endif
2718
2719 return hm_dll;
2720 }
2721
2722 int get_adapters_num_amd (HM_LIB hm_dll, int *iNumberAdapters)
2723 {
2724 if (hc_ADL_Adapter_NumberOfAdapters_Get (hm_dll, iNumberAdapters) != ADL_OK) return -1;
2725
2726 if (iNumberAdapters == 0)
2727 {
2728 log_info ("WARN: No ADL adapters found.");
2729
2730 return -1;
2731 }
2732
2733 return 0;
2734 }
2735
2736 /*
2737 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2738 {
2739 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2740 ADLODParameters lpOdParameters;
2741
2742 lpOdParameters.iSize = sizeof (ADLODParameters);
2743 size_t plevels_size = 0;
2744
2745 if (hc_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2746
2747 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2748 __func__, iAdapterIndex,
2749 lpOdParameters.iNumberOfPerformanceLevels,
2750 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2751 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2752
2753 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2754
2755 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2756
2757 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2758
2759 if (hc_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2760
2761 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2762 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2763 __func__, iAdapterIndex, j,
2764 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2765
2766 myfree (lpOdPerformanceLevels);
2767
2768 return 0;
2769 }
2770 */
2771
2772 LPAdapterInfo hm_get_adapter_info_amd (HM_LIB hm_dll, int iNumberAdapters)
2773 {
2774 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2775
2776 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2777
2778 if (hc_ADL_Adapter_AdapterInfo_Get (hm_dll, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2779
2780 return lpAdapterInfo;
2781 }
2782
2783 /*
2784 //
2785 // does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2786 //
2787
2788 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2789 {
2790 uint32_t idx = -1;
2791
2792 for (uint i = 0; i < num_adl_adapters; i++)
2793 {
2794 int opencl_bus_num = hm_device[i].busid;
2795 int opencl_dev_num = hm_device[i].devid;
2796
2797 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2798 {
2799 idx = i;
2800
2801 break;
2802 }
2803 }
2804
2805 if (idx >= DEVICES_MAX) return -1;
2806
2807 return idx;
2808 }
2809
2810 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2811 {
2812 for (uint i = 0; i < opencl_num_devices; i++)
2813 {
2814 cl_device_topology_amd device_topology;
2815
2816 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2817
2818 hm_device[i].busid = device_topology.pcie.bus;
2819 hm_device[i].devid = device_topology.pcie.device;
2820 }
2821 }
2822 */
2823
2824 void hm_sort_adl_adapters_by_busid_devid (uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2825 {
2826 // basically bubble sort
2827
2828 for (int i = 0; i < num_adl_adapters; i++)
2829 {
2830 for (int j = 0; j < num_adl_adapters - 1; j++)
2831 {
2832 // get info of adapter [x]
2833
2834 uint32_t adapter_index_x = valid_adl_device_list[j];
2835 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2836
2837 uint32_t bus_num_x = info_x.iBusNumber;
2838 uint32_t dev_num_x = info_x.iDeviceNumber;
2839
2840 // get info of adapter [y]
2841
2842 uint32_t adapter_index_y = valid_adl_device_list[j + 1];
2843 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2844
2845 uint32_t bus_num_y = info_y.iBusNumber;
2846 uint32_t dev_num_y = info_y.iDeviceNumber;
2847
2848 uint need_swap = 0;
2849
2850 if (bus_num_y < bus_num_x)
2851 {
2852 need_swap = 1;
2853 }
2854 else if (bus_num_y == bus_num_x)
2855 {
2856 if (dev_num_y < dev_num_x)
2857 {
2858 need_swap = 1;
2859 }
2860 }
2861
2862 if (need_swap == 1)
2863 {
2864 uint32_t temp = valid_adl_device_list[j + 1];
2865
2866 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2867 valid_adl_device_list[j + 0] = temp;
2868 }
2869 }
2870 }
2871 }
2872
2873 uint32_t *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2874 {
2875 *num_adl_adapters = 0;
2876
2877 uint32_t *adl_adapters = NULL;
2878
2879 int *bus_numbers = NULL;
2880 int *device_numbers = NULL;
2881
2882 for (int i = 0; i < iNumberAdapters; i++)
2883 {
2884 AdapterInfo info = lpAdapterInfo[i];
2885
2886 if ((info.strUDID == NULL) || (strlen (info.strUDID) < 1)) continue;
2887
2888 #ifdef WIN
2889 if (info.iVendorID != 1002) continue;
2890 #else
2891 if (info.iVendorID != 0x1002) continue;
2892 #endif
2893
2894 if (info.iBusNumber < 0) continue;
2895 if (info.iDeviceNumber < 0) continue;
2896
2897 int found = 0;
2898
2899 for (int pos = 0; pos < *num_adl_adapters; pos++)
2900 {
2901 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2902 {
2903 found = 1;
2904 break;
2905 }
2906 }
2907
2908 if (found) continue;
2909
2910 // add it to the list
2911
2912 adl_adapters = (uint32_t *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2913
2914 adl_adapters[*num_adl_adapters] = i;
2915
2916 // rest is just bookkeeping
2917
2918 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2919 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2920
2921 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2922 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2923
2924 (*num_adl_adapters)++;
2925 }
2926
2927 myfree (bus_numbers);
2928 myfree (device_numbers);
2929
2930 // sort the list by increasing bus id, device id number
2931
2932 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2933
2934 return adl_adapters;
2935 }
2936
2937 int hm_check_fanspeed_control (HM_LIB hm_dll, hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2938 {
2939 // loop through all valid devices
2940
2941 for (int i = 0; i < num_adl_adapters; i++)
2942 {
2943 uint32_t adapter_index = valid_adl_device_list[i];
2944
2945 // get AdapterInfo
2946
2947 AdapterInfo info = lpAdapterInfo[adapter_index];
2948
2949 // unfortunately this doesn't work since bus id and dev id are not unique
2950 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2951 // if (opencl_device_index == -1) continue;
2952
2953 int opencl_device_index = i;
2954
2955 // if (hm_show_performance_level (hm_dll, info.iAdapterIndex) != 0) return -1;
2956
2957 // get fanspeed info
2958
2959 if (hm_device[opencl_device_index].od_version == 5)
2960 {
2961 ADLFanSpeedInfo FanSpeedInfo;
2962
2963 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2964
2965 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2966
2967 if (hc_ADL_Overdrive5_FanSpeedInfo_Get (hm_dll, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2968
2969 // check read and write capability in fanspeedinfo
2970
2971 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2972 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2973 {
2974 hm_device[opencl_device_index].fan_supported = 1;
2975 }
2976 else
2977 {
2978 hm_device[opencl_device_index].fan_supported = 0;
2979 }
2980 }
2981 else // od_version == 6
2982 {
2983 ADLOD6FanSpeedInfo faninfo;
2984
2985 memset (&faninfo, 0, sizeof (faninfo));
2986
2987 if (hc_ADL_Overdrive6_FanSpeed_Get (hm_dll, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
2988
2989 // check read capability in fanspeedinfo
2990
2991 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
2992 {
2993 hm_device[opencl_device_index].fan_supported = 1;
2994 }
2995 else
2996 {
2997 hm_device[opencl_device_index].fan_supported = 0;
2998 }
2999 }
3000 }
3001
3002 return 0;
3003 }
3004
3005 int hm_get_overdrive_version (HM_LIB hm_dll, hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3006 {
3007 for (int i = 0; i < num_adl_adapters; i++)
3008 {
3009 uint32_t adapter_index = valid_adl_device_list[i];
3010
3011 // get AdapterInfo
3012
3013 AdapterInfo info = lpAdapterInfo[adapter_index];
3014
3015 // get overdrive version
3016
3017 int od_supported = 0;
3018 int od_enabled = 0;
3019 int od_version = 0;
3020
3021 if (hc_ADL_Overdrive_Caps (hm_dll, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3022
3023 // store the overdrive version in hm_device
3024
3025 // unfortunately this doesn't work since bus id and dev id are not unique
3026 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3027 // if (opencl_device_index == -1) continue;
3028
3029 int opencl_device_index = i;
3030
3031 hm_device[opencl_device_index].od_version = od_version;
3032 }
3033
3034 return 0;
3035 }
3036
3037 int hm_get_adapter_index_amd (hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3038 {
3039 for (int i = 0; i < num_adl_adapters; i++)
3040 {
3041 uint32_t adapter_index = valid_adl_device_list[i];
3042
3043 // get AdapterInfo
3044
3045 AdapterInfo info = lpAdapterInfo[adapter_index];
3046
3047 // store the iAdapterIndex in hm_device
3048
3049 // unfortunately this doesn't work since bus id and dev id are not unique
3050 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3051 // if (opencl_device_index == -1) continue;
3052
3053 int opencl_device_index = i;
3054
3055 hm_device[opencl_device_index].adapter_index.amd = info.iAdapterIndex;
3056 }
3057
3058 return num_adl_adapters;
3059 }
3060
3061 int hm_get_temperature_with_device_id (const uint device_id)
3062 {
3063 if (data.vendor_id == VENDOR_ID_AMD)
3064 {
3065 if (data.hm_dll)
3066 {
3067 if (data.hm_device[device_id].od_version == 5)
3068 {
3069 ADLTemperature Temperature;
3070
3071 Temperature.iSize = sizeof (ADLTemperature);
3072
3073 if (hc_ADL_Overdrive5_Temperature_Get (data.hm_dll, data.hm_device[device_id].adapter_index.amd, 0, &Temperature) != ADL_OK) return -1;
3074
3075 return Temperature.iTemperature / 1000;
3076 }
3077 else if (data.hm_device[device_id].od_version == 6)
3078 {
3079 int Temperature = 0;
3080
3081 if (hc_ADL_Overdrive6_Temperature_Get (data.hm_dll, data.hm_device[device_id].adapter_index.amd, &Temperature) != ADL_OK) return -1;
3082
3083 return Temperature / 1000;
3084 }
3085 }
3086 }
3087
3088 if (data.vendor_id == VENDOR_ID_NV)
3089 {
3090 #ifdef LINUX
3091 int temperature = 0;
3092
3093 hc_NVML_nvmlDeviceGetTemperature (data.hm_dll, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_GPU, (unsigned int *) &temperature);
3094
3095 return temperature;
3096 #endif
3097
3098 #ifdef WIN
3099 NV_GPU_THERMAL_SETTINGS pThermalSettings;
3100
3101 pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER;
3102 pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU;
3103 pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN;
3104 pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
3105
3106 if (hc_NvAPI_GPU_GetThermalSettings (data.hm_device[device_id].adapter_index.nv, 0, &pThermalSettings) != NVAPI_OK) return -1;
3107
3108 return pThermalSettings.sensor[0].currentTemp;
3109 #endif
3110 }
3111
3112 return -1;
3113 }
3114
3115 int hm_get_fanspeed_with_device_id (const uint device_id)
3116 {
3117 if (data.hm_device[device_id].fan_supported == 1)
3118 {
3119 if (data.vendor_id == VENDOR_ID_AMD)
3120 {
3121 if (data.hm_dll)
3122 {
3123 if (data.hm_device[device_id].od_version == 5)
3124 {
3125 ADLFanSpeedValue lpFanSpeedValue;
3126
3127 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3128
3129 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3130 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3131 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3132
3133 if (hc_ADL_Overdrive5_FanSpeed_Get (data.hm_dll, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3134
3135 return lpFanSpeedValue.iFanSpeed;
3136 }
3137 else // od_version == 6
3138 {
3139 ADLOD6FanSpeedInfo faninfo;
3140
3141 memset (&faninfo, 0, sizeof (faninfo));
3142
3143 if (hc_ADL_Overdrive6_FanSpeed_Get (data.hm_dll, data.hm_device[device_id].adapter_index.amd, &faninfo) != ADL_OK) return -1;
3144
3145 return faninfo.iFanSpeedPercent;
3146 }
3147 }
3148 }
3149
3150 if (data.vendor_id == VENDOR_ID_NV)
3151 {
3152 #ifdef LINUX
3153 int speed = 0;
3154
3155 hc_NVML_nvmlDeviceGetFanSpeed (data.hm_dll, 1, data.hm_device[device_id].adapter_index.nv, (unsigned int *) &speed);
3156
3157 return speed;
3158 #endif
3159
3160 #ifdef WIN
3161 NvU32 speed = 0;
3162
3163 hc_NvAPI_GPU_GetTachReading (data.hm_device[device_id].adapter_index.nv, &speed);
3164
3165 return speed;
3166 #endif
3167 }
3168 }
3169
3170 return -1;
3171 }
3172
3173 int hm_get_utilization_with_device_id (const uint device_id)
3174 {
3175 if (data.vendor_id == VENDOR_ID_AMD)
3176 {
3177 if (data.hm_dll)
3178 {
3179 ADLPMActivity PMActivity;
3180
3181 PMActivity.iSize = sizeof (ADLPMActivity);
3182
3183 if (hc_ADL_Overdrive_CurrentActivity_Get (data.hm_dll, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3184
3185 return PMActivity.iActivityPercent;
3186 }
3187 }
3188
3189 if (data.vendor_id == VENDOR_ID_NV)
3190 {
3191 #ifdef LINUX
3192 nvmlUtilization_t utilization;
3193
3194 hc_NVML_nvmlDeviceGetUtilizationRates (data.hm_dll, data.hm_device[device_id].adapter_index.nv, &utilization);
3195
3196 return utilization.gpu;
3197 #endif
3198
3199 #ifdef WIN
3200 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3201
3202 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3203
3204 if (hc_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_device[device_id].adapter_index.nv, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3205
3206 return pDynamicPstatesInfoEx.utilization[0].percentage;
3207 #endif
3208 }
3209
3210 return -1;
3211 }
3212
3213 int hm_set_fanspeed_with_device_id_amd (const uint device_id, const int fanspeed)
3214 {
3215 if (data.hm_device[device_id].fan_supported == 1)
3216 {
3217 if (data.hm_dll)
3218 {
3219 if (data.hm_device[device_id].od_version == 5)
3220 {
3221 ADLFanSpeedValue lpFanSpeedValue;
3222
3223 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3224
3225 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3226 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3227 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3228 lpFanSpeedValue.iFanSpeed = fanspeed;
3229
3230 if (hc_ADL_Overdrive5_FanSpeed_Set (data.hm_dll, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3231
3232 return 0;
3233 }
3234 else // od_version == 6
3235 {
3236 ADLOD6FanSpeedValue fan_speed_value;
3237
3238 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3239
3240 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3241 fan_speed_value.iFanSpeed = fanspeed;
3242
3243 if (hc_ADL_Overdrive6_FanSpeed_Set (data.hm_dll, data.hm_device[device_id].adapter_index.amd, &fan_speed_value) != ADL_OK) return -1;
3244
3245 return 0;
3246 }
3247 }
3248 }
3249
3250 return -1;
3251 }
3252
3253 /**
3254 * maskprocessor
3255 */
3256
3257 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3258 {
3259 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3260
3261 if (css_cnt > SP_PW_MAX)
3262 {
3263 log_error ("ERROR: mask length is too long");
3264
3265 exit (-1);
3266 }
3267
3268 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3269 {
3270 uint *uniq_tbl = uniq_tbls[css_pos];
3271
3272 uint *cs_buf = css[css_pos].cs_buf;
3273 uint cs_len = css[css_pos].cs_len;
3274
3275 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3276 {
3277 uint c = cs_buf[cs_pos] & 0xff;
3278
3279 uniq_tbl[c] = 1;
3280 }
3281 }
3282 }
3283
3284 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3285 {
3286 cs_t *cs = &css[css_cnt];
3287
3288 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3289
3290 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3291
3292 memset (css_uniq, 0, css_uniq_sz);
3293
3294 size_t i;
3295
3296 for (i = 0; i < cs->cs_len; i++)
3297 {
3298 const uint u = cs->cs_buf[i];
3299
3300 css_uniq[u] = 1;
3301 }
3302
3303 for (i = 0; i < in_len; i++)
3304 {
3305 uint u = in_buf[i] & 0xff;
3306
3307 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3308
3309 if (css_uniq[u] == 1) continue;
3310
3311 css_uniq[u] = 1;
3312
3313 cs->cs_buf[cs->cs_len] = u;
3314
3315 cs->cs_len++;
3316 }
3317
3318 myfree (css_uniq);
3319 }
3320
3321 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3322 {
3323 size_t in_pos;
3324
3325 for (in_pos = 0; in_pos < in_len; in_pos++)
3326 {
3327 uint p0 = in_buf[in_pos] & 0xff;
3328
3329 if (interpret == 1 && p0 == '?')
3330 {
3331 in_pos++;
3332
3333 if (in_pos == in_len) break;
3334
3335 uint p1 = in_buf[in_pos] & 0xff;
3336
3337 switch (p1)
3338 {
3339 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3340 break;
3341 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3342 break;
3343 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3344 break;
3345 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3346 break;
3347 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3348 break;
3349 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3350 break;
3351 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3352 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3353 break;
3354 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3355 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3356 break;
3357 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3358 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3359 break;
3360 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3361 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3362 break;
3363 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3364 break;
3365 default: log_error ("Syntax error: %s", in_buf);
3366 exit (-1);
3367 }
3368 }
3369 else
3370 {
3371 if (data.hex_charset)
3372 {
3373 in_pos++;
3374
3375 if (in_pos == in_len)
3376 {
3377 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3378
3379 exit (-1);
3380 }
3381
3382 uint p1 = in_buf[in_pos] & 0xff;
3383
3384 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3385 {
3386 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3387
3388 exit (-1);
3389 }
3390
3391 uint chr = 0;
3392
3393 chr = hex_convert (p1) << 0;
3394 chr |= hex_convert (p0) << 4;
3395
3396 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3397 }
3398 else
3399 {
3400 uint chr = p0;
3401
3402 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3403 }
3404 }
3405 }
3406 }
3407
3408 uint64_t mp_get_sum (uint css_cnt, cs_t *css)
3409 {
3410 uint64_t sum = 1;
3411
3412 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3413 {
3414 sum *= css[css_pos].cs_len;
3415 }
3416
3417 return (sum);
3418 }
3419
3420 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3421 {
3422 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3423
3424 uint mask_pos;
3425 uint css_pos;
3426
3427 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3428 {
3429 char p0 = mask_buf[mask_pos];
3430
3431 if (p0 == '?')
3432 {
3433 mask_pos++;
3434
3435 if (mask_pos == mask_len) break;
3436
3437 char p1 = mask_buf[mask_pos];
3438
3439 uint chr = p1;
3440
3441 switch (p1)
3442 {
3443 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3444 break;
3445 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3446 break;
3447 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3448 break;
3449 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3450 break;
3451 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3452 break;
3453 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3454 break;
3455 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3456 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3457 break;
3458 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3459 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3460 break;
3461 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3462 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3463 break;
3464 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3465 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3466 break;
3467 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3468 break;
3469 default: log_error ("ERROR: syntax error: %s", mask_buf);
3470 exit (-1);
3471 }
3472 }
3473 else
3474 {
3475 if (data.hex_charset)
3476 {
3477 mask_pos++;
3478
3479 // if there is no 2nd hex character, show an error:
3480
3481 if (mask_pos == mask_len)
3482 {
3483 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3484
3485 exit (-1);
3486 }
3487
3488 char p1 = mask_buf[mask_pos];
3489
3490 // if they are not valid hex character, show an error:
3491
3492 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3493 {
3494 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3495
3496 exit (-1);
3497 }
3498
3499 uint chr = 0;
3500
3501 chr |= hex_convert (p1) << 0;
3502 chr |= hex_convert (p0) << 4;
3503
3504 mp_add_cs_buf (&chr, 1, css, css_pos);
3505 }
3506 else
3507 {
3508 uint chr = p0;
3509
3510 mp_add_cs_buf (&chr, 1, css, css_pos);
3511 }
3512 }
3513 }
3514
3515 if (css_pos == 0)
3516 {
3517 log_error ("ERROR: invalid mask length (0)");
3518
3519 exit (-1);
3520 }
3521
3522 *css_cnt = css_pos;
3523
3524 return (css);
3525 }
3526
3527 void mp_exec (uint64_t val, char *buf, cs_t *css, int css_cnt)
3528 {
3529 for (int i = 0; i < css_cnt; i++)
3530 {
3531 uint len = css[i].cs_len;
3532 uint64_t next = val / len;
3533 uint pos = val % len;
3534 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3535 val = next;
3536 }
3537 }
3538
3539 void mp_cut_at (char *mask, uint max)
3540 {
3541 uint i;
3542 uint j;
3543 uint mask_len = strlen (mask);
3544
3545 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3546 {
3547 if (mask[i] == '?') i++;
3548 }
3549
3550 mask[i] = 0;
3551 }
3552
3553 void mp_setup_sys (cs_t *mp_sys)
3554 {
3555 uint pos;
3556 uint chr;
3557 uint donec[CHARSIZ];
3558
3559 memset (donec, 0, sizeof (donec));
3560
3561 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3562 mp_sys[0].cs_buf[pos++] = chr;
3563 mp_sys[0].cs_len = pos; }
3564
3565 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3566 mp_sys[1].cs_buf[pos++] = chr;
3567 mp_sys[1].cs_len = pos; }
3568
3569 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3570 mp_sys[2].cs_buf[pos++] = chr;
3571 mp_sys[2].cs_len = pos; }
3572
3573 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3574 mp_sys[3].cs_buf[pos++] = chr;
3575 mp_sys[3].cs_len = pos; }
3576
3577 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3578 mp_sys[4].cs_len = pos; }
3579
3580 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3581 mp_sys[5].cs_len = pos; }
3582 }
3583
3584 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3585 {
3586 FILE *fp = fopen (buf, "rb");
3587
3588 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3589 {
3590 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3591 }
3592 else
3593 {
3594 char mp_file[1024];
3595
3596 memset (mp_file, 0, sizeof (mp_file));
3597
3598 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3599
3600 fclose (fp);
3601
3602 len = in_superchop (mp_file);
3603
3604 if (len == 0)
3605 {
3606 log_info ("WARNING: charset file corrupted");
3607
3608 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3609 }
3610 else
3611 {
3612 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3613 }
3614 }
3615 }
3616
3617 void mp_reset_usr (cs_t *mp_usr, uint index)
3618 {
3619 mp_usr[index].cs_len = 0;
3620
3621 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3622 }
3623
3624 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3625 {
3626 char *new_mask_buf = (char *) mymalloc (256);
3627
3628 uint mask_pos;
3629
3630 uint css_pos;
3631
3632 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3633 {
3634 if (css_pos == len) break;
3635
3636 char p0 = mask_buf[mask_pos];
3637
3638 new_mask_buf[mask_pos] = p0;
3639
3640 if (p0 == '?')
3641 {
3642 mask_pos++;
3643
3644 if (mask_pos == mask_len) break;
3645
3646 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3647 }
3648 else
3649 {
3650 if (data.hex_charset)
3651 {
3652 mask_pos++;
3653
3654 if (mask_pos == mask_len)
3655 {
3656 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3657
3658 exit (-1);
3659 }
3660
3661 char p1 = mask_buf[mask_pos];
3662
3663 // if they are not valid hex character, show an error:
3664
3665 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3666 {
3667 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3668
3669 exit (-1);
3670 }
3671
3672 new_mask_buf[mask_pos] = p1;
3673 }
3674 }
3675 }
3676
3677 if (css_pos == len) return (new_mask_buf);
3678
3679 myfree (new_mask_buf);
3680
3681 return (NULL);
3682 }
3683
3684 /**
3685 * statprocessor
3686 */
3687
3688 uint64_t sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3689 {
3690 uint64_t sum = 1;
3691
3692 uint i;
3693
3694 for (i = start; i < stop; i++)
3695 {
3696 sum *= root_css_buf[i].cs_len;
3697 }
3698
3699 return (sum);
3700 }
3701
3702 void sp_exec (uint64_t ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3703 {
3704 uint64_t v = ctx;
3705
3706 cs_t *cs = &root_css_buf[start];
3707
3708 uint i;
3709
3710 for (i = start; i < stop; i++)
3711 {
3712 const uint64_t m = v % cs->cs_len;
3713 const uint64_t d = v / cs->cs_len;
3714
3715 v = d;
3716
3717 const uint k = cs->cs_buf[m];
3718
3719 pw_buf[i - start] = (char) k;
3720
3721 cs = &markov_css_buf[(i * CHARSIZ) + k];
3722 }
3723 }
3724
3725 int sp_comp_val (const void *p1, const void *p2)
3726 {
3727 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3728 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3729
3730 return b2->val - b1->val;
3731 }
3732
3733 void sp_setup_tbl (const char *install_dir, char *hcstat, uint disable, uint classic, hcstat_table_t *root_table_buf, hcstat_table_t *markov_table_buf)
3734 {
3735 uint i;
3736 uint j;
3737 uint k;
3738
3739 /**
3740 * Initialize hcstats
3741 */
3742
3743 uint64_t *root_stats_buf = (uint64_t *) mycalloc (SP_ROOT_CNT, sizeof (uint64_t));
3744
3745 uint64_t *root_stats_ptr = root_stats_buf;
3746
3747 uint64_t *root_stats_buf_by_pos[SP_PW_MAX];
3748
3749 for (i = 0; i < SP_PW_MAX; i++)
3750 {
3751 root_stats_buf_by_pos[i] = root_stats_ptr;
3752
3753 root_stats_ptr += CHARSIZ;
3754 }
3755
3756 uint64_t *markov_stats_buf = (uint64_t *) mycalloc (SP_MARKOV_CNT, sizeof (uint64_t));
3757
3758 uint64_t *markov_stats_ptr = markov_stats_buf;
3759
3760 uint64_t *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3761
3762 for (i = 0; i < SP_PW_MAX; i++)
3763 {
3764 for (j = 0; j < CHARSIZ; j++)
3765 {
3766 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3767
3768 markov_stats_ptr += CHARSIZ;
3769 }
3770 }
3771
3772 /**
3773 * Load hcstats File
3774 */
3775
3776 if (hcstat == NULL)
3777 {
3778 char hcstat_tmp[256];
3779
3780 memset (hcstat_tmp, 0, sizeof (hcstat_tmp));
3781
3782 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", install_dir, SP_HCSTAT);
3783
3784 hcstat = hcstat_tmp;
3785 }
3786
3787 FILE *fd = fopen (hcstat, "rb");
3788
3789 if (fd == NULL)
3790 {
3791 log_error ("%s: %s", hcstat, strerror (errno));
3792
3793 exit (-1);
3794 }
3795
3796 if (fread (root_stats_buf, sizeof (uint64_t), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3797 {
3798 log_error ("%s: Could not load data", hcstat);
3799
3800 exit (-1);
3801 }
3802
3803 if (fread (markov_stats_buf, sizeof (uint64_t), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3804 {
3805 log_error ("%s: Could not load data", hcstat);
3806
3807 exit (-1);
3808 }
3809
3810 fclose (fd);
3811
3812 /**
3813 * Markov modifier of hcstat_table on user request
3814 */
3815
3816 if (disable)
3817 {
3818 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (uint64_t));
3819 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (uint64_t));
3820 }
3821
3822 if (classic)
3823 {
3824 /* Add all stats to first position */
3825
3826 for (i = 1; i < SP_PW_MAX; i++)
3827 {
3828 uint64_t *out = root_stats_buf_by_pos[0];
3829 uint64_t *in = root_stats_buf_by_pos[i];
3830
3831 for (j = 0; j < CHARSIZ; j++)
3832 {
3833 *out++ += *in++;
3834 }
3835 }
3836
3837 for (i = 1; i < SP_PW_MAX; i++)
3838 {
3839 uint64_t *out = markov_stats_buf_by_key[0][0];
3840 uint64_t *in = markov_stats_buf_by_key[i][0];
3841
3842 for (j = 0; j < CHARSIZ; j++)
3843 {
3844 for (k = 0; k < CHARSIZ; k++)
3845 {
3846 *out++ += *in++;
3847 }
3848 }
3849 }
3850
3851 /* copy them to all pw_positions */
3852
3853 for (i = 1; i < SP_PW_MAX; i++)
3854 {
3855 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (uint64_t));
3856 }
3857
3858 for (i = 1; i < SP_PW_MAX; i++)
3859 {
3860 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (uint64_t));
3861 }
3862 }
3863
3864 /**
3865 * Initialize tables
3866 */
3867
3868 hcstat_table_t *root_table_ptr = root_table_buf;
3869
3870 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
3871
3872 for (i = 0; i < SP_PW_MAX; i++)
3873 {
3874 root_table_buf_by_pos[i] = root_table_ptr;
3875
3876 root_table_ptr += CHARSIZ;
3877 }
3878
3879 hcstat_table_t *markov_table_ptr = markov_table_buf;
3880
3881 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
3882
3883 for (i = 0; i < SP_PW_MAX; i++)
3884 {
3885 for (j = 0; j < CHARSIZ; j++)
3886 {
3887 markov_table_buf_by_key[i][j] = markov_table_ptr;
3888
3889 markov_table_ptr += CHARSIZ;
3890 }
3891 }
3892
3893 /**
3894 * Convert hcstat to tables
3895 */
3896
3897 for (i = 0; i < SP_ROOT_CNT; i++)
3898 {
3899 uint key = i % CHARSIZ;
3900
3901 root_table_buf[i].key = key;
3902 root_table_buf[i].val = root_stats_buf[i];
3903 }
3904
3905 for (i = 0; i < SP_MARKOV_CNT; i++)
3906 {
3907 uint key = i % CHARSIZ;
3908
3909 markov_table_buf[i].key = key;
3910 markov_table_buf[i].val = markov_stats_buf[i];
3911 }
3912
3913 myfree (root_stats_buf);
3914 myfree (markov_stats_buf);
3915
3916 /**
3917 * Finally sort them
3918 */
3919
3920 for (i = 0; i < SP_PW_MAX; i++)
3921 {
3922 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3923 }
3924
3925 for (i = 0; i < SP_PW_MAX; i++)
3926 {
3927 for (j = 0; j < CHARSIZ; j++)
3928 {
3929 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3930 }
3931 }
3932 }
3933
3934 void sp_tbl_to_css (hcstat_table_t *root_table_buf, hcstat_table_t *markov_table_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint threshold, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3935 {
3936 /**
3937 * Convert tables to css
3938 */
3939
3940 for (uint i = 0; i < SP_ROOT_CNT; i++)
3941 {
3942 uint pw_pos = i / CHARSIZ;
3943
3944 cs_t *cs = &root_css_buf[pw_pos];
3945
3946 if (cs->cs_len == threshold) continue;
3947
3948 uint key = root_table_buf[i].key;
3949
3950 if (uniq_tbls[pw_pos][key] == 0) continue;
3951
3952 cs->cs_buf[cs->cs_len] = key;
3953
3954 cs->cs_len++;
3955 }
3956
3957 /**
3958 * Convert table to css
3959 */
3960
3961 for (uint i = 0; i < SP_MARKOV_CNT; i++)
3962 {
3963 uint c = i / CHARSIZ;
3964
3965 cs_t *cs = &markov_css_buf[c];
3966
3967 if (cs->cs_len == threshold) continue;
3968
3969 uint pw_pos = c / CHARSIZ;
3970
3971 uint key = markov_table_buf[i].key;
3972
3973 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
3974
3975 cs->cs_buf[cs->cs_len] = key;
3976
3977 cs->cs_len++;
3978 }
3979
3980 /*
3981 for (uint i = 0; i < 8; i++)
3982 {
3983 for (uint j = 0x20; j < 0x80; j++)
3984 {
3985 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
3986
3987 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
3988
3989 for (uint k = 0; k < 10; k++)
3990 {
3991 printf (" %u\n", ptr->cs_buf[k]);
3992 }
3993 }
3994 }
3995 */
3996 }
3997
3998 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
3999 {
4000 for (uint i = 0; i < SP_PW_MAX; i += 2)
4001 {
4002 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4003
4004 out += CHARSIZ;
4005 in += CHARSIZ;
4006
4007 out->key = 0;
4008 out->val = 1;
4009
4010 out++;
4011
4012 for (uint j = 1; j < CHARSIZ; j++)
4013 {
4014 out->key = j;
4015 out->val = 0;
4016
4017 out++;
4018 }
4019 }
4020 }
4021
4022 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4023 {
4024 for (uint i = 0; i < SP_PW_MAX; i += 2)
4025 {
4026 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4027
4028 out += CHARSIZ * CHARSIZ;
4029 in += CHARSIZ * CHARSIZ;
4030
4031 for (uint j = 0; j < CHARSIZ; j++)
4032 {
4033 out->key = 0;
4034 out->val = 1;
4035
4036 out++;
4037
4038 for (uint k = 1; k < CHARSIZ; k++)
4039 {
4040 out->key = k;
4041 out->val = 0;
4042
4043 out++;
4044 }
4045 }
4046 }
4047 }
4048
4049 /**
4050 * mixed shared functions
4051 */
4052
4053 void dump_hex (const char *s, size_t size)
4054 {
4055 size_t i;
4056
4057 for (i = 0; i < size; i++)
4058 {
4059 log_info_nn ("%02x ", (unsigned char) s[i]);
4060 }
4061
4062 log_info ("");
4063 }
4064
4065 void usage_mini_print (const char *progname)
4066 {
4067 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4068 }
4069
4070 void usage_big_print (const char *progname)
4071 {
4072 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4073 }
4074
4075 char *get_install_dir (const char *progname)
4076 {
4077 char *install_dir = mystrdup (progname);
4078 char *last_slash = NULL;
4079
4080 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4081 {
4082 *last_slash = 0;
4083 }
4084 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4085 {
4086 *last_slash = 0;
4087 }
4088 else
4089 {
4090 install_dir[0] = '.';
4091 install_dir[1] = 0;
4092 }
4093
4094 return (install_dir);
4095 }
4096
4097 char *get_profile_dir (const char *homedir)
4098 {
4099 #define DOT_HASHCAT ".hashcat"
4100
4101 char *profile_dir = (char *) mymalloc (strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1);
4102
4103 sprintf (profile_dir, "%s/%s", homedir, DOT_HASHCAT);
4104
4105 return profile_dir;
4106 }
4107
4108 char *get_session_dir (const char *profile_dir, const char *session)
4109 {
4110 char *session_dir = (char *) mymalloc (strlen (profile_dir) + 1 + strlen (session) + 1);
4111
4112 sprintf (session_dir, "%s/%s", profile_dir, session);
4113
4114 return session_dir;
4115 }
4116
4117 void truecrypt_crc32 (char *file, unsigned char keytab[64])
4118 {
4119 uint crc = ~0;
4120
4121 FILE *fd = fopen (file, "rb");
4122
4123 if (fd == NULL)
4124 {
4125 log_error ("%s: %s", file, strerror (errno));
4126
4127 exit (-1);
4128 }
4129
4130 #define MAX_KEY_SIZE (1024 * 1024)
4131
4132 char *buf = (char *) mymalloc (MAX_KEY_SIZE);
4133
4134 int nread = fread (buf, 1, MAX_KEY_SIZE, fd);
4135
4136 int kpos = 0;
4137
4138 for (int fpos = 0; fpos < nread; fpos++)
4139 {
4140 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4141
4142 keytab[kpos++] += (crc >> 24) & 0xff;
4143 keytab[kpos++] += (crc >> 16) & 0xff;
4144 keytab[kpos++] += (crc >> 8) & 0xff;
4145 keytab[kpos++] += (crc >> 0) & 0xff;
4146
4147 if (kpos >= 64) kpos = 0;
4148 }
4149
4150 myfree (buf);
4151
4152 fclose(fd);
4153 }
4154
4155 void set_cpu_affinity (char *cpu_affinity)
4156 {
4157 #ifdef WIN
4158 DWORD_PTR aff_mask = 0;
4159 #endif
4160
4161 #ifdef LINUX
4162 cpu_set_t cpuset;
4163
4164 CPU_ZERO (&cpuset);
4165 #endif
4166
4167 if (cpu_affinity)
4168 {
4169 char *devices = strdup (cpu_affinity);
4170
4171 char *next = strtok (devices, ",");
4172
4173 do
4174 {
4175 uint cpu_id = atoi (next);
4176
4177 if (cpu_id == 0)
4178 {
4179 #ifdef WIN
4180 aff_mask = 0;
4181 #endif
4182
4183 #ifdef LINUX
4184 CPU_ZERO (&cpuset);
4185 #endif
4186
4187 break;
4188 }
4189
4190 if (cpu_id > 32)
4191 {
4192 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4193
4194 exit (-1);
4195 }
4196
4197 #ifdef WIN
4198 aff_mask |= 1 << (cpu_id - 1);
4199 #endif
4200
4201 #ifdef LINUX
4202 CPU_SET ((cpu_id - 1), &cpuset);
4203 #endif
4204
4205 } while ((next = strtok (NULL, ",")) != NULL);
4206
4207 free (devices);
4208 }
4209
4210 #ifdef WIN
4211 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4212 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4213 #endif
4214
4215 #ifdef LINUX
4216 pthread_t thread = pthread_self ();
4217 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4218 #endif
4219 }
4220
4221 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4222 {
4223 char *element, *end;
4224
4225 end = (char *) base + nmemb * size;
4226
4227 for (element = (char *) base; element < end; element += size)
4228 if (!compar (element, key))
4229 return element;
4230
4231 return NULL;
4232 }
4233
4234 int sort_by_salt (const void *v1, const void *v2)
4235 {
4236 const salt_t *s1 = (const salt_t *) v1;
4237 const salt_t *s2 = (const salt_t *) v2;
4238
4239 const int res1 = s1->salt_len - s2->salt_len;
4240
4241 if (res1 != 0) return (res1);
4242
4243 const int res2 = s1->salt_iter - s2->salt_iter;
4244
4245 if (res2 != 0) return (res2);
4246
4247 uint n;
4248
4249 n = 12;
4250
4251 while (n--)
4252 {
4253 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4254 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4255 }
4256
4257 n = 8;
4258
4259 while (n--)
4260 {
4261 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4262 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4263 }
4264
4265 return (0);
4266 }
4267
4268 int sort_by_salt_buf (const void *v1, const void *v2)
4269 {
4270 const pot_t *p1 = (const pot_t *) v1;
4271 const pot_t *p2 = (const pot_t *) v2;
4272
4273 const hash_t *h1 = &p1->hash;
4274 const hash_t *h2 = &p2->hash;
4275
4276 const salt_t *s1 = h1->salt;
4277 const salt_t *s2 = h2->salt;
4278
4279 uint n = 12;
4280
4281 while (n--)
4282 {
4283 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4284 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4285 }
4286
4287 return 0;
4288 }
4289
4290 int sort_by_hash_t_salt (const void *v1, const void *v2)
4291 {
4292 const hash_t *h1 = (const hash_t *) v1;
4293 const hash_t *h2 = (const hash_t *) v2;
4294
4295 const salt_t *s1 = h1->salt;
4296 const salt_t *s2 = h2->salt;
4297
4298 // testphase: this should work
4299 uint n = 12;
4300
4301 while (n--)
4302 {
4303 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4304 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4305 }
4306
4307 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4308 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4309 if (s1->salt_len > s2->salt_len) return ( 1);
4310 if (s1->salt_len < s2->salt_len) return (-1);
4311
4312 uint n = s1->salt_len;
4313
4314 while (n--)
4315 {
4316 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4317 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4318 }
4319 */
4320
4321 return 0;
4322 }
4323
4324 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4325 {
4326 const hash_t *h1 = (const hash_t *) v1;
4327 const hash_t *h2 = (const hash_t *) v2;
4328
4329 const salt_t *s1 = h1->salt;
4330 const salt_t *s2 = h2->salt;
4331
4332 // 12 - 2 (since last 2 uints contain the digest)
4333 uint n = 10;
4334
4335 while (n--)
4336 {
4337 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4338 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4339 }
4340
4341 return 0;
4342 }
4343
4344 int sort_by_hash_no_salt (const void *v1, const void *v2)
4345 {
4346 const hash_t *h1 = (const hash_t *) v1;
4347 const hash_t *h2 = (const hash_t *) v2;
4348
4349 const void *d1 = h1->digest;
4350 const void *d2 = h2->digest;
4351
4352 return data.sort_by_digest (d1, d2);
4353 }
4354
4355 int sort_by_hash (const void *v1, const void *v2)
4356 {
4357 const hash_t *h1 = (const hash_t *) v1;
4358 const hash_t *h2 = (const hash_t *) v2;
4359
4360 if (data.isSalted)
4361 {
4362 const salt_t *s1 = h1->salt;
4363 const salt_t *s2 = h2->salt;
4364
4365 int res = sort_by_salt (s1, s2);
4366
4367 if (res != 0) return (res);
4368 }
4369
4370 const void *d1 = h1->digest;
4371 const void *d2 = h2->digest;
4372
4373 return data.sort_by_digest (d1, d2);
4374 }
4375
4376 int sort_by_pot (const void *v1, const void *v2)
4377 {
4378 const pot_t *p1 = (const pot_t *) v1;
4379 const pot_t *p2 = (const pot_t *) v2;
4380
4381 const hash_t *h1 = &p1->hash;
4382 const hash_t *h2 = &p2->hash;
4383
4384 return sort_by_hash (h1, h2);
4385 }
4386
4387 int sort_by_mtime (const void *p1, const void *p2)
4388 {
4389 const char **f1 = (const char **) p1;
4390 const char **f2 = (const char **) p2;
4391
4392 struct stat s1; stat (*f1, &s1);
4393 struct stat s2; stat (*f2, &s2);
4394
4395 return s2.st_mtime - s1.st_mtime;
4396 }
4397
4398 int sort_by_cpu_rule (const void *p1, const void *p2)
4399 {
4400 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4401 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4402
4403 return memcmp (r1, r2, sizeof (cpu_rule_t));
4404 }
4405
4406 int sort_by_gpu_rule (const void *p1, const void *p2)
4407 {
4408 const gpu_rule_t *r1 = (const gpu_rule_t *) p1;
4409 const gpu_rule_t *r2 = (const gpu_rule_t *) p2;
4410
4411 return memcmp (r1, r2, sizeof (gpu_rule_t));
4412 }
4413
4414 int sort_by_stringptr (const void *p1, const void *p2)
4415 {
4416 const char **s1 = (const char **) p1;
4417 const char **s2 = (const char **) p2;
4418
4419 return strcmp (*s1, *s2);
4420 }
4421
4422 int sort_by_dictstat (const void *s1, const void *s2)
4423 {
4424 dictstat_t *d1 = (dictstat_t *) s1;
4425 dictstat_t *d2 = (dictstat_t *) s2;
4426
4427 #ifdef _POSIX
4428 d2->stat.st_atim = d1->stat.st_atim;
4429 #else
4430 d2->stat.st_atime = d1->stat.st_atime;
4431 #endif
4432
4433 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4434 }
4435
4436 int sort_by_bitmap (const void *p1, const void *p2)
4437 {
4438 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4439 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4440
4441 return b1->collisions - b2->collisions;
4442 }
4443
4444 int sort_by_digest_4_2 (const void *v1, const void *v2)
4445 {
4446 const uint32_t *d1 = (const uint32_t *) v1;
4447 const uint32_t *d2 = (const uint32_t *) v2;
4448
4449 uint n = 2;
4450
4451 while (n--)
4452 {
4453 if (d1[n] > d2[n]) return ( 1);
4454 if (d1[n] < d2[n]) return (-1);
4455 }
4456
4457 return (0);
4458 }
4459
4460 int sort_by_digest_4_4 (const void *v1, const void *v2)
4461 {
4462 const uint32_t *d1 = (const uint32_t *) v1;
4463 const uint32_t *d2 = (const uint32_t *) v2;
4464
4465 uint n = 4;
4466
4467 while (n--)
4468 {
4469 if (d1[n] > d2[n]) return ( 1);
4470 if (d1[n] < d2[n]) return (-1);
4471 }
4472
4473 return (0);
4474 }
4475
4476 int sort_by_digest_4_5 (const void *v1, const void *v2)
4477 {
4478 const uint32_t *d1 = (const uint32_t *) v1;
4479 const uint32_t *d2 = (const uint32_t *) v2;
4480
4481 uint n = 5;
4482
4483 while (n--)
4484 {
4485 if (d1[n] > d2[n]) return ( 1);
4486 if (d1[n] < d2[n]) return (-1);
4487 }
4488
4489 return (0);
4490 }
4491
4492 int sort_by_digest_4_6 (const void *v1, const void *v2)
4493 {
4494 const uint32_t *d1 = (const uint32_t *) v1;
4495 const uint32_t *d2 = (const uint32_t *) v2;
4496
4497 uint n = 6;
4498
4499 while (n--)
4500 {
4501 if (d1[n] > d2[n]) return ( 1);
4502 if (d1[n] < d2[n]) return (-1);
4503 }
4504
4505 return (0);
4506 }
4507
4508 int sort_by_digest_4_8 (const void *v1, const void *v2)
4509 {
4510 const uint32_t *d1 = (const uint32_t *) v1;
4511 const uint32_t *d2 = (const uint32_t *) v2;
4512
4513 uint n = 8;
4514
4515 while (n--)
4516 {
4517 if (d1[n] > d2[n]) return ( 1);
4518 if (d1[n] < d2[n]) return (-1);
4519 }
4520
4521 return (0);
4522 }
4523
4524 int sort_by_digest_4_16 (const void *v1, const void *v2)
4525 {
4526 const uint32_t *d1 = (const uint32_t *) v1;
4527 const uint32_t *d2 = (const uint32_t *) v2;
4528
4529 uint n = 16;
4530
4531 while (n--)
4532 {
4533 if (d1[n] > d2[n]) return ( 1);
4534 if (d1[n] < d2[n]) return (-1);
4535 }
4536
4537 return (0);
4538 }
4539
4540 int sort_by_digest_4_32 (const void *v1, const void *v2)
4541 {
4542 const uint32_t *d1 = (const uint32_t *) v1;
4543 const uint32_t *d2 = (const uint32_t *) v2;
4544
4545 uint n = 32;
4546
4547 while (n--)
4548 {
4549 if (d1[n] > d2[n]) return ( 1);
4550 if (d1[n] < d2[n]) return (-1);
4551 }
4552
4553 return (0);
4554 }
4555
4556 int sort_by_digest_4_64 (const void *v1, const void *v2)
4557 {
4558 const uint32_t *d1 = (const uint32_t *) v1;
4559 const uint32_t *d2 = (const uint32_t *) v2;
4560
4561 uint n = 64;
4562
4563 while (n--)
4564 {
4565 if (d1[n] > d2[n]) return ( 1);
4566 if (d1[n] < d2[n]) return (-1);
4567 }
4568
4569 return (0);
4570 }
4571
4572 int sort_by_digest_8_8 (const void *v1, const void *v2)
4573 {
4574 const uint64_t *d1 = (const uint64_t *) v1;
4575 const uint64_t *d2 = (const uint64_t *) v2;
4576
4577 uint n = 8;
4578
4579 while (n--)
4580 {
4581 if (d1[n] > d2[n]) return ( 1);
4582 if (d1[n] < d2[n]) return (-1);
4583 }
4584
4585 return (0);
4586 }
4587
4588 int sort_by_digest_8_16 (const void *v1, const void *v2)
4589 {
4590 const uint64_t *d1 = (const uint64_t *) v1;
4591 const uint64_t *d2 = (const uint64_t *) v2;
4592
4593 uint n = 16;
4594
4595 while (n--)
4596 {
4597 if (d1[n] > d2[n]) return ( 1);
4598 if (d1[n] < d2[n]) return (-1);
4599 }
4600
4601 return (0);
4602 }
4603
4604 int sort_by_digest_8_25 (const void *v1, const void *v2)
4605 {
4606 const uint64_t *d1 = (const uint64_t *) v1;
4607 const uint64_t *d2 = (const uint64_t *) v2;
4608
4609 uint n = 25;
4610
4611 while (n--)
4612 {
4613 if (d1[n] > d2[n]) return ( 1);
4614 if (d1[n] < d2[n]) return (-1);
4615 }
4616
4617 return (0);
4618 }
4619
4620 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4621 {
4622 const uint32_t *d1 = (const uint32_t *) v1;
4623 const uint32_t *d2 = (const uint32_t *) v2;
4624
4625 const uint dgst_pos0 = data.dgst_pos0;
4626 const uint dgst_pos1 = data.dgst_pos1;
4627 const uint dgst_pos2 = data.dgst_pos2;
4628 const uint dgst_pos3 = data.dgst_pos3;
4629
4630 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4631 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4632 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4633 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4634 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4635 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4636 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4637 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4638
4639 return (0);
4640 }
4641
4642 void format_debug (char * debug_file, uint debug_mode, unsigned char *orig_plain_ptr, uint orig_plain_len, unsigned char *mod_plain_ptr, uint mod_plain_len, char *rule_buf, int rule_len)
4643 {
4644 uint outfile_autohex = data.outfile_autohex;
4645
4646 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4647
4648 FILE *debug_fp = NULL;
4649
4650 if (debug_file != NULL)
4651 {
4652 debug_fp = fopen (debug_file, "ab");
4653 }
4654 else
4655 {
4656 debug_fp = stderr;
4657 }
4658
4659 if (debug_fp == NULL)
4660 {
4661 log_info ("WARNING: Could not open debug-file for writing");
4662 }
4663 else
4664 {
4665 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4666 {
4667 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4668
4669 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4670 }
4671
4672 fwrite (rule_ptr, rule_len, 1, debug_fp);
4673
4674 if (debug_mode == 4)
4675 {
4676 fputc (':', debug_fp);
4677
4678 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4679 }
4680
4681 fputc ('\n', debug_fp);
4682
4683 if (debug_file != NULL) fclose (debug_fp);
4684 }
4685 }
4686
4687 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4688 {
4689 int needs_hexify = 0;
4690
4691 if (outfile_autohex == 1)
4692 {
4693 for (uint i = 0; i < plain_len; i++)
4694 {
4695 if (plain_ptr[i] < 0x20)
4696 {
4697 needs_hexify = 1;
4698
4699 break;
4700 }
4701
4702 if (plain_ptr[i] > 0x7f)
4703 {
4704 needs_hexify = 1;
4705
4706 break;
4707 }
4708 }
4709 }
4710
4711 if (needs_hexify == 1)
4712 {
4713 fprintf (fp, "$HEX[");
4714
4715 for (uint i = 0; i < plain_len; i++)
4716 {
4717 fprintf (fp, "%02x", plain_ptr[i]);
4718 }
4719
4720 fprintf (fp, "]");
4721 }
4722 else
4723 {
4724 fwrite (plain_ptr, plain_len, 1, fp);
4725 }
4726 }
4727
4728 void format_output (FILE *out_fp, char *out_buf, unsigned char *plain_ptr, const uint plain_len, const uint64_t crackpos, unsigned char *username, const uint user_len)
4729 {
4730 uint outfile_format = data.outfile_format;
4731
4732 char separator = data.separator;
4733
4734 if (outfile_format & OUTFILE_FMT_HASH)
4735 {
4736 fprintf (out_fp, "%s", out_buf);
4737
4738 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4739 {
4740 fputc (separator, out_fp);
4741 }
4742 }
4743 else if (data.username)
4744 {
4745 if (username != NULL)
4746 {
4747 for (uint i = 0; i < user_len; i++)
4748 {
4749 fprintf (out_fp, "%c", username[i]);
4750 }
4751
4752 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4753 {
4754 fputc (separator, out_fp);
4755 }
4756 }
4757 }
4758
4759 if (outfile_format & OUTFILE_FMT_PLAIN)
4760 {
4761 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4762
4763 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4764 {
4765 fputc (separator, out_fp);
4766 }
4767 }
4768
4769 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4770 {
4771 for (uint i = 0; i < plain_len; i++)
4772 {
4773 fprintf (out_fp, "%02x", plain_ptr[i]);
4774 }
4775
4776 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4777 {
4778 fputc (separator, out_fp);
4779 }
4780 }
4781
4782 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4783 {
4784 #ifdef _WIN
4785 __mingw_fprintf (out_fp, "%llu", crackpos);
4786 #endif
4787
4788 #ifdef _POSIX
4789 #ifdef __x86_64__
4790 fprintf (out_fp, "%lu", crackpos);
4791 #else
4792 fprintf (out_fp, "%llu", crackpos);
4793 #endif
4794 #endif
4795 }
4796
4797 fputc ('\n', out_fp);
4798 }
4799
4800 void handle_show_request (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hashes_buf, int (*sort_by_pot) (const void *, const void *), FILE *out_fp)
4801 {
4802 pot_t pot_key;
4803
4804 pot_key.hash.salt = hashes_buf->salt;
4805 pot_key.hash.digest = hashes_buf->digest;
4806
4807 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4808
4809 if (pot_ptr)
4810 {
4811 log_info_nn ("");
4812
4813 input_buf[input_len] = 0;
4814
4815 // user
4816 unsigned char *username = NULL;
4817 uint user_len = 0;
4818
4819 if (data.username)
4820 {
4821 user_t *user = hashes_buf->hash_info->user;
4822
4823 if (user)
4824 {
4825 username = (unsigned char *) (user->user_name);
4826
4827 user_len = user->user_len;
4828 }
4829 }
4830
4831 // do output the line
4832 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
4833 }
4834 }
4835
4836 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
4837 #define LM_MASKED_PLAIN "[notfound]"
4838
4839 void handle_show_request_lm (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hash_left, hash_t *hash_right, int (*sort_by_pot) (const void *, const void *), FILE *out_fp)
4840 {
4841 // left
4842
4843 pot_t pot_left_key;
4844
4845 pot_left_key.hash.salt = hash_left->salt;
4846 pot_left_key.hash.digest = hash_left->digest;
4847
4848 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4849
4850 // right
4851
4852 uint weak_hash_found = 0;
4853
4854 pot_t pot_right_key;
4855
4856 pot_right_key.hash.salt = hash_right->salt;
4857 pot_right_key.hash.digest = hash_right->digest;
4858
4859 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4860
4861 if (pot_right_ptr == NULL)
4862 {
4863 // special case, if "weak hash"
4864
4865 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
4866 {
4867 weak_hash_found = 1;
4868
4869 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4870
4871 // in theory this is not needed, but we are paranoia:
4872
4873 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4874 pot_right_ptr->plain_len = 0;
4875 }
4876 }
4877
4878 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
4879 {
4880 if (weak_hash_found == 1) myfree (pot_right_ptr); // this shouldn't happen at all: if weak_hash_found == 1, than pot_right_ptr is not NULL for sure
4881
4882 return;
4883 }
4884
4885 // at least one half was found:
4886
4887 log_info_nn ("");
4888
4889 input_buf[input_len] = 0;
4890
4891 // user
4892
4893 unsigned char *username = NULL;
4894 uint user_len = 0;
4895
4896 if (data.username)
4897 {
4898 user_t *user = hash_left->hash_info->user;
4899
4900 if (user)
4901 {
4902 username = (unsigned char *) (user->user_name);
4903
4904 user_len = user->user_len;
4905 }
4906 }
4907
4908 // mask the part which was not found
4909
4910 uint left_part_masked = 0;
4911 uint right_part_masked = 0;
4912
4913 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
4914
4915 if (pot_left_ptr == NULL)
4916 {
4917 left_part_masked = 1;
4918
4919 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4920
4921 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
4922
4923 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
4924 pot_left_ptr->plain_len = mask_plain_len;
4925 }
4926
4927 if (pot_right_ptr == NULL)
4928 {
4929 right_part_masked = 1;
4930
4931 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4932
4933 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4934
4935 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
4936 pot_right_ptr->plain_len = mask_plain_len;
4937 }
4938
4939 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
4940
4941 pot_t pot_ptr;
4942
4943 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
4944
4945 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
4946
4947 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
4948
4949 // do output the line
4950
4951 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
4952
4953 if (weak_hash_found == 1) myfree (pot_right_ptr);
4954
4955 if (left_part_masked == 1) myfree (pot_left_ptr);
4956 if (right_part_masked == 1) myfree (pot_right_ptr);
4957 }
4958
4959 void handle_left_request (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hashes_buf, int (*sort_by_pot) (const void *, const void *), FILE *out_fp)
4960 {
4961 pot_t pot_key;
4962
4963 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
4964
4965 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4966
4967 if (pot_ptr == NULL)
4968 {
4969 log_info_nn ("");
4970
4971 input_buf[input_len] = 0;
4972
4973 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
4974 }
4975 }
4976
4977 void handle_left_request_lm (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hash_left, hash_t *hash_right, int (*sort_by_pot) (const void *, const void *), FILE *out_fp)
4978 {
4979 // left
4980
4981 pot_t pot_left_key;
4982
4983 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
4984
4985 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4986
4987 // right
4988
4989 pot_t pot_right_key;
4990
4991 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
4992
4993 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4994
4995 uint weak_hash_found = 0;
4996
4997 if (pot_right_ptr == NULL)
4998 {
4999 // special case, if "weak hash"
5000
5001 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5002 {
5003 weak_hash_found = 1;
5004
5005 // we just need that pot_right_ptr is not a NULL pointer
5006
5007 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5008 }
5009 }
5010
5011 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5012 {
5013 if (weak_hash_found == 1) myfree (pot_right_ptr);
5014
5015 return;
5016 }
5017
5018 // ... at least one part was not cracked
5019
5020 log_info_nn ("");
5021
5022 input_buf[input_len] = 0;
5023
5024 // only show the hash part which is still not cracked
5025
5026 uint user_len = input_len - 32;
5027
5028 char hash_output[user_len + 33];
5029
5030 memset (hash_output, 0, sizeof (hash_output));
5031
5032 memcpy (hash_output, input_buf, input_len);
5033
5034 if (pot_left_ptr != NULL)
5035 {
5036 // only show right part (because left part was already found)
5037
5038 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5039
5040 hash_output[user_len + 16] = 0;
5041 }
5042
5043 if (pot_right_ptr != NULL)
5044 {
5045 // only show left part (because right part was already found)
5046
5047 memcpy (hash_output + user_len, input_buf + user_len, 16);
5048
5049 hash_output[user_len + 16] = 0;
5050 }
5051
5052 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5053
5054 if (weak_hash_found == 1) myfree (pot_right_ptr);
5055 }
5056
5057 uint devices_to_devicemask (char *gpu_devices)
5058 {
5059 uint gpu_devicemask = 0;
5060
5061 if (gpu_devices)
5062 {
5063 char *devices = strdup (gpu_devices);
5064
5065 char *next = strtok (devices, ",");
5066
5067 do
5068 {
5069 uint gpu_id = atoi (next);
5070
5071 if (gpu_id < 1 || gpu_id > 8)
5072 {
5073 log_error ("ERROR: invalid gpu_id %u specified", gpu_id);
5074
5075 exit (-1);
5076 }
5077
5078 gpu_devicemask |= 1 << (gpu_id - 1);
5079
5080 } while ((next = strtok (NULL, ",")) != NULL);
5081
5082 free (devices);
5083 }
5084
5085 return gpu_devicemask;
5086 }
5087
5088 uint get_random_num (uint min, uint max)
5089 {
5090 if (min == max) return (min);
5091
5092 return (uint) ((rand () % (max - min)) + min);
5093 }
5094
5095 uint32_t mydivc32 (const uint32_t dividend, const uint32_t divisor)
5096 {
5097 uint32_t quotient = dividend / divisor;
5098
5099 if (dividend % divisor) quotient++;
5100
5101 return quotient;
5102 }
5103
5104 uint64_t mydivc64 (const uint64_t dividend, const uint64_t divisor)
5105 {
5106 uint64_t quotient = dividend / divisor;
5107
5108 if (dividend % divisor) quotient++;
5109
5110 return quotient;
5111 }
5112
5113 void format_timer_display (struct tm *tm, char *buf, size_t len)
5114 {
5115 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5116 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5117
5118 if (tm->tm_year - 70)
5119 {
5120 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5121 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5122
5123 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5124 }
5125 else if (tm->tm_yday)
5126 {
5127 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5128 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5129
5130 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5131 }
5132 else if (tm->tm_hour)
5133 {
5134 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5135 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5136
5137 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5138 }
5139 else if (tm->tm_min)
5140 {
5141 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5142 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5143
5144 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5145 }
5146 else
5147 {
5148 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5149
5150 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5151 }
5152 }
5153
5154 void format_speed_display (float val, char *buf, size_t len)
5155 {
5156 if (val <= 0)
5157 {
5158 buf[0] = '0';
5159 buf[1] = ' ';
5160 buf[2] = 0;
5161
5162 return;
5163 }
5164
5165 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5166
5167 uint level = 0;
5168
5169 while (val > 99999)
5170 {
5171 val /= 1000;
5172
5173 level++;
5174 }
5175
5176 /* generate output */
5177
5178 if (level == 0)
5179 {
5180 snprintf (buf, len - 1, "%.0f ", val);
5181 }
5182 else
5183 {
5184 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5185 }
5186 }
5187
5188 void lowercase (char *buf, int len)
5189 {
5190 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5191 }
5192
5193 void uppercase (char *buf, int len)
5194 {
5195 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5196 }
5197
5198 int fgetl (FILE *fp, char *line_buf)
5199 {
5200 int line_len = 0;
5201
5202 while (!feof (fp))
5203 {
5204 const int c = fgetc (fp);
5205
5206 if (c == EOF) break;
5207
5208 line_buf[line_len] = (char) c;
5209
5210 line_len++;
5211
5212 if (line_len == BUFSIZ) line_len--;
5213
5214 if (c == '\n') break;
5215 }
5216
5217 if (line_len == 0) return 0;
5218
5219 if (line_buf[line_len - 1] == '\n')
5220 {
5221 line_len--;
5222
5223 line_buf[line_len] = 0;
5224 }
5225
5226 if (line_len == 0) return 0;
5227
5228 if (line_buf[line_len - 1] == '\r')
5229 {
5230 line_len--;
5231
5232 line_buf[line_len] = 0;
5233 }
5234
5235 return (line_len);
5236 }
5237
5238 int in_superchop (char *buf)
5239 {
5240 int len = strlen (buf);
5241
5242 while (len)
5243 {
5244 if (buf[len - 1] == '\n')
5245 {
5246 len--;
5247
5248 continue;
5249 }
5250
5251 if (buf[len - 1] == '\r')
5252 {
5253 len--;
5254
5255 continue;
5256 }
5257
5258 break;
5259 }
5260
5261 buf[len] = 0;
5262
5263 return len;
5264 }
5265
5266 char **scan_directory (const char *path)
5267 {
5268 char *tmp_path = mystrdup (path);
5269
5270 size_t tmp_path_len = strlen (tmp_path);
5271
5272 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5273 {
5274 tmp_path[tmp_path_len - 1] = 0;
5275
5276 tmp_path_len = strlen (tmp_path);
5277 }
5278
5279 char **files = NULL;
5280
5281 int num_files = 0;
5282
5283 DIR *d;
5284
5285 if ((d = opendir (tmp_path)) != NULL)
5286 {
5287 struct dirent *de;
5288
5289 while ((de = readdir (d)) != NULL)
5290 {
5291 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5292
5293 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5294
5295 char *path_file = (char *) mymalloc (path_size + 1);
5296
5297 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5298
5299 path_file[path_size] = 0;
5300
5301 DIR *d_test;
5302
5303 if ((d_test = opendir (path_file)) != NULL)
5304 {
5305 closedir (d_test);
5306
5307 myfree (path_file);
5308 }
5309 else
5310 {
5311 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5312
5313 num_files++;
5314
5315 files[num_files - 1] = path_file;
5316 }
5317 }
5318
5319 closedir (d);
5320 }
5321 else if (errno == ENOTDIR)
5322 {
5323 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5324
5325 num_files++;
5326
5327 files[num_files - 1] = mystrdup (path);
5328 }
5329
5330 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5331
5332 num_files++;
5333
5334 files[num_files - 1] = NULL;
5335
5336 myfree (tmp_path);
5337
5338 return (files);
5339 }
5340
5341 int count_dictionaries (char **dictionary_files)
5342 {
5343 if (dictionary_files == NULL) return 0;
5344
5345 int cnt = 0;
5346
5347 for (int d = 0; dictionary_files[d] != NULL; d++)
5348 {
5349 cnt++;
5350 }
5351
5352 return (cnt);
5353 }
5354
5355 char *stroptitype (const uint opti_type)
5356 {
5357 switch (opti_type)
5358 {
5359 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5360 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5361 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5362 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5363 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5364 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5365 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5366 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5367 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5368 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5369 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5370 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5371 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5372 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5373 }
5374
5375 return (NULL);
5376 }
5377
5378 char *strparser (const uint parser_status)
5379 {
5380 switch (parser_status)
5381 {
5382 case PARSER_OK: return ((char *) PA_000); break;
5383 case PARSER_COMMENT: return ((char *) PA_001); break;
5384 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5385 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5386 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5387 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5388 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5389 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5390 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5391 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5392 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5393 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5394 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5395 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5396 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5397 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5398 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5399 }
5400
5401 return ((char *) PA_255);
5402 }
5403
5404 char *strhashtype (const uint hash_mode)
5405 {
5406 switch (hash_mode)
5407 {
5408 case 0: return ((char *) HT_00000); break;
5409 case 10: return ((char *) HT_00010); break;
5410 case 11: return ((char *) HT_00011); break;
5411 case 12: return ((char *) HT_00012); break;
5412 case 20: return ((char *) HT_00020); break;
5413 case 21: return ((char *) HT_00021); break;
5414 case 22: return ((char *) HT_00022); break;
5415 case 23: return ((char *) HT_00023); break;
5416 case 30: return ((char *) HT_00030); break;
5417 case 40: return ((char *) HT_00040); break;
5418 case 50: return ((char *) HT_00050); break;
5419 case 60: return ((char *) HT_00060); break;
5420 case 100: return ((char *) HT_00100); break;
5421 case 101: return ((char *) HT_00101); break;
5422 case 110: return ((char *) HT_00110); break;
5423 case 111: return ((char *) HT_00111); break;
5424 case 112: return ((char *) HT_00112); break;
5425 case 120: return ((char *) HT_00120); break;
5426 case 121: return ((char *) HT_00121); break;
5427 case 122: return ((char *) HT_00122); break;
5428 case 124: return ((char *) HT_00124); break;
5429 case 130: return ((char *) HT_00130); break;
5430 case 131: return ((char *) HT_00131); break;
5431 case 132: return ((char *) HT_00132); break;
5432 case 133: return ((char *) HT_00133); break;
5433 case 140: return ((char *) HT_00140); break;
5434 case 141: return ((char *) HT_00141); break;
5435 case 150: return ((char *) HT_00150); break;
5436 case 160: return ((char *) HT_00160); break;
5437 case 190: return ((char *) HT_00190); break;
5438 case 200: return ((char *) HT_00200); break;
5439 case 300: return ((char *) HT_00300); break;
5440 case 400: return ((char *) HT_00400); break;
5441 case 500: return ((char *) HT_00500); break;
5442 case 501: return ((char *) HT_00501); break;
5443 case 900: return ((char *) HT_00900); break;
5444 case 910: return ((char *) HT_00910); break;
5445 case 1000: return ((char *) HT_01000); break;
5446 case 1100: return ((char *) HT_01100); break;
5447 case 1400: return ((char *) HT_01400); break;
5448 case 1410: return ((char *) HT_01410); break;
5449 case 1420: return ((char *) HT_01420); break;
5450 case 1421: return ((char *) HT_01421); break;
5451 case 1430: return ((char *) HT_01430); break;
5452 case 1440: return ((char *) HT_01440); break;
5453 case 1441: return ((char *) HT_01441); break;
5454 case 1450: return ((char *) HT_01450); break;
5455 case 1460: return ((char *) HT_01460); break;
5456 case 1500: return ((char *) HT_01500); break;
5457 case 1600: return ((char *) HT_01600); break;
5458 case 1700: return ((char *) HT_01700); break;
5459 case 1710: return ((char *) HT_01710); break;
5460 case 1711: return ((char *) HT_01711); break;
5461 case 1720: return ((char *) HT_01720); break;
5462 case 1722: return ((char *) HT_01722); break;
5463 case 1730: return ((char *) HT_01730); break;
5464 case 1731: return ((char *) HT_01731); break;
5465 case 1740: return ((char *) HT_01740); break;
5466 case 1750: return ((char *) HT_01750); break;
5467 case 1760: return ((char *) HT_01760); break;
5468 case 1800: return ((char *) HT_01800); break;
5469 case 2100: return ((char *) HT_02100); break;
5470 case 2400: return ((char *) HT_02400); break;
5471 case 2410: return ((char *) HT_02410); break;
5472 case 2500: return ((char *) HT_02500); break;
5473 case 2600: return ((char *) HT_02600); break;
5474 case 2611: return ((char *) HT_02611); break;
5475 case 2612: return ((char *) HT_02612); break;
5476 case 2711: return ((char *) HT_02711); break;
5477 case 2811: return ((char *) HT_02811); break;
5478 case 3000: return ((char *) HT_03000); break;
5479 case 3100: return ((char *) HT_03100); break;
5480 case 3200: return ((char *) HT_03200); break;
5481 case 3710: return ((char *) HT_03710); break;
5482 case 3711: return ((char *) HT_03711); break;
5483 case 3800: return ((char *) HT_03800); break;
5484 case 4300: return ((char *) HT_04300); break;
5485 case 4400: return ((char *) HT_04400); break;
5486 case 4500: return ((char *) HT_04500); break;
5487 case 4700: return ((char *) HT_04700); break;
5488 case 4800: return ((char *) HT_04800); break;
5489 case 4900: return ((char *) HT_04900); break;
5490 case 5000: return ((char *) HT_05000); break;
5491 case 5100: return ((char *) HT_05100); break;
5492 case 5200: return ((char *) HT_05200); break;
5493 case 5300: return ((char *) HT_05300); break;
5494 case 5400: return ((char *) HT_05400); break;
5495 case 5500: return ((char *) HT_05500); break;
5496 case 5600: return ((char *) HT_05600); break;
5497 case 5700: return ((char *) HT_05700); break;
5498 case 5800: return ((char *) HT_05800); break;
5499 case 6000: return ((char *) HT_06000); break;
5500 case 6100: return ((char *) HT_06100); break;
5501 case 6211: return ((char *) HT_06211); break;
5502 case 6212: return ((char *) HT_06212); break;
5503 case 6213: return ((char *) HT_06213); break;
5504 case 6221: return ((char *) HT_06221); break;
5505 case 6222: return ((char *) HT_06222); break;
5506 case 6223: return ((char *) HT_06223); break;
5507 case 6231: return ((char *) HT_06231); break;
5508 case 6232: return ((char *) HT_06232); break;
5509 case 6233: return ((char *) HT_06233); break;
5510 case 6241: return ((char *) HT_06241); break;
5511 case 6242: return ((char *) HT_06242); break;
5512 case 6243: return ((char *) HT_06243); break;
5513 case 6300: return ((char *) HT_06300); break;
5514 case 6400: return ((char *) HT_06400); break;
5515 case 6500: return ((char *) HT_06500); break;
5516 case 6600: return ((char *) HT_06600); break;
5517 case 6700: return ((char *) HT_06700); break;
5518 case 6800: return ((char *) HT_06800); break;
5519 case 6900: return ((char *) HT_06900); break;
5520 case 7100: return ((char *) HT_07100); break;
5521 case 7200: return ((char *) HT_07200); break;
5522 case 7300: return ((char *) HT_07300); break;
5523 case 7400: return ((char *) HT_07400); break;
5524 case 7500: return ((char *) HT_07500); break;
5525 case 7600: return ((char *) HT_07600); break;
5526 case 7700: return ((char *) HT_07700); break;
5527 case 7800: return ((char *) HT_07800); break;
5528 case 7900: return ((char *) HT_07900); break;
5529 case 8000: return ((char *) HT_08000); break;
5530 case 8100: return ((char *) HT_08100); break;
5531 case 8200: return ((char *) HT_08200); break;
5532 case 8300: return ((char *) HT_08300); break;
5533 case 8400: return ((char *) HT_08400); break;
5534 case 8500: return ((char *) HT_08500); break;
5535 case 8600: return ((char *) HT_08600); break;
5536 case 8700: return ((char *) HT_08700); break;
5537 case 8800: return ((char *) HT_08800); break;
5538 case 8900: return ((char *) HT_08900); break;
5539 case 9000: return ((char *) HT_09000); break;
5540 case 9100: return ((char *) HT_09100); break;
5541 case 9200: return ((char *) HT_09200); break;
5542 case 9300: return ((char *) HT_09300); break;
5543 case 9400: return ((char *) HT_09400); break;
5544 case 9500: return ((char *) HT_09500); break;
5545 case 9600: return ((char *) HT_09600); break;
5546 case 9700: return ((char *) HT_09700); break;
5547 case 9710: return ((char *) HT_09710); break;
5548 case 9720: return ((char *) HT_09720); break;
5549 case 9800: return ((char *) HT_09800); break;
5550 case 9810: return ((char *) HT_09810); break;
5551 case 9820: return ((char *) HT_09820); break;
5552 case 9900: return ((char *) HT_09900); break;
5553 case 10000: return ((char *) HT_10000); break;
5554 case 10100: return ((char *) HT_10100); break;
5555 case 10200: return ((char *) HT_10200); break;
5556 case 10300: return ((char *) HT_10300); break;
5557 case 10400: return ((char *) HT_10400); break;
5558 case 10410: return ((char *) HT_10410); break;
5559 case 10420: return ((char *) HT_10420); break;
5560 case 10500: return ((char *) HT_10500); break;
5561 case 10600: return ((char *) HT_10600); break;
5562 case 10700: return ((char *) HT_10700); break;
5563 case 10800: return ((char *) HT_10800); break;
5564 case 10900: return ((char *) HT_10900); break;
5565 case 11000: return ((char *) HT_11000); break;
5566 case 11100: return ((char *) HT_11100); break;
5567 case 11200: return ((char *) HT_11200); break;
5568 case 11300: return ((char *) HT_11300); break;
5569 case 11400: return ((char *) HT_11400); break;
5570 case 11500: return ((char *) HT_11500); break;
5571 case 11600: return ((char *) HT_11600); break;
5572 case 11700: return ((char *) HT_11700); break;
5573 case 11800: return ((char *) HT_11800); break;
5574 case 11900: return ((char *) HT_11900); break;
5575 case 12000: return ((char *) HT_12000); break;
5576 case 12100: return ((char *) HT_12100); break;
5577 case 12200: return ((char *) HT_12200); break;
5578 case 12300: return ((char *) HT_12300); break;
5579 case 12400: return ((char *) HT_12400); break;
5580 case 12500: return ((char *) HT_12500); break;
5581 case 12600: return ((char *) HT_12600); break;
5582 case 12700: return ((char *) HT_12700); break;
5583 case 12800: return ((char *) HT_12800); break;
5584 }
5585
5586 return ((char *) "Unknown");
5587 }
5588
5589 char *strstatus (const uint devices_status)
5590 {
5591 switch (devices_status)
5592 {
5593 case STATUS_INIT: return ((char *) ST_0000); break;
5594 case STATUS_STARTING: return ((char *) ST_0001); break;
5595 case STATUS_RUNNING: return ((char *) ST_0002); break;
5596 case STATUS_PAUSED: return ((char *) ST_0003); break;
5597 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5598 case STATUS_CRACKED: return ((char *) ST_0005); break;
5599 case STATUS_ABORTED: return ((char *) ST_0006); break;
5600 case STATUS_QUIT: return ((char *) ST_0007); break;
5601 case STATUS_BYPASS: return ((char *) ST_0008); break;
5602 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5603 }
5604
5605 return ((char *) "Unknown");
5606 }
5607
5608 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5609 {
5610 uint hash_type = data.hash_type;
5611 uint hash_mode = data.hash_mode;
5612 uint salt_type = data.salt_type;
5613 uint opts_type = data.opts_type;
5614 uint opti_type = data.opti_type;
5615 uint dgst_size = data.dgst_size;
5616
5617 char *hashfile = data.hashfile;
5618
5619 uint len = 4096;
5620
5621 uint digest_buf[64];
5622
5623 uint64_t *digest_buf64 = (uint64_t *) digest_buf;
5624
5625 char *digests_buf_ptr = (char *) data.digests_buf;
5626
5627 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5628
5629 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5630 {
5631 uint tt;
5632
5633 switch (hash_type)
5634 {
5635 case HASH_TYPE_DESCRYPT:
5636 FP (digest_buf[1], digest_buf[0], tt);
5637 break;
5638
5639 case HASH_TYPE_DESRACF:
5640 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 29);
5641 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 29);
5642
5643 FP (digest_buf[1], digest_buf[0], tt);
5644 break;
5645
5646 case HASH_TYPE_LM:
5647 FP (digest_buf[1], digest_buf[0], tt);
5648 break;
5649
5650 case HASH_TYPE_NETNTLM:
5651 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 29);
5652 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 29);
5653 digest_buf[2] = ROTATE_LEFT (digest_buf[2], 29);
5654 digest_buf[3] = ROTATE_LEFT (digest_buf[3], 29);
5655
5656 FP (digest_buf[1], digest_buf[0], tt);
5657 FP (digest_buf[3], digest_buf[2], tt);
5658 break;
5659
5660 case HASH_TYPE_BSDICRYPT:
5661 digest_buf[0] = ROTATE_LEFT (digest_buf[0], 31);
5662 digest_buf[1] = ROTATE_LEFT (digest_buf[1], 31);
5663
5664 FP (digest_buf[1], digest_buf[0], tt);
5665 break;
5666 }
5667 }
5668
5669 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5670 {
5671 switch (hash_type)
5672 {
5673 case HASH_TYPE_MD4:
5674 digest_buf[0] += MD4M_A;
5675 digest_buf[1] += MD4M_B;
5676 digest_buf[2] += MD4M_C;
5677 digest_buf[3] += MD4M_D;
5678 break;
5679
5680 case HASH_TYPE_MD5:
5681 digest_buf[0] += MD5M_A;
5682 digest_buf[1] += MD5M_B;
5683 digest_buf[2] += MD5M_C;
5684 digest_buf[3] += MD5M_D;
5685 break;
5686
5687 case HASH_TYPE_SHA1:
5688 digest_buf[0] += SHA1M_A;
5689 digest_buf[1] += SHA1M_B;
5690 digest_buf[2] += SHA1M_C;
5691 digest_buf[3] += SHA1M_D;
5692 digest_buf[4] += SHA1M_E;
5693 break;
5694
5695 case HASH_TYPE_SHA256:
5696 digest_buf[0] += SHA256M_A;
5697 digest_buf[1] += SHA256M_B;
5698 digest_buf[2] += SHA256M_C;
5699 digest_buf[3] += SHA256M_D;
5700 digest_buf[4] += SHA256M_E;
5701 digest_buf[5] += SHA256M_F;
5702 digest_buf[6] += SHA256M_G;
5703 digest_buf[7] += SHA256M_H;
5704 break;
5705
5706 case HASH_TYPE_SHA384:
5707 digest_buf64[0] += SHA384M_A;
5708 digest_buf64[1] += SHA384M_B;
5709 digest_buf64[2] += SHA384M_C;
5710 digest_buf64[3] += SHA384M_D;
5711 digest_buf64[4] += SHA384M_E;
5712 digest_buf64[5] += SHA384M_F;
5713 digest_buf64[6] += 0;
5714 digest_buf64[7] += 0;
5715 break;
5716
5717 case HASH_TYPE_SHA512:
5718 digest_buf64[0] += SHA512M_A;
5719 digest_buf64[1] += SHA512M_B;
5720 digest_buf64[2] += SHA512M_C;
5721 digest_buf64[3] += SHA512M_D;
5722 digest_buf64[4] += SHA512M_E;
5723 digest_buf64[5] += SHA512M_F;
5724 digest_buf64[6] += SHA512M_G;
5725 digest_buf64[7] += SHA512M_H;
5726 break;
5727 }
5728 }
5729
5730 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
5731 {
5732 if (dgst_size == DGST_SIZE_4_2)
5733 {
5734 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5735 }
5736 else if (dgst_size == DGST_SIZE_4_4)
5737 {
5738 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5739 }
5740 else if (dgst_size == DGST_SIZE_4_5)
5741 {
5742 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5743 }
5744 else if (dgst_size == DGST_SIZE_4_6)
5745 {
5746 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5747 }
5748 else if (dgst_size == DGST_SIZE_4_8)
5749 {
5750 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5751 }
5752 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
5753 {
5754 if (hash_type == HASH_TYPE_WHIRLPOOL)
5755 {
5756 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5757 }
5758 else if (hash_type == HASH_TYPE_SHA384)
5759 {
5760 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5761 }
5762 else if (hash_type == HASH_TYPE_SHA512)
5763 {
5764 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5765 }
5766 else if (hash_type == HASH_TYPE_GOST)
5767 {
5768 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5769 }
5770 }
5771 else if (dgst_size == DGST_SIZE_4_64)
5772 {
5773 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5774 }
5775 else if (dgst_size == DGST_SIZE_8_25)
5776 {
5777 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5778 }
5779 }
5780
5781 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
5782 | (data.salt_type == SALT_TYPE_EXTERN)
5783 | (data.salt_type == SALT_TYPE_EMBEDDED));
5784
5785 salt_t salt;
5786
5787 if (isSalted)
5788 {
5789 memset (&salt, 0, sizeof (salt_t));
5790
5791 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
5792
5793 char *ptr = (char *) salt.salt_buf;
5794
5795 uint len = salt.salt_len;
5796
5797 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5798 {
5799 uint tt;
5800
5801 switch (hash_type)
5802 {
5803 case HASH_TYPE_NETNTLM:
5804
5805 salt.salt_buf[0] = ROTATE_RIGHT (salt.salt_buf[0], 3);
5806 salt.salt_buf[1] = ROTATE_RIGHT (salt.salt_buf[1], 3);
5807
5808 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
5809
5810 break;
5811 }
5812 }
5813
5814 if (opts_type & OPTS_TYPE_ST_UNICODE)
5815 {
5816 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5817 {
5818 ptr[i] = ptr[j];
5819 }
5820
5821 len = len / 2;
5822 }
5823
5824 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
5825 {
5826 uint max = salt.salt_len / 4;
5827
5828 if (len % 4) max++;
5829
5830 for (uint i = 0; i < max; i++)
5831 {
5832 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
5833 }
5834 }
5835
5836 if (opts_type & OPTS_TYPE_ST_HEX)
5837 {
5838 char tmp[64];
5839
5840 memset (tmp, 0, sizeof (tmp));
5841
5842 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5843 {
5844 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
5845 }
5846
5847 len = len * 2;
5848
5849 memcpy (ptr, tmp, len);
5850 }
5851
5852 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
5853
5854 memset (ptr + len, 0, memset_size);
5855
5856 salt.salt_len = len;
5857 }
5858
5859 //
5860 // some modes require special encoding
5861 //
5862
5863 uint out_buf_plain[256];
5864 uint out_buf_salt[256];
5865
5866 char tmp_buf[1024];
5867
5868 memset (out_buf_plain, 0, sizeof (out_buf_plain));
5869 memset (out_buf_salt, 0, sizeof (out_buf_salt));
5870
5871 memset (tmp_buf, 0, sizeof (tmp_buf));
5872
5873 char *ptr_plain = (char *) out_buf_plain;
5874 char *ptr_salt = (char *) out_buf_salt;
5875
5876 if (hash_mode == 22)
5877 {
5878 char username[30];
5879
5880 memset (username, 0, sizeof (username));
5881
5882 memcpy (username, salt.salt_buf, salt.salt_len - 22);
5883
5884 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
5885
5886 uint16_t *ptr = (uint16_t *) digest_buf;
5887
5888 tmp_buf[ 0] = sig[0];
5889 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
5890 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
5891 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
5892 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
5893 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
5894 tmp_buf[ 6] = sig[1];
5895 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
5896 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
5897 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
5898 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
5899 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
5900 tmp_buf[12] = sig[2];
5901 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
5902 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
5903 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
5904 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
5905 tmp_buf[17] = sig[3];
5906 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
5907 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
5908 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
5909 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
5910 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
5911 tmp_buf[23] = sig[4];
5912 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
5913 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
5914 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
5915 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
5916 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
5917 tmp_buf[29] = sig[5];
5918
5919 snprintf (out_buf, len-1, "%s:%s",
5920 tmp_buf,
5921 username);
5922 }
5923 else if (hash_mode == 23)
5924 {
5925 // do not show the \nskyper\n part in output
5926
5927 char *salt_buf_ptr = (char *) salt.salt_buf;
5928
5929 salt_buf_ptr[salt.salt_len - 8] = 0;
5930
5931 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
5932 digest_buf[0],
5933 digest_buf[1],
5934 digest_buf[2],
5935 digest_buf[3],
5936 salt_buf_ptr);
5937 }
5938 else if (hash_mode == 101)
5939 {
5940 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
5941
5942 digest_buf[0] = byte_swap_32 (digest_buf[0]);
5943 digest_buf[1] = byte_swap_32 (digest_buf[1]);
5944 digest_buf[2] = byte_swap_32 (digest_buf[2]);
5945 digest_buf[3] = byte_swap_32 (digest_buf[3]);
5946 digest_buf[4] = byte_swap_32 (digest_buf[4]);
5947
5948 memcpy (tmp_buf, digest_buf, 20);
5949
5950 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
5951
5952 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
5953 }
5954 else if (hash_mode == 111)
5955 {
5956 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
5957
5958 digest_buf[0] = byte_swap_32 (digest_buf[0]);
5959 digest_buf[1] = byte_swap_32 (digest_buf[1]);
5960 digest_buf[2] = byte_swap_32 (digest_buf[2]);
5961 digest_buf[3] = byte_swap_32 (digest_buf[3]);
5962 digest_buf[4] = byte_swap_32 (digest_buf[4]);
5963
5964 memcpy (tmp_buf, digest_buf, 20);
5965 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
5966
5967 base64_encode (int_to_base64, tmp_buf, 20 + salt.salt_len, ptr_plain);
5968
5969 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
5970 }
5971 else if (hash_mode == 122)
5972 {
5973 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
5974 (unsigned char *) salt.salt_buf,
5975 digest_buf[0],
5976 digest_buf[1],
5977 digest_buf[2],
5978 digest_buf[3],
5979 digest_buf[4]);
5980 }
5981 else if (hash_mode == 124)
5982 {
5983 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
5984 (unsigned char *) salt.salt_buf,
5985 digest_buf[0],
5986 digest_buf[1],
5987 digest_buf[2],
5988 digest_buf[3],
5989 digest_buf[4]);
5990 }
5991 else if (hash_mode == 131)
5992 {
5993 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
5994 (unsigned char *) salt.salt_buf,
5995 0, 0, 0, 0, 0,
5996 digest_buf[0],
5997 digest_buf[1],
5998 digest_buf[2],
5999 digest_buf[3],
6000 digest_buf[4]);
6001 }
6002 else if (hash_mode == 132)
6003 {
6004 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6005 (unsigned char *) salt.salt_buf,
6006 digest_buf[0],
6007 digest_buf[1],
6008 digest_buf[2],
6009 digest_buf[3],
6010 digest_buf[4]);
6011 }
6012 else if (hash_mode == 133)
6013 {
6014 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6015
6016 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6017 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6018 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6019 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6020 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6021
6022 memcpy (tmp_buf, digest_buf, 20);
6023
6024 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
6025
6026 snprintf (out_buf, len-1, "%s", ptr_plain);
6027 }
6028 else if (hash_mode == 141)
6029 {
6030 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6031
6032 base64_encode (int_to_base64, tmp_buf, salt.salt_len, ptr_salt);
6033
6034 memset (tmp_buf, 0, sizeof (tmp_buf));
6035
6036 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6037
6038 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6039 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6040 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6041 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6042 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6043
6044 memcpy (tmp_buf, digest_buf, 20);
6045
6046 base64_encode (int_to_base64, tmp_buf, 20, ptr_plain);
6047
6048 ptr_plain[27] = 0;
6049
6050 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6051 }
6052 else if (hash_mode == 400)
6053 {
6054 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6055
6056 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6057 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6058 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6059 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6060
6061 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6062
6063 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6064 }
6065 else if (hash_mode == 500)
6066 {
6067 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6068
6069 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6070 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6071 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6072 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6073
6074 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6075
6076 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6077 {
6078 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6079 }
6080 else
6081 {
6082 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6083 }
6084 }
6085 else if (hash_mode == 501)
6086 {
6087 uint digest_idx = salt.digests_offset + digest_pos;
6088
6089 hashinfo_t **hashinfo_ptr = data.hash_info;
6090 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6091
6092 snprintf (out_buf, len-1, "%s", hash_buf);
6093 }
6094 else if (hash_mode == 1421)
6095 {
6096 uint8_t *salt_ptr = (uint8_t *) salt.salt_buf;
6097
6098 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6099 salt_ptr[0],
6100 salt_ptr[1],
6101 salt_ptr[2],
6102 salt_ptr[3],
6103 salt_ptr[4],
6104 salt_ptr[5],
6105 digest_buf[0],
6106 digest_buf[1],
6107 digest_buf[2],
6108 digest_buf[3],
6109 digest_buf[4],
6110 digest_buf[5],
6111 digest_buf[6],
6112 digest_buf[7]);
6113 }
6114 else if (hash_mode == 1441)
6115 {
6116 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6117
6118 base64_encode (int_to_base64, tmp_buf, salt.salt_len, ptr_salt);
6119
6120 memset (tmp_buf, 0, sizeof (tmp_buf));
6121
6122 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6123
6124 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6125 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6126 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6127 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6128 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6129 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6130 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6131 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6132
6133 memcpy (tmp_buf, digest_buf, 32);
6134
6135 base64_encode (int_to_base64, tmp_buf, 32, ptr_plain);
6136
6137 ptr_plain[43] = 0;
6138
6139 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6140 }
6141 else if (hash_mode == 1500)
6142 {
6143 out_buf[0] = salt.salt_sign[0] & 0xff;
6144 out_buf[1] = salt.salt_sign[1] & 0xff;
6145 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6146 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6147 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6148
6149 memset (tmp_buf, 0, sizeof (tmp_buf));
6150
6151 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6152
6153 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6154 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6155
6156 memcpy (tmp_buf, digest_buf, 8);
6157
6158 base64_encode (int_to_itoa64, tmp_buf, 8, ptr_plain);
6159
6160 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6161
6162 out_buf[13] = 0;
6163 }
6164 else if (hash_mode == 1600)
6165 {
6166 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6167
6168 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6169 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6170 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6171 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6172
6173 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6174
6175 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6176 {
6177 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6178 }
6179 else
6180 {
6181 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6182 }
6183 }
6184 else if (hash_mode == 1711)
6185 {
6186 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6187
6188 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6189 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6190 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6191 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6192 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6193 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6194 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6195 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6196
6197 memcpy (tmp_buf, digest_buf, 64);
6198 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6199
6200 base64_encode (int_to_base64, tmp_buf, 64 + salt.salt_len, ptr_plain);
6201
6202 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6203 }
6204 else if (hash_mode == 1722)
6205 {
6206 uint *ptr = digest_buf;
6207
6208 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6209 (unsigned char *) salt.salt_buf,
6210 ptr[ 1], ptr[ 0],
6211 ptr[ 3], ptr[ 2],
6212 ptr[ 5], ptr[ 4],
6213 ptr[ 7], ptr[ 6],
6214 ptr[ 9], ptr[ 8],
6215 ptr[11], ptr[10],
6216 ptr[13], ptr[12],
6217 ptr[15], ptr[14]);
6218 }
6219 else if (hash_mode == 1731)
6220 {
6221 uint *ptr = digest_buf;
6222
6223 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6224 (unsigned char *) salt.salt_buf,
6225 ptr[ 1], ptr[ 0],
6226 ptr[ 3], ptr[ 2],
6227 ptr[ 5], ptr[ 4],
6228 ptr[ 7], ptr[ 6],
6229 ptr[ 9], ptr[ 8],
6230 ptr[11], ptr[10],
6231 ptr[13], ptr[12],
6232 ptr[15], ptr[14]);
6233 }
6234 else if (hash_mode == 1800)
6235 {
6236 // temp workaround
6237
6238 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6239 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6240 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6241 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6242 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6243 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6244 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6245 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6246
6247 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6248
6249 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6250 {
6251 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6252 }
6253 else
6254 {
6255 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6256 }
6257 }
6258 else if (hash_mode == 2100)
6259 {
6260 uint pos = 0;
6261
6262 snprintf (out_buf + pos, len-1, "%s%i#",
6263 SIGNATURE_DCC2,
6264 salt.salt_iter + 1);
6265
6266 uint signature_len = strlen (out_buf);
6267
6268 pos += signature_len;
6269 len -= signature_len;
6270
6271 char *salt_ptr = (char *) salt.salt_buf;
6272
6273 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6274
6275 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6276 byte_swap_32 (digest_buf[0]),
6277 byte_swap_32 (digest_buf[1]),
6278 byte_swap_32 (digest_buf[2]),
6279 byte_swap_32 (digest_buf[3]));
6280 }
6281 else if ((hash_mode == 2400) || (hash_mode == 2410))
6282 {
6283 memcpy (tmp_buf, digest_buf, 16);
6284
6285 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6286
6287 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6288 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6289 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6290 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6291
6292 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6293 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6294 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6295 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6296
6297 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6298 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6299 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6300 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6301
6302 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6303 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6304 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6305 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6306
6307 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6308 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6309 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6310 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6311
6312 out_buf[16] = 0;
6313 }
6314 else if (hash_mode == 2500)
6315 {
6316 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6317
6318 wpa_t *wpa = &wpas[salt_pos];
6319
6320 uint pke[25];
6321
6322 char *pke_ptr = (char *) pke;
6323
6324 for (uint i = 0; i < 25; i++)
6325 {
6326 pke[i] = byte_swap_32 (wpa->pke[i]);
6327 }
6328
6329 unsigned char mac1[6];
6330 unsigned char mac2[6];
6331
6332 memcpy (mac1, pke_ptr + 23, 6);
6333 memcpy (mac2, pke_ptr + 29, 6);
6334
6335 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6336 (char *) salt.salt_buf,
6337 mac1[0],
6338 mac1[1],
6339 mac1[2],
6340 mac1[3],
6341 mac1[4],
6342 mac1[5],
6343 mac2[0],
6344 mac2[1],
6345 mac2[2],
6346 mac2[3],
6347 mac2[4],
6348 mac2[5]);
6349 }
6350 else if (hash_mode == 4400)
6351 {
6352 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6353 byte_swap_32 (digest_buf[0]),
6354 byte_swap_32 (digest_buf[1]),
6355 byte_swap_32 (digest_buf[2]),
6356 byte_swap_32 (digest_buf[3]));
6357 }
6358 else if (hash_mode == 4700)
6359 {
6360 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6361 byte_swap_32 (digest_buf[0]),
6362 byte_swap_32 (digest_buf[1]),
6363 byte_swap_32 (digest_buf[2]),
6364 byte_swap_32 (digest_buf[3]),
6365 byte_swap_32 (digest_buf[4]));
6366 }
6367 else if (hash_mode == 4800)
6368 {
6369 uint8_t chap_id_byte = (uint8_t) salt.salt_buf[4];
6370
6371 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6372 digest_buf[0],
6373 digest_buf[1],
6374 digest_buf[2],
6375 digest_buf[3],
6376 byte_swap_32 (salt.salt_buf[0]),
6377 byte_swap_32 (salt.salt_buf[1]),
6378 byte_swap_32 (salt.salt_buf[2]),
6379 byte_swap_32 (salt.salt_buf[3]),
6380 chap_id_byte);
6381 }
6382 else if (hash_mode == 4900)
6383 {
6384 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6385 byte_swap_32 (digest_buf[0]),
6386 byte_swap_32 (digest_buf[1]),
6387 byte_swap_32 (digest_buf[2]),
6388 byte_swap_32 (digest_buf[3]),
6389 byte_swap_32 (digest_buf[4]));
6390 }
6391 else if (hash_mode == 5100)
6392 {
6393 snprintf (out_buf, len-1, "%08x%08x",
6394 digest_buf[0],
6395 digest_buf[1]);
6396 }
6397 else if (hash_mode == 5200)
6398 {
6399 snprintf (out_buf, len-1, "%s", hashfile);
6400 }
6401 else if (hash_mode == 5300)
6402 {
6403 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6404
6405 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6406
6407 int buf_len = len -1;
6408
6409 // msg_buf
6410
6411 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6412
6413 for (uint i = 0; i < ikepsk_msg_len; i++)
6414 {
6415 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6416 {
6417 snprintf (out_buf, buf_len, ":");
6418
6419 buf_len--;
6420 out_buf++;
6421 }
6422
6423 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6424
6425 buf_len -= 8;
6426 out_buf += 8;
6427 }
6428
6429 // nr_buf
6430
6431 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6432
6433 for (uint i = 0; i < ikepsk_nr_len; i++)
6434 {
6435 if ((i == 0) || (i == 5))
6436 {
6437 snprintf (out_buf, buf_len, ":");
6438
6439 buf_len--;
6440 out_buf++;
6441 }
6442
6443 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6444
6445 buf_len -= 8;
6446 out_buf += 8;
6447 }
6448
6449 // digest_buf
6450
6451 for (uint i = 0; i < 4; i++)
6452 {
6453 if (i == 0)
6454 {
6455 snprintf (out_buf, buf_len, ":");
6456
6457 buf_len--;
6458 out_buf++;
6459 }
6460
6461 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6462
6463 buf_len -= 8;
6464 out_buf += 8;
6465 }
6466 }
6467 else if (hash_mode == 5400)
6468 {
6469 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6470
6471 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6472
6473 int buf_len = len -1;
6474
6475 // msg_buf
6476
6477 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6478
6479 for (uint i = 0; i < ikepsk_msg_len; i++)
6480 {
6481 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6482 {
6483 snprintf (out_buf, buf_len, ":");
6484
6485 buf_len--;
6486 out_buf++;
6487 }
6488
6489 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6490
6491 buf_len -= 8;
6492 out_buf += 8;
6493 }
6494
6495 // nr_buf
6496
6497 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6498
6499 for (uint i = 0; i < ikepsk_nr_len; i++)
6500 {
6501 if ((i == 0) || (i == 5))
6502 {
6503 snprintf (out_buf, buf_len, ":");
6504
6505 buf_len--;
6506 out_buf++;
6507 }
6508
6509 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6510
6511 buf_len -= 8;
6512 out_buf += 8;
6513 }
6514
6515 // digest_buf
6516
6517 for (uint i = 0; i < 5; i++)
6518 {
6519 if (i == 0)
6520 {
6521 snprintf (out_buf, buf_len, ":");
6522
6523 buf_len--;
6524 out_buf++;
6525 }
6526
6527 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6528
6529 buf_len -= 8;
6530 out_buf += 8;
6531 }
6532 }
6533 else if (hash_mode == 5500)
6534 {
6535 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6536
6537 netntlm_t *netntlm = &netntlms[salt_pos];
6538
6539 char user_buf[64];
6540 char domain_buf[64];
6541 char srvchall_buf[1024];
6542 char clichall_buf[1024];
6543
6544 memset (user_buf, 0, sizeof (user_buf));
6545 memset (domain_buf, 0, sizeof (domain_buf));
6546 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6547 memset (clichall_buf, 0, sizeof (clichall_buf));
6548
6549 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6550 {
6551 char *ptr = (char *) netntlm->userdomain_buf;
6552
6553 user_buf[i] = ptr[j];
6554 }
6555
6556 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6557 {
6558 char *ptr = (char *) netntlm->userdomain_buf;
6559
6560 domain_buf[i] = ptr[netntlm->user_len + j];
6561 }
6562
6563 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6564 {
6565 char *ptr = (char *) netntlm->chall_buf;
6566
6567 sprintf (srvchall_buf + j, "%02x", (uint8_t) ptr[i]);
6568 }
6569
6570 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6571 {
6572 char *ptr = (char *) netntlm->chall_buf;
6573
6574 sprintf (clichall_buf + j, "%02x", (uint8_t) ptr[netntlm->srvchall_len + i]);
6575 }
6576
6577 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6578 user_buf,
6579 domain_buf,
6580 srvchall_buf,
6581 digest_buf[0],
6582 digest_buf[1],
6583 digest_buf[2],
6584 digest_buf[3],
6585 byte_swap_32 (salt.salt_buf_pc[0]),
6586 byte_swap_32 (salt.salt_buf_pc[1]),
6587 clichall_buf);
6588 }
6589 else if (hash_mode == 5600)
6590 {
6591 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6592
6593 netntlm_t *netntlm = &netntlms[salt_pos];
6594
6595 char user_buf[64];
6596 char domain_buf[64];
6597 char srvchall_buf[1024];
6598 char clichall_buf[1024];
6599
6600 memset (user_buf, 0, sizeof (user_buf));
6601 memset (domain_buf, 0, sizeof (domain_buf));
6602 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6603 memset (clichall_buf, 0, sizeof (clichall_buf));
6604
6605 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6606 {
6607 char *ptr = (char *) netntlm->userdomain_buf;
6608
6609 user_buf[i] = ptr[j];
6610 }
6611
6612 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6613 {
6614 char *ptr = (char *) netntlm->userdomain_buf;
6615
6616 domain_buf[i] = ptr[netntlm->user_len + j];
6617 }
6618
6619 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6620 {
6621 char *ptr = (char *) netntlm->chall_buf;
6622
6623 sprintf (srvchall_buf + j, "%02x", (uint8_t) ptr[i]);
6624 }
6625
6626 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6627 {
6628 char *ptr = (char *) netntlm->chall_buf;
6629
6630 sprintf (clichall_buf + j, "%02x", (uint8_t) ptr[netntlm->srvchall_len + i]);
6631 }
6632
6633 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6634 user_buf,
6635 domain_buf,
6636 srvchall_buf,
6637 digest_buf[0],
6638 digest_buf[1],
6639 digest_buf[2],
6640 digest_buf[3],
6641 clichall_buf);
6642 }
6643 else if (hash_mode == 5700)
6644 {
6645 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6646
6647 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6648 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6649 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6650 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6651 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6652 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6653 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6654 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6655
6656 memcpy (tmp_buf, digest_buf, 32);
6657
6658 base64_encode (int_to_itoa64, tmp_buf, 32, ptr_plain);
6659
6660 ptr_plain[43] = 0;
6661
6662 snprintf (out_buf, len-1, "%s", ptr_plain);
6663 }
6664 else if (hash_mode == 5800)
6665 {
6666 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6667 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6668 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6669 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6670 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6671
6672 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6673 digest_buf[0],
6674 digest_buf[1],
6675 digest_buf[2],
6676 digest_buf[3],
6677 digest_buf[4]);
6678 }
6679 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6680 {
6681 snprintf (out_buf, len-1, "%s", hashfile);
6682 }
6683 else if (hash_mode == 6300)
6684 {
6685 // the encoder is a bit to intelligent, it expects the input data in the wrong BOM
6686
6687 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6688 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6689 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6690 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6691
6692 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6693
6694 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6695 }
6696 else if (hash_mode == 6400)
6697 {
6698 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6699
6700 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6701 }
6702 else if (hash_mode == 6500)
6703 {
6704 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6705
6706 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6707 }
6708 else if (hash_mode == 6600)
6709 {
6710 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6711
6712 agilekey_t *agilekey = &agilekeys[salt_pos];
6713
6714 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6715 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6716
6717 uint buf_len = len - 1;
6718
6719 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6720 buf_len -= 22;
6721
6722 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6723 {
6724 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6725
6726 buf_len -= 2;
6727 }
6728 }
6729 else if (hash_mode == 6700)
6730 {
6731 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6732
6733 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6734 }
6735 else if (hash_mode == 6800)
6736 {
6737 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6738 }
6739 else if (hash_mode == 7100)
6740 {
6741 uint *ptr = digest_buf;
6742
6743 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6744
6745 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6746
6747 uint esalt[16];
6748
6749 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6750 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6751 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6752 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6753 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6754 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6755 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6756 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6757
6758 snprintf (out_buf, len-1, "%s%i$%08x%08x%08x%08x%08x%08x%08x%08x$%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6759 SIGNATURE_SHA512OSX,
6760 salt.salt_iter + 1,
6761 esalt[ 0], esalt[ 1],
6762 esalt[ 2], esalt[ 3],
6763 esalt[ 4], esalt[ 5],
6764 esalt[ 6], esalt[ 7],
6765 ptr [ 1], ptr [ 0],
6766 ptr [ 3], ptr [ 2],
6767 ptr [ 5], ptr [ 4],
6768 ptr [ 7], ptr [ 6],
6769 ptr [ 9], ptr [ 8],
6770 ptr [11], ptr [10],
6771 ptr [13], ptr [12],
6772 ptr [15], ptr [14]);
6773 }
6774 else if (hash_mode == 7200)
6775 {
6776 uint *ptr = digest_buf;
6777
6778 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6779
6780 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6781
6782 uint len_used = 0;
6783
6784 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
6785
6786 len_used = strlen (out_buf);
6787
6788 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
6789
6790 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
6791 {
6792 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
6793 }
6794
6795 snprintf (out_buf + len_used, len - len_used - 1, ".%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6796 ptr [ 1], ptr [ 0],
6797 ptr [ 3], ptr [ 2],
6798 ptr [ 5], ptr [ 4],
6799 ptr [ 7], ptr [ 6],
6800 ptr [ 9], ptr [ 8],
6801 ptr [11], ptr [10],
6802 ptr [13], ptr [12],
6803 ptr [15], ptr [14]);
6804 }
6805 else if (hash_mode == 7300)
6806 {
6807 rakp_t *rakps = (rakp_t *) data.esalts_buf;
6808
6809 rakp_t *rakp = &rakps[salt_pos];
6810
6811 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
6812 {
6813 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
6814 }
6815
6816 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
6817 digest_buf[0],
6818 digest_buf[1],
6819 digest_buf[2],
6820 digest_buf[3],
6821 digest_buf[4]);
6822 }
6823 else if (hash_mode == 7400)
6824 {
6825 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6826
6827 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6828 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6829 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6830 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6831 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6832 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6833 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6834 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6835
6836 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6837
6838 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
6839 {
6840 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6841 }
6842 else
6843 {
6844 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6845 }
6846 }
6847 else if (hash_mode == 7500)
6848 {
6849 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
6850
6851 krb5pa_t *krb5pa = &krb5pas[salt_pos];
6852
6853 uint8_t *ptr_timestamp = (uint8_t *) krb5pa->timestamp;
6854 uint8_t *ptr_checksum = (uint8_t *) krb5pa->checksum;
6855
6856 char data[128];
6857
6858 char *ptr_data = data;
6859
6860 for (uint i = 0; i < 36; i++, ptr_data += 2)
6861 {
6862 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
6863 }
6864
6865 for (uint i = 0; i < 16; i++, ptr_data += 2)
6866 {
6867 sprintf (ptr_data, "%02x", ptr_checksum[i]);
6868 }
6869
6870 *ptr_data = 0;
6871
6872 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
6873 SIGNATURE_KRB5PA,
6874 (char *) krb5pa->user,
6875 (char *) krb5pa->realm,
6876 (char *) krb5pa->salt,
6877 data);
6878 }
6879 else if (hash_mode == 7700)
6880 {
6881 snprintf (out_buf, len-1, "%s$%08X%08X",
6882 (char *) salt.salt_buf,
6883 digest_buf[0],
6884 digest_buf[1]);
6885 }
6886 else if (hash_mode == 7800)
6887 {
6888 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
6889 (char *) salt.salt_buf,
6890 digest_buf[0],
6891 digest_buf[1],
6892 digest_buf[2],
6893 digest_buf[3],
6894 digest_buf[4]);
6895 }
6896 else if (hash_mode == 7900)
6897 {
6898 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6899
6900 // ugly hack start
6901
6902 char *tmp = (char *) salt.salt_buf_pc;
6903
6904 ptr_plain[42] = tmp[0];
6905
6906 // ugly hack end
6907
6908 ptr_plain[43] = 0;
6909
6910 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6911 }
6912 else if (hash_mode == 8000)
6913 {
6914 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
6915 (unsigned char *) salt.salt_buf,
6916 digest_buf[0],
6917 digest_buf[1],
6918 digest_buf[2],
6919 digest_buf[3],
6920 digest_buf[4],
6921 digest_buf[5],
6922 digest_buf[6],
6923 digest_buf[7]);
6924 }
6925 else if (hash_mode == 8100)
6926 {
6927 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6928 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6929
6930 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
6931 (unsigned char *) salt.salt_buf,
6932 digest_buf[0],
6933 digest_buf[1],
6934 digest_buf[2],
6935 digest_buf[3],
6936 digest_buf[4]);
6937 }
6938 else if (hash_mode == 8200)
6939 {
6940 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
6941
6942 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
6943
6944 char data_buf[4096];
6945
6946 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
6947 {
6948 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
6949 }
6950
6951 data_buf[cloudkey->data_len * 2] = 0;
6952
6953 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6954 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6955 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6956 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6957 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6958 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6959 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6960 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6961
6962 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6963 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6964 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
6965 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
6966
6967 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
6968 digest_buf[0],
6969 digest_buf[1],
6970 digest_buf[2],
6971 digest_buf[3],
6972 digest_buf[4],
6973 digest_buf[5],
6974 digest_buf[6],
6975 digest_buf[7],
6976 salt.salt_buf[0],
6977 salt.salt_buf[1],
6978 salt.salt_buf[2],
6979 salt.salt_buf[3],
6980 salt.salt_iter + 1,
6981 data_buf);
6982 }
6983 else if (hash_mode == 8300)
6984 {
6985 // todo
6986
6987 char digest_buf_c[33];
6988
6989 base32_encode (int_to_itoa32, (char *) digest_buf, 32, digest_buf_c);
6990
6991 digest_buf_c[32] = 0;
6992
6993 // domain
6994
6995 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
6996
6997 char domain_buf_c[33];
6998
6999 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7000
7001 for (uint i = 0; i < salt_pc_len; i++)
7002 {
7003 const char next = domain_buf_c[i];
7004
7005 domain_buf_c[i] = '.';
7006
7007 i += next;
7008 }
7009
7010 domain_buf_c[salt_pc_len] = 0;
7011
7012 // final
7013
7014 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7015 }
7016 else if (hash_mode == 8500)
7017 {
7018 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7019 }
7020 else if (hash_mode == 2612)
7021 {
7022 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7023 SIGNATURE_PHPS,
7024 (char *) salt.salt_buf,
7025 digest_buf[0],
7026 digest_buf[1],
7027 digest_buf[2],
7028 digest_buf[3]);
7029 }
7030 else if (hash_mode == 3711)
7031 {
7032 char *salt_ptr = (char *) salt.salt_buf;
7033
7034 salt_ptr[salt.salt_len - 1] = 0;
7035
7036 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7037 SIGNATURE_MEDIAWIKI_B,
7038 salt_ptr,
7039 digest_buf[0],
7040 digest_buf[1],
7041 digest_buf[2],
7042 digest_buf[3]);
7043 }
7044 else if (hash_mode == 8800)
7045 {
7046 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7047
7048 androidfde_t *androidfde = &androidfdes[salt_pos];
7049
7050 char tmp[3073];
7051
7052 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7053 {
7054 sprintf (tmp + j, "%08x", androidfde->data[i]);
7055 }
7056
7057 tmp[3072] = 0;
7058
7059 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7060 SIGNATURE_ANDROIDFDE,
7061 byte_swap_32 (salt.salt_buf[0]),
7062 byte_swap_32 (salt.salt_buf[1]),
7063 byte_swap_32 (salt.salt_buf[2]),
7064 byte_swap_32 (salt.salt_buf[3]),
7065 byte_swap_32 (digest_buf[0]),
7066 byte_swap_32 (digest_buf[1]),
7067 byte_swap_32 (digest_buf[2]),
7068 byte_swap_32 (digest_buf[3]),
7069 tmp);
7070 }
7071 else if (hash_mode == 8900)
7072 {
7073 uint N = salt.scrypt_N;
7074 uint r = salt.scrypt_r;
7075 uint p = salt.scrypt_p;
7076
7077 char base64_salt[32];
7078
7079 memset (base64_salt, 0, 32);
7080
7081 base64_encode (int_to_base64, (char *) salt.salt_buf, salt.salt_len, base64_salt + 0);
7082
7083 memset (tmp_buf, 0, 46);
7084
7085 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7086 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7087 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7088 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7089 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7090 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7091 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7092 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7093 digest_buf[8] = 0; // needed for base64_encode ()
7094
7095 base64_encode (int_to_base64, (char *) digest_buf, 32, tmp_buf + 0);
7096
7097 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7098 SIGNATURE_SCRYPT,
7099 N,
7100 r,
7101 p,
7102 base64_salt,
7103 tmp_buf);
7104 }
7105 else if (hash_mode == 9000)
7106 {
7107 snprintf (out_buf, len-1, "%s", hashfile);
7108 }
7109 else if (hash_mode == 9200)
7110 {
7111 // salt
7112
7113 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7114
7115 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7116
7117 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7118
7119 // hash
7120
7121 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7122 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7123 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7124 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7125 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7126 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7127 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7128 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7129 digest_buf[8] = 0; // needed for base64_encode ()
7130
7131 char tmp_buf[64];
7132 memset (tmp_buf, 0, sizeof (tmp_buf));
7133
7134 base64_encode (int_to_itoa64, (char *) digest_buf, 32, tmp_buf);
7135 tmp_buf[43] = 0; // cut it here
7136
7137 // output
7138
7139 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7140 }
7141 else if (hash_mode == 9300)
7142 {
7143 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7144 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7145 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7146 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7147 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7148 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7149 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7150 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7151 digest_buf[8] = 0; // needed for base64_encode ()
7152
7153 char tmp_buf[64];
7154 memset (tmp_buf, 0, sizeof (tmp_buf));
7155
7156 base64_encode (int_to_itoa64, (char *) digest_buf, 32, tmp_buf);
7157 tmp_buf[43] = 0; // cut it here
7158
7159 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7160
7161 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7162 }
7163 else if (hash_mode == 9400)
7164 {
7165 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7166
7167 office2007_t *office2007 = &office2007s[salt_pos];
7168
7169 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7170 SIGNATURE_OFFICE2007,
7171 2007,
7172 20,
7173 office2007->keySize,
7174 16,
7175 salt.salt_buf[0],
7176 salt.salt_buf[1],
7177 salt.salt_buf[2],
7178 salt.salt_buf[3],
7179 office2007->encryptedVerifier[0],
7180 office2007->encryptedVerifier[1],
7181 office2007->encryptedVerifier[2],
7182 office2007->encryptedVerifier[3],
7183 office2007->encryptedVerifierHash[0],
7184 office2007->encryptedVerifierHash[1],
7185 office2007->encryptedVerifierHash[2],
7186 office2007->encryptedVerifierHash[3],
7187 office2007->encryptedVerifierHash[4]);
7188 }
7189 else if (hash_mode == 9500)
7190 {
7191 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7192
7193 office2010_t *office2010 = &office2010s[salt_pos];
7194
7195 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x%08x%08x", SIGNATURE_OFFICE2010, 2010, 100000, 128, 16,
7196
7197 salt.salt_buf[0],
7198 salt.salt_buf[1],
7199 salt.salt_buf[2],
7200 salt.salt_buf[3],
7201 office2010->encryptedVerifier[0],
7202 office2010->encryptedVerifier[1],
7203 office2010->encryptedVerifier[2],
7204 office2010->encryptedVerifier[3],
7205 office2010->encryptedVerifierHash[0],
7206 office2010->encryptedVerifierHash[1],
7207 office2010->encryptedVerifierHash[2],
7208 office2010->encryptedVerifierHash[3],
7209 office2010->encryptedVerifierHash[4],
7210 office2010->encryptedVerifierHash[5],
7211 office2010->encryptedVerifierHash[6],
7212 office2010->encryptedVerifierHash[7]);
7213 }
7214 else if (hash_mode == 9600)
7215 {
7216 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7217
7218 office2013_t *office2013 = &office2013s[salt_pos];
7219
7220 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x%08x%08x", SIGNATURE_OFFICE2013, 2013, 100000, 256, 16,
7221
7222 salt.salt_buf[0],
7223 salt.salt_buf[1],
7224 salt.salt_buf[2],
7225 salt.salt_buf[3],
7226 office2013->encryptedVerifier[0],
7227 office2013->encryptedVerifier[1],
7228 office2013->encryptedVerifier[2],
7229 office2013->encryptedVerifier[3],
7230 office2013->encryptedVerifierHash[0],
7231 office2013->encryptedVerifierHash[1],
7232 office2013->encryptedVerifierHash[2],
7233 office2013->encryptedVerifierHash[3],
7234 office2013->encryptedVerifierHash[4],
7235 office2013->encryptedVerifierHash[5],
7236 office2013->encryptedVerifierHash[6],
7237 office2013->encryptedVerifierHash[7]);
7238 }
7239 else if (hash_mode == 9700)
7240 {
7241 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7242
7243 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7244
7245 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7246 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7247 byte_swap_32 (salt.salt_buf[0]),
7248 byte_swap_32 (salt.salt_buf[1]),
7249 byte_swap_32 (salt.salt_buf[2]),
7250 byte_swap_32 (salt.salt_buf[3]),
7251 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7252 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7253 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7254 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7255 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7256 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7257 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7258 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7259 }
7260 else if (hash_mode == 9710)
7261 {
7262 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7263
7264 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7265
7266 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7267 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7268 byte_swap_32 (salt.salt_buf[0]),
7269 byte_swap_32 (salt.salt_buf[1]),
7270 byte_swap_32 (salt.salt_buf[2]),
7271 byte_swap_32 (salt.salt_buf[3]),
7272 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7273 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7274 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7275 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7276 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7277 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7278 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7279 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7280 }
7281 else if (hash_mode == 9720)
7282 {
7283 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7284
7285 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7286
7287 uint8_t *rc4key = (uint8_t *) oldoffice01->rc4key;
7288
7289 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7290 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7291 byte_swap_32 (salt.salt_buf[0]),
7292 byte_swap_32 (salt.salt_buf[1]),
7293 byte_swap_32 (salt.salt_buf[2]),
7294 byte_swap_32 (salt.salt_buf[3]),
7295 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7296 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7297 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7298 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7299 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7300 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7301 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7302 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7303 rc4key[0],
7304 rc4key[1],
7305 rc4key[2],
7306 rc4key[3],
7307 rc4key[4]);
7308 }
7309 else if (hash_mode == 9800)
7310 {
7311 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7312
7313 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7314
7315 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7316 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7317 salt.salt_buf[0],
7318 salt.salt_buf[1],
7319 salt.salt_buf[2],
7320 salt.salt_buf[3],
7321 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7322 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7323 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7324 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7325 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7326 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7327 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7328 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7329 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7330 }
7331 else if (hash_mode == 9810)
7332 {
7333 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7334
7335 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7336
7337 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7338 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7339 salt.salt_buf[0],
7340 salt.salt_buf[1],
7341 salt.salt_buf[2],
7342 salt.salt_buf[3],
7343 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7344 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7345 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7346 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7347 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7348 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7349 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7350 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7351 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7352 }
7353 else if (hash_mode == 9820)
7354 {
7355 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7356
7357 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7358
7359 uint8_t *rc4key = (uint8_t *) oldoffice34->rc4key;
7360
7361 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7362 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7363 salt.salt_buf[0],
7364 salt.salt_buf[1],
7365 salt.salt_buf[2],
7366 salt.salt_buf[3],
7367 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7368 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7369 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7370 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7371 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7372 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7373 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7374 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7375 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7376 rc4key[0],
7377 rc4key[1],
7378 rc4key[2],
7379 rc4key[3],
7380 rc4key[4]);
7381 }
7382 else if (hash_mode == 10000)
7383 {
7384 // salt
7385
7386 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7387
7388 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7389
7390 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7391
7392 // hash
7393
7394 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7395 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7396 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7397 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7398 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7399 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7400 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7401 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7402 digest_buf[8] = 0; // needed for base64_encode ()
7403
7404 char tmp_buf[64];
7405 memset (tmp_buf, 0, sizeof (tmp_buf));
7406
7407 base64_encode (int_to_base64, (char *) digest_buf, 32, tmp_buf);
7408
7409 // output
7410
7411 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7412 }
7413 else if (hash_mode == 10100)
7414 {
7415 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7416 digest_buf[0],
7417 digest_buf[1],
7418 2,
7419 4,
7420 byte_swap_32 (salt.salt_buf[0]),
7421 byte_swap_32 (salt.salt_buf[1]),
7422 byte_swap_32 (salt.salt_buf[2]),
7423 byte_swap_32 (salt.salt_buf[3]));
7424 }
7425 else if (hash_mode == 10200)
7426 {
7427 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7428
7429 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7430
7431 // challenge
7432
7433 char challenge[100];
7434
7435 memset (challenge, 0, sizeof (challenge));
7436
7437 base64_encode (int_to_base64, (char *) salt.salt_buf, salt.salt_len, challenge);
7438
7439 // response
7440
7441 char tmp_buf[100];
7442
7443 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7444 (char *) cram_md5->user,
7445 digest_buf[0],
7446 digest_buf[1],
7447 digest_buf[2],
7448 digest_buf[3]);
7449
7450 char response[100];
7451
7452 memset (response, 0, sizeof (response));
7453
7454 base64_encode (int_to_base64, (char *) tmp_buf, tmp_len, response);
7455
7456 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7457 }
7458 else if (hash_mode == 10300)
7459 {
7460 char tmp_buf[100];
7461
7462 memset (tmp_buf, 0, sizeof (tmp_buf));
7463
7464 memcpy (tmp_buf + 0, digest_buf, 20);
7465 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7466
7467 uint tmp_len = 20 + salt.salt_len;
7468
7469 // base64 encode it
7470
7471 char base64_encoded[100];
7472
7473 memset (base64_encoded, 0, sizeof (base64_encoded));
7474
7475 base64_encode (int_to_base64, (char *) tmp_buf, tmp_len, base64_encoded);
7476
7477 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7478 }
7479 else if (hash_mode == 10400)
7480 {
7481 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7482
7483 pdf_t *pdf = &pdfs[salt_pos];
7484
7485 snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x",
7486
7487 pdf->V,
7488 pdf->R,
7489 40,
7490 pdf->P,
7491 pdf->enc_md,
7492 pdf->id_len,
7493 byte_swap_32 (pdf->id_buf[0]),
7494 byte_swap_32 (pdf->id_buf[1]),
7495 byte_swap_32 (pdf->id_buf[2]),
7496 byte_swap_32 (pdf->id_buf[3]),
7497 pdf->u_len,
7498 byte_swap_32 (pdf->u_buf[0]),
7499 byte_swap_32 (pdf->u_buf[1]),
7500 byte_swap_32 (pdf->u_buf[2]),
7501 byte_swap_32 (pdf->u_buf[3]),
7502 byte_swap_32 (pdf->u_buf[4]),
7503 byte_swap_32 (pdf->u_buf[5]),
7504 byte_swap_32 (pdf->u_buf[6]),
7505 byte_swap_32 (pdf->u_buf[7]),
7506 pdf->o_len,
7507 byte_swap_32 (pdf->o_buf[0]),
7508 byte_swap_32 (pdf->o_buf[1]),
7509 byte_swap_32 (pdf->o_buf[2]),
7510 byte_swap_32 (pdf->o_buf[3]),
7511 byte_swap_32 (pdf->o_buf[4]),
7512 byte_swap_32 (pdf->o_buf[5]),
7513 byte_swap_32 (pdf->o_buf[6]),
7514 byte_swap_32 (pdf->o_buf[7])
7515 );
7516 }
7517 else if (hash_mode == 10410)
7518 {
7519 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7520
7521 pdf_t *pdf = &pdfs[salt_pos];
7522
7523 snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x",
7524
7525 pdf->V,
7526 pdf->R,
7527 40,
7528 pdf->P,
7529 pdf->enc_md,
7530 pdf->id_len,
7531 byte_swap_32 (pdf->id_buf[0]),
7532 byte_swap_32 (pdf->id_buf[1]),
7533 byte_swap_32 (pdf->id_buf[2]),
7534 byte_swap_32 (pdf->id_buf[3]),
7535 pdf->u_len,
7536 byte_swap_32 (pdf->u_buf[0]),
7537 byte_swap_32 (pdf->u_buf[1]),
7538 byte_swap_32 (pdf->u_buf[2]),
7539 byte_swap_32 (pdf->u_buf[3]),
7540 byte_swap_32 (pdf->u_buf[4]),
7541 byte_swap_32 (pdf->u_buf[5]),
7542 byte_swap_32 (pdf->u_buf[6]),
7543 byte_swap_32 (pdf->u_buf[7]),
7544 pdf->o_len,
7545 byte_swap_32 (pdf->o_buf[0]),
7546 byte_swap_32 (pdf->o_buf[1]),
7547 byte_swap_32 (pdf->o_buf[2]),
7548 byte_swap_32 (pdf->o_buf[3]),
7549 byte_swap_32 (pdf->o_buf[4]),
7550 byte_swap_32 (pdf->o_buf[5]),
7551 byte_swap_32 (pdf->o_buf[6]),
7552 byte_swap_32 (pdf->o_buf[7])
7553 );
7554 }
7555 else if (hash_mode == 10420)
7556 {
7557 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7558
7559 pdf_t *pdf = &pdfs[salt_pos];
7560
7561 uint8_t *rc4key = (uint8_t *) pdf->rc4key;
7562
7563 snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7564
7565 pdf->V,
7566 pdf->R,
7567 40,
7568 pdf->P,
7569 pdf->enc_md,
7570 pdf->id_len,
7571 byte_swap_32 (pdf->id_buf[0]),
7572 byte_swap_32 (pdf->id_buf[1]),
7573 byte_swap_32 (pdf->id_buf[2]),
7574 byte_swap_32 (pdf->id_buf[3]),
7575 pdf->u_len,
7576 byte_swap_32 (pdf->u_buf[0]),
7577 byte_swap_32 (pdf->u_buf[1]),
7578 byte_swap_32 (pdf->u_buf[2]),
7579 byte_swap_32 (pdf->u_buf[3]),
7580 byte_swap_32 (pdf->u_buf[4]),
7581 byte_swap_32 (pdf->u_buf[5]),
7582 byte_swap_32 (pdf->u_buf[6]),
7583 byte_swap_32 (pdf->u_buf[7]),
7584 pdf->o_len,
7585 byte_swap_32 (pdf->o_buf[0]),
7586 byte_swap_32 (pdf->o_buf[1]),
7587 byte_swap_32 (pdf->o_buf[2]),
7588 byte_swap_32 (pdf->o_buf[3]),
7589 byte_swap_32 (pdf->o_buf[4]),
7590 byte_swap_32 (pdf->o_buf[5]),
7591 byte_swap_32 (pdf->o_buf[6]),
7592 byte_swap_32 (pdf->o_buf[7]),
7593 rc4key[0],
7594 rc4key[1],
7595 rc4key[2],
7596 rc4key[3],
7597 rc4key[4]
7598 );
7599 }
7600 else if (hash_mode == 10500)
7601 {
7602 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7603
7604 pdf_t *pdf = &pdfs[salt_pos];
7605
7606 if (pdf->id_len == 32)
7607 {
7608 snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x",
7609
7610 pdf->V,
7611 pdf->R,
7612 128,
7613 pdf->P,
7614 pdf->enc_md,
7615 pdf->id_len,
7616 byte_swap_32 (pdf->id_buf[0]),
7617 byte_swap_32 (pdf->id_buf[1]),
7618 byte_swap_32 (pdf->id_buf[2]),
7619 byte_swap_32 (pdf->id_buf[3]),
7620 byte_swap_32 (pdf->id_buf[4]),
7621 byte_swap_32 (pdf->id_buf[5]),
7622 byte_swap_32 (pdf->id_buf[6]),
7623 byte_swap_32 (pdf->id_buf[7]),
7624 pdf->u_len,
7625 byte_swap_32 (pdf->u_buf[0]),
7626 byte_swap_32 (pdf->u_buf[1]),
7627 byte_swap_32 (pdf->u_buf[2]),
7628 byte_swap_32 (pdf->u_buf[3]),
7629 byte_swap_32 (pdf->u_buf[4]),
7630 byte_swap_32 (pdf->u_buf[5]),
7631 byte_swap_32 (pdf->u_buf[6]),
7632 byte_swap_32 (pdf->u_buf[7]),
7633 pdf->o_len,
7634 byte_swap_32 (pdf->o_buf[0]),
7635 byte_swap_32 (pdf->o_buf[1]),
7636 byte_swap_32 (pdf->o_buf[2]),
7637 byte_swap_32 (pdf->o_buf[3]),
7638 byte_swap_32 (pdf->o_buf[4]),
7639 byte_swap_32 (pdf->o_buf[5]),
7640 byte_swap_32 (pdf->o_buf[6]),
7641 byte_swap_32 (pdf->o_buf[7])
7642 );
7643 }
7644 else
7645 {
7646 snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x",
7647
7648 pdf->V,
7649 pdf->R,
7650 128,
7651 pdf->P,
7652 pdf->enc_md,
7653 pdf->id_len,
7654 byte_swap_32 (pdf->id_buf[0]),
7655 byte_swap_32 (pdf->id_buf[1]),
7656 byte_swap_32 (pdf->id_buf[2]),
7657 byte_swap_32 (pdf->id_buf[3]),
7658 pdf->u_len,
7659 byte_swap_32 (pdf->u_buf[0]),
7660 byte_swap_32 (pdf->u_buf[1]),
7661 byte_swap_32 (pdf->u_buf[2]),
7662 byte_swap_32 (pdf->u_buf[3]),
7663 byte_swap_32 (pdf->u_buf[4]),
7664 byte_swap_32 (pdf->u_buf[5]),
7665 byte_swap_32 (pdf->u_buf[6]),
7666 byte_swap_32 (pdf->u_buf[7]),
7667 pdf->o_len,
7668 byte_swap_32 (pdf->o_buf[0]),
7669 byte_swap_32 (pdf->o_buf[1]),
7670 byte_swap_32 (pdf->o_buf[2]),
7671 byte_swap_32 (pdf->o_buf[3]),
7672 byte_swap_32 (pdf->o_buf[4]),
7673 byte_swap_32 (pdf->o_buf[5]),
7674 byte_swap_32 (pdf->o_buf[6]),
7675 byte_swap_32 (pdf->o_buf[7])
7676 );
7677 }
7678 }
7679 else if (hash_mode == 10600)
7680 {
7681 uint digest_idx = salt.digests_offset + digest_pos;
7682
7683 hashinfo_t **hashinfo_ptr = data.hash_info;
7684 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7685
7686 snprintf (out_buf, len-1, "%s", hash_buf);
7687 }
7688 else if (hash_mode == 10700)
7689 {
7690 uint digest_idx = salt.digests_offset + digest_pos;
7691
7692 hashinfo_t **hashinfo_ptr = data.hash_info;
7693 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7694
7695 snprintf (out_buf, len-1, "%s", hash_buf);
7696 }
7697 else if (hash_mode == 10900)
7698 {
7699 uint digest_idx = salt.digests_offset + digest_pos;
7700
7701 hashinfo_t **hashinfo_ptr = data.hash_info;
7702 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7703
7704 snprintf (out_buf, len-1, "%s", hash_buf);
7705 }
7706 else if (hash_mode == 11100)
7707 {
7708 uint32_t salt_challenge = salt.salt_buf[0];
7709
7710 salt_challenge = byte_swap_32 (salt_challenge);
7711
7712 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7713
7714 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7715 SIGNATURE_POSTGRESQL_AUTH,
7716 user_name,
7717 salt_challenge,
7718 digest_buf[0],
7719 digest_buf[1],
7720 digest_buf[2],
7721 digest_buf[3]);
7722 }
7723 else if (hash_mode == 11200)
7724 {
7725 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7726 SIGNATURE_MYSQL_AUTH,
7727 (unsigned char *) salt.salt_buf,
7728 digest_buf[0],
7729 digest_buf[1],
7730 digest_buf[2],
7731 digest_buf[3],
7732 digest_buf[4]);
7733 }
7734 else if (hash_mode == 11300)
7735 {
7736 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7737
7738 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7739
7740 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7741 const uint ckey_len = bitcoin_wallet->ckey_len;
7742 const uint public_key_len = bitcoin_wallet->public_key_len;
7743
7744 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7745 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7746 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7747
7748 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7749 {
7750 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->cry_master_buf;
7751
7752 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7753 }
7754
7755 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7756 {
7757 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->ckey_buf;
7758
7759 sprintf (ckey_buf + j, "%02x", ptr[i]);
7760 }
7761
7762 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7763 {
7764 const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->public_key_buf;
7765
7766 sprintf (public_key_buf + j, "%02x", ptr[i]);
7767 }
7768
7769 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
7770 SIGNATURE_BITCOIN_WALLET,
7771 cry_master_len * 2,
7772 cry_master_buf,
7773 salt.salt_len,
7774 (unsigned char *) salt.salt_buf,
7775 salt.salt_iter + 1,
7776 ckey_len * 2,
7777 ckey_buf,
7778 public_key_len * 2,
7779 public_key_buf
7780 );
7781
7782 free (cry_master_buf);
7783 free (ckey_buf);
7784 free (public_key_buf);
7785 }
7786 else if (hash_mode == 11400)
7787 {
7788 uint digest_idx = salt.digests_offset + digest_pos;
7789
7790 hashinfo_t **hashinfo_ptr = data.hash_info;
7791 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7792
7793 snprintf (out_buf, len-1, "%s", hash_buf);
7794 }
7795 else if (hash_mode == 11600)
7796 {
7797 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
7798
7799 seven_zip_t *seven_zip = &seven_zips[salt_pos];
7800
7801 const uint data_len = seven_zip->data_len;
7802
7803 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
7804
7805 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
7806 {
7807 const uint8_t *ptr = (const uint8_t *) seven_zip->data_buf;
7808
7809 sprintf (data_buf + j, "%02x", ptr[i]);
7810 }
7811
7812 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
7813 SIGNATURE_SEVEN_ZIP,
7814 0,
7815 salt.salt_sign[0],
7816 0,
7817 (char *) seven_zip->salt_buf,
7818 seven_zip->iv_len,
7819 seven_zip->iv_buf[0],
7820 seven_zip->iv_buf[1],
7821 seven_zip->iv_buf[2],
7822 seven_zip->iv_buf[3],
7823 seven_zip->crc,
7824 seven_zip->data_len,
7825 seven_zip->unpack_size,
7826 data_buf);
7827
7828 free (data_buf);
7829 }
7830 else if (hash_mode == 11700)
7831 {
7832 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7833 digest_buf[0],
7834 digest_buf[1],
7835 digest_buf[2],
7836 digest_buf[3],
7837 digest_buf[4],
7838 digest_buf[5],
7839 digest_buf[6],
7840 digest_buf[7]);
7841 }
7842 else if (hash_mode == 11800)
7843 {
7844 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
7845 digest_buf[ 0],
7846 digest_buf[ 1],
7847 digest_buf[ 2],
7848 digest_buf[ 3],
7849 digest_buf[ 4],
7850 digest_buf[ 5],
7851 digest_buf[ 6],
7852 digest_buf[ 7],
7853 digest_buf[ 8],
7854 digest_buf[ 9],
7855 digest_buf[10],
7856 digest_buf[11],
7857 digest_buf[12],
7858 digest_buf[13],
7859 digest_buf[14],
7860 digest_buf[15]);
7861 }
7862 else if (hash_mode == 11900)
7863 {
7864 uint digest_idx = salt.digests_offset + digest_pos;
7865
7866 hashinfo_t **hashinfo_ptr = data.hash_info;
7867 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7868
7869 snprintf (out_buf, len-1, "%s", hash_buf);
7870 }
7871 else if (hash_mode == 12000)
7872 {
7873 uint digest_idx = salt.digests_offset + digest_pos;
7874
7875 hashinfo_t **hashinfo_ptr = data.hash_info;
7876 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7877
7878 snprintf (out_buf, len-1, "%s", hash_buf);
7879 }
7880 else if (hash_mode == 12100)
7881 {
7882 uint digest_idx = salt.digests_offset + digest_pos;
7883
7884 hashinfo_t **hashinfo_ptr = data.hash_info;
7885 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7886
7887 snprintf (out_buf, len-1, "%s", hash_buf);
7888 }
7889 else if (hash_mode == 12200)
7890 {
7891 uint *ptr_digest = digest_buf;
7892 uint *ptr_salt = salt.salt_buf;
7893
7894 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
7895 SIGNATURE_ECRYPTFS,
7896 ptr_salt[0],
7897 ptr_salt[1],
7898 ptr_digest[0],
7899 ptr_digest[1]);
7900 }
7901 else if (hash_mode == 12300)
7902 {
7903 uint *ptr_digest = digest_buf;
7904 uint *ptr_salt = salt.salt_buf;
7905
7906 snprintf (out_buf, len-1, "%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X",
7907 ptr_digest[ 0], ptr_digest[ 1],
7908 ptr_digest[ 2], ptr_digest[ 3],
7909 ptr_digest[ 4], ptr_digest[ 5],
7910 ptr_digest[ 6], ptr_digest[ 7],
7911 ptr_digest[ 8], ptr_digest[ 9],
7912 ptr_digest[10], ptr_digest[11],
7913 ptr_digest[12], ptr_digest[13],
7914 ptr_digest[14], ptr_digest[15],
7915 ptr_salt[0],
7916 ptr_salt[1],
7917 ptr_salt[2],
7918 ptr_salt[3]);
7919 }
7920 else if (hash_mode == 12400)
7921 {
7922 // encode iteration count
7923
7924 char salt_iter[5];
7925
7926 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
7927 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
7928 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
7929 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
7930 salt_iter[4] = 0;
7931
7932 // encode salt
7933
7934 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
7935 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
7936 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
7937 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
7938 ptr_salt[4] = 0;
7939
7940 // encode digest
7941
7942 memset (tmp_buf, 0, sizeof (tmp_buf));
7943
7944 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7945 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7946
7947 memcpy (tmp_buf, digest_buf, 8);
7948
7949 base64_encode (int_to_itoa64, tmp_buf, 8, ptr_plain);
7950
7951 ptr_plain[11] = 0;
7952
7953 // fill the resulting buffer
7954
7955 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
7956 }
7957 else if (hash_mode == 12500)
7958 {
7959 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
7960 SIGNATURE_RAR3,
7961 byte_swap_32 (salt.salt_buf[0]),
7962 byte_swap_32 (salt.salt_buf[1]),
7963 salt.salt_buf[2],
7964 salt.salt_buf[3],
7965 salt.salt_buf[4],
7966 salt.salt_buf[5]);
7967 }
7968 else if (hash_mode == 12600)
7969 {
7970 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7971 digest_buf[0] + salt.salt_buf_pc[0],
7972 digest_buf[1] + salt.salt_buf_pc[1],
7973 digest_buf[2] + salt.salt_buf_pc[2],
7974 digest_buf[3] + salt.salt_buf_pc[3],
7975 digest_buf[4] + salt.salt_buf_pc[4],
7976 digest_buf[5] + salt.salt_buf_pc[5],
7977 digest_buf[6] + salt.salt_buf_pc[6],
7978 digest_buf[7] + salt.salt_buf_pc[7]);
7979 }
7980 else if (hash_mode == 12700)
7981 {
7982 uint digest_idx = salt.digests_offset + digest_pos;
7983
7984 hashinfo_t **hashinfo_ptr = data.hash_info;
7985 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7986
7987 snprintf (out_buf, len-1, "%s", hash_buf);
7988 }
7989 else if (hash_mode == 12800)
7990 {
7991 const uint8_t *ptr = (const uint8_t *) salt.salt_buf;
7992
7993 snprintf (out_buf, len-1, "%s,%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x,%d,%08x%08x%08x%08x%08x%08x%08x%08x",
7994 SIGNATURE_MS_DRSR,
7995 ptr[0],
7996 ptr[1],
7997 ptr[2],
7998 ptr[3],
7999 ptr[4],
8000 ptr[5],
8001 ptr[6],
8002 ptr[7],
8003 ptr[8],
8004 ptr[9],
8005 salt.salt_iter + 1,
8006 byte_swap_32 (digest_buf[0]),
8007 byte_swap_32 (digest_buf[1]),
8008 byte_swap_32 (digest_buf[2]),
8009 byte_swap_32 (digest_buf[3]),
8010 byte_swap_32 (digest_buf[4]),
8011 byte_swap_32 (digest_buf[5]),
8012 byte_swap_32 (digest_buf[6]),
8013 byte_swap_32 (digest_buf[7])
8014 );
8015 }
8016 else
8017 {
8018 if (hash_type == HASH_TYPE_MD4)
8019 {
8020 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8021 digest_buf[0],
8022 digest_buf[1],
8023 digest_buf[2],
8024 digest_buf[3]);
8025 }
8026 else if (hash_type == HASH_TYPE_MD5)
8027 {
8028 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8029 digest_buf[0],
8030 digest_buf[1],
8031 digest_buf[2],
8032 digest_buf[3]);
8033 }
8034 else if (hash_type == HASH_TYPE_SHA1)
8035 {
8036 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8037 digest_buf[0],
8038 digest_buf[1],
8039 digest_buf[2],
8040 digest_buf[3],
8041 digest_buf[4]);
8042 }
8043 else if (hash_type == HASH_TYPE_SHA256)
8044 {
8045 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8046 digest_buf[0],
8047 digest_buf[1],
8048 digest_buf[2],
8049 digest_buf[3],
8050 digest_buf[4],
8051 digest_buf[5],
8052 digest_buf[6],
8053 digest_buf[7]);
8054 }
8055 else if (hash_type == HASH_TYPE_SHA384)
8056 {
8057 uint *ptr = digest_buf;
8058
8059 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8060 ptr[ 1], ptr[ 0],
8061 ptr[ 3], ptr[ 2],
8062 ptr[ 5], ptr[ 4],
8063 ptr[ 7], ptr[ 6],
8064 ptr[ 9], ptr[ 8],
8065 ptr[11], ptr[10]);
8066 }
8067 else if (hash_type == HASH_TYPE_SHA512)
8068 {
8069 uint *ptr = digest_buf;
8070
8071 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8072 ptr[ 1], ptr[ 0],
8073 ptr[ 3], ptr[ 2],
8074 ptr[ 5], ptr[ 4],
8075 ptr[ 7], ptr[ 6],
8076 ptr[ 9], ptr[ 8],
8077 ptr[11], ptr[10],
8078 ptr[13], ptr[12],
8079 ptr[15], ptr[14]);
8080 }
8081 else if (hash_type == HASH_TYPE_LM)
8082 {
8083 snprintf (out_buf, len-1, "%08x%08x",
8084 digest_buf[0],
8085 digest_buf[1]);
8086 }
8087 else if (hash_type == HASH_TYPE_ORACLEH)
8088 {
8089 snprintf (out_buf, len-1, "%08X%08X",
8090 digest_buf[0],
8091 digest_buf[1]);
8092 }
8093 else if (hash_type == HASH_TYPE_BCRYPT)
8094 {
8095 base64_encode (int_to_bf64, (char *) salt.salt_buf, 16, tmp_buf + 0);
8096 base64_encode (int_to_bf64, (char *) digest_buf, 23, tmp_buf + 22);
8097
8098 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8099
8100 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8101 }
8102 else if (hash_type == HASH_TYPE_KECCAK)
8103 {
8104 uint *ptr = digest_buf;
8105
8106 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8107 ptr[ 1], ptr[ 0],
8108 ptr[ 3], ptr[ 2],
8109 ptr[ 5], ptr[ 4],
8110 ptr[ 7], ptr[ 6],
8111 ptr[ 9], ptr[ 8],
8112 ptr[11], ptr[10],
8113 ptr[13], ptr[12],
8114 ptr[15], ptr[14],
8115 ptr[17], ptr[16],
8116 ptr[19], ptr[18],
8117 ptr[21], ptr[20],
8118 ptr[23], ptr[22],
8119 ptr[25], ptr[24],
8120 ptr[27], ptr[26],
8121 ptr[29], ptr[28],
8122 ptr[31], ptr[30],
8123 ptr[33], ptr[32],
8124 ptr[35], ptr[34],
8125 ptr[37], ptr[36],
8126 ptr[39], ptr[38],
8127 ptr[41], ptr[30],
8128 ptr[43], ptr[42],
8129 ptr[45], ptr[44],
8130 ptr[47], ptr[46],
8131 ptr[49], ptr[48]
8132 );
8133
8134 out_buf[salt.keccak_mdlen * 2] = 0;
8135 }
8136 else if (hash_type == HASH_TYPE_RIPEMD160)
8137 {
8138 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8139 digest_buf[0],
8140 digest_buf[1],
8141 digest_buf[2],
8142 digest_buf[3],
8143 digest_buf[4]);
8144 }
8145 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8146 {
8147 digest_buf[ 0] = digest_buf[ 0];
8148 digest_buf[ 1] = digest_buf[ 1];
8149 digest_buf[ 2] = digest_buf[ 2];
8150 digest_buf[ 3] = digest_buf[ 3];
8151 digest_buf[ 4] = digest_buf[ 4];
8152 digest_buf[ 5] = digest_buf[ 5];
8153 digest_buf[ 6] = digest_buf[ 6];
8154 digest_buf[ 7] = digest_buf[ 7];
8155 digest_buf[ 8] = digest_buf[ 8];
8156 digest_buf[ 9] = digest_buf[ 9];
8157 digest_buf[10] = digest_buf[10];
8158 digest_buf[11] = digest_buf[11];
8159 digest_buf[12] = digest_buf[12];
8160 digest_buf[13] = digest_buf[13];
8161 digest_buf[14] = digest_buf[14];
8162 digest_buf[15] = digest_buf[15];
8163
8164 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8165 digest_buf[ 0],
8166 digest_buf[ 1],
8167 digest_buf[ 2],
8168 digest_buf[ 3],
8169 digest_buf[ 4],
8170 digest_buf[ 5],
8171 digest_buf[ 6],
8172 digest_buf[ 7],
8173 digest_buf[ 8],
8174 digest_buf[ 9],
8175 digest_buf[10],
8176 digest_buf[11],
8177 digest_buf[12],
8178 digest_buf[13],
8179 digest_buf[14],
8180 digest_buf[15]);
8181 }
8182 else if (hash_type == HASH_TYPE_GOST)
8183 {
8184 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8185 digest_buf[0],
8186 digest_buf[1],
8187 digest_buf[2],
8188 digest_buf[3],
8189 digest_buf[4],
8190 digest_buf[5],
8191 digest_buf[6],
8192 digest_buf[7]);
8193 }
8194 else if (hash_type == HASH_TYPE_MYSQL)
8195 {
8196 snprintf (out_buf, len-1, "%08x%08x",
8197 digest_buf[0],
8198 digest_buf[1]);
8199 }
8200 else if (hash_type == HASH_TYPE_LOTUS5)
8201 {
8202 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8203 digest_buf[0],
8204 digest_buf[1],
8205 digest_buf[2],
8206 digest_buf[3]);
8207 }
8208 else if (hash_type == HASH_TYPE_LOTUS6)
8209 {
8210 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8211 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8212 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8213 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8214
8215 char buf[16];
8216
8217 memcpy (buf + 0, salt.salt_buf, 5);
8218 memcpy (buf + 5, digest_buf, 9);
8219
8220 buf[3] -= -4;
8221
8222 base64_encode (int_to_lotus64, buf, 14, tmp_buf);
8223
8224 tmp_buf[18] = salt.salt_buf_pc[7];
8225 tmp_buf[19] = 0;
8226
8227 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8228 }
8229 else if (hash_type == HASH_TYPE_LOTUS8)
8230 {
8231 char buf[52];
8232
8233 memset (buf, 0, sizeof (buf));
8234
8235 // salt
8236
8237 memcpy (buf + 0, salt.salt_buf, 16);
8238
8239 buf[3] -= -4;
8240
8241 // iteration
8242
8243 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8244
8245 // chars
8246
8247 buf[26] = salt.salt_buf_pc[0];
8248 buf[27] = salt.salt_buf_pc[1];
8249
8250 // digest
8251
8252 memcpy (buf + 28, digest_buf, 8);
8253
8254 base64_encode (int_to_lotus64, buf, 36, tmp_buf);
8255
8256 tmp_buf[49] = 0;
8257
8258 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8259 }
8260 else if (hash_type == HASH_TYPE_CRC32)
8261 {
8262 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8263 }
8264 }
8265
8266 if (salt_type == SALT_TYPE_INTERN)
8267 {
8268 size_t pos = strlen (out_buf);
8269
8270 out_buf[pos] = data.separator;
8271
8272 char *ptr = (char *) salt.salt_buf;
8273
8274 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8275
8276 out_buf[pos + 1 + salt.salt_len] = 0;
8277 }
8278 }
8279
8280 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8281 {
8282 memset (hccap, 0, sizeof (hccap_t));
8283
8284 salt_t *salt = &data.salts_buf[salt_pos];
8285
8286 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8287
8288 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8289 wpa_t *wpa = &wpas[salt_pos];
8290
8291 hccap->keyver = wpa->keyver;
8292
8293 hccap->eapol_size = wpa->eapol_size;
8294
8295 if (wpa->keyver != 1)
8296 {
8297 uint eapol_tmp[64];
8298
8299 for (uint i = 0; i < 64; i++)
8300 {
8301 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8302 }
8303
8304 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8305 }
8306 else
8307 {
8308 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8309 }
8310
8311 uint pke_tmp[25];
8312
8313 for (int i = 5; i < 25; i++)
8314 {
8315 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8316 }
8317
8318 char *pke_ptr = (char *) pke_tmp;
8319
8320 memcpy (hccap->mac1, pke_ptr + 23, 6);
8321 memcpy (hccap->mac2, pke_ptr + 29, 6);
8322 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8323 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8324
8325 char *digests_buf_ptr = (char *) data.digests_buf;
8326
8327 uint dgst_size = data.dgst_size;
8328
8329 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8330
8331 if (wpa->keyver != 1)
8332 {
8333 uint digest_tmp[4];
8334
8335 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8336 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8337 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8338 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8339
8340 memcpy (hccap->keymic, digest_tmp, 16);
8341 }
8342 else
8343 {
8344 memcpy (hccap->keymic, digest_ptr, 16);
8345 }
8346 }
8347
8348 void SuspendThreads ()
8349 {
8350 if (data.devices_status == STATUS_RUNNING)
8351 {
8352 hc_timer_set (&data.timer_paused);
8353
8354 data.devices_status = STATUS_PAUSED;
8355
8356 log_info ("Paused");
8357 }
8358 }
8359
8360 void ResumeThreads ()
8361 {
8362 if (data.devices_status == STATUS_PAUSED)
8363 {
8364 float ms_paused;
8365
8366 hc_timer_get (data.timer_paused, ms_paused);
8367
8368 data.ms_paused += ms_paused;
8369
8370 data.devices_status = STATUS_RUNNING;
8371
8372 log_info ("Resumed");
8373 }
8374 }
8375
8376 void bypass ()
8377 {
8378 if (data.devices_status != STATUS_RUNNING) return;
8379
8380 data.devices_status = STATUS_BYPASS;
8381
8382 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8383 }
8384
8385 void stop_at_checkpoint ()
8386 {
8387 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8388 {
8389 if (data.devices_status != STATUS_RUNNING) return;
8390 }
8391
8392 // this feature only makes sense if --restore-disable was not specified
8393
8394 if (data.restore_disable == 1)
8395 {
8396 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8397
8398 return;
8399 }
8400
8401 // check if monitoring of Restore Point updates should be enabled or disabled
8402
8403 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8404 {
8405 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8406
8407 // save the current restore point value
8408
8409 data.checkpoint_cur_words = get_lowest_words_done ();
8410
8411 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8412 }
8413 else
8414 {
8415 data.devices_status = STATUS_RUNNING;
8416
8417 // reset the global value for checkpoint checks
8418
8419 data.checkpoint_cur_words = 0;
8420
8421 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8422 }
8423 }
8424
8425 void myabort ()
8426 {
8427 if (data.devices_status == STATUS_INIT) return;
8428 if (data.devices_status == STATUS_STARTING) return;
8429
8430 data.devices_status = STATUS_ABORTED;
8431 }
8432
8433 void myquit ()
8434 {
8435 if (data.devices_status == STATUS_INIT) return;
8436 if (data.devices_status == STATUS_STARTING) return;
8437
8438 data.devices_status = STATUS_QUIT;
8439 }
8440
8441 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const unsigned char **kernel_sources)
8442 {
8443 FILE *fp;
8444
8445 if ((fp = fopen (kernel_file, "rb")) != NULL)
8446 {
8447 struct stat st;
8448
8449 memset (&st, 0, sizeof (st));
8450
8451 stat (kernel_file, &st);
8452
8453 unsigned char *buf = (unsigned char *) mymalloc (st.st_size + 1);
8454
8455 size_t num_read = fread (buf, sizeof (unsigned char), st.st_size, fp);
8456
8457 if (num_read != (size_t) st.st_size)
8458 {
8459 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8460
8461 exit (-1);
8462 }
8463
8464 fclose (fp);
8465
8466 buf[st.st_size] = 0;
8467
8468 for (int i = 0; i < num_devices; i++)
8469 {
8470 kernel_lengths[i] = (size_t) st.st_size;
8471
8472 kernel_sources[i] = buf;
8473 }
8474 }
8475 else
8476 {
8477 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8478
8479 exit (-1);
8480 }
8481
8482 return;
8483 }
8484
8485 void writeProgramBin (char *dst, unsigned char *binary, size_t binary_size)
8486 {
8487 FILE *fp = fopen (dst, "wb");
8488
8489 fwrite (binary, sizeof (unsigned char), binary_size, fp);
8490
8491 fflush (fp);
8492 fclose (fp);
8493 }
8494
8495 /**
8496 * restore
8497 */
8498
8499 restore_data_t *init_restore (int argc, char **argv)
8500 {
8501 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8502
8503 if (data.restore_disable == 0)
8504 {
8505 FILE *fp = fopen (data.eff_restore_file, "rb");
8506
8507 if (fp)
8508 {
8509 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8510
8511 if (nread != 1)
8512 {
8513 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8514
8515 exit (-1);
8516 }
8517
8518 fclose (fp);
8519
8520 if (rd->pid)
8521 {
8522 char pidbin[BUFSIZ];
8523
8524 int pidbin_len;
8525
8526 #ifdef _POSIX
8527 memset (pidbin, 0, sizeof (pidbin));
8528
8529 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8530
8531 FILE *fd = fopen (pidbin, "rb");
8532
8533 if (fd)
8534 {
8535 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8536
8537 pidbin[pidbin_len] = 0;
8538
8539 fclose (fd);
8540
8541 char *argv0_r = strrchr (argv[0], '/');
8542
8543 char *pidbin_r = strrchr (pidbin, '/');
8544
8545 if (argv0_r == NULL) argv0_r = argv[0];
8546
8547 if (pidbin_r == NULL) pidbin_r = pidbin;
8548
8549 if (strcmp (argv0_r, pidbin_r) == 0)
8550 {
8551 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8552
8553 exit (-1);
8554 }
8555 }
8556
8557 #elif _WIN
8558 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8559
8560 char pidbin2[BUFSIZ];
8561
8562 int pidbin2_len;
8563
8564 memset (pidbin2, 0, sizeof (pidbin2));
8565
8566 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8567 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8568
8569 pidbin[pidbin_len] = 0;
8570 pidbin2[pidbin2_len] = 0;
8571
8572 if (pidbin2_len)
8573 {
8574 if (strcmp (pidbin, pidbin2) == 0)
8575 {
8576 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8577
8578 exit (-1);
8579 }
8580 }
8581 #endif
8582 }
8583
8584 if (rd->version_bin < RESTORE_MIN)
8585 {
8586 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8587
8588 exit (-1);
8589 }
8590 }
8591 }
8592
8593 memset (rd, 0, sizeof (restore_data_t));
8594
8595 rd->version_bin = VERSION_BIN;
8596
8597 #ifdef _POSIX
8598 rd->pid = getpid ();
8599 #elif _WIN
8600 rd->pid = GetCurrentProcessId ();
8601 #endif
8602
8603 if (getcwd (rd->cwd, 255) == NULL)
8604 {
8605 myfree (rd);
8606
8607 return (NULL);
8608 }
8609
8610 rd->argc = argc;
8611 rd->argv = argv;
8612
8613 return (rd);
8614 }
8615
8616 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8617 {
8618 FILE *fp = fopen (eff_restore_file, "rb");
8619
8620 if (fp == NULL)
8621 {
8622 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8623
8624 exit (-1);
8625 }
8626
8627 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8628 {
8629 log_error ("ERROR: cannot read %s", eff_restore_file);
8630
8631 exit (-1);
8632 }
8633
8634 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8635
8636 for (uint i = 0; i < rd->argc; i++)
8637 {
8638 char buf[BUFSIZ];
8639
8640 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8641 {
8642 log_error ("ERROR: cannot read %s", eff_restore_file);
8643
8644 exit (-1);
8645 }
8646
8647 size_t len = strlen (buf);
8648
8649 if (len) buf[len - 1] = 0;
8650
8651 rd->argv[i] = mystrdup (buf);
8652 }
8653
8654 fclose (fp);
8655
8656 char new_cwd[256];
8657
8658 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8659
8660 if (nwd == NULL)
8661 {
8662 log_error ("Restore file is corrupted");
8663 }
8664
8665 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8666 {
8667 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8668 {
8669 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8670
8671 exit (-1);
8672 }
8673
8674 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8675 }
8676
8677
8678 if (chdir (rd->cwd))
8679 {
8680 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8681
8682 exit (-1);
8683 }
8684 }
8685
8686 uint64_t get_lowest_words_done ()
8687 {
8688 uint64_t words_cur = -1;
8689
8690 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8691 {
8692 hc_device_param_t *device_param = &data.devices_param[device_id];
8693
8694 const uint64_t words_done = device_param->words_done;
8695
8696 if (words_done < words_cur) words_cur = words_done;
8697 }
8698
8699 // It's possible that a GPU's workload isn't finished right after a restore-case.
8700 // In that case, this function would return 0 and overwrite the real restore point
8701 // There's also data.words_cur which is set to rd->words_cur but it changes while
8702 // the attack is running therefore we should stick to rd->words_cur.
8703 // Note that -s influences rd->words_cur we should keep a close look on that.
8704
8705 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
8706
8707 return words_cur;
8708 }
8709
8710 void write_restore (const char *new_restore_file, restore_data_t *rd)
8711 {
8712 uint64_t words_cur = get_lowest_words_done ();
8713
8714 rd->words_cur = words_cur;
8715
8716 FILE *fp = fopen (new_restore_file, "wb");
8717
8718 if (fp == NULL)
8719 {
8720 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
8721
8722 exit (-1);
8723 }
8724
8725 if (setvbuf (fp, NULL, _IONBF, 0))
8726 {
8727 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
8728
8729 exit (-1);
8730 }
8731
8732 fwrite (rd, sizeof (restore_data_t), 1, fp);
8733
8734 for (uint i = 0; i < rd->argc; i++)
8735 {
8736 fprintf (fp, "%s", rd->argv[i]);
8737 fputc ('\n', fp);
8738 }
8739
8740 fflush (fp);
8741
8742 fsync (fileno (fp));
8743
8744 fclose (fp);
8745 }
8746
8747 void cycle_restore ()
8748 {
8749 const char *eff_restore_file = data.eff_restore_file;
8750 const char *new_restore_file = data.new_restore_file;
8751
8752 restore_data_t *rd = data.rd;
8753
8754 write_restore (new_restore_file, rd);
8755
8756 struct stat st;
8757
8758 memset (&st, 0, sizeof(st));
8759
8760 if (stat (eff_restore_file, &st) == 0)
8761 {
8762 if (unlink (eff_restore_file))
8763 {
8764 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
8765 }
8766 }
8767
8768 if (rename (new_restore_file, eff_restore_file))
8769 {
8770 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
8771 }
8772 }
8773
8774 void check_checkpoint ()
8775 {
8776 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
8777
8778 uint64_t words_cur = get_lowest_words_done ();
8779
8780 if (words_cur != data.checkpoint_cur_words)
8781 {
8782 myabort ();
8783 }
8784 }
8785
8786 /**
8787 * adjustments
8788 */
8789
8790 uint set_gpu_accel (uint hash_mode)
8791 {
8792 switch (hash_mode)
8793 {
8794 case 0: return GET_ACCEL (0);
8795 case 10: return GET_ACCEL (10);
8796 case 11: return GET_ACCEL (11);
8797 case 12: return GET_ACCEL (12);
8798 case 20: return GET_ACCEL (20);
8799 case 21: return GET_ACCEL (21);
8800 case 22: return GET_ACCEL (22);
8801 case 23: return GET_ACCEL (23);
8802 case 30: return GET_ACCEL (30);
8803 case 40: return GET_ACCEL (40);
8804 case 50: return GET_ACCEL (50);
8805 case 60: return GET_ACCEL (60);
8806 case 100: return GET_ACCEL (100);
8807 case 101: return GET_ACCEL (101);
8808 case 110: return GET_ACCEL (110);
8809 case 111: return GET_ACCEL (111);
8810 case 112: return GET_ACCEL (112);
8811 case 120: return GET_ACCEL (120);
8812 case 121: return GET_ACCEL (121);
8813 case 122: return GET_ACCEL (122);
8814 case 124: return GET_ACCEL (124);
8815 case 130: return GET_ACCEL (130);
8816 case 131: return GET_ACCEL (131);
8817 case 132: return GET_ACCEL (132);
8818 case 133: return GET_ACCEL (133);
8819 case 140: return GET_ACCEL (140);
8820 case 141: return GET_ACCEL (141);
8821 case 150: return GET_ACCEL (150);
8822 case 160: return GET_ACCEL (160);
8823 case 190: return GET_ACCEL (190);
8824 case 200: return GET_ACCEL (200);
8825 case 300: return GET_ACCEL (300);
8826 case 400: return GET_ACCEL (400);
8827 case 500: return GET_ACCEL (500);
8828 case 501: return GET_ACCEL (501);
8829 case 900: return GET_ACCEL (900);
8830 case 910: return GET_ACCEL (910);
8831 case 1000: return GET_ACCEL (1000);
8832 case 1100: return GET_ACCEL (1100);
8833 case 1400: return GET_ACCEL (1400);
8834 case 1410: return GET_ACCEL (1410);
8835 case 1420: return GET_ACCEL (1420);
8836 case 1421: return GET_ACCEL (1421);
8837 case 1430: return GET_ACCEL (1430);
8838 case 1440: return GET_ACCEL (1440);
8839 case 1441: return GET_ACCEL (1441);
8840 case 1450: return GET_ACCEL (1450);
8841 case 1460: return GET_ACCEL (1460);
8842 case 1500: return GET_ACCEL (1500);
8843 case 1600: return GET_ACCEL (1600);
8844 case 1700: return GET_ACCEL (1700);
8845 case 1710: return GET_ACCEL (1710);
8846 case 1711: return GET_ACCEL (1711);
8847 case 1720: return GET_ACCEL (1720);
8848 case 1722: return GET_ACCEL (1722);
8849 case 1730: return GET_ACCEL (1730);
8850 case 1731: return GET_ACCEL (1731);
8851 case 1740: return GET_ACCEL (1740);
8852 case 1750: return GET_ACCEL (1750);
8853 case 1760: return GET_ACCEL (1760);
8854 case 1800: return GET_ACCEL (1800);
8855 case 2100: return GET_ACCEL (2100);
8856 case 2400: return GET_ACCEL (2400);
8857 case 2410: return GET_ACCEL (2410);
8858 case 2500: return GET_ACCEL (2500);
8859 case 2600: return GET_ACCEL (2600);
8860 case 2611: return GET_ACCEL (2611);
8861 case 2612: return GET_ACCEL (2612);
8862 case 2711: return GET_ACCEL (2711);
8863 case 2811: return GET_ACCEL (2811);
8864 case 3000: return GET_ACCEL (3000);
8865 case 3100: return GET_ACCEL (3100);
8866 case 3200: return GET_ACCEL (3200);
8867 case 3710: return GET_ACCEL (3710);
8868 case 3711: return GET_ACCEL (3711);
8869 case 3800: return GET_ACCEL (3800);
8870 case 4300: return GET_ACCEL (4300);
8871 case 4400: return GET_ACCEL (4400);
8872 case 4500: return GET_ACCEL (4500);
8873 case 4700: return GET_ACCEL (4700);
8874 case 4800: return GET_ACCEL (4800);
8875 case 4900: return GET_ACCEL (4900);
8876 case 5000: return GET_ACCEL (5000);
8877 case 5100: return GET_ACCEL (5100);
8878 case 5200: return GET_ACCEL (5200);
8879 case 5300: return GET_ACCEL (5300);
8880 case 5400: return GET_ACCEL (5400);
8881 case 5500: return GET_ACCEL (5500);
8882 case 5600: return GET_ACCEL (5600);
8883 case 5700: return GET_ACCEL (5700);
8884 case 5800: return GET_ACCEL (5800);
8885 case 6000: return GET_ACCEL (6000);
8886 case 6100: return GET_ACCEL (6100);
8887 case 6211: return GET_ACCEL (6211);
8888 case 6212: return GET_ACCEL (6212);
8889 case 6213: return GET_ACCEL (6213);
8890 case 6221: return GET_ACCEL (6221);
8891 case 6222: return GET_ACCEL (6222);
8892 case 6223: return GET_ACCEL (6223);
8893 case 6231: return GET_ACCEL (6231);
8894 case 6232: return GET_ACCEL (6232);
8895 case 6233: return GET_ACCEL (6233);
8896 case 6241: return GET_ACCEL (6241);
8897 case 6242: return GET_ACCEL (6242);
8898 case 6243: return GET_ACCEL (6243);
8899 case 6300: return GET_ACCEL (6300);
8900 case 6400: return GET_ACCEL (6400);
8901 case 6500: return GET_ACCEL (6500);
8902 case 6600: return GET_ACCEL (6600);
8903 case 6700: return GET_ACCEL (6700);
8904 case 6800: return GET_ACCEL (6800);
8905 case 6900: return GET_ACCEL (6900);
8906 case 7100: return GET_ACCEL (7100);
8907 case 7200: return GET_ACCEL (7200);
8908 case 7300: return GET_ACCEL (7300);
8909 case 7400: return GET_ACCEL (7400);
8910 case 7500: return GET_ACCEL (7500);
8911 case 7600: return GET_ACCEL (7600);
8912 case 7700: return GET_ACCEL (7700);
8913 case 7800: return GET_ACCEL (7800);
8914 case 7900: return GET_ACCEL (7900);
8915 case 8000: return GET_ACCEL (8000);
8916 case 8100: return GET_ACCEL (8100);
8917 case 8200: return GET_ACCEL (8200);
8918 case 8300: return GET_ACCEL (8300);
8919 case 8400: return GET_ACCEL (8400);
8920 case 8500: return GET_ACCEL (8500);
8921 case 8600: return GET_ACCEL (8600);
8922 case 8700: return GET_ACCEL (8700);
8923 case 8800: return GET_ACCEL (8800);
8924 case 8900: return GET_ACCEL (8900);
8925 case 9000: return GET_ACCEL (9000);
8926 case 9100: return GET_ACCEL (9100);
8927 case 9200: return GET_ACCEL (9200);
8928 case 9300: return GET_ACCEL (9300);
8929 case 9400: return GET_ACCEL (9400);
8930 case 9500: return GET_ACCEL (9500);
8931 case 9600: return GET_ACCEL (9600);
8932 case 9700: return GET_ACCEL (9700);
8933 case 9710: return GET_ACCEL (9710);
8934 case 9720: return GET_ACCEL (9720);
8935 case 9800: return GET_ACCEL (9800);
8936 case 9810: return GET_ACCEL (9810);
8937 case 9820: return GET_ACCEL (9820);
8938 case 9900: return GET_ACCEL (9900);
8939 case 10000: return GET_ACCEL (10000);
8940 case 10100: return GET_ACCEL (10100);
8941 case 10200: return GET_ACCEL (10200);
8942 case 10300: return GET_ACCEL (10300);
8943 case 10400: return GET_ACCEL (10400);
8944 case 10410: return GET_ACCEL (10410);
8945 case 10420: return GET_ACCEL (10420);
8946 case 10500: return GET_ACCEL (10500);
8947 case 10600: return GET_ACCEL (10600);
8948 case 10700: return GET_ACCEL (10700);
8949 case 10800: return GET_ACCEL (10800);
8950 case 10900: return GET_ACCEL (10900);
8951 case 11000: return GET_ACCEL (11000);
8952 case 11100: return GET_ACCEL (11100);
8953 case 11200: return GET_ACCEL (11200);
8954 case 11300: return GET_ACCEL (11300);
8955 case 11400: return GET_ACCEL (11400);
8956 case 11500: return GET_ACCEL (11500);
8957 case 11600: return GET_ACCEL (11600);
8958 case 11700: return GET_ACCEL (11700);
8959 case 11800: return GET_ACCEL (11800);
8960 case 11900: return GET_ACCEL (11900);
8961 case 12000: return GET_ACCEL (12000);
8962 case 12100: return GET_ACCEL (12100);
8963 case 12200: return GET_ACCEL (12200);
8964 case 12300: return GET_ACCEL (12300);
8965 case 12400: return GET_ACCEL (12400);
8966 case 12500: return GET_ACCEL (12500);
8967 case 12600: return GET_ACCEL (12600);
8968 case 12700: return GET_ACCEL (12700);
8969 case 12800: return GET_ACCEL (12800);
8970 }
8971
8972 return 0;
8973 }
8974
8975 uint set_gpu_loops (uint hash_mode)
8976 {
8977 switch (hash_mode)
8978 {
8979 case 0: return GET_LOOPS (0);
8980 case 10: return GET_LOOPS (10);
8981 case 11: return GET_LOOPS (11);
8982 case 12: return GET_LOOPS (12);
8983 case 20: return GET_LOOPS (20);
8984 case 21: return GET_LOOPS (21);
8985 case 22: return GET_LOOPS (22);
8986 case 23: return GET_LOOPS (23);
8987 case 30: return GET_LOOPS (30);
8988 case 40: return GET_LOOPS (40);
8989 case 50: return GET_LOOPS (50);
8990 case 60: return GET_LOOPS (60);
8991 case 100: return GET_LOOPS (100);
8992 case 101: return GET_LOOPS (101);
8993 case 110: return GET_LOOPS (110);
8994 case 111: return GET_LOOPS (111);
8995 case 112: return GET_LOOPS (112);
8996 case 120: return GET_LOOPS (120);
8997 case 121: return GET_LOOPS (121);
8998 case 122: return GET_LOOPS (122);
8999 case 124: return GET_LOOPS (124);
9000 case 130: return GET_LOOPS (130);
9001 case 131: return GET_LOOPS (131);
9002 case 132: return GET_LOOPS (132);
9003 case 133: return GET_LOOPS (133);
9004 case 140: return GET_LOOPS (140);
9005 case 141: return GET_LOOPS (141);
9006 case 150: return GET_LOOPS (150);
9007 case 160: return GET_LOOPS (160);
9008 case 190: return GET_LOOPS (190);
9009 case 200: return GET_LOOPS (200);
9010 case 300: return GET_LOOPS (300);
9011 case 400: return GET_LOOPS (400);
9012 case 500: return GET_LOOPS (500);
9013 case 501: return GET_LOOPS (501);
9014 case 900: return GET_LOOPS (900);
9015 case 910: return GET_LOOPS (910);
9016 case 1000: return GET_LOOPS (1000);
9017 case 1100: return GET_LOOPS (1100);
9018 case 1400: return GET_LOOPS (1400);
9019 case 1410: return GET_LOOPS (1410);
9020 case 1420: return GET_LOOPS (1420);
9021 case 1421: return GET_LOOPS (1421);
9022 case 1430: return GET_LOOPS (1430);
9023 case 1440: return GET_LOOPS (1440);
9024 case 1441: return GET_LOOPS (1441);
9025 case 1450: return GET_LOOPS (1450);
9026 case 1460: return GET_LOOPS (1460);
9027 case 1500: return GET_LOOPS (1500);
9028 case 1600: return GET_LOOPS (1600);
9029 case 1700: return GET_LOOPS (1700);
9030 case 1710: return GET_LOOPS (1710);
9031 case 1711: return GET_LOOPS (1711);
9032 case 1720: return GET_LOOPS (1720);
9033 case 1722: return GET_LOOPS (1722);
9034 case 1730: return GET_LOOPS (1730);
9035 case 1731: return GET_LOOPS (1731);
9036 case 1740: return GET_LOOPS (1740);
9037 case 1750: return GET_LOOPS (1750);
9038 case 1760: return GET_LOOPS (1760);
9039 case 1800: return GET_LOOPS (1800);
9040 case 2100: return GET_LOOPS (2100);
9041 case 2400: return GET_LOOPS (2400);
9042 case 2410: return GET_LOOPS (2410);
9043 case 2500: return GET_LOOPS (2500);
9044 case 2600: return GET_LOOPS (2600);
9045 case 2611: return GET_LOOPS (2611);
9046 case 2612: return GET_LOOPS (2612);
9047 case 2711: return GET_LOOPS (2711);
9048 case 2811: return GET_LOOPS (2811);
9049 case 3000: return GET_LOOPS (3000);
9050 case 3100: return GET_LOOPS (3100);
9051 case 3200: return GET_LOOPS (3200);
9052 case 3710: return GET_LOOPS (3710);
9053 case 3711: return GET_LOOPS (3711);
9054 case 3800: return GET_LOOPS (3800);
9055 case 4300: return GET_LOOPS (4300);
9056 case 4400: return GET_LOOPS (4400);
9057 case 4500: return GET_LOOPS (4500);
9058 case 4700: return GET_LOOPS (4700);
9059 case 4800: return GET_LOOPS (4800);
9060 case 4900: return GET_LOOPS (4900);
9061 case 5000: return GET_LOOPS (5000);
9062 case 5100: return GET_LOOPS (5100);
9063 case 5200: return GET_LOOPS (5200);
9064 case 5300: return GET_LOOPS (5300);
9065 case 5400: return GET_LOOPS (5400);
9066 case 5500: return GET_LOOPS (5500);
9067 case 5600: return GET_LOOPS (5600);
9068 case 5700: return GET_LOOPS (5700);
9069 case 5800: return GET_LOOPS (5800);
9070 case 6000: return GET_LOOPS (6000);
9071 case 6100: return GET_LOOPS (6100);
9072 case 6211: return GET_LOOPS (6211);
9073 case 6212: return GET_LOOPS (6212);
9074 case 6213: return GET_LOOPS (6213);
9075 case 6221: return GET_LOOPS (6221);
9076 case 6222: return GET_LOOPS (6222);
9077 case 6223: return GET_LOOPS (6223);
9078 case 6231: return GET_LOOPS (6231);
9079 case 6232: return GET_LOOPS (6232);
9080 case 6233: return GET_LOOPS (6233);
9081 case 6241: return GET_LOOPS (6241);
9082 case 6242: return GET_LOOPS (6242);
9083 case 6243: return GET_LOOPS (6243);
9084 case 6300: return GET_LOOPS (6300);
9085 case 6400: return GET_LOOPS (6400);
9086 case 6500: return GET_LOOPS (6500);
9087 case 6600: return GET_LOOPS (6600);
9088 case 6700: return GET_LOOPS (6700);
9089 case 6800: return GET_LOOPS (6800);
9090 case 6900: return GET_LOOPS (6900);
9091 case 7100: return GET_LOOPS (7100);
9092 case 7200: return GET_LOOPS (7200);
9093 case 7300: return GET_LOOPS (7300);
9094 case 7400: return GET_LOOPS (7400);
9095 case 7500: return GET_LOOPS (7500);
9096 case 7600: return GET_LOOPS (7600);
9097 case 7700: return GET_LOOPS (7700);
9098 case 7800: return GET_LOOPS (7800);
9099 case 7900: return GET_LOOPS (7900);
9100 case 8000: return GET_LOOPS (8000);
9101 case 8100: return GET_LOOPS (8100);
9102 case 8200: return GET_LOOPS (8200);
9103 case 8300: return GET_LOOPS (8300);
9104 case 8400: return GET_LOOPS (8400);
9105 case 8500: return GET_LOOPS (8500);
9106 case 8600: return GET_LOOPS (8600);
9107 case 8700: return GET_LOOPS (8700);
9108 case 8800: return GET_LOOPS (8800);
9109 case 8900: return GET_LOOPS (8900);
9110 case 9000: return GET_LOOPS (9000);
9111 case 9100: return GET_LOOPS (9100);
9112 case 9200: return GET_LOOPS (9200);
9113 case 9300: return GET_LOOPS (9300);
9114 case 9400: return GET_LOOPS (9400);
9115 case 9500: return GET_LOOPS (9500);
9116 case 9600: return GET_LOOPS (9600);
9117 case 9700: return GET_LOOPS (9700);
9118 case 9710: return GET_LOOPS (9710);
9119 case 9720: return GET_LOOPS (9720);
9120 case 9800: return GET_LOOPS (9800);
9121 case 9810: return GET_LOOPS (9810);
9122 case 9820: return GET_LOOPS (9820);
9123 case 9900: return GET_LOOPS (9900);
9124 case 10000: return GET_LOOPS (10000);
9125 case 10100: return GET_LOOPS (10100);
9126 case 10200: return GET_LOOPS (10200);
9127 case 10300: return GET_LOOPS (10300);
9128 case 10400: return GET_LOOPS (10400);
9129 case 10410: return GET_LOOPS (10410);
9130 case 10420: return GET_LOOPS (10420);
9131 case 10500: return GET_LOOPS (10500);
9132 case 10600: return GET_LOOPS (10600);
9133 case 10700: return GET_LOOPS (10700);
9134 case 10800: return GET_LOOPS (10800);
9135 case 10900: return GET_LOOPS (10900);
9136 case 11000: return GET_LOOPS (11000);
9137 case 11100: return GET_LOOPS (11100);
9138 case 11200: return GET_LOOPS (11200);
9139 case 11300: return GET_LOOPS (11300);
9140 case 11400: return GET_LOOPS (11400);
9141 case 11500: return GET_LOOPS (11500);
9142 case 11600: return GET_LOOPS (11600);
9143 case 11700: return GET_LOOPS (11700);
9144 case 11800: return GET_LOOPS (11800);
9145 case 11900: return GET_LOOPS (11900);
9146 case 12000: return GET_LOOPS (12000);
9147 case 12100: return GET_LOOPS (12100);
9148 case 12200: return GET_LOOPS (12200);
9149 case 12300: return GET_LOOPS (12300);
9150 case 12400: return GET_LOOPS (12400);
9151 case 12500: return GET_LOOPS (12500);
9152 case 12600: return GET_LOOPS (12600);
9153 case 12700: return GET_LOOPS (12700);
9154 case 12800: return GET_LOOPS (12800);
9155 }
9156
9157 return 0;
9158 }
9159
9160 /**
9161 * parser
9162 */
9163
9164 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9165 {
9166 char tmp[256];
9167
9168 if (salt_len > sizeof(tmp))
9169 {
9170 return UINT_MAX;
9171 }
9172
9173 memset (tmp, 0, sizeof (tmp));
9174 memcpy (tmp, in, salt_len);
9175
9176 if (data.opts_type & OPTS_TYPE_ST_HEX)
9177 {
9178 if ((salt_len % 2) == 0)
9179 {
9180 uint new_salt_len = salt_len / 2;
9181
9182 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9183 {
9184 char p0 = tmp[j + 0];
9185 char p1 = tmp[j + 1];
9186
9187 tmp[i] = hex_convert (p1) << 0;
9188 tmp[i] |= hex_convert (p0) << 4;
9189 }
9190
9191 salt_len = new_salt_len;
9192 }
9193 else
9194 {
9195 return UINT_MAX;
9196 }
9197 }
9198 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9199 {
9200 salt_len = base64_decode (base64_to_int, in, salt_len, tmp);
9201 }
9202
9203 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9204
9205 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9206 {
9207 if (salt_len < 20)
9208 {
9209 uint *tmp_uint = (uint *) tmp;
9210
9211 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9212 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9213 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9214 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9215 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9216 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9217 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9218 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9219 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9220 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9221
9222 salt_len = salt_len * 2;
9223 }
9224 else
9225 {
9226 return UINT_MAX;
9227 }
9228 }
9229
9230 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9231 {
9232 lowercase (tmp, salt_len);
9233 }
9234
9235 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9236 {
9237 uppercase (tmp, salt_len);
9238 }
9239
9240 uint len = salt_len;
9241
9242 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9243 {
9244 tmp[len++] = 0x80;
9245 }
9246
9247 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9248 {
9249 tmp[len++] = 0x01;
9250 }
9251
9252 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9253 {
9254 uint *tmp_uint = (uint *) tmp;
9255
9256 uint max = len / 4;
9257
9258 if (len % 4) max++;
9259
9260 for (uint i = 0; i < max; i++)
9261 {
9262 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9263 }
9264
9265 // Important: we may need to increase the length of memcpy since
9266 // we don't want to "loose" some swapped bytes (could happen if
9267 // they do not perfectly fit in the 4-byte blocks)
9268 // Memcpy does always copy the bytes in the BE order, but since
9269 // we swapped them, some important bytes could be in positions
9270 // we normally skip with the original len
9271
9272 if (len % 4) len += 4 - (len % 4);
9273 }
9274
9275 memcpy (out, tmp, len);
9276
9277 return (salt_len);
9278 }
9279
9280 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9281 {
9282 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9283
9284 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9285
9286 uint32_t *digest = (uint32_t *) hash_buf->digest;
9287
9288 salt_t *salt = hash_buf->salt;
9289
9290 memcpy ((char *) salt->salt_sign, input_buf, 6);
9291
9292 char *iter_pos = input_buf + 4;
9293
9294 salt->salt_iter = 1 << atoi (iter_pos);
9295
9296 char *salt_pos = strchr (iter_pos, '$');
9297
9298 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9299
9300 salt_pos++;
9301
9302 uint salt_len = 16;
9303
9304 salt->salt_len = salt_len;
9305
9306 char tmp_buf[100];
9307
9308 memset (tmp_buf, 0, sizeof (tmp_buf));
9309
9310 base64_decode (bf64_to_int, salt_pos, 22, tmp_buf);
9311
9312 char *salt_buf_ptr = (char *) salt->salt_buf;
9313
9314 memcpy (salt_buf_ptr, tmp_buf, 16);
9315
9316 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9317 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9318 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9319 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9320
9321 char *hash_pos = salt_pos + 22;
9322
9323 memset (tmp_buf, 0, sizeof (tmp_buf));
9324
9325 base64_decode (bf64_to_int, hash_pos, 31, tmp_buf);
9326
9327 memcpy (digest, tmp_buf, 24);
9328
9329 digest[0] = byte_swap_32 (digest[0]);
9330 digest[1] = byte_swap_32 (digest[1]);
9331 digest[2] = byte_swap_32 (digest[2]);
9332 digest[3] = byte_swap_32 (digest[3]);
9333 digest[4] = byte_swap_32 (digest[4]);
9334 digest[5] = byte_swap_32 (digest[5]);
9335
9336 digest[5] &= ~0xff; // its just 23 not 24 !
9337
9338 return (PARSER_OK);
9339 }
9340
9341 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9342 {
9343 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9344
9345 uint32_t *digest = (uint32_t *) hash_buf->digest;
9346
9347 char tmp_buf[100];
9348
9349 memset (tmp_buf, 0, sizeof (tmp_buf));
9350
9351 base64_decode (itoa64_to_int, input_buf, 43, tmp_buf);
9352
9353 memcpy (digest, tmp_buf, 32);
9354
9355 digest[0] = byte_swap_32 (digest[0]);
9356 digest[1] = byte_swap_32 (digest[1]);
9357 digest[2] = byte_swap_32 (digest[2]);
9358 digest[3] = byte_swap_32 (digest[3]);
9359 digest[4] = byte_swap_32 (digest[4]);
9360 digest[5] = byte_swap_32 (digest[5]);
9361 digest[6] = byte_swap_32 (digest[6]);
9362 digest[7] = byte_swap_32 (digest[7]);
9363
9364 digest[0] -= SHA256M_A;
9365 digest[1] -= SHA256M_B;
9366 digest[2] -= SHA256M_C;
9367 digest[3] -= SHA256M_D;
9368 digest[4] -= SHA256M_E;
9369 digest[5] -= SHA256M_F;
9370 digest[6] -= SHA256M_G;
9371 digest[7] -= SHA256M_H;
9372
9373 return (PARSER_OK);
9374 }
9375
9376 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9377 {
9378 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9379
9380 uint32_t *digest = (uint32_t *) hash_buf->digest;
9381
9382 digest[0] = hex_to_uint (&input_buf[ 0]);
9383 digest[1] = hex_to_uint (&input_buf[ 8]);
9384
9385 digest[0] = byte_swap_32 (digest[0]);
9386 digest[1] = byte_swap_32 (digest[1]);
9387
9388 uint tt;
9389
9390 IP (digest[0], digest[1], tt);
9391
9392 digest[0] = digest[0];
9393 digest[1] = digest[1];
9394 digest[2] = 0;
9395 digest[3] = 0;
9396
9397 return (PARSER_OK);
9398 }
9399
9400 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9401 {
9402 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9403
9404 uint32_t *digest = (uint32_t *) hash_buf->digest;
9405
9406 salt_t *salt = hash_buf->salt;
9407
9408 char *hash_pos = input_buf + 8;
9409
9410 digest[0] = hex_to_uint (&hash_pos[ 0]);
9411 digest[1] = hex_to_uint (&hash_pos[ 8]);
9412 digest[2] = hex_to_uint (&hash_pos[16]);
9413 digest[3] = hex_to_uint (&hash_pos[24]);
9414 digest[4] = hex_to_uint (&hash_pos[32]);
9415
9416 digest[0] -= SHA1M_A;
9417 digest[1] -= SHA1M_B;
9418 digest[2] -= SHA1M_C;
9419 digest[3] -= SHA1M_D;
9420 digest[4] -= SHA1M_E;
9421
9422 uint salt_len = 8;
9423
9424 char *salt_buf_ptr = (char *) salt->salt_buf;
9425
9426 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9427
9428 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9429
9430 salt->salt_len = salt_len;
9431
9432 return (PARSER_OK);
9433 }
9434
9435 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9436 {
9437 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9438
9439 uint64_t *digest = (uint64_t *) hash_buf->digest;
9440
9441 salt_t *salt = hash_buf->salt;
9442
9443 char *hash_pos = input_buf + 8;
9444
9445 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
9446 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
9447 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
9448 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
9449 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
9450 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
9451 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
9452 digest[7] = hex_to_uint64_t (&hash_pos[112]);
9453
9454 digest[0] -= SHA512M_A;
9455 digest[1] -= SHA512M_B;
9456 digest[2] -= SHA512M_C;
9457 digest[3] -= SHA512M_D;
9458 digest[4] -= SHA512M_E;
9459 digest[5] -= SHA512M_F;
9460 digest[6] -= SHA512M_G;
9461 digest[7] -= SHA512M_H;
9462
9463 uint salt_len = 8;
9464
9465 char *salt_buf_ptr = (char *) salt->salt_buf;
9466
9467 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9468
9469 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9470
9471 salt->salt_len = salt_len;
9472
9473 return (PARSER_OK);
9474 }
9475
9476 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9477 {
9478 if (data.opts_type & OPTS_TYPE_ST_HEX)
9479 {
9480 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9481 }
9482 else
9483 {
9484 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9485 }
9486
9487 uint32_t *digest = (uint32_t *) hash_buf->digest;
9488
9489 salt_t *salt = hash_buf->salt;
9490
9491 digest[0] = hex_to_uint (&input_buf[ 0]);
9492 digest[1] = hex_to_uint (&input_buf[ 8]);
9493 digest[2] = hex_to_uint (&input_buf[16]);
9494 digest[3] = hex_to_uint (&input_buf[24]);
9495
9496 digest[0] = byte_swap_32 (digest[0]);
9497 digest[1] = byte_swap_32 (digest[1]);
9498 digest[2] = byte_swap_32 (digest[2]);
9499 digest[3] = byte_swap_32 (digest[3]);
9500
9501 digest[0] -= MD5M_A;
9502 digest[1] -= MD5M_B;
9503 digest[2] -= MD5M_C;
9504 digest[3] -= MD5M_D;
9505
9506 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9507
9508 uint salt_len = input_len - 32 - 1;
9509
9510 char *salt_buf = input_buf + 32 + 1;
9511
9512 char *salt_buf_ptr = (char *) salt->salt_buf;
9513
9514 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9515
9516 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9517
9518 salt->salt_len = salt_len;
9519
9520 return (PARSER_OK);
9521 }
9522
9523 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9524 {
9525 if (data.opts_type & OPTS_TYPE_ST_HEX)
9526 {
9527 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9528 }
9529 else
9530 {
9531 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9532 }
9533
9534 // unscramble
9535
9536 char clean_input_buf[32];
9537
9538 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9539 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9540
9541 for (int i = 0, j = 0, k = 0; i < 30; i++)
9542 {
9543 if (i == pos[j])
9544 {
9545 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9546
9547 j++;
9548 }
9549 else
9550 {
9551 clean_input_buf[k] = input_buf[i];
9552
9553 k++;
9554 }
9555 }
9556
9557 // base64 decode
9558
9559 uint32_t *digest = (uint32_t *) hash_buf->digest;
9560
9561 salt_t *salt = hash_buf->salt;
9562
9563 char a, b, c, d, e, f;
9564
9565 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9566 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9567 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9568 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9569 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9570 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9571
9572 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9573 | (((d << 12) | (e << 6) | (f)) << 0);
9574
9575 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9576 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9577 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9578 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9579 e = base64_to_int (clean_input_buf[10] & 0x7f);
9580 f = base64_to_int (clean_input_buf[11] & 0x7f);
9581
9582 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9583 | (((d << 12) | (e << 6) | (f)) << 0);
9584
9585 a = base64_to_int (clean_input_buf[12] & 0x7f);
9586 b = base64_to_int (clean_input_buf[13] & 0x7f);
9587 c = base64_to_int (clean_input_buf[14] & 0x7f);
9588 d = base64_to_int (clean_input_buf[15] & 0x7f);
9589 e = base64_to_int (clean_input_buf[16] & 0x7f);
9590 f = base64_to_int (clean_input_buf[17] & 0x7f);
9591
9592 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9593 | (((d << 12) | (e << 6) | (f)) << 0);
9594
9595 a = base64_to_int (clean_input_buf[18] & 0x7f);
9596 b = base64_to_int (clean_input_buf[19] & 0x7f);
9597 c = base64_to_int (clean_input_buf[20] & 0x7f);
9598 d = base64_to_int (clean_input_buf[21] & 0x7f);
9599 e = base64_to_int (clean_input_buf[22] & 0x7f);
9600 f = base64_to_int (clean_input_buf[23] & 0x7f);
9601
9602 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
9603 | (((d << 12) | (e << 6) | (f)) << 0);
9604
9605 digest[0] = byte_swap_32 (digest[0]);
9606 digest[1] = byte_swap_32 (digest[1]);
9607 digest[2] = byte_swap_32 (digest[2]);
9608 digest[3] = byte_swap_32 (digest[3]);
9609
9610 digest[0] -= MD5M_A;
9611 digest[1] -= MD5M_B;
9612 digest[2] -= MD5M_C;
9613 digest[3] -= MD5M_D;
9614
9615 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
9616
9617 uint salt_len = input_len - 30 - 1;
9618
9619 char *salt_buf = input_buf + 30 + 1;
9620
9621 char *salt_buf_ptr = (char *) salt->salt_buf;
9622
9623 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9624
9625 // max. salt length: salt_buf[32] => 32 - 22 (":Administration Tools:") = 10
9626 if (salt_len > 10) return (PARSER_SALT_LENGTH);
9627
9628 salt->salt_len = salt_len;
9629
9630 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9631
9632 salt->salt_len += 22;
9633
9634 return (PARSER_OK);
9635 }
9636
9637 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9638 {
9639 if (data.opts_type & OPTS_TYPE_ST_HEX)
9640 {
9641 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9642 }
9643 else
9644 {
9645 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9646 }
9647
9648 uint32_t *digest = (uint32_t *) hash_buf->digest;
9649
9650 salt_t *salt = hash_buf->salt;
9651
9652 digest[0] = hex_to_uint (&input_buf[ 0]);
9653 digest[1] = hex_to_uint (&input_buf[ 8]);
9654 digest[2] = hex_to_uint (&input_buf[16]);
9655 digest[3] = hex_to_uint (&input_buf[24]);
9656 digest[4] = hex_to_uint (&input_buf[32]);
9657
9658 digest[0] -= SHA1M_A;
9659 digest[1] -= SHA1M_B;
9660 digest[2] -= SHA1M_C;
9661 digest[3] -= SHA1M_D;
9662 digest[4] -= SHA1M_E;
9663
9664 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9665
9666 uint salt_len = input_len - 40 - 1;
9667
9668 char *salt_buf = input_buf + 40 + 1;
9669
9670 char *salt_buf_ptr = (char *) salt->salt_buf;
9671
9672 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9673
9674 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9675
9676 salt->salt_len = salt_len;
9677
9678 return (PARSER_OK);
9679 }
9680
9681 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9682 {
9683 if (data.opts_type & OPTS_TYPE_ST_HEX)
9684 {
9685 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9686 }
9687 else
9688 {
9689 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9690 }
9691
9692 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9693
9694 char *iter_pos = input_buf + 6;
9695
9696 salt_t *salt = hash_buf->salt;
9697
9698 salt->salt_iter = atoi (iter_pos) - 1;
9699
9700 char *salt_pos = strchr (iter_pos, '#');
9701
9702 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9703
9704 salt_pos++;
9705
9706 char *digest_pos = strchr (salt_pos, '#');
9707
9708 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9709
9710 digest_pos++;
9711
9712 uint salt_len = digest_pos - salt_pos - 1;
9713
9714 uint32_t *digest = (uint32_t *) hash_buf->digest;
9715
9716 digest[0] = hex_to_uint (&digest_pos[ 0]);
9717 digest[1] = hex_to_uint (&digest_pos[ 8]);
9718 digest[2] = hex_to_uint (&digest_pos[16]);
9719 digest[3] = hex_to_uint (&digest_pos[24]);
9720
9721 char *salt_buf_ptr = (char *) salt->salt_buf;
9722
9723 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9724
9725 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9726
9727 salt->salt_len = salt_len;
9728
9729 return (PARSER_OK);
9730 }
9731
9732 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9733 {
9734 uint32_t *digest = (uint32_t *) hash_buf->digest;
9735
9736 salt_t *salt = hash_buf->salt;
9737
9738 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9739
9740 hccap_t in;
9741
9742 memcpy (&in, input_buf, input_len);
9743
9744 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9745
9746 memcpy (digest, in.keymic, 16);
9747
9748 /*
9749 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9750 The phrase "Pairwise key expansion"
9751 Access Point Address (Referred to as Authenticator Address AA)
9752 Supplicant Address (referred to as Supplicant Address SA)
9753 Access Point Nonce (referred to as Authenticator Anonce)
9754 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9755 */
9756
9757 uint salt_len = strlen (in.essid);
9758
9759 memcpy (salt->salt_buf, in.essid, salt_len);
9760
9761 salt->salt_len = salt_len;
9762
9763 salt->salt_iter = ROUNDS_WPA2 - 1;
9764
9765 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
9766
9767 memcpy (pke_ptr, "Pairwise key expansion", 23);
9768
9769 if (memcmp (in.mac1, in.mac2, 6) < 0)
9770 {
9771 memcpy (pke_ptr + 23, in.mac1, 6);
9772 memcpy (pke_ptr + 29, in.mac2, 6);
9773 }
9774 else
9775 {
9776 memcpy (pke_ptr + 23, in.mac2, 6);
9777 memcpy (pke_ptr + 29, in.mac1, 6);
9778 }
9779
9780 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
9781 {
9782 memcpy (pke_ptr + 35, in.nonce1, 32);
9783 memcpy (pke_ptr + 67, in.nonce2, 32);
9784 }
9785 else
9786 {
9787 memcpy (pke_ptr + 35, in.nonce2, 32);
9788 memcpy (pke_ptr + 67, in.nonce1, 32);
9789 }
9790
9791 for (int i = 0; i < 25; i++)
9792 {
9793 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
9794 }
9795
9796 wpa->keyver = in.keyver;
9797
9798 if (wpa->keyver > 255)
9799 {
9800 log_info ("ATTENTION!");
9801 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
9802 log_info (" This could be due to a recent aircrack-ng bug.");
9803 log_info (" The key version was automatically reset to a reasonable value.");
9804 log_info ("");
9805
9806 wpa->keyver &= 0xff;
9807 }
9808
9809 wpa->eapol_size = in.eapol_size;
9810
9811 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
9812
9813 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
9814
9815 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
9816
9817 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
9818
9819 if (wpa->keyver == 1)
9820 {
9821 // nothing to do
9822 }
9823 else
9824 {
9825 digest[0] = byte_swap_32 (digest[0]);
9826 digest[1] = byte_swap_32 (digest[1]);
9827 digest[2] = byte_swap_32 (digest[2]);
9828 digest[3] = byte_swap_32 (digest[3]);
9829
9830 for (int i = 0; i < 64; i++)
9831 {
9832 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
9833 }
9834 }
9835
9836 salt->salt_buf[10] = digest[1];
9837 salt->salt_buf[11] = digest[2];
9838
9839 return (PARSER_OK);
9840 }
9841
9842 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9843 {
9844 uint32_t *digest = (uint32_t *) hash_buf->digest;
9845
9846 salt_t *salt = hash_buf->salt;
9847
9848 if (input_len == 0)
9849 {
9850 log_error ("Password Safe v2 container not specified");
9851
9852 exit (-1);
9853 }
9854
9855 FILE *fp = fopen (input_buf, "rb");
9856
9857 if (fp == NULL)
9858 {
9859 log_error ("%s: %s", input_buf, strerror (errno));
9860
9861 exit (-1);
9862 }
9863
9864 typedef struct
9865 {
9866 uint32_t random[2];
9867 uint32_t hash[5];
9868 uint32_t salt[5]; // unused, but makes better valid check
9869 uint32_t iv[2]; // unused, but makes better valid check
9870
9871 } psafe2_hdr;
9872
9873 psafe2_hdr buf;
9874
9875 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
9876
9877 fclose (fp);
9878
9879 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
9880
9881 salt->salt_buf[0] = buf.random[0];
9882 salt->salt_buf[1] = buf.random[1];
9883
9884 salt->salt_len = 8;
9885 salt->salt_iter = 1000;
9886
9887 digest[0] = byte_swap_32 (buf.hash[0]);
9888 digest[1] = byte_swap_32 (buf.hash[1]);
9889 digest[2] = byte_swap_32 (buf.hash[2]);
9890 digest[3] = byte_swap_32 (buf.hash[3]);
9891 digest[4] = byte_swap_32 (buf.hash[4]);
9892
9893 return (PARSER_OK);
9894 }
9895
9896 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9897 {
9898 uint32_t *digest = (uint32_t *) hash_buf->digest;
9899
9900 salt_t *salt = hash_buf->salt;
9901
9902 if (input_len == 0)
9903 {
9904 log_error (".psafe3 not specified");
9905
9906 exit (-1);
9907 }
9908
9909 FILE *fp = fopen (input_buf, "rb");
9910
9911 if (fp == NULL)
9912 {
9913 log_error ("%s: %s", input_buf, strerror (errno));
9914
9915 exit (-1);
9916 }
9917
9918 psafe3_t in;
9919
9920 int n = fread (&in, sizeof (psafe3_t), 1, fp);
9921
9922 fclose (fp);
9923
9924 data.hashfile = input_buf; // we will need this in case it gets cracked
9925
9926 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
9927
9928 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
9929
9930 salt->salt_iter = in.iterations + 1;
9931
9932 salt->salt_buf[0] = in.salt_buf[0];
9933 salt->salt_buf[1] = in.salt_buf[1];
9934 salt->salt_buf[2] = in.salt_buf[2];
9935 salt->salt_buf[3] = in.salt_buf[3];
9936 salt->salt_buf[4] = in.salt_buf[4];
9937 salt->salt_buf[5] = in.salt_buf[5];
9938 salt->salt_buf[6] = in.salt_buf[6];
9939 salt->salt_buf[7] = in.salt_buf[7];
9940
9941 salt->salt_len = 32;
9942
9943 digest[0] = in.hash_buf[0];
9944 digest[1] = in.hash_buf[1];
9945 digest[2] = in.hash_buf[2];
9946 digest[3] = in.hash_buf[3];
9947 digest[4] = in.hash_buf[4];
9948 digest[5] = in.hash_buf[5];
9949 digest[6] = in.hash_buf[6];
9950 digest[7] = in.hash_buf[7];
9951
9952 digest[0] = byte_swap_32 (digest[0]);
9953 digest[1] = byte_swap_32 (digest[1]);
9954 digest[2] = byte_swap_32 (digest[2]);
9955 digest[3] = byte_swap_32 (digest[3]);
9956 digest[4] = byte_swap_32 (digest[4]);
9957 digest[5] = byte_swap_32 (digest[5]);
9958 digest[6] = byte_swap_32 (digest[6]);
9959 digest[7] = byte_swap_32 (digest[7]);
9960
9961 return (PARSER_OK);
9962 }
9963
9964 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9965 {
9966 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
9967
9968 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
9969
9970 uint32_t *digest = (uint32_t *) hash_buf->digest;
9971
9972 salt_t *salt = hash_buf->salt;
9973
9974 char *iter_pos = input_buf + 3;
9975
9976 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
9977
9978 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
9979
9980 memcpy ((char *) salt->salt_sign, input_buf, 4);
9981
9982 salt->salt_iter = salt_iter;
9983
9984 char *salt_pos = iter_pos + 1;
9985
9986 uint salt_len = 8;
9987
9988 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
9989
9990 salt->salt_len = salt_len;
9991
9992 char *hash_pos = salt_pos + salt_len;
9993
9994 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
9995
9996 return (PARSER_OK);
9997 }
9998
9999 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10000 {
10001 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10002
10003 uint32_t *digest = (uint32_t *) hash_buf->digest;
10004
10005 salt_t *salt = hash_buf->salt;
10006
10007 char *salt_pos = input_buf + 3;
10008
10009 uint iterations_len = 0;
10010
10011 if (memcmp (salt_pos, "rounds=", 7) == 0)
10012 {
10013 salt_pos += 7;
10014
10015 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10016
10017 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10018 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10019
10020 salt_pos[0] = 0x0;
10021
10022 salt->salt_iter = atoi (salt_pos - iterations_len);
10023
10024 salt_pos += 1;
10025
10026 iterations_len += 8;
10027 }
10028 else
10029 {
10030 salt->salt_iter = ROUNDS_MD5CRYPT;
10031 }
10032
10033 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10034
10035 char *hash_pos = strchr (salt_pos, '$');
10036
10037 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10038
10039 uint salt_len = hash_pos - salt_pos;
10040
10041 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10042
10043 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10044
10045 salt->salt_len = salt_len;
10046
10047 hash_pos++;
10048
10049 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10050
10051 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10052
10053 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10054
10055 return (PARSER_OK);
10056 }
10057
10058 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10059 {
10060 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10061
10062 uint32_t *digest = (uint32_t *) hash_buf->digest;
10063
10064 salt_t *salt = hash_buf->salt;
10065
10066 char *salt_pos = input_buf + 6;
10067
10068 uint iterations_len = 0;
10069
10070 if (memcmp (salt_pos, "rounds=", 7) == 0)
10071 {
10072 salt_pos += 7;
10073
10074 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10075
10076 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10077 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10078
10079 salt_pos[0] = 0x0;
10080
10081 salt->salt_iter = atoi (salt_pos - iterations_len);
10082
10083 salt_pos += 1;
10084
10085 iterations_len += 8;
10086 }
10087 else
10088 {
10089 salt->salt_iter = ROUNDS_MD5CRYPT;
10090 }
10091
10092 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10093
10094 char *hash_pos = strchr (salt_pos, '$');
10095
10096 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10097
10098 uint salt_len = hash_pos - salt_pos;
10099
10100 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10101
10102 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10103
10104 salt->salt_len = salt_len;
10105
10106 hash_pos++;
10107
10108 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10109
10110 return (PARSER_OK);
10111 }
10112
10113 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10114 {
10115 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10116
10117 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10118
10119 uint32_t *digest = (uint32_t *) hash_buf->digest;
10120
10121 salt_t *salt = hash_buf->salt;
10122
10123 char *salt_pos = input_buf + 14;
10124
10125 char *hash_pos = strchr (salt_pos, '*');
10126
10127 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10128
10129 hash_pos++;
10130
10131 uint salt_len = hash_pos - salt_pos - 1;
10132
10133 char *salt_buf_ptr = (char *) salt->salt_buf;
10134
10135 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10136
10137 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10138
10139 salt->salt_len = salt_len;
10140
10141 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
10142
10143 base64_decode (base64_to_int, hash_pos, 27, tmp_buf);
10144
10145 memcpy (digest, tmp_buf, 20);
10146
10147 digest[0] = byte_swap_32 (digest[0]);
10148 digest[1] = byte_swap_32 (digest[1]);
10149 digest[2] = byte_swap_32 (digest[2]);
10150 digest[3] = byte_swap_32 (digest[3]);
10151 digest[4] = byte_swap_32 (digest[4]);
10152
10153 digest[0] -= SHA1M_A;
10154 digest[1] -= SHA1M_B;
10155 digest[2] -= SHA1M_C;
10156 digest[3] -= SHA1M_D;
10157 digest[4] -= SHA1M_E;
10158
10159 return (PARSER_OK);
10160 }
10161
10162 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10163 {
10164 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10165
10166 unsigned char c12 = itoa64_to_int (input_buf[12]);
10167
10168 if (c12 & 3) return (PARSER_HASH_VALUE);
10169
10170 uint32_t *digest = (uint32_t *) hash_buf->digest;
10171
10172 salt_t *salt = hash_buf->salt;
10173
10174 // for ascii_digest
10175 salt->salt_sign[0] = input_buf[0];
10176 salt->salt_sign[1] = input_buf[1];
10177
10178 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10179 | itoa64_to_int (input_buf[1]) << 6;
10180
10181 salt->salt_len = 2;
10182
10183 char tmp_buf[100];
10184
10185 memset (tmp_buf, 0, sizeof (tmp_buf));
10186
10187 base64_decode (itoa64_to_int, input_buf + 2, 11, tmp_buf);
10188
10189 memcpy (digest, tmp_buf, 8);
10190
10191 uint tt;
10192
10193 IP (digest[0], digest[1], tt);
10194
10195 digest[2] = 0;
10196 digest[3] = 0;
10197
10198 return (PARSER_OK);
10199 }
10200
10201 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10202 {
10203 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10204
10205 uint32_t *digest = (uint32_t *) hash_buf->digest;
10206
10207 digest[0] = hex_to_uint (&input_buf[ 0]);
10208 digest[1] = hex_to_uint (&input_buf[ 8]);
10209 digest[2] = hex_to_uint (&input_buf[16]);
10210 digest[3] = hex_to_uint (&input_buf[24]);
10211
10212 digest[0] = byte_swap_32 (digest[0]);
10213 digest[1] = byte_swap_32 (digest[1]);
10214 digest[2] = byte_swap_32 (digest[2]);
10215 digest[3] = byte_swap_32 (digest[3]);
10216
10217 digest[0] -= MD4M_A;
10218 digest[1] -= MD4M_B;
10219 digest[2] -= MD4M_C;
10220 digest[3] -= MD4M_D;
10221
10222 return (PARSER_OK);
10223 }
10224
10225 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10226 {
10227 if (data.opts_type & OPTS_TYPE_ST_HEX)
10228 {
10229 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10230 }
10231 else
10232 {
10233 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10234 }
10235
10236 uint32_t *digest = (uint32_t *) hash_buf->digest;
10237
10238 salt_t *salt = hash_buf->salt;
10239
10240 digest[0] = hex_to_uint (&input_buf[ 0]);
10241 digest[1] = hex_to_uint (&input_buf[ 8]);
10242 digest[2] = hex_to_uint (&input_buf[16]);
10243 digest[3] = hex_to_uint (&input_buf[24]);
10244
10245 digest[0] = byte_swap_32 (digest[0]);
10246 digest[1] = byte_swap_32 (digest[1]);
10247 digest[2] = byte_swap_32 (digest[2]);
10248 digest[3] = byte_swap_32 (digest[3]);
10249
10250 digest[0] -= MD4M_A;
10251 digest[1] -= MD4M_B;
10252 digest[2] -= MD4M_C;
10253 digest[3] -= MD4M_D;
10254
10255 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10256
10257 uint salt_len = input_len - 32 - 1;
10258
10259 char *salt_buf = input_buf + 32 + 1;
10260
10261 char *salt_buf_ptr = (char *) salt->salt_buf;
10262
10263 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10264
10265 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10266
10267 salt->salt_len = salt_len;
10268
10269 return (PARSER_OK);
10270 }
10271
10272 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10273 {
10274 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10275
10276 uint32_t *digest = (uint32_t *) hash_buf->digest;
10277
10278 digest[0] = hex_to_uint (&input_buf[ 0]);
10279 digest[1] = hex_to_uint (&input_buf[ 8]);
10280 digest[2] = hex_to_uint (&input_buf[16]);
10281 digest[3] = hex_to_uint (&input_buf[24]);
10282
10283 digest[0] = byte_swap_32 (digest[0]);
10284 digest[1] = byte_swap_32 (digest[1]);
10285 digest[2] = byte_swap_32 (digest[2]);
10286 digest[3] = byte_swap_32 (digest[3]);
10287
10288 digest[0] -= MD5M_A;
10289 digest[1] -= MD5M_B;
10290 digest[2] -= MD5M_C;
10291 digest[3] -= MD5M_D;
10292
10293 return (PARSER_OK);
10294 }
10295
10296 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10297 {
10298 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10299
10300 uint32_t *digest = (uint32_t *) hash_buf->digest;
10301
10302 digest[0] = hex_to_uint (&input_buf[0]);
10303 digest[1] = hex_to_uint (&input_buf[8]);
10304 digest[2] = 0;
10305 digest[3] = 0;
10306
10307 digest[0] = byte_swap_32 (digest[0]);
10308 digest[1] = byte_swap_32 (digest[1]);
10309
10310 return (PARSER_OK);
10311 }
10312
10313 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10314 {
10315 if (data.opts_type & OPTS_TYPE_ST_HEX)
10316 {
10317 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10318 }
10319 else
10320 {
10321 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10322 }
10323
10324 uint32_t *digest = (uint32_t *) hash_buf->digest;
10325
10326 salt_t *salt = hash_buf->salt;
10327
10328 digest[0] = hex_to_uint (&input_buf[ 0]);
10329 digest[1] = hex_to_uint (&input_buf[ 8]);
10330 digest[2] = hex_to_uint (&input_buf[16]);
10331 digest[3] = hex_to_uint (&input_buf[24]);
10332
10333 digest[0] = byte_swap_32 (digest[0]);
10334 digest[1] = byte_swap_32 (digest[1]);
10335 digest[2] = byte_swap_32 (digest[2]);
10336 digest[3] = byte_swap_32 (digest[3]);
10337
10338 digest[0] -= MD5M_A;
10339 digest[1] -= MD5M_B;
10340 digest[2] -= MD5M_C;
10341 digest[3] -= MD5M_D;
10342
10343 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10344
10345 uint salt_len = input_len - 32 - 1;
10346
10347 char *salt_buf = input_buf + 32 + 1;
10348
10349 char *salt_buf_ptr = (char *) salt->salt_buf;
10350
10351 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10352
10353 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10354
10355 salt->salt_len = salt_len;
10356
10357 return (PARSER_OK);
10358 }
10359
10360 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10361 {
10362 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10363
10364 uint32_t *digest = (uint32_t *) hash_buf->digest;
10365
10366 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10367 | itoa64_to_int (input_buf[ 1]) << 6
10368 | itoa64_to_int (input_buf[ 2]) << 12
10369 | itoa64_to_int (input_buf[ 3]) << 18;
10370 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10371 | itoa64_to_int (input_buf[ 5]) << 6
10372 | itoa64_to_int (input_buf[ 6]) << 12
10373 | itoa64_to_int (input_buf[ 7]) << 18;
10374 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10375 | itoa64_to_int (input_buf[ 9]) << 6
10376 | itoa64_to_int (input_buf[10]) << 12
10377 | itoa64_to_int (input_buf[11]) << 18;
10378 digest[3] = itoa64_to_int (input_buf[12]) << 0
10379 | itoa64_to_int (input_buf[13]) << 6
10380 | itoa64_to_int (input_buf[14]) << 12
10381 | itoa64_to_int (input_buf[15]) << 18;
10382
10383 digest[0] -= MD5M_A;
10384 digest[1] -= MD5M_B;
10385 digest[2] -= MD5M_C;
10386 digest[3] -= MD5M_D;
10387
10388 digest[0] &= 0x00ffffff;
10389 digest[1] &= 0x00ffffff;
10390 digest[2] &= 0x00ffffff;
10391 digest[3] &= 0x00ffffff;
10392
10393 return (PARSER_OK);
10394 }
10395
10396 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10397 {
10398 if (data.opts_type & OPTS_TYPE_ST_HEX)
10399 {
10400 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10401 }
10402 else
10403 {
10404 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10405 }
10406
10407 uint32_t *digest = (uint32_t *) hash_buf->digest;
10408
10409 salt_t *salt = hash_buf->salt;
10410
10411 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10412 | itoa64_to_int (input_buf[ 1]) << 6
10413 | itoa64_to_int (input_buf[ 2]) << 12
10414 | itoa64_to_int (input_buf[ 3]) << 18;
10415 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10416 | itoa64_to_int (input_buf[ 5]) << 6
10417 | itoa64_to_int (input_buf[ 6]) << 12
10418 | itoa64_to_int (input_buf[ 7]) << 18;
10419 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10420 | itoa64_to_int (input_buf[ 9]) << 6
10421 | itoa64_to_int (input_buf[10]) << 12
10422 | itoa64_to_int (input_buf[11]) << 18;
10423 digest[3] = itoa64_to_int (input_buf[12]) << 0
10424 | itoa64_to_int (input_buf[13]) << 6
10425 | itoa64_to_int (input_buf[14]) << 12
10426 | itoa64_to_int (input_buf[15]) << 18;
10427
10428 digest[0] -= MD5M_A;
10429 digest[1] -= MD5M_B;
10430 digest[2] -= MD5M_C;
10431 digest[3] -= MD5M_D;
10432
10433 digest[0] &= 0x00ffffff;
10434 digest[1] &= 0x00ffffff;
10435 digest[2] &= 0x00ffffff;
10436 digest[3] &= 0x00ffffff;
10437
10438 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10439
10440 uint salt_len = input_len - 16 - 1;
10441
10442 char *salt_buf = input_buf + 16 + 1;
10443
10444 char *salt_buf_ptr = (char *) salt->salt_buf;
10445
10446 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10447
10448 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10449
10450 salt->salt_len = salt_len;
10451
10452 return (PARSER_OK);
10453 }
10454
10455 void transform_netntlmv1_key (const uint8_t *nthash, uint8_t *key)
10456 {
10457 key[0] = (nthash[0] >> 0);
10458 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10459 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10460 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10461 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10462 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10463 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10464 key[7] = (nthash[6] << 1);
10465
10466 key[0] |= 0x01;
10467 key[1] |= 0x01;
10468 key[2] |= 0x01;
10469 key[3] |= 0x01;
10470 key[4] |= 0x01;
10471 key[5] |= 0x01;
10472 key[6] |= 0x01;
10473 key[7] |= 0x01;
10474 }
10475
10476 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10477 {
10478 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10479
10480 uint32_t *digest = (uint32_t *) hash_buf->digest;
10481
10482 salt_t *salt = hash_buf->salt;
10483
10484 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10485
10486 /**
10487 * parse line
10488 */
10489
10490 char *user_pos = input_buf;
10491
10492 char *unused_pos = strchr (user_pos, ':');
10493
10494 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10495
10496 uint user_len = unused_pos - user_pos;
10497
10498 if (user_len > 60) return (PARSER_SALT_LENGTH);
10499
10500 unused_pos++;
10501
10502 char *domain_pos = strchr (unused_pos, ':');
10503
10504 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10505
10506 uint unused_len = domain_pos - unused_pos;
10507
10508 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10509
10510 domain_pos++;
10511
10512 char *srvchall_pos = strchr (domain_pos, ':');
10513
10514 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10515
10516 uint domain_len = srvchall_pos - domain_pos;
10517
10518 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10519
10520 srvchall_pos++;
10521
10522 char *hash_pos = strchr (srvchall_pos, ':');
10523
10524 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10525
10526 uint srvchall_len = hash_pos - srvchall_pos;
10527
10528 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10529
10530 hash_pos++;
10531
10532 char *clichall_pos = strchr (hash_pos, ':');
10533
10534 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10535
10536 uint hash_len = clichall_pos - hash_pos;
10537
10538 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10539
10540 clichall_pos++;
10541
10542 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10543
10544 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10545
10546 /**
10547 * store some data for later use
10548 */
10549
10550 netntlm->user_len = user_len * 2;
10551 netntlm->domain_len = domain_len * 2;
10552 netntlm->srvchall_len = srvchall_len / 2;
10553 netntlm->clichall_len = clichall_len / 2;
10554
10555 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10556 char *chall_ptr = (char *) netntlm->chall_buf;
10557
10558 /**
10559 * handle username and domainname
10560 */
10561
10562 for (uint i = 0; i < user_len; i++)
10563 {
10564 *userdomain_ptr++ = user_pos[i];
10565 *userdomain_ptr++ = 0;
10566 }
10567
10568 for (uint i = 0; i < domain_len; i++)
10569 {
10570 *userdomain_ptr++ = domain_pos[i];
10571 *userdomain_ptr++ = 0;
10572 }
10573
10574 /**
10575 * handle server challenge encoding
10576 */
10577
10578 for (uint i = 0; i < srvchall_len; i += 2)
10579 {
10580 const char p0 = srvchall_pos[i + 0];
10581 const char p1 = srvchall_pos[i + 1];
10582
10583 *chall_ptr++ = hex_convert (p1) << 0
10584 | hex_convert (p0) << 4;
10585 }
10586
10587 /**
10588 * handle client challenge encoding
10589 */
10590
10591 for (uint i = 0; i < clichall_len; i += 2)
10592 {
10593 const char p0 = clichall_pos[i + 0];
10594 const char p1 = clichall_pos[i + 1];
10595
10596 *chall_ptr++ = hex_convert (p1) << 0
10597 | hex_convert (p0) << 4;
10598 }
10599
10600 /**
10601 * store data
10602 */
10603
10604 char *salt_buf_ptr = (char *) salt->salt_buf;
10605
10606 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10607
10608 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10609
10610 salt->salt_len = salt_len;
10611
10612 digest[0] = hex_to_uint (&hash_pos[ 0]);
10613 digest[1] = hex_to_uint (&hash_pos[ 8]);
10614 digest[2] = hex_to_uint (&hash_pos[16]);
10615 digest[3] = hex_to_uint (&hash_pos[24]);
10616
10617 digest[0] = byte_swap_32 (digest[0]);
10618 digest[1] = byte_swap_32 (digest[1]);
10619 digest[2] = byte_swap_32 (digest[2]);
10620 digest[3] = byte_swap_32 (digest[3]);
10621
10622 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10623
10624 uint digest_tmp[2];
10625
10626 digest_tmp[0] = hex_to_uint (&hash_pos[32]);
10627 digest_tmp[1] = hex_to_uint (&hash_pos[40]);
10628
10629 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10630 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10631
10632 /* special case 2: ESS */
10633
10634 if (srvchall_len == 48)
10635 {
10636 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10637 {
10638 uint w[16];
10639
10640 w[ 0] = netntlm->chall_buf[6];
10641 w[ 1] = netntlm->chall_buf[7];
10642 w[ 2] = netntlm->chall_buf[0];
10643 w[ 3] = netntlm->chall_buf[1];
10644 w[ 4] = 0x80;
10645 w[ 5] = 0;
10646 w[ 6] = 0;
10647 w[ 7] = 0;
10648 w[ 8] = 0;
10649 w[ 9] = 0;
10650 w[10] = 0;
10651 w[11] = 0;
10652 w[12] = 0;
10653 w[13] = 0;
10654 w[14] = 16 * 8;
10655 w[15] = 0;
10656
10657 uint dgst[4];
10658
10659 dgst[0] = MAGIC_A;
10660 dgst[1] = MAGIC_B;
10661 dgst[2] = MAGIC_C;
10662 dgst[3] = MAGIC_D;
10663
10664 md5_64 (w, dgst);
10665
10666 salt->salt_buf[0] = dgst[0];
10667 salt->salt_buf[1] = dgst[1];
10668 }
10669 }
10670
10671 /* precompute netntlmv1 exploit start */
10672
10673 for (uint i = 0; i < 0x10000; i++)
10674 {
10675 uint key_md4[2] = { i, 0 };
10676 uint key_des[2] = { 0, 0 };
10677
10678 transform_netntlmv1_key ((uint8_t *) key_md4, (uint8_t *) key_des);
10679
10680 uint Kc[16];
10681 uint Kd[16];
10682
10683 _des_keysetup (key_des, Kc, Kd, c_skb);
10684
10685 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10686
10687 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10688
10689 if (data3[0] != digest_tmp[0]) continue;
10690 if (data3[1] != digest_tmp[1]) continue;
10691
10692 salt->salt_buf[2] = i;
10693
10694 salt->salt_len = 24;
10695
10696 break;
10697 }
10698
10699 salt->salt_buf_pc[0] = digest_tmp[0];
10700 salt->salt_buf_pc[1] = digest_tmp[1];
10701
10702 /* precompute netntlmv1 exploit stop */
10703
10704 uint32_t tt;
10705
10706 IP (digest[0], digest[1], tt);
10707 IP (digest[2], digest[3], tt);
10708
10709 digest[0] = ROTATE_RIGHT (digest[0], 29);
10710 digest[1] = ROTATE_RIGHT (digest[1], 29);
10711 digest[2] = ROTATE_RIGHT (digest[2], 29);
10712 digest[3] = ROTATE_RIGHT (digest[3], 29);
10713
10714 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10715
10716 salt->salt_buf[0] = ROTATE_LEFT (salt->salt_buf[0], 3);
10717 salt->salt_buf[1] = ROTATE_LEFT (salt->salt_buf[1], 3);
10718
10719 return (PARSER_OK);
10720 }
10721
10722 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10723 {
10724 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10725
10726 uint32_t *digest = (uint32_t *) hash_buf->digest;
10727
10728 salt_t *salt = hash_buf->salt;
10729
10730 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10731
10732 /**
10733 * parse line
10734 */
10735
10736 char *user_pos = input_buf;
10737
10738 char *unused_pos = strchr (user_pos, ':');
10739
10740 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10741
10742 uint user_len = unused_pos - user_pos;
10743
10744 if (user_len > 60) return (PARSER_SALT_LENGTH);
10745
10746 unused_pos++;
10747
10748 char *domain_pos = strchr (unused_pos, ':');
10749
10750 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10751
10752 uint unused_len = domain_pos - unused_pos;
10753
10754 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10755
10756 domain_pos++;
10757
10758 char *srvchall_pos = strchr (domain_pos, ':');
10759
10760 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10761
10762 uint domain_len = srvchall_pos - domain_pos;
10763
10764 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10765
10766 srvchall_pos++;
10767
10768 char *hash_pos = strchr (srvchall_pos, ':');
10769
10770 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10771
10772 uint srvchall_len = hash_pos - srvchall_pos;
10773
10774 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
10775
10776 hash_pos++;
10777
10778 char *clichall_pos = strchr (hash_pos, ':');
10779
10780 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10781
10782 uint hash_len = clichall_pos - hash_pos;
10783
10784 if (hash_len != 32) return (PARSER_HASH_LENGTH);
10785
10786 clichall_pos++;
10787
10788 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10789
10790 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
10791
10792 if (clichall_len % 2) return (PARSER_SALT_VALUE);
10793
10794 /**
10795 * store some data for later use
10796 */
10797
10798 netntlm->user_len = user_len * 2;
10799 netntlm->domain_len = domain_len * 2;
10800 netntlm->srvchall_len = srvchall_len / 2;
10801 netntlm->clichall_len = clichall_len / 2;
10802
10803 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10804 char *chall_ptr = (char *) netntlm->chall_buf;
10805
10806 /**
10807 * handle username and domainname
10808 */
10809
10810 for (uint i = 0; i < user_len; i++)
10811 {
10812 *userdomain_ptr++ = toupper (user_pos[i]);
10813 *userdomain_ptr++ = 0;
10814 }
10815
10816 for (uint i = 0; i < domain_len; i++)
10817 {
10818 *userdomain_ptr++ = domain_pos[i];
10819 *userdomain_ptr++ = 0;
10820 }
10821
10822 *userdomain_ptr++ = 0x80;
10823
10824 /**
10825 * handle server challenge encoding
10826 */
10827
10828 for (uint i = 0; i < srvchall_len; i += 2)
10829 {
10830 const char p0 = srvchall_pos[i + 0];
10831 const char p1 = srvchall_pos[i + 1];
10832
10833 *chall_ptr++ = hex_convert (p1) << 0
10834 | hex_convert (p0) << 4;
10835 }
10836
10837 /**
10838 * handle client challenge encoding
10839 */
10840
10841 for (uint i = 0; i < clichall_len; i += 2)
10842 {
10843 const char p0 = clichall_pos[i + 0];
10844 const char p1 = clichall_pos[i + 1];
10845
10846 *chall_ptr++ = hex_convert (p1) << 0
10847 | hex_convert (p0) << 4;
10848 }
10849
10850 *chall_ptr++ = 0x80;
10851
10852 /**
10853 * handle hash itself
10854 */
10855
10856 digest[0] = hex_to_uint (&hash_pos[ 0]);
10857 digest[1] = hex_to_uint (&hash_pos[ 8]);
10858 digest[2] = hex_to_uint (&hash_pos[16]);
10859 digest[3] = hex_to_uint (&hash_pos[24]);
10860
10861 digest[0] = byte_swap_32 (digest[0]);
10862 digest[1] = byte_swap_32 (digest[1]);
10863 digest[2] = byte_swap_32 (digest[2]);
10864 digest[3] = byte_swap_32 (digest[3]);
10865
10866 /**
10867 * reuse challange data as salt_buf, its the buffer that is most likely unique
10868 */
10869
10870 salt->salt_buf[0] = 0;
10871 salt->salt_buf[1] = 0;
10872 salt->salt_buf[2] = 0;
10873 salt->salt_buf[3] = 0;
10874 salt->salt_buf[4] = 0;
10875 salt->salt_buf[5] = 0;
10876 salt->salt_buf[6] = 0;
10877 salt->salt_buf[7] = 0;
10878
10879 uint *uptr;
10880
10881 uptr = (uint *) netntlm->userdomain_buf;
10882
10883 for (uint i = 0; i < 16; i += 16)
10884 {
10885 md5_64 (uptr, salt->salt_buf);
10886 }
10887
10888 uptr = (uint *) netntlm->chall_buf;
10889
10890 for (uint i = 0; i < 256; i += 16)
10891 {
10892 md5_64 (uptr, salt->salt_buf);
10893 }
10894
10895 salt->salt_len = 16;
10896
10897 return (PARSER_OK);
10898 }
10899
10900 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10901 {
10902 if (data.opts_type & OPTS_TYPE_ST_HEX)
10903 {
10904 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
10905 }
10906 else
10907 {
10908 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
10909 }
10910
10911 uint32_t *digest = (uint32_t *) hash_buf->digest;
10912
10913 salt_t *salt = hash_buf->salt;
10914
10915 digest[0] = hex_to_uint (&input_buf[ 0]);
10916 digest[1] = hex_to_uint (&input_buf[ 8]);
10917 digest[2] = hex_to_uint (&input_buf[16]);
10918 digest[3] = hex_to_uint (&input_buf[24]);
10919
10920 digest[0] = byte_swap_32 (digest[0]);
10921 digest[1] = byte_swap_32 (digest[1]);
10922 digest[2] = byte_swap_32 (digest[2]);
10923 digest[3] = byte_swap_32 (digest[3]);
10924
10925 digest[0] -= MD5M_A;
10926 digest[1] -= MD5M_B;
10927 digest[2] -= MD5M_C;
10928 digest[3] -= MD5M_D;
10929
10930 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10931
10932 uint salt_len = input_len - 32 - 1;
10933
10934 char *salt_buf = input_buf + 32 + 1;
10935
10936 char *salt_buf_ptr = (char *) salt->salt_buf;
10937
10938 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10939
10940 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10941
10942 salt->salt_len = salt_len;
10943
10944 return (PARSER_OK);
10945 }
10946
10947 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10948 {
10949 if (data.opts_type & OPTS_TYPE_ST_HEX)
10950 {
10951 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
10952 }
10953 else
10954 {
10955 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
10956 }
10957
10958 uint32_t *digest = (uint32_t *) hash_buf->digest;
10959
10960 salt_t *salt = hash_buf->salt;
10961
10962 digest[0] = hex_to_uint (&input_buf[ 0]);
10963 digest[1] = hex_to_uint (&input_buf[ 8]);
10964 digest[2] = hex_to_uint (&input_buf[16]);
10965 digest[3] = hex_to_uint (&input_buf[24]);
10966
10967 digest[0] = byte_swap_32 (digest[0]);
10968 digest[1] = byte_swap_32 (digest[1]);
10969 digest[2] = byte_swap_32 (digest[2]);
10970 digest[3] = byte_swap_32 (digest[3]);
10971
10972 digest[0] -= MD5M_A;
10973 digest[1] -= MD5M_B;
10974 digest[2] -= MD5M_C;
10975 digest[3] -= MD5M_D;
10976
10977 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10978
10979 uint salt_len = input_len - 32 - 1;
10980
10981 char *salt_buf = input_buf + 32 + 1;
10982
10983 char *salt_buf_ptr = (char *) salt->salt_buf;
10984
10985 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10986
10987 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10988
10989 salt->salt_len = salt_len;
10990
10991 return (PARSER_OK);
10992 }
10993
10994 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10995 {
10996 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
10997
10998 uint32_t *digest = (uint32_t *) hash_buf->digest;
10999
11000 salt_t *salt = hash_buf->salt;
11001
11002 digest[0] = hex_to_uint (&input_buf[ 0]);
11003 digest[1] = hex_to_uint (&input_buf[ 8]);
11004 digest[2] = hex_to_uint (&input_buf[16]);
11005 digest[3] = hex_to_uint (&input_buf[24]);
11006
11007 digest[0] = byte_swap_32 (digest[0]);
11008 digest[1] = byte_swap_32 (digest[1]);
11009 digest[2] = byte_swap_32 (digest[2]);
11010 digest[3] = byte_swap_32 (digest[3]);
11011
11012 digest[0] -= MD5M_A;
11013 digest[1] -= MD5M_B;
11014 digest[2] -= MD5M_C;
11015 digest[3] -= MD5M_D;
11016
11017 /**
11018 * This is a virtual salt. While the algorithm is basically not salted
11019 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11020 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11021 */
11022
11023 char *salt_buf_ptr = (char *) salt->salt_buf;
11024
11025 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11026
11027 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11028
11029 salt->salt_len = salt_len;
11030
11031 return (PARSER_OK);
11032 }
11033
11034 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11035 {
11036 if (data.opts_type & OPTS_TYPE_ST_HEX)
11037 {
11038 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11039 }
11040 else
11041 {
11042 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11043 }
11044
11045 uint32_t *digest = (uint32_t *) hash_buf->digest;
11046
11047 salt_t *salt = hash_buf->salt;
11048
11049 digest[0] = hex_to_uint (&input_buf[ 0]);
11050 digest[1] = hex_to_uint (&input_buf[ 8]);
11051 digest[2] = hex_to_uint (&input_buf[16]);
11052 digest[3] = hex_to_uint (&input_buf[24]);
11053
11054 digest[0] = byte_swap_32 (digest[0]);
11055 digest[1] = byte_swap_32 (digest[1]);
11056 digest[2] = byte_swap_32 (digest[2]);
11057 digest[3] = byte_swap_32 (digest[3]);
11058
11059 digest[0] -= MD5M_A;
11060 digest[1] -= MD5M_B;
11061 digest[2] -= MD5M_C;
11062 digest[3] -= MD5M_D;
11063
11064 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11065
11066 uint salt_len = input_len - 32 - 1;
11067
11068 char *salt_buf = input_buf + 32 + 1;
11069
11070 char *salt_buf_ptr = (char *) salt->salt_buf;
11071
11072 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11073
11074 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11075
11076 salt->salt_len = salt_len;
11077
11078 return (PARSER_OK);
11079 }
11080
11081 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11082 {
11083 if (data.opts_type & OPTS_TYPE_ST_HEX)
11084 {
11085 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11086 }
11087 else
11088 {
11089 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11090 }
11091
11092 uint32_t *digest = (uint32_t *) hash_buf->digest;
11093
11094 salt_t *salt = hash_buf->salt;
11095
11096 digest[0] = hex_to_uint (&input_buf[ 0]);
11097 digest[1] = hex_to_uint (&input_buf[ 8]);
11098 digest[2] = hex_to_uint (&input_buf[16]);
11099 digest[3] = hex_to_uint (&input_buf[24]);
11100
11101 digest[0] = byte_swap_32 (digest[0]);
11102 digest[1] = byte_swap_32 (digest[1]);
11103 digest[2] = byte_swap_32 (digest[2]);
11104 digest[3] = byte_swap_32 (digest[3]);
11105
11106 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11107
11108 uint salt_len = input_len - 32 - 1;
11109
11110 char *salt_buf = input_buf + 32 + 1;
11111
11112 char *salt_buf_ptr = (char *) salt->salt_buf;
11113
11114 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11115
11116 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11117
11118 salt->salt_len = salt_len;
11119
11120 return (PARSER_OK);
11121 }
11122
11123 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11124 {
11125 if (data.opts_type & OPTS_TYPE_ST_HEX)
11126 {
11127 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11128 }
11129 else
11130 {
11131 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11132 }
11133
11134 uint32_t *digest = (uint32_t *) hash_buf->digest;
11135
11136 salt_t *salt = hash_buf->salt;
11137
11138 digest[0] = hex_to_uint (&input_buf[ 0]);
11139 digest[1] = hex_to_uint (&input_buf[ 8]);
11140 digest[2] = hex_to_uint (&input_buf[16]);
11141 digest[3] = hex_to_uint (&input_buf[24]);
11142
11143 digest[0] = byte_swap_32 (digest[0]);
11144 digest[1] = byte_swap_32 (digest[1]);
11145 digest[2] = byte_swap_32 (digest[2]);
11146 digest[3] = byte_swap_32 (digest[3]);
11147
11148 digest[0] -= MD4M_A;
11149 digest[1] -= MD4M_B;
11150 digest[2] -= MD4M_C;
11151 digest[3] -= MD4M_D;
11152
11153 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11154
11155 uint salt_len = input_len - 32 - 1;
11156
11157 char *salt_buf = input_buf + 32 + 1;
11158
11159 char *salt_buf_ptr = (char *) salt->salt_buf;
11160
11161 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11162
11163 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11164
11165 salt->salt_len = salt_len;
11166
11167 return (PARSER_OK);
11168 }
11169
11170 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11171 {
11172 if (data.opts_type & OPTS_TYPE_ST_HEX)
11173 {
11174 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11175 }
11176 else
11177 {
11178 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11179 }
11180
11181 uint32_t *digest = (uint32_t *) hash_buf->digest;
11182
11183 salt_t *salt = hash_buf->salt;
11184
11185 digest[0] = hex_to_uint (&input_buf[ 0]);
11186 digest[1] = hex_to_uint (&input_buf[ 8]);
11187 digest[2] = hex_to_uint (&input_buf[16]);
11188 digest[3] = hex_to_uint (&input_buf[24]);
11189
11190 digest[0] = byte_swap_32 (digest[0]);
11191 digest[1] = byte_swap_32 (digest[1]);
11192 digest[2] = byte_swap_32 (digest[2]);
11193 digest[3] = byte_swap_32 (digest[3]);
11194
11195 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11196
11197 uint salt_len = input_len - 32 - 1;
11198
11199 char *salt_buf = input_buf + 32 + 1;
11200
11201 uint salt_pc_block[16];
11202
11203 memset (salt_pc_block, 0, sizeof (salt_pc_block));
11204
11205 char *salt_pc_block_ptr = (char *) salt_pc_block;
11206
11207 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11208
11209 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11210
11211 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11212
11213 salt_pc_block[14] = salt_len * 8;
11214
11215 uint salt_pc_digest[4];
11216
11217 salt_pc_digest[0] = MAGIC_A;
11218 salt_pc_digest[1] = MAGIC_B;
11219 salt_pc_digest[2] = MAGIC_C;
11220 salt_pc_digest[3] = MAGIC_D;
11221
11222 md5_64 (salt_pc_block, salt_pc_digest);
11223
11224 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11225 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11226 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11227 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11228
11229 char *salt_buf_ptr = (char *) salt->salt_buf;
11230
11231 memcpy (salt_buf_ptr, salt_buf, salt_len);
11232
11233 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
11234
11235 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11236 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11237 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11238 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11239
11240 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11241
11242 return (PARSER_OK);
11243 }
11244
11245 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11246 {
11247 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11248
11249 uint32_t *digest = (uint32_t *) hash_buf->digest;
11250
11251 digest[0] = hex_to_uint (&input_buf[ 0]);
11252 digest[1] = hex_to_uint (&input_buf[ 8]);
11253 digest[2] = hex_to_uint (&input_buf[16]);
11254 digest[3] = hex_to_uint (&input_buf[24]);
11255 digest[4] = hex_to_uint (&input_buf[32]);
11256
11257 digest[0] -= SHA1M_A;
11258 digest[1] -= SHA1M_B;
11259 digest[2] -= SHA1M_C;
11260 digest[3] -= SHA1M_D;
11261 digest[4] -= SHA1M_E;
11262
11263 return (PARSER_OK);
11264 }
11265
11266 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11267 {
11268 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11269
11270 uint32_t *digest = (uint32_t *) hash_buf->digest;
11271
11272 digest[0] = hex_to_uint (&input_buf[ 0]);
11273 digest[1] = hex_to_uint (&input_buf[ 8]);
11274 digest[2] = hex_to_uint (&input_buf[16]);
11275 digest[3] = hex_to_uint (&input_buf[24]);
11276 digest[4] = hex_to_uint (&input_buf[32]);
11277
11278 return (PARSER_OK);
11279 }
11280
11281 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11282 {
11283 if (data.opts_type & OPTS_TYPE_ST_HEX)
11284 {
11285 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11286 }
11287 else
11288 {
11289 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11290 }
11291
11292 uint32_t *digest = (uint32_t *) hash_buf->digest;
11293
11294 salt_t *salt = hash_buf->salt;
11295
11296 digest[0] = hex_to_uint (&input_buf[ 0]);
11297 digest[1] = hex_to_uint (&input_buf[ 8]);
11298 digest[2] = hex_to_uint (&input_buf[16]);
11299 digest[3] = hex_to_uint (&input_buf[24]);
11300 digest[4] = hex_to_uint (&input_buf[32]);
11301
11302 digest[0] -= SHA1M_A;
11303 digest[1] -= SHA1M_B;
11304 digest[2] -= SHA1M_C;
11305 digest[3] -= SHA1M_D;
11306 digest[4] -= SHA1M_E;
11307
11308 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11309
11310 uint salt_len = input_len - 40 - 1;
11311
11312 char *salt_buf = input_buf + 40 + 1;
11313
11314 char *salt_buf_ptr = (char *) salt->salt_buf;
11315
11316 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11317
11318 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11319
11320 salt->salt_len = salt_len;
11321
11322 return (PARSER_OK);
11323 }
11324
11325 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11326 {
11327 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11328
11329 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11330
11331 uint32_t *digest = (uint32_t *) hash_buf->digest;
11332
11333 char tmp_buf[100];
11334
11335 memset (tmp_buf, 0, sizeof (tmp_buf));
11336
11337 base64_decode (base64_to_int, input_buf + 5, input_len - 5, tmp_buf);
11338
11339 memcpy (digest, tmp_buf, 20);
11340
11341 digest[0] = byte_swap_32 (digest[0]);
11342 digest[1] = byte_swap_32 (digest[1]);
11343 digest[2] = byte_swap_32 (digest[2]);
11344 digest[3] = byte_swap_32 (digest[3]);
11345 digest[4] = byte_swap_32 (digest[4]);
11346
11347 digest[0] -= SHA1M_A;
11348 digest[1] -= SHA1M_B;
11349 digest[2] -= SHA1M_C;
11350 digest[3] -= SHA1M_D;
11351 digest[4] -= SHA1M_E;
11352
11353 return (PARSER_OK);
11354 }
11355
11356 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11357 {
11358 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11359
11360 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11361
11362 uint32_t *digest = (uint32_t *) hash_buf->digest;
11363
11364 salt_t *salt = hash_buf->salt;
11365
11366 char tmp_buf[100];
11367
11368 memset (tmp_buf, 0, sizeof (tmp_buf));
11369
11370 int tmp_len = base64_decode (base64_to_int, input_buf + 6, input_len - 6, tmp_buf);
11371
11372 memcpy (digest, tmp_buf, 20);
11373
11374 salt->salt_len = tmp_len - 20;
11375
11376 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11377
11378 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11379 {
11380 char *ptr = (char *) salt->salt_buf;
11381
11382 ptr[salt->salt_len] = 0x80;
11383 }
11384
11385 digest[0] = byte_swap_32 (digest[0]);
11386 digest[1] = byte_swap_32 (digest[1]);
11387 digest[2] = byte_swap_32 (digest[2]);
11388 digest[3] = byte_swap_32 (digest[3]);
11389 digest[4] = byte_swap_32 (digest[4]);
11390
11391 digest[0] -= SHA1M_A;
11392 digest[1] -= SHA1M_B;
11393 digest[2] -= SHA1M_C;
11394 digest[3] -= SHA1M_D;
11395 digest[4] -= SHA1M_E;
11396
11397 return (PARSER_OK);
11398 }
11399
11400 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11401 {
11402 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11403
11404 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11405
11406 uint32_t *digest = (uint32_t *) hash_buf->digest;
11407
11408 salt_t *salt = hash_buf->salt;
11409
11410 char *salt_buf = input_buf + 6;
11411
11412 uint salt_len = 8;
11413
11414 char *salt_buf_ptr = (char *) salt->salt_buf;
11415
11416 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11417
11418 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11419
11420 salt->salt_len = salt_len;
11421
11422 char *hash_pos = input_buf + 6 + 8 + 40;
11423
11424 digest[0] = hex_to_uint (&hash_pos[ 0]);
11425 digest[1] = hex_to_uint (&hash_pos[ 8]);
11426 digest[2] = hex_to_uint (&hash_pos[16]);
11427 digest[3] = hex_to_uint (&hash_pos[24]);
11428 digest[4] = hex_to_uint (&hash_pos[32]);
11429
11430 digest[0] -= SHA1M_A;
11431 digest[1] -= SHA1M_B;
11432 digest[2] -= SHA1M_C;
11433 digest[3] -= SHA1M_D;
11434 digest[4] -= SHA1M_E;
11435
11436 return (PARSER_OK);
11437 }
11438
11439 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11440 {
11441 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11442
11443 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11444
11445 uint32_t *digest = (uint32_t *) hash_buf->digest;
11446
11447 salt_t *salt = hash_buf->salt;
11448
11449 char *salt_buf = input_buf + 6;
11450
11451 uint salt_len = 8;
11452
11453 char *salt_buf_ptr = (char *) salt->salt_buf;
11454
11455 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11456
11457 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11458
11459 salt->salt_len = salt_len;
11460
11461 char *hash_pos = input_buf + 6 + 8;
11462
11463 digest[0] = hex_to_uint (&hash_pos[ 0]);
11464 digest[1] = hex_to_uint (&hash_pos[ 8]);
11465 digest[2] = hex_to_uint (&hash_pos[16]);
11466 digest[3] = hex_to_uint (&hash_pos[24]);
11467 digest[4] = hex_to_uint (&hash_pos[32]);
11468
11469 digest[0] -= SHA1M_A;
11470 digest[1] -= SHA1M_B;
11471 digest[2] -= SHA1M_C;
11472 digest[3] -= SHA1M_D;
11473 digest[4] -= SHA1M_E;
11474
11475 return (PARSER_OK);
11476 }
11477
11478 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11479 {
11480 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11481
11482 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11483
11484 uint64_t *digest = (uint64_t *) hash_buf->digest;
11485
11486 salt_t *salt = hash_buf->salt;
11487
11488 char *salt_buf = input_buf + 6;
11489
11490 uint salt_len = 8;
11491
11492 char *salt_buf_ptr = (char *) salt->salt_buf;
11493
11494 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11495
11496 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11497
11498 salt->salt_len = salt_len;
11499
11500 char *hash_pos = input_buf + 6 + 8;
11501
11502 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
11503 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
11504 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
11505 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
11506 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
11507 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
11508 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
11509 digest[7] = hex_to_uint64_t (&hash_pos[112]);
11510
11511 digest[0] -= SHA512M_A;
11512 digest[1] -= SHA512M_B;
11513 digest[2] -= SHA512M_C;
11514 digest[3] -= SHA512M_D;
11515 digest[4] -= SHA512M_E;
11516 digest[5] -= SHA512M_F;
11517 digest[6] -= SHA512M_G;
11518 digest[7] -= SHA512M_H;
11519
11520 return (PARSER_OK);
11521 }
11522
11523 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11524 {
11525 if (data.opts_type & OPTS_TYPE_ST_HEX)
11526 {
11527 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11528 }
11529 else
11530 {
11531 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11532 }
11533
11534 uint32_t *digest = (uint32_t *) hash_buf->digest;
11535
11536 salt_t *salt = hash_buf->salt;
11537
11538 digest[0] = hex_to_uint (&input_buf[ 0]);
11539 digest[1] = hex_to_uint (&input_buf[ 8]);
11540 digest[2] = 0;
11541 digest[3] = 0;
11542
11543 digest[0] = byte_swap_32 (digest[0]);
11544 digest[1] = byte_swap_32 (digest[1]);
11545
11546 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11547
11548 uint salt_len = input_len - 16 - 1;
11549
11550 char *salt_buf = input_buf + 16 + 1;
11551
11552 char *salt_buf_ptr = (char *) salt->salt_buf;
11553
11554 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11555
11556 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11557
11558 salt->salt_len = salt_len;
11559
11560 return (PARSER_OK);
11561 }
11562
11563 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11564 {
11565 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11566
11567 uint32_t *digest = (uint32_t *) hash_buf->digest;
11568
11569 salt_t *salt = hash_buf->salt;
11570
11571 digest[0] = hex_to_uint (&input_buf[ 0]);
11572 digest[1] = hex_to_uint (&input_buf[ 8]);
11573 digest[2] = hex_to_uint (&input_buf[16]);
11574 digest[3] = hex_to_uint (&input_buf[24]);
11575 digest[4] = hex_to_uint (&input_buf[32]);
11576
11577 digest[0] -= SHA1M_A;
11578 digest[1] -= SHA1M_B;
11579 digest[2] -= SHA1M_C;
11580 digest[3] -= SHA1M_D;
11581 digest[4] -= SHA1M_E;
11582
11583 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11584
11585 uint salt_len = input_len - 40 - 1;
11586
11587 char *salt_buf = input_buf + 40 + 1;
11588
11589 char *salt_buf_ptr = (char *) salt->salt_buf;
11590
11591 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11592
11593 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11594
11595 salt->salt_len = salt_len;
11596
11597 return (PARSER_OK);
11598 }
11599
11600 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11601 {
11602 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11603
11604 uint32_t *digest = (uint32_t *) hash_buf->digest;
11605
11606 salt_t *salt = hash_buf->salt;
11607
11608 char *hash_pos = input_buf;
11609
11610 digest[ 0] = hex_to_uint (&hash_pos[ 0]);
11611 digest[ 1] = hex_to_uint (&hash_pos[ 8]);
11612 digest[ 2] = hex_to_uint (&hash_pos[ 16]);
11613 digest[ 3] = hex_to_uint (&hash_pos[ 24]);
11614 digest[ 4] = hex_to_uint (&hash_pos[ 32]);
11615 digest[ 5] = hex_to_uint (&hash_pos[ 40]);
11616 digest[ 6] = hex_to_uint (&hash_pos[ 48]);
11617 digest[ 7] = hex_to_uint (&hash_pos[ 56]);
11618 digest[ 8] = hex_to_uint (&hash_pos[ 64]);
11619 digest[ 9] = hex_to_uint (&hash_pos[ 72]);
11620 digest[10] = hex_to_uint (&hash_pos[ 80]);
11621 digest[11] = hex_to_uint (&hash_pos[ 88]);
11622 digest[12] = hex_to_uint (&hash_pos[ 96]);
11623 digest[13] = hex_to_uint (&hash_pos[104]);
11624 digest[14] = hex_to_uint (&hash_pos[112]);
11625 digest[15] = hex_to_uint (&hash_pos[120]);
11626
11627 char *salt_pos = input_buf + 128;
11628
11629 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
11630 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
11631 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]);
11632 salt->salt_buf[3] = hex_to_uint (&salt_pos[24]);
11633
11634 salt->salt_iter = ROUNDS_ORACLET - 1;
11635 salt->salt_len = 16;
11636
11637 return (PARSER_OK);
11638 }
11639
11640 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11641 {
11642 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11643
11644 uint32_t *digest = (uint32_t *) hash_buf->digest;
11645
11646 digest[0] = hex_to_uint (&input_buf[ 0]);
11647 digest[1] = hex_to_uint (&input_buf[ 8]);
11648 digest[2] = hex_to_uint (&input_buf[16]);
11649 digest[3] = hex_to_uint (&input_buf[24]);
11650 digest[4] = hex_to_uint (&input_buf[32]);
11651 digest[5] = hex_to_uint (&input_buf[40]);
11652 digest[6] = hex_to_uint (&input_buf[48]);
11653 digest[7] = hex_to_uint (&input_buf[56]);
11654
11655 digest[0] -= SHA256M_A;
11656 digest[1] -= SHA256M_B;
11657 digest[2] -= SHA256M_C;
11658 digest[3] -= SHA256M_D;
11659 digest[4] -= SHA256M_E;
11660 digest[5] -= SHA256M_F;
11661 digest[6] -= SHA256M_G;
11662 digest[7] -= SHA256M_H;
11663
11664 return (PARSER_OK);
11665 }
11666
11667 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11668 {
11669 if (data.opts_type & OPTS_TYPE_ST_HEX)
11670 {
11671 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11672 }
11673 else
11674 {
11675 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11676 }
11677
11678 uint32_t *digest = (uint32_t *) hash_buf->digest;
11679
11680 salt_t *salt = hash_buf->salt;
11681
11682 digest[0] = hex_to_uint (&input_buf[ 0]);
11683 digest[1] = hex_to_uint (&input_buf[ 8]);
11684 digest[2] = hex_to_uint (&input_buf[16]);
11685 digest[3] = hex_to_uint (&input_buf[24]);
11686 digest[4] = hex_to_uint (&input_buf[32]);
11687 digest[5] = hex_to_uint (&input_buf[40]);
11688 digest[6] = hex_to_uint (&input_buf[48]);
11689 digest[7] = hex_to_uint (&input_buf[56]);
11690
11691 digest[0] -= SHA256M_A;
11692 digest[1] -= SHA256M_B;
11693 digest[2] -= SHA256M_C;
11694 digest[3] -= SHA256M_D;
11695 digest[4] -= SHA256M_E;
11696 digest[5] -= SHA256M_F;
11697 digest[6] -= SHA256M_G;
11698 digest[7] -= SHA256M_H;
11699
11700 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11701
11702 uint salt_len = input_len - 64 - 1;
11703
11704 char *salt_buf = input_buf + 64 + 1;
11705
11706 char *salt_buf_ptr = (char *) salt->salt_buf;
11707
11708 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11709
11710 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11711
11712 salt->salt_len = salt_len;
11713
11714 return (PARSER_OK);
11715 }
11716
11717 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11718 {
11719 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11720
11721 uint64_t *digest = (uint64_t *) hash_buf->digest;
11722
11723 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11724 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11725 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11726 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11727 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11728 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11729 digest[6] = 0;
11730 digest[7] = 0;
11731
11732 digest[0] -= SHA384M_A;
11733 digest[1] -= SHA384M_B;
11734 digest[2] -= SHA384M_C;
11735 digest[3] -= SHA384M_D;
11736 digest[4] -= SHA384M_E;
11737 digest[5] -= SHA384M_F;
11738 digest[6] -= 0;
11739 digest[7] -= 0;
11740
11741 return (PARSER_OK);
11742 }
11743
11744 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11745 {
11746 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
11747
11748 uint64_t *digest = (uint64_t *) hash_buf->digest;
11749
11750 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11751 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11752 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11753 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11754 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11755 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11756 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
11757 digest[7] = hex_to_uint64_t (&input_buf[112]);
11758
11759 digest[0] -= SHA512M_A;
11760 digest[1] -= SHA512M_B;
11761 digest[2] -= SHA512M_C;
11762 digest[3] -= SHA512M_D;
11763 digest[4] -= SHA512M_E;
11764 digest[5] -= SHA512M_F;
11765 digest[6] -= SHA512M_G;
11766 digest[7] -= SHA512M_H;
11767
11768 return (PARSER_OK);
11769 }
11770
11771 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11772 {
11773 if (data.opts_type & OPTS_TYPE_ST_HEX)
11774 {
11775 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
11776 }
11777 else
11778 {
11779 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
11780 }
11781
11782 uint64_t *digest = (uint64_t *) hash_buf->digest;
11783
11784 salt_t *salt = hash_buf->salt;
11785
11786 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
11787 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
11788 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
11789 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
11790 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
11791 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
11792 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
11793 digest[7] = hex_to_uint64_t (&input_buf[112]);
11794
11795 digest[0] -= SHA512M_A;
11796 digest[1] -= SHA512M_B;
11797 digest[2] -= SHA512M_C;
11798 digest[3] -= SHA512M_D;
11799 digest[4] -= SHA512M_E;
11800 digest[5] -= SHA512M_F;
11801 digest[6] -= SHA512M_G;
11802 digest[7] -= SHA512M_H;
11803
11804 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11805
11806 uint salt_len = input_len - 128 - 1;
11807
11808 char *salt_buf = input_buf + 128 + 1;
11809
11810 char *salt_buf_ptr = (char *) salt->salt_buf;
11811
11812 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11813
11814 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11815
11816 salt->salt_len = salt_len;
11817
11818 return (PARSER_OK);
11819 }
11820
11821 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11822 {
11823 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
11824
11825 uint64_t *digest = (uint64_t *) hash_buf->digest;
11826
11827 salt_t *salt = hash_buf->salt;
11828
11829 char *salt_pos = input_buf + 3;
11830
11831 uint iterations_len = 0;
11832
11833 if (memcmp (salt_pos, "rounds=", 7) == 0)
11834 {
11835 salt_pos += 7;
11836
11837 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
11838
11839 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
11840 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
11841
11842 salt_pos[0] = 0x0;
11843
11844 salt->salt_iter = atoi (salt_pos - iterations_len);
11845
11846 salt_pos += 1;
11847
11848 iterations_len += 8;
11849 }
11850 else
11851 {
11852 salt->salt_iter = ROUNDS_SHA512CRYPT;
11853 }
11854
11855 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
11856
11857 char *hash_pos = strchr (salt_pos, '$');
11858
11859 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11860
11861 uint salt_len = hash_pos - salt_pos;
11862
11863 if (salt_len > 16) return (PARSER_SALT_LENGTH);
11864
11865 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
11866
11867 salt->salt_len = salt_len;
11868
11869 hash_pos++;
11870
11871 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
11872
11873 return (PARSER_OK);
11874 }
11875
11876 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11877 {
11878 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
11879
11880 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
11881
11882 uint64_t *digest = (uint64_t *) hash_buf->digest;
11883
11884 salt_t *salt = hash_buf->salt;
11885
11886 uint keccak_mdlen = input_len / 2;
11887
11888 for (uint i = 0; i < keccak_mdlen / 8; i++)
11889 {
11890 digest[i] = hex_to_uint64_t (&input_buf[i * 16]);
11891
11892 digest[i] = byte_swap_64 (digest[i]);
11893 }
11894
11895 salt->keccak_mdlen = keccak_mdlen;
11896
11897 return (PARSER_OK);
11898 }
11899
11900 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11901 {
11902 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
11903
11904 uint32_t *digest = (uint32_t *) hash_buf->digest;
11905
11906 salt_t *salt = hash_buf->salt;
11907
11908 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
11909
11910 /**
11911 * Parse that strange long line
11912 */
11913
11914 char *in_off[9];
11915
11916 size_t in_len[9];
11917
11918 in_off[0] = strtok (input_buf, ":");
11919
11920 in_len[0] = strlen (in_off[0]);
11921
11922 size_t i;
11923
11924 for (i = 1; i < 9; i++)
11925 {
11926 in_off[i] = strtok (NULL, ":");
11927
11928 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
11929
11930 in_len[i] = strlen (in_off[i]);
11931 }
11932
11933 char *ptr;
11934
11935 ptr = (char *) ikepsk->msg_buf;
11936
11937 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_char (in_off[0] + i);
11938 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_char (in_off[1] + i);
11939 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_char (in_off[2] + i);
11940 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_char (in_off[3] + i);
11941 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_char (in_off[4] + i);
11942 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_char (in_off[5] + i);
11943
11944 *ptr = 0x80;
11945
11946 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
11947
11948 ptr = (char *) ikepsk->nr_buf;
11949
11950 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_char (in_off[6] + i);
11951 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_char (in_off[7] + i);
11952
11953 *ptr = 0x80;
11954
11955 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
11956
11957 /**
11958 * Store to database
11959 */
11960
11961 ptr = in_off[8];
11962
11963 digest[0] = hex_to_uint (&ptr[ 0]);
11964 digest[1] = hex_to_uint (&ptr[ 8]);
11965 digest[2] = hex_to_uint (&ptr[16]);
11966 digest[3] = hex_to_uint (&ptr[24]);
11967
11968 digest[0] = byte_swap_32 (digest[0]);
11969 digest[1] = byte_swap_32 (digest[1]);
11970 digest[2] = byte_swap_32 (digest[2]);
11971 digest[3] = byte_swap_32 (digest[3]);
11972
11973 salt->salt_len = 32;
11974
11975 salt->salt_buf[0] = ikepsk->nr_buf[0];
11976 salt->salt_buf[1] = ikepsk->nr_buf[1];
11977 salt->salt_buf[2] = ikepsk->nr_buf[2];
11978 salt->salt_buf[3] = ikepsk->nr_buf[3];
11979 salt->salt_buf[4] = ikepsk->nr_buf[4];
11980 salt->salt_buf[5] = ikepsk->nr_buf[5];
11981 salt->salt_buf[6] = ikepsk->nr_buf[6];
11982 salt->salt_buf[7] = ikepsk->nr_buf[7];
11983
11984 return (PARSER_OK);
11985 }
11986
11987 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11988 {
11989 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
11990
11991 uint32_t *digest = (uint32_t *) hash_buf->digest;
11992
11993 salt_t *salt = hash_buf->salt;
11994
11995 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
11996
11997 /**
11998 * Parse that strange long line
11999 */
12000
12001 char *in_off[9];
12002
12003 size_t in_len[9];
12004
12005 in_off[0] = strtok (input_buf, ":");
12006
12007 in_len[0] = strlen (in_off[0]);
12008
12009 size_t i;
12010
12011 for (i = 1; i < 9; i++)
12012 {
12013 in_off[i] = strtok (NULL, ":");
12014
12015 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12016
12017 in_len[i] = strlen (in_off[i]);
12018 }
12019
12020 char *ptr;
12021
12022 ptr = (char *) ikepsk->msg_buf;
12023
12024 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_char (in_off[0] + i);
12025 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_char (in_off[1] + i);
12026 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_char (in_off[2] + i);
12027 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_char (in_off[3] + i);
12028 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_char (in_off[4] + i);
12029 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_char (in_off[5] + i);
12030
12031 *ptr = 0x80;
12032
12033 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12034
12035 ptr = (char *) ikepsk->nr_buf;
12036
12037 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_char (in_off[6] + i);
12038 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_char (in_off[7] + i);
12039
12040 *ptr = 0x80;
12041
12042 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12043
12044 /**
12045 * Store to database
12046 */
12047
12048 ptr = in_off[8];
12049
12050 digest[0] = hex_to_uint (&ptr[ 0]);
12051 digest[1] = hex_to_uint (&ptr[ 8]);
12052 digest[2] = hex_to_uint (&ptr[16]);
12053 digest[3] = hex_to_uint (&ptr[24]);
12054 digest[4] = hex_to_uint (&ptr[32]);
12055
12056 salt->salt_len = 32;
12057
12058 salt->salt_buf[0] = ikepsk->nr_buf[0];
12059 salt->salt_buf[1] = ikepsk->nr_buf[1];
12060 salt->salt_buf[2] = ikepsk->nr_buf[2];
12061 salt->salt_buf[3] = ikepsk->nr_buf[3];
12062 salt->salt_buf[4] = ikepsk->nr_buf[4];
12063 salt->salt_buf[5] = ikepsk->nr_buf[5];
12064 salt->salt_buf[6] = ikepsk->nr_buf[6];
12065 salt->salt_buf[7] = ikepsk->nr_buf[7];
12066
12067 return (PARSER_OK);
12068 }
12069
12070 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12071 {
12072 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12073
12074 uint32_t *digest = (uint32_t *) hash_buf->digest;
12075
12076 digest[0] = hex_to_uint (&input_buf[ 0]);
12077 digest[1] = hex_to_uint (&input_buf[ 8]);
12078 digest[2] = hex_to_uint (&input_buf[16]);
12079 digest[3] = hex_to_uint (&input_buf[24]);
12080 digest[4] = hex_to_uint (&input_buf[32]);
12081
12082 digest[0] = byte_swap_32 (digest[0]);
12083 digest[1] = byte_swap_32 (digest[1]);
12084 digest[2] = byte_swap_32 (digest[2]);
12085 digest[3] = byte_swap_32 (digest[3]);
12086 digest[4] = byte_swap_32 (digest[4]);
12087
12088 return (PARSER_OK);
12089 }
12090
12091 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12092 {
12093 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12094
12095 uint32_t *digest = (uint32_t *) hash_buf->digest;
12096
12097 digest[ 0] = hex_to_uint (&input_buf[ 0]);
12098 digest[ 1] = hex_to_uint (&input_buf[ 8]);
12099 digest[ 2] = hex_to_uint (&input_buf[ 16]);
12100 digest[ 3] = hex_to_uint (&input_buf[ 24]);
12101 digest[ 4] = hex_to_uint (&input_buf[ 32]);
12102 digest[ 5] = hex_to_uint (&input_buf[ 40]);
12103 digest[ 6] = hex_to_uint (&input_buf[ 48]);
12104 digest[ 7] = hex_to_uint (&input_buf[ 56]);
12105 digest[ 8] = hex_to_uint (&input_buf[ 64]);
12106 digest[ 9] = hex_to_uint (&input_buf[ 72]);
12107 digest[10] = hex_to_uint (&input_buf[ 80]);
12108 digest[11] = hex_to_uint (&input_buf[ 88]);
12109 digest[12] = hex_to_uint (&input_buf[ 96]);
12110 digest[13] = hex_to_uint (&input_buf[104]);
12111 digest[14] = hex_to_uint (&input_buf[112]);
12112 digest[15] = hex_to_uint (&input_buf[120]);
12113
12114 return (PARSER_OK);
12115 }
12116
12117 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12118 {
12119 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12120
12121 uint32_t *digest = (uint32_t *) hash_buf->digest;
12122
12123 salt_t *salt = hash_buf->salt;
12124
12125 digest[0] = hex_to_uint (&input_buf[ 0]);
12126 digest[1] = hex_to_uint (&input_buf[ 8]);
12127 digest[2] = hex_to_uint (&input_buf[16]);
12128 digest[3] = hex_to_uint (&input_buf[24]);
12129 digest[4] = hex_to_uint (&input_buf[32]);
12130
12131 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12132
12133 uint salt_len = input_len - 40 - 1;
12134
12135 char *salt_buf = input_buf + 40 + 1;
12136
12137 char *salt_buf_ptr = (char *) salt->salt_buf;
12138
12139 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12140
12141 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12142
12143 salt->salt_len = salt_len;
12144
12145 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12146
12147 return (PARSER_OK);
12148 }
12149
12150 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12151 {
12152 uint32_t *digest = (uint32_t *) hash_buf->digest;
12153
12154 salt_t *salt = hash_buf->salt;
12155
12156 tc_t *tc = (tc_t *) hash_buf->esalt;
12157
12158 if (input_len == 0)
12159 {
12160 log_error ("TrueCrypt container not specified");
12161
12162 exit (-1);
12163 }
12164
12165 FILE *fp = fopen (input_buf, "rb");
12166
12167 if (fp == NULL)
12168 {
12169 log_error ("%s: %s", input_buf, strerror (errno));
12170
12171 exit (-1);
12172 }
12173
12174 char buf[512];
12175
12176 int n = fread (buf, 1, sizeof (buf), fp);
12177
12178 fclose (fp);
12179
12180 if (n != 512) return (PARSER_TC_FILE_SIZE);
12181
12182 memcpy (tc->salt_buf, buf, 64);
12183
12184 memcpy (tc->data_buf, buf + 64, 512 - 64);
12185
12186 salt->salt_buf[0] = tc->salt_buf[0];
12187
12188 salt->salt_len = 4;
12189
12190 salt->salt_iter = 1000 - 1;
12191
12192 digest[0] = tc->data_buf[0];
12193
12194 return (PARSER_OK);
12195 }
12196
12197 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12198 {
12199 uint32_t *digest = (uint32_t *) hash_buf->digest;
12200
12201 salt_t *salt = hash_buf->salt;
12202
12203 tc_t *tc = (tc_t *) hash_buf->esalt;
12204
12205 if (input_len == 0)
12206 {
12207 log_error ("TrueCrypt container not specified");
12208
12209 exit (-1);
12210 }
12211
12212 FILE *fp = fopen (input_buf, "rb");
12213
12214 if (fp == NULL)
12215 {
12216 log_error ("%s: %s", input_buf, strerror (errno));
12217
12218 exit (-1);
12219 }
12220
12221 char buf[512];
12222
12223 int n = fread (buf, 1, sizeof (buf), fp);
12224
12225 fclose (fp);
12226
12227 if (n != 512) return (PARSER_TC_FILE_SIZE);
12228
12229 memcpy (tc->salt_buf, buf, 64);
12230
12231 memcpy (tc->data_buf, buf + 64, 512 - 64);
12232
12233 salt->salt_buf[0] = tc->salt_buf[0];
12234
12235 salt->salt_len = 4;
12236
12237 salt->salt_iter = 2000 - 1;
12238
12239 digest[0] = tc->data_buf[0];
12240
12241 return (PARSER_OK);
12242 }
12243
12244 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12245 {
12246 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12247
12248 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12249
12250 uint32_t *digest = (uint32_t *) hash_buf->digest;
12251
12252 salt_t *salt = hash_buf->salt;
12253
12254 char *salt_pos = input_buf + 6;
12255
12256 char *hash_pos = strchr (salt_pos, '$');
12257
12258 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12259
12260 uint salt_len = hash_pos - salt_pos;
12261
12262 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12263
12264 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12265
12266 salt->salt_len = salt_len;
12267
12268 salt->salt_iter = 1000;
12269
12270 hash_pos++;
12271
12272 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12273
12274 return (PARSER_OK);
12275 }
12276
12277 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12278 {
12279 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12280
12281 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12282
12283 uint32_t *digest = (uint32_t *) hash_buf->digest;
12284
12285 salt_t *salt = hash_buf->salt;
12286
12287 char *iter_pos = input_buf + 7;
12288
12289 char *salt_pos = strchr (iter_pos, '$');
12290
12291 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12292
12293 salt_pos++;
12294
12295 char *hash_pos = strchr (salt_pos, '$');
12296
12297 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12298
12299 uint salt_len = hash_pos - salt_pos;
12300
12301 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12302
12303 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12304
12305 salt->salt_len = salt_len;
12306
12307 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12308
12309 salt->salt_sign[0] = atoi (salt_iter);
12310
12311 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12312
12313 hash_pos++;
12314
12315 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12316
12317 digest[0] = byte_swap_32 (digest[0]);
12318 digest[1] = byte_swap_32 (digest[1]);
12319 digest[2] = byte_swap_32 (digest[2]);
12320 digest[3] = byte_swap_32 (digest[3]);
12321 digest[4] = byte_swap_32 (digest[4]);
12322
12323 return (PARSER_OK);
12324 }
12325
12326 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12327 {
12328 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12329
12330 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12331
12332 uint32_t *digest = (uint32_t *) hash_buf->digest;
12333
12334 salt_t *salt = hash_buf->salt;
12335
12336 char *iter_pos = input_buf + 9;
12337
12338 char *salt_pos = strchr (iter_pos, '$');
12339
12340 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12341
12342 salt_pos++;
12343
12344 char *hash_pos = strchr (salt_pos, '$');
12345
12346 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12347
12348 uint salt_len = hash_pos - salt_pos;
12349
12350 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12351
12352 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12353
12354 salt->salt_len = salt_len;
12355
12356 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12357
12358 salt->salt_sign[0] = atoi (salt_iter);
12359
12360 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12361
12362 hash_pos++;
12363
12364 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12365
12366 digest[0] = byte_swap_32 (digest[0]);
12367 digest[1] = byte_swap_32 (digest[1]);
12368 digest[2] = byte_swap_32 (digest[2]);
12369 digest[3] = byte_swap_32 (digest[3]);
12370 digest[4] = byte_swap_32 (digest[4]);
12371 digest[5] = byte_swap_32 (digest[5]);
12372 digest[6] = byte_swap_32 (digest[6]);
12373 digest[7] = byte_swap_32 (digest[7]);
12374
12375 return (PARSER_OK);
12376 }
12377
12378 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12379 {
12380 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12381
12382 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12383
12384 uint64_t *digest = (uint64_t *) hash_buf->digest;
12385
12386 salt_t *salt = hash_buf->salt;
12387
12388 char *iter_pos = input_buf + 9;
12389
12390 char *salt_pos = strchr (iter_pos, '$');
12391
12392 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12393
12394 salt_pos++;
12395
12396 char *hash_pos = strchr (salt_pos, '$');
12397
12398 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12399
12400 uint salt_len = hash_pos - salt_pos;
12401
12402 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12403
12404 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12405
12406 salt->salt_len = salt_len;
12407
12408 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12409
12410 salt->salt_sign[0] = atoi (salt_iter);
12411
12412 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12413
12414 hash_pos++;
12415
12416 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12417
12418 digest[0] = byte_swap_64 (digest[0]);
12419 digest[1] = byte_swap_64 (digest[1]);
12420 digest[2] = byte_swap_64 (digest[2]);
12421 digest[3] = byte_swap_64 (digest[3]);
12422 digest[4] = byte_swap_64 (digest[4]);
12423 digest[5] = byte_swap_64 (digest[5]);
12424 digest[6] = byte_swap_64 (digest[6]);
12425 digest[7] = byte_swap_64 (digest[7]);
12426
12427 return (PARSER_OK);
12428 }
12429
12430 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12431 {
12432 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12433
12434 uint32_t *digest = (uint32_t *) hash_buf->digest;
12435
12436 salt_t *salt = hash_buf->salt;
12437
12438 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12439
12440 /**
12441 * parse line
12442 */
12443
12444 char *iterations_pos = input_buf;
12445
12446 char *saltbuf_pos = strchr (iterations_pos, ':');
12447
12448 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12449
12450 uint iterations_len = saltbuf_pos - iterations_pos;
12451
12452 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12453
12454 saltbuf_pos++;
12455
12456 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12457
12458 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12459
12460 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12461
12462 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12463
12464 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12465
12466 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12467
12468 cipherbuf_pos++;
12469
12470 /**
12471 * pbkdf2 iterations
12472 */
12473
12474 salt->salt_iter = atoi (iterations_pos) - 1;
12475
12476 /**
12477 * handle salt encoding
12478 */
12479
12480 char *saltbuf_ptr = (char *) salt->salt_buf;
12481
12482 for (uint i = 0; i < saltbuf_len; i += 2)
12483 {
12484 const char p0 = saltbuf_pos[i + 0];
12485 const char p1 = saltbuf_pos[i + 1];
12486
12487 *saltbuf_ptr++ = hex_convert (p1) << 0
12488 | hex_convert (p0) << 4;
12489 }
12490
12491 salt->salt_len = saltbuf_len / 2;
12492
12493 /**
12494 * handle cipher encoding
12495 */
12496
12497 uint *tmp = (uint *) mymalloc (32);
12498
12499 char *cipherbuf_ptr = (char *) tmp;
12500
12501 for (uint i = 2016; i < cipherbuf_len; i += 2)
12502 {
12503 const char p0 = cipherbuf_pos[i + 0];
12504 const char p1 = cipherbuf_pos[i + 1];
12505
12506 *cipherbuf_ptr++ = hex_convert (p1) << 0
12507 | hex_convert (p0) << 4;
12508 }
12509
12510 // iv is stored at salt_buf 4 (length 16)
12511 // data is stored at salt_buf 8 (length 16)
12512
12513 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12514 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12515 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12516 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12517
12518 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12519 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12520 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12521 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12522
12523 free (tmp);
12524
12525 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12526 {
12527 const char p0 = cipherbuf_pos[j + 0];
12528 const char p1 = cipherbuf_pos[j + 1];
12529
12530 agilekey->cipher[i] = hex_convert (p1) << 0
12531 | hex_convert (p0) << 4;
12532 }
12533
12534 /**
12535 * digest buf
12536 */
12537
12538 digest[0] = 0x10101010;
12539 digest[1] = 0x10101010;
12540 digest[2] = 0x10101010;
12541 digest[3] = 0x10101010;
12542
12543 return (PARSER_OK);
12544 }
12545
12546 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12547 {
12548 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12549
12550 uint32_t *digest = (uint32_t *) hash_buf->digest;
12551
12552 salt_t *salt = hash_buf->salt;
12553
12554 char *hashbuf_pos = input_buf;
12555
12556 char *iterations_pos = strchr (hashbuf_pos, ':');
12557
12558 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12559
12560 uint hash_len = iterations_pos - hashbuf_pos;
12561
12562 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12563
12564 iterations_pos++;
12565
12566 char *saltbuf_pos = strchr (iterations_pos, ':');
12567
12568 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12569
12570 uint iterations_len = saltbuf_pos - iterations_pos;
12571
12572 saltbuf_pos++;
12573
12574 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12575
12576 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12577
12578 char *salt_buf_ptr = (char *) salt->salt_buf;
12579
12580 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12581
12582 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12583
12584 salt->salt_len = salt_len;
12585
12586 salt->salt_iter = atoi (iterations_pos) - 1;
12587
12588 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
12589 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
12590 digest[2] = hex_to_uint (&hashbuf_pos[16]);
12591 digest[3] = hex_to_uint (&hashbuf_pos[24]);
12592
12593 return (PARSER_OK);
12594 }
12595
12596 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12597 {
12598 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12599
12600 uint32_t *digest = (uint32_t *) hash_buf->digest;
12601
12602 digest[0] = hex_to_uint (&input_buf[ 0]);
12603 digest[1] = hex_to_uint (&input_buf[ 8]);
12604 digest[2] = hex_to_uint (&input_buf[16]);
12605 digest[3] = hex_to_uint (&input_buf[24]);
12606 digest[4] = hex_to_uint (&input_buf[32]);
12607 digest[5] = hex_to_uint (&input_buf[40]);
12608 digest[6] = hex_to_uint (&input_buf[48]);
12609 digest[7] = hex_to_uint (&input_buf[56]);
12610
12611 digest[0] = byte_swap_32 (digest[0]);
12612 digest[1] = byte_swap_32 (digest[1]);
12613 digest[2] = byte_swap_32 (digest[2]);
12614 digest[3] = byte_swap_32 (digest[3]);
12615 digest[4] = byte_swap_32 (digest[4]);
12616 digest[5] = byte_swap_32 (digest[5]);
12617 digest[6] = byte_swap_32 (digest[6]);
12618 digest[7] = byte_swap_32 (digest[7]);
12619
12620 return (PARSER_OK);
12621 }
12622
12623 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12624 {
12625 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12626
12627 uint32_t *digest = (uint32_t *) hash_buf->digest;
12628
12629 salt_t *salt = hash_buf->salt;
12630
12631 char *salt_pos = input_buf + 3;
12632
12633 uint iterations_len = 0;
12634
12635 if (memcmp (salt_pos, "rounds=", 7) == 0)
12636 {
12637 salt_pos += 7;
12638
12639 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12640
12641 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12642 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12643
12644 salt_pos[0] = 0x0;
12645
12646 salt->salt_iter = atoi (salt_pos - iterations_len);
12647
12648 salt_pos += 1;
12649
12650 iterations_len += 8;
12651 }
12652 else
12653 {
12654 salt->salt_iter = ROUNDS_SHA256CRYPT;
12655 }
12656
12657 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12658
12659 char *hash_pos = strchr (salt_pos, '$');
12660
12661 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12662
12663 uint salt_len = hash_pos - salt_pos;
12664
12665 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12666
12667 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12668
12669 salt->salt_len = salt_len;
12670
12671 hash_pos++;
12672
12673 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12674
12675 return (PARSER_OK);
12676 }
12677
12678 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12679 {
12680 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12681
12682 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12683
12684 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12685
12686 uint64_t *digest = (uint64_t *) hash_buf->digest;
12687
12688 salt_t *salt = hash_buf->salt;
12689
12690 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12691
12692 char *iter_pos = input_buf + 4;
12693
12694 char *salt_pos = strchr (iter_pos, '$');
12695
12696 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12697
12698 salt_pos++;
12699
12700 char *hash_pos = strchr (salt_pos, '$');
12701
12702 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12703
12704 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12705
12706 hash_pos++;
12707
12708 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
12709 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
12710 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
12711 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
12712 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
12713 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
12714 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
12715 digest[7] = hex_to_uint64_t (&hash_pos[112]);
12716
12717 uint salt_len = hash_pos - salt_pos - 1;
12718
12719 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12720
12721 salt->salt_len = salt_len / 2;
12722
12723 pbkdf2_sha512->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
12724 pbkdf2_sha512->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
12725 pbkdf2_sha512->salt_buf[2] = hex_to_uint (&salt_pos[16]);
12726 pbkdf2_sha512->salt_buf[3] = hex_to_uint (&salt_pos[24]);
12727 pbkdf2_sha512->salt_buf[4] = hex_to_uint (&salt_pos[32]);
12728 pbkdf2_sha512->salt_buf[5] = hex_to_uint (&salt_pos[40]);
12729 pbkdf2_sha512->salt_buf[6] = hex_to_uint (&salt_pos[48]);
12730 pbkdf2_sha512->salt_buf[7] = hex_to_uint (&salt_pos[56]);
12731
12732 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12733 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12734 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12735 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12736 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12737 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12738 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12739 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12740 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12741 pbkdf2_sha512->salt_buf[9] = 0x80;
12742
12743 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12744
12745 salt->salt_iter = atoi (iter_pos) - 1;
12746
12747 return (PARSER_OK);
12748 }
12749
12750 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12751 {
12752 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12753
12754 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12755
12756 uint32_t *digest = (uint32_t *) hash_buf->digest;
12757
12758 salt_t *salt = hash_buf->salt;
12759
12760 char *salt_pos = input_buf + 14;
12761
12762 char *hash_pos = strchr (salt_pos, '*');
12763
12764 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12765
12766 hash_pos++;
12767
12768 uint salt_len = hash_pos - salt_pos - 1;
12769
12770 char *salt_buf_ptr = (char *) salt->salt_buf;
12771
12772 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
12773
12774 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12775
12776 salt->salt_len = salt_len;
12777
12778 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
12779
12780 base64_decode (base64_to_int, hash_pos, 43, tmp_buf);
12781
12782 memcpy (digest, tmp_buf, 32);
12783
12784 digest[0] = byte_swap_32 (digest[0]);
12785 digest[1] = byte_swap_32 (digest[1]);
12786 digest[2] = byte_swap_32 (digest[2]);
12787 digest[3] = byte_swap_32 (digest[3]);
12788 digest[4] = byte_swap_32 (digest[4]);
12789 digest[5] = byte_swap_32 (digest[5]);
12790 digest[6] = byte_swap_32 (digest[6]);
12791 digest[7] = byte_swap_32 (digest[7]);
12792
12793 digest[0] -= SHA256M_A;
12794 digest[1] -= SHA256M_B;
12795 digest[2] -= SHA256M_C;
12796 digest[3] -= SHA256M_D;
12797 digest[4] -= SHA256M_E;
12798 digest[5] -= SHA256M_F;
12799 digest[6] -= SHA256M_G;
12800 digest[7] -= SHA256M_H;
12801
12802 return (PARSER_OK);
12803 }
12804
12805 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12806 {
12807 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
12808
12809 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12810
12811 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
12812
12813 uint64_t *digest = (uint64_t *) hash_buf->digest;
12814
12815 salt_t *salt = hash_buf->salt;
12816
12817 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12818
12819 char *iter_pos = input_buf + 19;
12820
12821 char *salt_pos = strchr (iter_pos, '.');
12822
12823 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12824
12825 salt_pos++;
12826
12827 char *hash_pos = strchr (salt_pos, '.');
12828
12829 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12830
12831 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12832
12833 hash_pos++;
12834
12835 digest[0] = hex_to_uint64_t (&hash_pos[ 0]);
12836 digest[1] = hex_to_uint64_t (&hash_pos[ 16]);
12837 digest[2] = hex_to_uint64_t (&hash_pos[ 32]);
12838 digest[3] = hex_to_uint64_t (&hash_pos[ 48]);
12839 digest[4] = hex_to_uint64_t (&hash_pos[ 64]);
12840 digest[5] = hex_to_uint64_t (&hash_pos[ 80]);
12841 digest[6] = hex_to_uint64_t (&hash_pos[ 96]);
12842 digest[7] = hex_to_uint64_t (&hash_pos[112]);
12843
12844 uint salt_len = hash_pos - salt_pos - 1;
12845
12846 salt_len /= 2;
12847
12848 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
12849
12850 uint i;
12851
12852 for (i = 0; i < salt_len; i++)
12853 {
12854 salt_buf_ptr[i] = hex_to_char (&salt_pos[i * 2]);
12855 }
12856
12857 salt_buf_ptr[salt_len + 3] = 0x01;
12858 salt_buf_ptr[salt_len + 4] = 0x80;
12859
12860 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12861
12862 salt->salt_len = salt_len;
12863
12864 salt->salt_iter = atoi (iter_pos) - 1;
12865
12866 return (PARSER_OK);
12867 }
12868
12869 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12870 {
12871 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
12872
12873 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12874
12875 uint64_t *digest = (uint64_t *) hash_buf->digest;
12876
12877 salt_t *salt = hash_buf->salt;
12878
12879 char tmp_buf[120];
12880
12881 memset (tmp_buf, 0, sizeof (tmp_buf));
12882
12883 int tmp_len = base64_decode (base64_to_int, input_buf + 9, input_len - 9, tmp_buf);
12884
12885 memcpy (digest, tmp_buf, 64);
12886
12887 digest[0] = byte_swap_64 (digest[0]);
12888 digest[1] = byte_swap_64 (digest[1]);
12889 digest[2] = byte_swap_64 (digest[2]);
12890 digest[3] = byte_swap_64 (digest[3]);
12891 digest[4] = byte_swap_64 (digest[4]);
12892 digest[5] = byte_swap_64 (digest[5]);
12893 digest[6] = byte_swap_64 (digest[6]);
12894 digest[7] = byte_swap_64 (digest[7]);
12895
12896 digest[0] -= SHA512M_A;
12897 digest[1] -= SHA512M_B;
12898 digest[2] -= SHA512M_C;
12899 digest[3] -= SHA512M_D;
12900 digest[4] -= SHA512M_E;
12901 digest[5] -= SHA512M_F;
12902 digest[6] -= SHA512M_G;
12903 digest[7] -= SHA512M_H;
12904
12905 salt->salt_len = tmp_len - 64;
12906
12907 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
12908
12909 if (data.opts_type & OPTS_TYPE_ST_ADD80)
12910 {
12911 char *ptr = (char *) salt->salt_buf;
12912
12913 ptr[salt->salt_len] = 0x80;
12914 }
12915
12916 return (PARSER_OK);
12917 }
12918
12919 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12920 {
12921 if (data.opts_type & OPTS_TYPE_ST_HEX)
12922 {
12923 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
12924 }
12925 else
12926 {
12927 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
12928 }
12929
12930 uint32_t *digest = (uint32_t *) hash_buf->digest;
12931
12932 salt_t *salt = hash_buf->salt;
12933
12934 digest[0] = hex_to_uint (&input_buf[ 0]);
12935 digest[1] = hex_to_uint (&input_buf[ 8]);
12936 digest[2] = hex_to_uint (&input_buf[16]);
12937 digest[3] = hex_to_uint (&input_buf[24]);
12938
12939 digest[0] = byte_swap_32 (digest[0]);
12940 digest[1] = byte_swap_32 (digest[1]);
12941 digest[2] = byte_swap_32 (digest[2]);
12942 digest[3] = byte_swap_32 (digest[3]);
12943
12944 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12945
12946 uint salt_len = input_len - 32 - 1;
12947
12948 char *salt_buf = input_buf + 32 + 1;
12949
12950 char *salt_buf_ptr = (char *) salt->salt_buf;
12951
12952 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12953
12954 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12955
12956 salt->salt_len = salt_len;
12957
12958 return (PARSER_OK);
12959 }
12960
12961 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12962 {
12963 if (data.opts_type & OPTS_TYPE_ST_HEX)
12964 {
12965 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
12966 }
12967 else
12968 {
12969 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
12970 }
12971
12972 uint32_t *digest = (uint32_t *) hash_buf->digest;
12973
12974 salt_t *salt = hash_buf->salt;
12975
12976 digest[0] = hex_to_uint (&input_buf[ 0]);
12977 digest[1] = hex_to_uint (&input_buf[ 8]);
12978 digest[2] = hex_to_uint (&input_buf[16]);
12979 digest[3] = hex_to_uint (&input_buf[24]);
12980 digest[4] = hex_to_uint (&input_buf[32]);
12981
12982 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12983
12984 uint salt_len = input_len - 40 - 1;
12985
12986 char *salt_buf = input_buf + 40 + 1;
12987
12988 char *salt_buf_ptr = (char *) salt->salt_buf;
12989
12990 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12991
12992 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12993
12994 salt->salt_len = salt_len;
12995
12996 return (PARSER_OK);
12997 }
12998
12999 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13000 {
13001 if (data.opts_type & OPTS_TYPE_ST_HEX)
13002 {
13003 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13004 }
13005 else
13006 {
13007 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13008 }
13009
13010 uint32_t *digest = (uint32_t *) hash_buf->digest;
13011
13012 salt_t *salt = hash_buf->salt;
13013
13014 digest[0] = hex_to_uint (&input_buf[ 0]);
13015 digest[1] = hex_to_uint (&input_buf[ 8]);
13016 digest[2] = hex_to_uint (&input_buf[16]);
13017 digest[3] = hex_to_uint (&input_buf[24]);
13018 digest[4] = hex_to_uint (&input_buf[32]);
13019 digest[5] = hex_to_uint (&input_buf[40]);
13020 digest[6] = hex_to_uint (&input_buf[48]);
13021 digest[7] = hex_to_uint (&input_buf[56]);
13022
13023 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13024
13025 uint salt_len = input_len - 64 - 1;
13026
13027 char *salt_buf = input_buf + 64 + 1;
13028
13029 char *salt_buf_ptr = (char *) salt->salt_buf;
13030
13031 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13032
13033 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13034
13035 salt->salt_len = salt_len;
13036
13037 return (PARSER_OK);
13038 }
13039
13040 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13041 {
13042 if (data.opts_type & OPTS_TYPE_ST_HEX)
13043 {
13044 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13045 }
13046 else
13047 {
13048 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13049 }
13050
13051 uint64_t *digest = (uint64_t *) hash_buf->digest;
13052
13053 salt_t *salt = hash_buf->salt;
13054
13055 digest[0] = hex_to_uint64_t (&input_buf[ 0]);
13056 digest[1] = hex_to_uint64_t (&input_buf[ 16]);
13057 digest[2] = hex_to_uint64_t (&input_buf[ 32]);
13058 digest[3] = hex_to_uint64_t (&input_buf[ 48]);
13059 digest[4] = hex_to_uint64_t (&input_buf[ 64]);
13060 digest[5] = hex_to_uint64_t (&input_buf[ 80]);
13061 digest[6] = hex_to_uint64_t (&input_buf[ 96]);
13062 digest[7] = hex_to_uint64_t (&input_buf[112]);
13063
13064 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13065
13066 uint salt_len = input_len - 128 - 1;
13067
13068 char *salt_buf = input_buf + 128 + 1;
13069
13070 char *salt_buf_ptr = (char *) salt->salt_buf;
13071
13072 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13073
13074 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13075
13076 salt->salt_len = salt_len;
13077
13078 return (PARSER_OK);
13079 }
13080
13081 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13082 {
13083 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13084
13085 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13086
13087 uint32_t *digest = (uint32_t *) hash_buf->digest;
13088
13089 salt_t *salt = hash_buf->salt;
13090
13091 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13092
13093 /**
13094 * parse line
13095 */
13096
13097 char *user_pos = input_buf + 10 + 1;
13098
13099 char *realm_pos = strchr (user_pos, '$');
13100
13101 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13102
13103 uint user_len = realm_pos - user_pos;
13104
13105 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13106
13107 realm_pos++;
13108
13109 char *salt_pos = strchr (realm_pos, '$');
13110
13111 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13112
13113 uint realm_len = salt_pos - realm_pos;
13114
13115 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13116
13117 salt_pos++;
13118
13119 char *data_pos = strchr (salt_pos, '$');
13120
13121 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13122
13123 uint salt_len = data_pos - salt_pos;
13124
13125 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13126
13127 data_pos++;
13128
13129 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13130
13131 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13132
13133 /**
13134 * copy data
13135 */
13136
13137 memcpy (krb5pa->user, user_pos, user_len);
13138 memcpy (krb5pa->realm, realm_pos, realm_len);
13139 memcpy (krb5pa->salt, salt_pos, salt_len);
13140
13141 char *timestamp_ptr = (char *) krb5pa->timestamp;
13142
13143 for (uint i = 0; i < (36 * 2); i += 2)
13144 {
13145 const char p0 = data_pos[i + 0];
13146 const char p1 = data_pos[i + 1];
13147
13148 *timestamp_ptr++ = hex_convert (p1) << 0
13149 | hex_convert (p0) << 4;
13150 }
13151
13152 char *checksum_ptr = (char *) krb5pa->checksum;
13153
13154 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13155 {
13156 const char p0 = data_pos[i + 0];
13157 const char p1 = data_pos[i + 1];
13158
13159 *checksum_ptr++ = hex_convert (p1) << 0
13160 | hex_convert (p0) << 4;
13161 }
13162
13163 /**
13164 * copy some data to generic buffers to make sorting happy
13165 */
13166
13167 salt->salt_buf[0] = krb5pa->timestamp[0];
13168 salt->salt_buf[1] = krb5pa->timestamp[1];
13169 salt->salt_buf[2] = krb5pa->timestamp[2];
13170 salt->salt_buf[3] = krb5pa->timestamp[3];
13171 salt->salt_buf[4] = krb5pa->timestamp[4];
13172 salt->salt_buf[5] = krb5pa->timestamp[5];
13173 salt->salt_buf[6] = krb5pa->timestamp[6];
13174 salt->salt_buf[7] = krb5pa->timestamp[7];
13175 salt->salt_buf[8] = krb5pa->timestamp[8];
13176
13177 salt->salt_len = 36;
13178
13179 digest[0] = krb5pa->checksum[0];
13180 digest[1] = krb5pa->checksum[1];
13181 digest[2] = krb5pa->checksum[2];
13182 digest[3] = krb5pa->checksum[3];
13183
13184 return (PARSER_OK);
13185 }
13186
13187 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13188 {
13189 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13190
13191 uint32_t *digest = (uint32_t *) hash_buf->digest;
13192
13193 salt_t *salt = hash_buf->salt;
13194
13195 /**
13196 * parse line
13197 */
13198
13199 char *salt_pos = input_buf;
13200
13201 char *hash_pos = strchr (salt_pos, '$');
13202
13203 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13204
13205 uint salt_len = hash_pos - salt_pos;
13206
13207 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13208
13209 hash_pos++;
13210
13211 uint hash_len = input_len - 1 - salt_len;
13212
13213 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13214
13215 /**
13216 * valid some data
13217 */
13218
13219 uint user_len = 0;
13220
13221 for (uint i = 0; i < salt_len; i++)
13222 {
13223 if (salt_pos[i] == ' ') continue;
13224
13225 user_len++;
13226 }
13227
13228 // SAP user names cannot be longer than 12 characters
13229 if (user_len > 12) return (PARSER_SALT_LENGTH);
13230
13231 // SAP user name cannot start with ! or ?
13232 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13233
13234 /**
13235 * copy data
13236 */
13237
13238 char *salt_buf_ptr = (char *) salt->salt_buf;
13239
13240 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13241
13242 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13243
13244 salt->salt_len = salt_len;
13245
13246 digest[0] = hex_to_uint (&hash_pos[0]);
13247 digest[1] = hex_to_uint (&hash_pos[8]);
13248 digest[2] = 0;
13249 digest[3] = 0;
13250
13251 digest[0] = byte_swap_32 (digest[0]);
13252 digest[1] = byte_swap_32 (digest[1]);
13253
13254 return (PARSER_OK);
13255 }
13256
13257 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13258 {
13259 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13260
13261 uint32_t *digest = (uint32_t *) hash_buf->digest;
13262
13263 salt_t *salt = hash_buf->salt;
13264
13265 /**
13266 * parse line
13267 */
13268
13269 char *salt_pos = input_buf;
13270
13271 char *hash_pos = strchr (salt_pos, '$');
13272
13273 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13274
13275 uint salt_len = hash_pos - salt_pos;
13276
13277 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13278
13279 hash_pos++;
13280
13281 uint hash_len = input_len - 1 - salt_len;
13282
13283 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13284
13285 /**
13286 * valid some data
13287 */
13288
13289 uint user_len = 0;
13290
13291 for (uint i = 0; i < salt_len; i++)
13292 {
13293 if (salt_pos[i] == ' ') continue;
13294
13295 user_len++;
13296 }
13297
13298 // SAP user names cannot be longer than 12 characters
13299 if (user_len > 12) return (PARSER_SALT_LENGTH);
13300
13301 // SAP user name cannot start with ! or ?
13302 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13303
13304 /**
13305 * copy data
13306 */
13307
13308 char *salt_buf_ptr = (char *) salt->salt_buf;
13309
13310 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13311
13312 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13313
13314 salt->salt_len = salt_len;
13315
13316 digest[0] = hex_to_uint (&hash_pos[ 0]);
13317 digest[1] = hex_to_uint (&hash_pos[ 8]);
13318 digest[2] = hex_to_uint (&hash_pos[16]);
13319 digest[3] = hex_to_uint (&hash_pos[24]);
13320 digest[4] = hex_to_uint (&hash_pos[32]);
13321
13322 return (PARSER_OK);
13323 }
13324
13325 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13326 {
13327 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13328
13329 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13330
13331 uint64_t *digest = (uint64_t *) hash_buf->digest;
13332
13333 salt_t *salt = hash_buf->salt;
13334
13335 char *iter_pos = input_buf + 3;
13336
13337 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13338
13339 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13340
13341 memcpy ((char *) salt->salt_sign, input_buf, 4);
13342
13343 salt->salt_iter = salt_iter;
13344
13345 char *salt_pos = iter_pos + 1;
13346
13347 uint salt_len = 8;
13348
13349 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13350
13351 salt->salt_len = salt_len;
13352
13353 char *hash_pos = salt_pos + salt_len;
13354
13355 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13356
13357 // ugly hack start
13358
13359 char *tmp = (char *) salt->salt_buf_pc;
13360
13361 tmp[0] = hash_pos[42];
13362
13363 // ugly hack end
13364
13365 digest[ 0] = byte_swap_64 (digest[ 0]);
13366 digest[ 1] = byte_swap_64 (digest[ 1]);
13367 digest[ 2] = byte_swap_64 (digest[ 2]);
13368 digest[ 3] = byte_swap_64 (digest[ 3]);
13369 digest[ 4] = 0;
13370 digest[ 5] = 0;
13371 digest[ 6] = 0;
13372 digest[ 7] = 0;
13373
13374 return (PARSER_OK);
13375 }
13376
13377 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13378 {
13379 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13380
13381 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13382
13383 uint32_t *digest = (uint32_t *) hash_buf->digest;
13384
13385 salt_t *salt = hash_buf->salt;
13386
13387 char *salt_buf = input_buf + 6;
13388
13389 uint salt_len = 16;
13390
13391 char *salt_buf_ptr = (char *) salt->salt_buf;
13392
13393 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13394
13395 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13396
13397 salt->salt_len = salt_len;
13398
13399 char *hash_pos = input_buf + 6 + 16;
13400
13401 digest[0] = hex_to_uint (&hash_pos[ 0]);
13402 digest[1] = hex_to_uint (&hash_pos[ 8]);
13403 digest[2] = hex_to_uint (&hash_pos[16]);
13404 digest[3] = hex_to_uint (&hash_pos[24]);
13405 digest[4] = hex_to_uint (&hash_pos[32]);
13406 digest[5] = hex_to_uint (&hash_pos[40]);
13407 digest[6] = hex_to_uint (&hash_pos[48]);
13408 digest[7] = hex_to_uint (&hash_pos[56]);
13409
13410 return (PARSER_OK);
13411 }
13412
13413 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13414 {
13415 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13416
13417 uint32_t *digest = (uint32_t *) hash_buf->digest;
13418
13419 digest[0] = hex_to_uint (&input_buf[ 0]);
13420 digest[1] = hex_to_uint (&input_buf[ 8]);
13421 digest[2] = 0;
13422 digest[3] = 0;
13423
13424 return (PARSER_OK);
13425 }
13426
13427 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13428 {
13429 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13430
13431 uint32_t *digest = (uint32_t *) hash_buf->digest;
13432
13433 salt_t *salt = hash_buf->salt;
13434
13435 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13436
13437 char *saltbuf_pos = input_buf;
13438
13439 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13440
13441 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13442
13443 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13444
13445 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13446 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13447
13448 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13449
13450 hashbuf_pos++;
13451
13452 uint hashbuf_len = input_len - saltbuf_len - 1;
13453
13454 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13455
13456 char *salt_ptr = (char *) saltbuf_pos;
13457 char *rakp_ptr = (char *) rakp->salt_buf;
13458
13459 uint i;
13460 uint j;
13461
13462 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13463 {
13464 rakp_ptr[j] = hex_to_char (&salt_ptr[i]);
13465 }
13466
13467 rakp_ptr[j] = 0x80;
13468
13469 rakp->salt_len = j;
13470
13471 for (i = 0; i < 64; i++)
13472 {
13473 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13474 }
13475
13476 salt->salt_buf[0] = rakp->salt_buf[0];
13477 salt->salt_buf[1] = rakp->salt_buf[1];
13478 salt->salt_buf[2] = rakp->salt_buf[2];
13479 salt->salt_buf[3] = rakp->salt_buf[3];
13480 salt->salt_buf[4] = rakp->salt_buf[4];
13481 salt->salt_buf[5] = rakp->salt_buf[5];
13482 salt->salt_buf[6] = rakp->salt_buf[6];
13483 salt->salt_buf[7] = rakp->salt_buf[7];
13484
13485 salt->salt_len = 32; // muss min. 32 haben
13486
13487 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
13488 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
13489 digest[2] = hex_to_uint (&hashbuf_pos[16]);
13490 digest[3] = hex_to_uint (&hashbuf_pos[24]);
13491 digest[4] = hex_to_uint (&hashbuf_pos[32]);
13492
13493 return (PARSER_OK);
13494 }
13495
13496 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13497 {
13498 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13499
13500 uint32_t *digest = (uint32_t *) hash_buf->digest;
13501
13502 salt_t *salt = hash_buf->salt;
13503
13504 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13505
13506 char *salt_pos = input_buf + 1;
13507
13508 memcpy (salt->salt_buf, salt_pos, 8);
13509
13510 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13511 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13512
13513 salt->salt_len = 8;
13514
13515 char *hash_pos = salt_pos + 8;
13516
13517 digest[0] = hex_to_uint (&hash_pos[ 0]);
13518 digest[1] = hex_to_uint (&hash_pos[ 8]);
13519 digest[2] = hex_to_uint (&hash_pos[16]);
13520 digest[3] = hex_to_uint (&hash_pos[24]);
13521 digest[4] = hex_to_uint (&hash_pos[32]);
13522
13523 digest[0] -= SHA1M_A;
13524 digest[1] -= SHA1M_B;
13525 digest[2] -= SHA1M_C;
13526 digest[3] -= SHA1M_D;
13527 digest[4] -= SHA1M_E;
13528
13529 return (PARSER_OK);
13530 }
13531
13532 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13533 {
13534 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13535
13536 uint32_t *digest = (uint32_t *) hash_buf->digest;
13537
13538 salt_t *salt = hash_buf->salt;
13539
13540 digest[0] = hex_to_uint (&input_buf[ 0]);
13541 digest[1] = hex_to_uint (&input_buf[ 8]);
13542 digest[2] = hex_to_uint (&input_buf[16]);
13543 digest[3] = hex_to_uint (&input_buf[24]);
13544
13545 digest[0] = byte_swap_32 (digest[0]);
13546 digest[1] = byte_swap_32 (digest[1]);
13547 digest[2] = byte_swap_32 (digest[2]);
13548 digest[3] = byte_swap_32 (digest[3]);
13549
13550 digest[0] -= MD5M_A;
13551 digest[1] -= MD5M_B;
13552 digest[2] -= MD5M_C;
13553 digest[3] -= MD5M_D;
13554
13555 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13556
13557 char *salt_buf_ptr = input_buf + 32 + 1;
13558
13559 uint32_t *salt_buf = salt->salt_buf;
13560
13561 salt_buf[0] = hex_to_uint (&salt_buf_ptr[ 0]);
13562 salt_buf[1] = hex_to_uint (&salt_buf_ptr[ 8]);
13563 salt_buf[2] = hex_to_uint (&salt_buf_ptr[16]);
13564 salt_buf[3] = hex_to_uint (&salt_buf_ptr[24]);
13565
13566 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13567 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13568 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13569 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13570
13571 salt->salt_len = 16 + 1;
13572
13573 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13574
13575 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13576
13577 salt_buf[4] = hex_to_char (&idbyte_buf_ptr[0]) & 0xff;
13578
13579 return (PARSER_OK);
13580 }
13581
13582 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13583 {
13584 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13585
13586 uint32_t *digest = (uint32_t *) hash_buf->digest;
13587
13588 salt_t *salt = hash_buf->salt;
13589
13590 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13591
13592 /**
13593 * parse line
13594 */
13595
13596 char *hashbuf_pos = input_buf;
13597
13598 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13599
13600 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13601
13602 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13603
13604 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13605
13606 saltbuf_pos++;
13607
13608 char *iteration_pos = strchr (saltbuf_pos, ':');
13609
13610 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13611
13612 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13613
13614 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13615
13616 iteration_pos++;
13617
13618 char *databuf_pos = strchr (iteration_pos, ':');
13619
13620 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13621
13622 const uint iteration_len = databuf_pos - iteration_pos;
13623
13624 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13625 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13626
13627 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13628
13629 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13630 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13631
13632 databuf_pos++;
13633
13634 // digest
13635
13636 digest[0] = hex_to_uint (&hashbuf_pos[ 0]);
13637 digest[1] = hex_to_uint (&hashbuf_pos[ 8]);
13638 digest[2] = hex_to_uint (&hashbuf_pos[16]);
13639 digest[3] = hex_to_uint (&hashbuf_pos[24]);
13640 digest[4] = hex_to_uint (&hashbuf_pos[32]);
13641 digest[5] = hex_to_uint (&hashbuf_pos[40]);
13642 digest[6] = hex_to_uint (&hashbuf_pos[48]);
13643 digest[7] = hex_to_uint (&hashbuf_pos[56]);
13644
13645 // salt
13646
13647 char *saltbuf_ptr = (char *) salt->salt_buf;
13648
13649 for (uint i = 0; i < saltbuf_len; i += 2)
13650 {
13651 const char p0 = saltbuf_pos[i + 0];
13652 const char p1 = saltbuf_pos[i + 1];
13653
13654 *saltbuf_ptr++ = hex_convert (p1) << 0
13655 | hex_convert (p0) << 4;
13656 }
13657
13658 salt->salt_buf[4] = 0x01000000;
13659 salt->salt_buf[5] = 0x80;
13660
13661 salt->salt_len = saltbuf_len / 2;
13662
13663 // iteration
13664
13665 salt->salt_iter = atoi (iteration_pos) - 1;
13666
13667 // data
13668
13669 char *databuf_ptr = (char *) cloudkey->data_buf;
13670
13671 for (uint i = 0; i < databuf_len; i += 2)
13672 {
13673 const char p0 = databuf_pos[i + 0];
13674 const char p1 = databuf_pos[i + 1];
13675
13676 *databuf_ptr++ = hex_convert (p1) << 0
13677 | hex_convert (p0) << 4;
13678 }
13679
13680 *databuf_ptr++ = 0x80;
13681
13682 for (uint i = 0; i < 512; i++)
13683 {
13684 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13685 }
13686
13687 cloudkey->data_len = databuf_len / 2;
13688
13689 return (PARSER_OK);
13690 }
13691
13692 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13693 {
13694 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13695
13696 uint32_t *digest = (uint32_t *) hash_buf->digest;
13697
13698 salt_t *salt = hash_buf->salt;
13699
13700 /**
13701 * parse line
13702 */
13703
13704 char *hashbuf_pos = input_buf;
13705
13706 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13707
13708 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13709
13710 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13711
13712 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13713
13714 domainbuf_pos++;
13715
13716 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13717
13718 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13719
13720 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13721
13722 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13723
13724 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13725
13726 saltbuf_pos++;
13727
13728 char *iteration_pos = strchr (saltbuf_pos, ':');
13729
13730 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13731
13732 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13733
13734 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13735
13736 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13737
13738 iteration_pos++;
13739
13740 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13741
13742 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13743 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13744
13745 // ok, the plan for this algorithm is the following:
13746 // we have 2 salts here, the domain-name and a random salt
13747 // while both are used in the initial transformation,
13748 // only the random salt is used in the following iterations
13749 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13750 // and one that includes only the real salt (stored into salt_buf[]).
13751 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13752
13753 char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf));
13754
13755 base32_decode (itoa32_to_int, hashbuf_pos, 32, tmp_buf);
13756
13757 memcpy (digest, tmp_buf, 20);
13758
13759 digest[0] = byte_swap_32 (digest[0]);
13760 digest[1] = byte_swap_32 (digest[1]);
13761 digest[2] = byte_swap_32 (digest[2]);
13762 digest[3] = byte_swap_32 (digest[3]);
13763 digest[4] = byte_swap_32 (digest[4]);
13764
13765 // domain
13766
13767 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13768
13769 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
13770
13771 char *len_ptr = NULL;
13772
13773 for (uint i = 0; i < domainbuf_len; i++)
13774 {
13775 if (salt_buf_pc_ptr[i] == '.')
13776 {
13777 len_ptr = &salt_buf_pc_ptr[i];
13778
13779 *len_ptr = 0;
13780 }
13781 else
13782 {
13783 *len_ptr += 1;
13784 }
13785 }
13786
13787 salt->salt_buf_pc[7] = domainbuf_len;
13788
13789 // "real" salt
13790
13791 char *salt_buf_ptr = (char *) salt->salt_buf;
13792
13793 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
13794
13795 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13796
13797 salt->salt_len = salt_len;
13798
13799 // iteration
13800
13801 salt->salt_iter = atoi (iteration_pos);
13802
13803 return (PARSER_OK);
13804 }
13805
13806 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13807 {
13808 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
13809
13810 uint32_t *digest = (uint32_t *) hash_buf->digest;
13811
13812 salt_t *salt = hash_buf->salt;
13813
13814 digest[0] = hex_to_uint (&input_buf[ 0]);
13815 digest[1] = hex_to_uint (&input_buf[ 8]);
13816 digest[2] = hex_to_uint (&input_buf[16]);
13817 digest[3] = hex_to_uint (&input_buf[24]);
13818 digest[4] = hex_to_uint (&input_buf[32]);
13819
13820 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13821
13822 uint salt_len = input_len - 40 - 1;
13823
13824 char *salt_buf = input_buf + 40 + 1;
13825
13826 char *salt_buf_ptr = (char *) salt->salt_buf;
13827
13828 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13829
13830 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13831
13832 salt->salt_len = salt_len;
13833
13834 return (PARSER_OK);
13835 }
13836
13837 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13838 {
13839 const uint8_t ascii_to_ebcdic[] =
13840 {
13841 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
13842 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
13843 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
13844 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
13845 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
13846 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
13847 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
13848 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
13849 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
13850 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
13851 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
13852 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
13853 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
13854 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
13855 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
13856 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
13857 };
13858
13859 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
13860
13861 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13862
13863 uint32_t *digest = (uint32_t *) hash_buf->digest;
13864
13865 salt_t *salt = hash_buf->salt;
13866
13867 char *salt_pos = input_buf + 6 + 1;
13868
13869 char *digest_pos = strchr (salt_pos, '*');
13870
13871 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13872
13873 uint salt_len = digest_pos - salt_pos;
13874
13875 if (salt_len > 8) return (PARSER_SALT_LENGTH);
13876
13877 uint hash_len = input_len - 1 - salt_len - 1 - 6;
13878
13879 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13880
13881 digest_pos++;
13882
13883 char *salt_buf_ptr = (char *) salt->salt_buf;
13884 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13885
13886 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13887
13888 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13889
13890 salt->salt_len = salt_len;
13891
13892 for (uint i = 0; i < salt_len; i++)
13893 {
13894 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
13895 }
13896 for (uint i = salt_len; i < 8; i++)
13897 {
13898 salt_buf_pc_ptr[i] = 0x40;
13899 }
13900
13901 uint tt;
13902
13903 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
13904
13905 salt->salt_buf_pc[0] = ROTATE_LEFT (salt->salt_buf_pc[0], 3u);
13906 salt->salt_buf_pc[1] = ROTATE_LEFT (salt->salt_buf_pc[1], 3u);
13907
13908 digest[0] = hex_to_uint (&digest_pos[ 0]);
13909 digest[1] = hex_to_uint (&digest_pos[ 8]);
13910
13911 digest[0] = byte_swap_32 (digest[0]);
13912 digest[1] = byte_swap_32 (digest[1]);
13913
13914 IP (digest[0], digest[1], tt);
13915
13916 digest[0] = ROTATE_RIGHT (digest[0], 29);
13917 digest[1] = ROTATE_RIGHT (digest[1], 29);
13918 digest[2] = 0;
13919 digest[3] = 0;
13920
13921 return (PARSER_OK);
13922 }
13923
13924 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13925 {
13926 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
13927
13928 uint32_t *digest = (uint32_t *) hash_buf->digest;
13929
13930 digest[0] = hex_to_uint (&input_buf[ 0]);
13931 digest[1] = hex_to_uint (&input_buf[ 8]);
13932 digest[2] = hex_to_uint (&input_buf[16]);
13933 digest[3] = hex_to_uint (&input_buf[24]);
13934
13935 digest[0] = byte_swap_32 (digest[0]);
13936 digest[1] = byte_swap_32 (digest[1]);
13937 digest[2] = byte_swap_32 (digest[2]);
13938 digest[3] = byte_swap_32 (digest[3]);
13939
13940 return (PARSER_OK);
13941 }
13942
13943 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13944 {
13945 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
13946
13947 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
13948
13949 uint32_t *digest = (uint32_t *) hash_buf->digest;
13950
13951 salt_t *salt = hash_buf->salt;
13952
13953 char tmp_buf[120];
13954
13955 memset (tmp_buf, 0, sizeof (tmp_buf));
13956
13957 base64_decode (lotus64_to_int, input_buf + 2, input_len - 3, tmp_buf);
13958
13959 tmp_buf[3] += -4; // dont ask!
13960
13961 memcpy (salt->salt_buf, tmp_buf, 5);
13962
13963 salt->salt_len = 5;
13964
13965 memcpy (digest, tmp_buf + 5, 9);
13966
13967 // yes, only 9 byte are needed to crack, but 10 to display
13968
13969 salt->salt_buf_pc[7] = input_buf[20];
13970
13971 return (PARSER_OK);
13972 }
13973
13974 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13975 {
13976 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
13977
13978 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
13979
13980 uint32_t *digest = (uint32_t *) hash_buf->digest;
13981
13982 salt_t *salt = hash_buf->salt;
13983
13984 char tmp_buf[120];
13985
13986 memset (tmp_buf, 0, sizeof (tmp_buf));
13987
13988 base64_decode (lotus64_to_int, input_buf + 2, input_len - 3, tmp_buf);
13989
13990 tmp_buf[3] += -4; // dont ask!
13991
13992 // salt
13993
13994 memcpy (salt->salt_buf, tmp_buf, 16);
13995
13996 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)
13997
13998 // iteration
13999
14000 char tmp_iter_buf[11];
14001
14002 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14003
14004 tmp_iter_buf[10] = 0;
14005
14006 salt->salt_iter = atoi (tmp_iter_buf);
14007
14008 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14009 {
14010 return (PARSER_SALT_ITERATION);
14011 }
14012
14013 salt->salt_iter--; // first round in init
14014
14015 // 2 additional bytes for display only
14016
14017 salt->salt_buf_pc[0] = tmp_buf[26];
14018 salt->salt_buf_pc[1] = tmp_buf[27];
14019
14020 // digest
14021
14022 memcpy (digest, tmp_buf + 28, 8);
14023
14024 digest[0] = byte_swap_32 (digest[0]);
14025 digest[1] = byte_swap_32 (digest[1]);
14026 digest[2] = 0;
14027 digest[3] = 0;
14028
14029 return (PARSER_OK);
14030 }
14031
14032 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14033 {
14034 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14035
14036 uint32_t *digest = (uint32_t *) hash_buf->digest;
14037
14038 salt_t *salt = hash_buf->salt;
14039
14040 char *salt_buf_pos = input_buf;
14041
14042 char *hash_buf_pos = salt_buf_pos + 6;
14043
14044 digest[0] = hex_to_uint (&hash_buf_pos[ 0]);
14045 digest[1] = hex_to_uint (&hash_buf_pos[ 8]);
14046 digest[2] = hex_to_uint (&hash_buf_pos[16]);
14047 digest[3] = hex_to_uint (&hash_buf_pos[24]);
14048 digest[4] = hex_to_uint (&hash_buf_pos[32]);
14049 digest[5] = hex_to_uint (&hash_buf_pos[40]);
14050 digest[6] = hex_to_uint (&hash_buf_pos[48]);
14051 digest[7] = hex_to_uint (&hash_buf_pos[56]);
14052
14053 digest[0] -= SHA256M_A;
14054 digest[1] -= SHA256M_B;
14055 digest[2] -= SHA256M_C;
14056 digest[3] -= SHA256M_D;
14057 digest[4] -= SHA256M_E;
14058 digest[5] -= SHA256M_F;
14059 digest[6] -= SHA256M_G;
14060 digest[7] -= SHA256M_H;
14061
14062 char *salt_buf_ptr = (char *) salt->salt_buf;
14063
14064 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14065
14066 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14067
14068 salt->salt_len = salt_len;
14069
14070 return (PARSER_OK);
14071 }
14072
14073 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14074 {
14075 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14076
14077 uint32_t *digest = (uint32_t *) hash_buf->digest;
14078
14079 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14080
14081 salt_t *salt = hash_buf->salt;
14082
14083 char *salt_buf = input_buf + 6;
14084
14085 char *digest_buf = strchr (salt_buf, '$');
14086
14087 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14088
14089 uint salt_len = digest_buf - salt_buf;
14090
14091 digest_buf++; // skip the '$' symbol
14092
14093 char *salt_buf_ptr = (char *) salt->salt_buf;
14094
14095 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14096
14097 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14098
14099 salt->salt_len = salt_len;
14100
14101 digest[0] = hex_to_uint (&digest_buf[ 0]);
14102 digest[1] = hex_to_uint (&digest_buf[ 8]);
14103 digest[2] = hex_to_uint (&digest_buf[16]);
14104 digest[3] = hex_to_uint (&digest_buf[24]);
14105
14106 digest[0] = byte_swap_32 (digest[0]);
14107 digest[1] = byte_swap_32 (digest[1]);
14108 digest[2] = byte_swap_32 (digest[2]);
14109 digest[3] = byte_swap_32 (digest[3]);
14110
14111 digest[0] -= MD5M_A;
14112 digest[1] -= MD5M_B;
14113 digest[2] -= MD5M_C;
14114 digest[3] -= MD5M_D;
14115
14116 return (PARSER_OK);
14117 }
14118
14119 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14120 {
14121 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14122
14123 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14124
14125 uint32_t *digest = (uint32_t *) hash_buf->digest;
14126
14127 salt_t *salt = hash_buf->salt;
14128
14129 char *salt_buf = input_buf + 3;
14130
14131 char *digest_buf = strchr (salt_buf, '$');
14132
14133 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14134
14135 uint salt_len = digest_buf - salt_buf;
14136
14137 digest_buf++; // skip the '$' symbol
14138
14139 char *salt_buf_ptr = (char *) salt->salt_buf;
14140
14141 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14142
14143 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14144
14145 salt_buf_ptr[salt_len] = 0x2d;
14146
14147 salt->salt_len = salt_len + 1;
14148
14149 digest[0] = hex_to_uint (&digest_buf[ 0]);
14150 digest[1] = hex_to_uint (&digest_buf[ 8]);
14151 digest[2] = hex_to_uint (&digest_buf[16]);
14152 digest[3] = hex_to_uint (&digest_buf[24]);
14153
14154 digest[0] = byte_swap_32 (digest[0]);
14155 digest[1] = byte_swap_32 (digest[1]);
14156 digest[2] = byte_swap_32 (digest[2]);
14157 digest[3] = byte_swap_32 (digest[3]);
14158
14159 digest[0] -= MD5M_A;
14160 digest[1] -= MD5M_B;
14161 digest[2] -= MD5M_C;
14162 digest[3] -= MD5M_D;
14163
14164 return (PARSER_OK);
14165 }
14166
14167 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14168 {
14169 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14170
14171 uint32_t *digest = (uint32_t *) hash_buf->digest;
14172
14173 char tmp_buf[100];
14174
14175 memset (tmp_buf, 0, sizeof (tmp_buf));
14176
14177 base64_decode (base64_to_int, input_buf, input_len, tmp_buf);
14178
14179 memcpy (digest, tmp_buf, 20);
14180
14181 digest[0] = byte_swap_32 (digest[0]);
14182 digest[1] = byte_swap_32 (digest[1]);
14183 digest[2] = byte_swap_32 (digest[2]);
14184 digest[3] = byte_swap_32 (digest[3]);
14185 digest[4] = byte_swap_32 (digest[4]);
14186
14187 digest[0] -= SHA1M_A;
14188 digest[1] -= SHA1M_B;
14189 digest[2] -= SHA1M_C;
14190 digest[3] -= SHA1M_D;
14191 digest[4] -= SHA1M_E;
14192
14193 return (PARSER_OK);
14194 }
14195
14196 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14197 {
14198 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14199
14200 uint32_t *digest = (uint32_t *) hash_buf->digest;
14201
14202 salt_t *salt = hash_buf->salt;
14203
14204 digest[0] = hex_to_uint (&input_buf[ 0]);
14205 digest[1] = hex_to_uint (&input_buf[ 8]);
14206 digest[2] = hex_to_uint (&input_buf[16]);
14207 digest[3] = hex_to_uint (&input_buf[24]);
14208
14209 digest[0] = byte_swap_32 (digest[0]);
14210 digest[1] = byte_swap_32 (digest[1]);
14211 digest[2] = byte_swap_32 (digest[2]);
14212 digest[3] = byte_swap_32 (digest[3]);
14213
14214 digest[0] -= MD5M_A;
14215 digest[1] -= MD5M_B;
14216 digest[2] -= MD5M_C;
14217 digest[3] -= MD5M_D;
14218
14219 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14220
14221 uint salt_len = input_len - 32 - 1;
14222
14223 char *salt_buf = input_buf + 32 + 1;
14224
14225 char *salt_buf_ptr = (char *) salt->salt_buf;
14226
14227 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14228
14229 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14230
14231 /*
14232 * add static "salt" part
14233 */
14234
14235 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14236
14237 salt_len += 8;
14238
14239 salt->salt_len = salt_len;
14240
14241 return (PARSER_OK);
14242 }
14243
14244 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14245 {
14246 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14247
14248 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14249
14250 uint32_t *digest = (uint32_t *) hash_buf->digest;
14251
14252 salt_t *salt = hash_buf->salt;
14253
14254 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14255
14256 /**
14257 * parse line
14258 */
14259
14260 char *saltlen_pos = input_buf + 1 + 3 + 1;
14261
14262 char *saltbuf_pos = strchr (saltlen_pos, '$');
14263
14264 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14265
14266 uint saltlen_len = saltbuf_pos - saltlen_pos;
14267
14268 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14269
14270 saltbuf_pos++;
14271
14272 char *keylen_pos = strchr (saltbuf_pos, '$');
14273
14274 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14275
14276 uint saltbuf_len = keylen_pos - saltbuf_pos;
14277
14278 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14279
14280 keylen_pos++;
14281
14282 char *keybuf_pos = strchr (keylen_pos, '$');
14283
14284 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14285
14286 uint keylen_len = keybuf_pos - keylen_pos;
14287
14288 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14289
14290 keybuf_pos++;
14291
14292 char *databuf_pos = strchr (keybuf_pos, '$');
14293
14294 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14295
14296 uint keybuf_len = databuf_pos - keybuf_pos;
14297
14298 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14299
14300 databuf_pos++;
14301
14302 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14303
14304 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14305
14306 /**
14307 * copy data
14308 */
14309
14310 digest[0] = hex_to_uint (&keybuf_pos[ 0]);
14311 digest[1] = hex_to_uint (&keybuf_pos[ 8]);
14312 digest[2] = hex_to_uint (&keybuf_pos[16]);
14313 digest[3] = hex_to_uint (&keybuf_pos[24]);
14314
14315 salt->salt_buf[0] = hex_to_uint (&saltbuf_pos[ 0]);
14316 salt->salt_buf[1] = hex_to_uint (&saltbuf_pos[ 8]);
14317 salt->salt_buf[2] = hex_to_uint (&saltbuf_pos[16]);
14318 salt->salt_buf[3] = hex_to_uint (&saltbuf_pos[24]);
14319
14320 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14321 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14322 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14323 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14324
14325 salt->salt_len = 16;
14326 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14327
14328 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14329 {
14330 androidfde->data[j] = hex_to_uint (&databuf_pos[i]);
14331 }
14332
14333 return (PARSER_OK);
14334 }
14335
14336 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14337 {
14338 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14339
14340 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14341
14342 uint32_t *digest = (uint32_t *) hash_buf->digest;
14343
14344 salt_t *salt = hash_buf->salt;
14345
14346 /**
14347 * parse line
14348 */
14349
14350 // first is the N salt parameter
14351
14352 char *N_pos = input_buf + 6;
14353
14354 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14355
14356 N_pos++;
14357
14358 salt->scrypt_N = atoi (N_pos);
14359
14360 // r
14361
14362 char *r_pos = strchr (N_pos, ':');
14363
14364 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14365
14366 r_pos++;
14367
14368 salt->scrypt_r = atoi (r_pos);
14369
14370 // p
14371
14372 char *p_pos = strchr (r_pos, ':');
14373
14374 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14375
14376 p_pos++;
14377
14378 salt->scrypt_p = atoi (p_pos);
14379
14380 // salt
14381
14382 char *saltbuf_pos = strchr (p_pos, ':');
14383
14384 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14385
14386 saltbuf_pos++;
14387
14388 char *hash_pos = strchr (saltbuf_pos, ':');
14389
14390 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14391
14392 hash_pos++;
14393
14394 // base64 decode
14395
14396 char tmp_buf[32];
14397
14398 memset (tmp_buf, 0, sizeof (tmp_buf));
14399
14400 int tmp_len = base64_decode (base64_to_int, saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14401
14402 char *salt_buf_ptr = (char *) salt->salt_buf;
14403
14404 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14405
14406 salt->salt_len = tmp_len;
14407 salt->salt_iter = 1;
14408
14409 // digest - base64 decode
14410
14411 memset (tmp_buf, 0, sizeof (tmp_buf));
14412
14413 tmp_len = input_len - (hash_pos - input_buf);
14414
14415 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14416
14417 base64_decode (base64_to_int, hash_pos, tmp_len, tmp_buf);
14418
14419 memcpy (digest, tmp_buf, 32);
14420
14421 return (PARSER_OK);
14422 }
14423
14424 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14425 {
14426 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14427
14428 uint32_t *digest = (uint32_t *) hash_buf->digest;
14429
14430 salt_t *salt = hash_buf->salt;
14431
14432 /**
14433 * parse line
14434 */
14435
14436 char decrypted[76]; // iv + hash
14437
14438 juniper_decrypt_hash (input_buf, decrypted);
14439
14440 char *md5crypt_hash = decrypted + 12;
14441
14442 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14443
14444 salt->salt_iter = ROUNDS_MD5CRYPT;
14445
14446 char *salt_pos = md5crypt_hash + 3;
14447
14448 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14449
14450 salt->salt_len = hash_pos - salt_pos; // should be 8
14451
14452 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14453
14454 hash_pos++;
14455
14456 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14457
14458 return (PARSER_OK);
14459 }
14460
14461 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14462 {
14463 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14464
14465 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14466
14467 uint32_t *digest = (uint32_t *) hash_buf->digest;
14468
14469 salt_t *salt = hash_buf->salt;
14470
14471 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14472
14473 /**
14474 * parse line
14475 */
14476
14477 // first is *raw* salt
14478
14479 char *salt_pos = input_buf + 3;
14480
14481 char *hash_pos = strchr (salt_pos, '$');
14482
14483 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14484
14485 uint salt_len = hash_pos - salt_pos;
14486
14487 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14488
14489 hash_pos++;
14490
14491 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14492
14493 memcpy (salt_buf_ptr, salt_pos, 14);
14494
14495 salt_buf_ptr[17] = 0x01;
14496 salt_buf_ptr[18] = 0x80;
14497
14498 // add some stuff to normal salt to make sorted happy
14499
14500 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14501 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14502 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14503 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14504
14505 salt->salt_len = salt_len;
14506 salt->salt_iter = ROUNDS_CISCO8 - 1;
14507
14508 // base64 decode hash
14509
14510 char tmp_buf[100];
14511
14512 memset (tmp_buf, 0, sizeof (tmp_buf));
14513
14514 uint hash_len = input_len - 3 - salt_len - 1;
14515
14516 int tmp_len = base64_decode (itoa64_to_int, hash_pos, hash_len, tmp_buf);
14517
14518 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14519
14520 memcpy (digest, tmp_buf, 32);
14521
14522 digest[0] = byte_swap_32 (digest[0]);
14523 digest[1] = byte_swap_32 (digest[1]);
14524 digest[2] = byte_swap_32 (digest[2]);
14525 digest[3] = byte_swap_32 (digest[3]);
14526 digest[4] = byte_swap_32 (digest[4]);
14527 digest[5] = byte_swap_32 (digest[5]);
14528 digest[6] = byte_swap_32 (digest[6]);
14529 digest[7] = byte_swap_32 (digest[7]);
14530
14531 return (PARSER_OK);
14532 }
14533
14534 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14535 {
14536 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14537
14538 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14539
14540 uint32_t *digest = (uint32_t *) hash_buf->digest;
14541
14542 salt_t *salt = hash_buf->salt;
14543
14544 /**
14545 * parse line
14546 */
14547
14548 // first is *raw* salt
14549
14550 char *salt_pos = input_buf + 3;
14551
14552 char *hash_pos = strchr (salt_pos, '$');
14553
14554 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14555
14556 uint salt_len = hash_pos - salt_pos;
14557
14558 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14559
14560 salt->salt_len = salt_len;
14561 hash_pos++;
14562
14563 char *salt_buf_ptr = (char *) salt->salt_buf;
14564
14565 memcpy (salt_buf_ptr, salt_pos, salt_len);
14566 salt_buf_ptr[salt_len] = 0;
14567
14568 // base64 decode hash
14569
14570 char tmp_buf[100];
14571
14572 memset (tmp_buf, 0, sizeof (tmp_buf));
14573
14574 uint hash_len = input_len - 3 - salt_len - 1;
14575
14576 int tmp_len = base64_decode (itoa64_to_int, hash_pos, hash_len, tmp_buf);
14577
14578 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14579
14580 memcpy (digest, tmp_buf, 32);
14581
14582 // fixed:
14583 salt->scrypt_N = 16384;
14584 salt->scrypt_r = 1;
14585 salt->scrypt_p = 1;
14586 salt->salt_iter = 1;
14587
14588 return (PARSER_OK);
14589 }
14590
14591 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14592 {
14593 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14594
14595 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14596
14597 uint32_t *digest = (uint32_t *) hash_buf->digest;
14598
14599 salt_t *salt = hash_buf->salt;
14600
14601 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14602
14603 /**
14604 * parse line
14605 */
14606
14607 char *version_pos = input_buf + 8 + 1;
14608
14609 char *verifierHashSize_pos = strchr (version_pos, '*');
14610
14611 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14612
14613 uint32_t version_len = verifierHashSize_pos - version_pos;
14614
14615 if (version_len != 4) return (PARSER_SALT_LENGTH);
14616
14617 verifierHashSize_pos++;
14618
14619 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14620
14621 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14622
14623 uint32_t verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14624
14625 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14626
14627 keySize_pos++;
14628
14629 char *saltSize_pos = strchr (keySize_pos, '*');
14630
14631 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14632
14633 uint32_t keySize_len = saltSize_pos - keySize_pos;
14634
14635 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14636
14637 saltSize_pos++;
14638
14639 char *osalt_pos = strchr (saltSize_pos, '*');
14640
14641 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14642
14643 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14644
14645 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14646
14647 osalt_pos++;
14648
14649 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14650
14651 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14652
14653 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14654
14655 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14656
14657 encryptedVerifier_pos++;
14658
14659 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14660
14661 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14662
14663 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14664
14665 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14666
14667 encryptedVerifierHash_pos++;
14668
14669 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;
14670
14671 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14672
14673 const uint version = atoi (version_pos);
14674
14675 if (version != 2007) return (PARSER_SALT_VALUE);
14676
14677 const uint verifierHashSize = atoi (verifierHashSize_pos);
14678
14679 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14680
14681 const uint keySize = atoi (keySize_pos);
14682
14683 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14684
14685 office2007->keySize = keySize;
14686
14687 const uint saltSize = atoi (saltSize_pos);
14688
14689 if (saltSize != 16) return (PARSER_SALT_VALUE);
14690
14691 /**
14692 * salt
14693 */
14694
14695 salt->salt_len = 16;
14696 salt->salt_iter = ROUNDS_OFFICE2007;
14697
14698 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14699 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14700 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14701 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14702
14703 /**
14704 * esalt
14705 */
14706
14707 office2007->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14708 office2007->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14709 office2007->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14710 office2007->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14711
14712 office2007->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14713 office2007->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14714 office2007->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14715 office2007->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14716 office2007->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14717
14718 /**
14719 * digest
14720 */
14721
14722 digest[0] = office2007->encryptedVerifierHash[0];
14723 digest[1] = office2007->encryptedVerifierHash[1];
14724 digest[2] = office2007->encryptedVerifierHash[2];
14725 digest[3] = office2007->encryptedVerifierHash[3];
14726
14727 return (PARSER_OK);
14728 }
14729
14730 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14731 {
14732 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14733
14734 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14735
14736 uint32_t *digest = (uint32_t *) hash_buf->digest;
14737
14738 salt_t *salt = hash_buf->salt;
14739
14740 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14741
14742 /**
14743 * parse line
14744 */
14745
14746 char *version_pos = input_buf + 8 + 1;
14747
14748 char *spinCount_pos = strchr (version_pos, '*');
14749
14750 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14751
14752 uint32_t version_len = spinCount_pos - version_pos;
14753
14754 if (version_len != 4) return (PARSER_SALT_LENGTH);
14755
14756 spinCount_pos++;
14757
14758 char *keySize_pos = strchr (spinCount_pos, '*');
14759
14760 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14761
14762 uint32_t spinCount_len = keySize_pos - spinCount_pos;
14763
14764 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14765
14766 keySize_pos++;
14767
14768 char *saltSize_pos = strchr (keySize_pos, '*');
14769
14770 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14771
14772 uint32_t keySize_len = saltSize_pos - keySize_pos;
14773
14774 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14775
14776 saltSize_pos++;
14777
14778 char *osalt_pos = strchr (saltSize_pos, '*');
14779
14780 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14781
14782 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14783
14784 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14785
14786 osalt_pos++;
14787
14788 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14789
14790 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14791
14792 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14793
14794 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14795
14796 encryptedVerifier_pos++;
14797
14798 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14799
14800 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14801
14802 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14803
14804 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14805
14806 encryptedVerifierHash_pos++;
14807
14808 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;
14809
14810 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14811
14812 const uint version = atoi (version_pos);
14813
14814 if (version != 2010) return (PARSER_SALT_VALUE);
14815
14816 const uint spinCount = atoi (spinCount_pos);
14817
14818 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14819
14820 const uint keySize = atoi (keySize_pos);
14821
14822 if (keySize != 128) return (PARSER_SALT_VALUE);
14823
14824 const uint saltSize = atoi (saltSize_pos);
14825
14826 if (saltSize != 16) return (PARSER_SALT_VALUE);
14827
14828 /**
14829 * salt
14830 */
14831
14832 salt->salt_len = 16;
14833 salt->salt_iter = spinCount;
14834
14835 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14836 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14837 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14838 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14839
14840 /**
14841 * esalt
14842 */
14843
14844 office2010->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14845 office2010->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14846 office2010->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14847 office2010->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14848
14849 office2010->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14850 office2010->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14851 office2010->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14852 office2010->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14853 office2010->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14854 office2010->encryptedVerifierHash[5] = hex_to_uint (&encryptedVerifierHash_pos[40]);
14855 office2010->encryptedVerifierHash[6] = hex_to_uint (&encryptedVerifierHash_pos[48]);
14856 office2010->encryptedVerifierHash[7] = hex_to_uint (&encryptedVerifierHash_pos[56]);
14857
14858 /**
14859 * digest
14860 */
14861
14862 digest[0] = office2010->encryptedVerifierHash[0];
14863 digest[1] = office2010->encryptedVerifierHash[1];
14864 digest[2] = office2010->encryptedVerifierHash[2];
14865 digest[3] = office2010->encryptedVerifierHash[3];
14866
14867 return (PARSER_OK);
14868 }
14869
14870 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14871 {
14872 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
14873
14874 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14875
14876 uint32_t *digest = (uint32_t *) hash_buf->digest;
14877
14878 salt_t *salt = hash_buf->salt;
14879
14880 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
14881
14882 /**
14883 * parse line
14884 */
14885
14886 char *version_pos = input_buf + 8 + 1;
14887
14888 char *spinCount_pos = strchr (version_pos, '*');
14889
14890 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14891
14892 uint32_t version_len = spinCount_pos - version_pos;
14893
14894 if (version_len != 4) return (PARSER_SALT_LENGTH);
14895
14896 spinCount_pos++;
14897
14898 char *keySize_pos = strchr (spinCount_pos, '*');
14899
14900 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14901
14902 uint32_t spinCount_len = keySize_pos - spinCount_pos;
14903
14904 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14905
14906 keySize_pos++;
14907
14908 char *saltSize_pos = strchr (keySize_pos, '*');
14909
14910 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14911
14912 uint32_t keySize_len = saltSize_pos - keySize_pos;
14913
14914 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14915
14916 saltSize_pos++;
14917
14918 char *osalt_pos = strchr (saltSize_pos, '*');
14919
14920 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14921
14922 uint32_t saltSize_len = osalt_pos - saltSize_pos;
14923
14924 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14925
14926 osalt_pos++;
14927
14928 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14929
14930 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14931
14932 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
14933
14934 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14935
14936 encryptedVerifier_pos++;
14937
14938 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14939
14940 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14941
14942 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14943
14944 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14945
14946 encryptedVerifierHash_pos++;
14947
14948 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;
14949
14950 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
14951
14952 const uint version = atoi (version_pos);
14953
14954 if (version != 2013) return (PARSER_SALT_VALUE);
14955
14956 const uint spinCount = atoi (spinCount_pos);
14957
14958 if (spinCount != 100000) return (PARSER_SALT_VALUE);
14959
14960 const uint keySize = atoi (keySize_pos);
14961
14962 if (keySize != 256) return (PARSER_SALT_VALUE);
14963
14964 const uint saltSize = atoi (saltSize_pos);
14965
14966 if (saltSize != 16) return (PARSER_SALT_VALUE);
14967
14968 /**
14969 * salt
14970 */
14971
14972 salt->salt_len = 16;
14973 salt->salt_iter = spinCount;
14974
14975 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
14976 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
14977 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
14978 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
14979
14980 /**
14981 * esalt
14982 */
14983
14984 office2013->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
14985 office2013->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
14986 office2013->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
14987 office2013->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
14988
14989 office2013->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
14990 office2013->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
14991 office2013->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
14992 office2013->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
14993 office2013->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
14994 office2013->encryptedVerifierHash[5] = hex_to_uint (&encryptedVerifierHash_pos[40]);
14995 office2013->encryptedVerifierHash[6] = hex_to_uint (&encryptedVerifierHash_pos[48]);
14996 office2013->encryptedVerifierHash[7] = hex_to_uint (&encryptedVerifierHash_pos[56]);
14997
14998 /**
14999 * digest
15000 */
15001
15002 digest[0] = office2013->encryptedVerifierHash[0];
15003 digest[1] = office2013->encryptedVerifierHash[1];
15004 digest[2] = office2013->encryptedVerifierHash[2];
15005 digest[3] = office2013->encryptedVerifierHash[3];
15006
15007 return (PARSER_OK);
15008 }
15009
15010 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15011 {
15012 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15013
15014 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15015
15016 uint32_t *digest = (uint32_t *) hash_buf->digest;
15017
15018 salt_t *salt = hash_buf->salt;
15019
15020 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15021
15022 /**
15023 * parse line
15024 */
15025
15026 char *version_pos = input_buf + 11;
15027
15028 char *osalt_pos = strchr (version_pos, '*');
15029
15030 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15031
15032 uint32_t version_len = osalt_pos - version_pos;
15033
15034 if (version_len != 1) return (PARSER_SALT_LENGTH);
15035
15036 osalt_pos++;
15037
15038 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15039
15040 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15041
15042 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15043
15044 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15045
15046 encryptedVerifier_pos++;
15047
15048 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15049
15050 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15051
15052 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15053
15054 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15055
15056 encryptedVerifierHash_pos++;
15057
15058 uint32_t encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15059
15060 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15061
15062 const uint version = *version_pos - 0x30;
15063
15064 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15065
15066 /**
15067 * esalt
15068 */
15069
15070 oldoffice01->version = version;
15071
15072 oldoffice01->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15073 oldoffice01->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15074 oldoffice01->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15075 oldoffice01->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15076
15077 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15078 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15079 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15080 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15081
15082 oldoffice01->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15083 oldoffice01->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15084 oldoffice01->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15085 oldoffice01->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15086
15087 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15088 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15089 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15090 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15091
15092 /**
15093 * salt
15094 */
15095
15096 salt->salt_len = 16;
15097
15098 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15099 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15100 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15101 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15102
15103 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15104 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15105 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15106 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15107
15108 // this is a workaround as office produces multiple documents with the same salt
15109
15110 salt->salt_len += 32;
15111
15112 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15113 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15114 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15115 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15116 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15117 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15118 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15119 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15120
15121 /**
15122 * digest
15123 */
15124
15125 digest[0] = oldoffice01->encryptedVerifierHash[0];
15126 digest[1] = oldoffice01->encryptedVerifierHash[1];
15127 digest[2] = oldoffice01->encryptedVerifierHash[2];
15128 digest[3] = oldoffice01->encryptedVerifierHash[3];
15129
15130 return (PARSER_OK);
15131 }
15132
15133 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15134 {
15135 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15136 }
15137
15138 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15139 {
15140 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15141
15142 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15143
15144 uint32_t *digest = (uint32_t *) hash_buf->digest;
15145
15146 salt_t *salt = hash_buf->salt;
15147
15148 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15149
15150 /**
15151 * parse line
15152 */
15153
15154 char *version_pos = input_buf + 11;
15155
15156 char *osalt_pos = strchr (version_pos, '*');
15157
15158 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15159
15160 uint32_t version_len = osalt_pos - version_pos;
15161
15162 if (version_len != 1) return (PARSER_SALT_LENGTH);
15163
15164 osalt_pos++;
15165
15166 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15167
15168 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15169
15170 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15171
15172 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15173
15174 encryptedVerifier_pos++;
15175
15176 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15177
15178 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15179
15180 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15181
15182 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15183
15184 encryptedVerifierHash_pos++;
15185
15186 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15187
15188 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15189
15190 uint32_t encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15191
15192 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15193
15194 rc4key_pos++;
15195
15196 uint32_t rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15197
15198 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15199
15200 const uint version = *version_pos - 0x30;
15201
15202 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15203
15204 /**
15205 * esalt
15206 */
15207
15208 oldoffice01->version = version;
15209
15210 oldoffice01->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15211 oldoffice01->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15212 oldoffice01->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15213 oldoffice01->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15214
15215 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15216 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15217 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15218 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15219
15220 oldoffice01->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15221 oldoffice01->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15222 oldoffice01->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15223 oldoffice01->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15224
15225 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15226 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15227 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15228 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15229
15230 oldoffice01->rc4key[1] = 0;
15231 oldoffice01->rc4key[0] = 0;
15232
15233 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15234 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15235 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15236 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15237 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15238 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15239 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15240 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15241 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15242 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15243
15244 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15245 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15246
15247 /**
15248 * salt
15249 */
15250
15251 salt->salt_len = 16;
15252
15253 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15254 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15255 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15256 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15257
15258 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15259 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15260 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15261 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15262
15263 // this is a workaround as office produces multiple documents with the same salt
15264
15265 salt->salt_len += 32;
15266
15267 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15268 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15269 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15270 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15271 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15272 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15273 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15274 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15275
15276 /**
15277 * digest
15278 */
15279
15280 digest[0] = oldoffice01->rc4key[0];
15281 digest[1] = oldoffice01->rc4key[1];
15282 digest[2] = 0;
15283 digest[3] = 0;
15284
15285 return (PARSER_OK);
15286 }
15287
15288 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15289 {
15290 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15291
15292 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15293
15294 uint32_t *digest = (uint32_t *) hash_buf->digest;
15295
15296 salt_t *salt = hash_buf->salt;
15297
15298 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15299
15300 /**
15301 * parse line
15302 */
15303
15304 char *version_pos = input_buf + 11;
15305
15306 char *osalt_pos = strchr (version_pos, '*');
15307
15308 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15309
15310 uint32_t version_len = osalt_pos - version_pos;
15311
15312 if (version_len != 1) return (PARSER_SALT_LENGTH);
15313
15314 osalt_pos++;
15315
15316 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15317
15318 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15319
15320 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15321
15322 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15323
15324 encryptedVerifier_pos++;
15325
15326 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15327
15328 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15329
15330 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15331
15332 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15333
15334 encryptedVerifierHash_pos++;
15335
15336 uint32_t encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15337
15338 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15339
15340 const uint version = *version_pos - 0x30;
15341
15342 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15343
15344 /**
15345 * esalt
15346 */
15347
15348 oldoffice34->version = version;
15349
15350 oldoffice34->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15351 oldoffice34->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15352 oldoffice34->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15353 oldoffice34->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15354
15355 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15356 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15357 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15358 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15359
15360 oldoffice34->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15361 oldoffice34->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15362 oldoffice34->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15363 oldoffice34->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15364 oldoffice34->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15365
15366 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15367 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15368 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15369 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15370 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15371
15372 /**
15373 * salt
15374 */
15375
15376 salt->salt_len = 16;
15377
15378 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15379 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15380 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15381 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15382
15383 // this is a workaround as office produces multiple documents with the same salt
15384
15385 salt->salt_len += 32;
15386
15387 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15388 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15389 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15390 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15391 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15392 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15393 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15394 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15395
15396 /**
15397 * digest
15398 */
15399
15400 digest[0] = oldoffice34->encryptedVerifierHash[0];
15401 digest[1] = oldoffice34->encryptedVerifierHash[1];
15402 digest[2] = oldoffice34->encryptedVerifierHash[2];
15403 digest[3] = oldoffice34->encryptedVerifierHash[3];
15404
15405 return (PARSER_OK);
15406 }
15407
15408 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15409 {
15410 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15411
15412 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15413 }
15414
15415 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15416 {
15417 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15418
15419 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15420
15421 uint32_t *digest = (uint32_t *) hash_buf->digest;
15422
15423 salt_t *salt = hash_buf->salt;
15424
15425 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15426
15427 /**
15428 * parse line
15429 */
15430
15431 char *version_pos = input_buf + 11;
15432
15433 char *osalt_pos = strchr (version_pos, '*');
15434
15435 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15436
15437 uint32_t version_len = osalt_pos - version_pos;
15438
15439 if (version_len != 1) return (PARSER_SALT_LENGTH);
15440
15441 osalt_pos++;
15442
15443 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15444
15445 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15446
15447 uint32_t osalt_len = encryptedVerifier_pos - osalt_pos;
15448
15449 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15450
15451 encryptedVerifier_pos++;
15452
15453 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15454
15455 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15456
15457 uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15458
15459 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15460
15461 encryptedVerifierHash_pos++;
15462
15463 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15464
15465 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15466
15467 uint32_t encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15468
15469 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15470
15471 rc4key_pos++;
15472
15473 uint32_t rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15474
15475 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15476
15477 const uint version = *version_pos - 0x30;
15478
15479 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15480
15481 /**
15482 * esalt
15483 */
15484
15485 oldoffice34->version = version;
15486
15487 oldoffice34->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]);
15488 oldoffice34->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]);
15489 oldoffice34->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]);
15490 oldoffice34->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]);
15491
15492 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15493 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15494 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15495 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15496
15497 oldoffice34->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]);
15498 oldoffice34->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]);
15499 oldoffice34->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]);
15500 oldoffice34->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]);
15501 oldoffice34->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]);
15502
15503 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15504 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15505 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15506 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15507 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15508
15509 oldoffice34->rc4key[1] = 0;
15510 oldoffice34->rc4key[0] = 0;
15511
15512 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15513 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15514 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15515 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15516 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15517 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15518 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15519 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15520 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15521 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15522
15523 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15524 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15525
15526 /**
15527 * salt
15528 */
15529
15530 salt->salt_len = 16;
15531
15532 salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]);
15533 salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]);
15534 salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]);
15535 salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]);
15536
15537 // this is a workaround as office produces multiple documents with the same salt
15538
15539 salt->salt_len += 32;
15540
15541 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15542 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15543 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15544 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15545 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15546 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15547 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15548 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15549
15550 /**
15551 * digest
15552 */
15553
15554 digest[0] = oldoffice34->rc4key[0];
15555 digest[1] = oldoffice34->rc4key[1];
15556 digest[2] = 0;
15557 digest[3] = 0;
15558
15559 return (PARSER_OK);
15560 }
15561
15562 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15563 {
15564 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15565
15566 uint32_t *digest = (uint32_t *) hash_buf->digest;
15567
15568 digest[0] = hex_to_uint (&input_buf[ 0]);
15569 digest[1] = hex_to_uint (&input_buf[ 8]);
15570 digest[2] = hex_to_uint (&input_buf[16]);
15571 digest[3] = hex_to_uint (&input_buf[24]);
15572
15573 digest[0] = byte_swap_32 (digest[0]);
15574 digest[1] = byte_swap_32 (digest[1]);
15575 digest[2] = byte_swap_32 (digest[2]);
15576 digest[3] = byte_swap_32 (digest[3]);
15577
15578 return (PARSER_OK);
15579 }
15580
15581 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15582 {
15583 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15584
15585 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15586
15587 uint32_t *digest = (uint32_t *) hash_buf->digest;
15588
15589 salt_t *salt = hash_buf->salt;
15590
15591 char *signature_pos = input_buf;
15592
15593 char *salt_pos = strchr (signature_pos, '$');
15594
15595 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15596
15597 uint32_t signature_len = salt_pos - signature_pos;
15598
15599 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15600
15601 salt_pos++;
15602
15603 char *hash_pos = strchr (salt_pos, '$');
15604
15605 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15606
15607 uint32_t salt_len = hash_pos - salt_pos;
15608
15609 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15610
15611 hash_pos++;
15612
15613 uint32_t hash_len = input_len - signature_len - 1 - salt_len - 1;
15614
15615 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15616
15617 digest[0] = hex_to_uint (&hash_pos[ 0]);
15618 digest[1] = hex_to_uint (&hash_pos[ 8]);
15619 digest[2] = hex_to_uint (&hash_pos[16]);
15620 digest[3] = hex_to_uint (&hash_pos[24]);
15621 digest[4] = hex_to_uint (&hash_pos[32]);
15622
15623 digest[0] -= SHA1M_A;
15624 digest[1] -= SHA1M_B;
15625 digest[2] -= SHA1M_C;
15626 digest[3] -= SHA1M_D;
15627 digest[4] -= SHA1M_E;
15628
15629 char *salt_buf_ptr = (char *) salt->salt_buf;
15630
15631 memcpy (salt_buf_ptr, salt_pos, salt_len);
15632
15633 salt->salt_len = salt_len;
15634
15635 return (PARSER_OK);
15636 }
15637
15638 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15639 {
15640 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15641
15642 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15643
15644 uint32_t *digest = (uint32_t *) hash_buf->digest;
15645
15646 salt_t *salt = hash_buf->salt;
15647
15648 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15649
15650 /**
15651 * parse line
15652 */
15653
15654 char *iter_pos = input_buf + 14;
15655
15656 const int iter = atoi (iter_pos);
15657
15658 if (iter < 1) return (PARSER_SALT_ITERATION);
15659
15660 salt->salt_iter = iter - 1;
15661
15662 char *salt_pos = strchr (iter_pos, '$');
15663
15664 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15665
15666 salt_pos++;
15667
15668 char *hash_pos = strchr (salt_pos, '$');
15669
15670 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15671
15672 const uint salt_len = hash_pos - salt_pos;
15673
15674 hash_pos++;
15675
15676 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15677
15678 memcpy (salt_buf_ptr, salt_pos, salt_len);
15679
15680 salt->salt_len = salt_len;
15681
15682 salt_buf_ptr[salt_len + 3] = 0x01;
15683 salt_buf_ptr[salt_len + 4] = 0x80;
15684
15685 // add some stuff to normal salt to make sorted happy
15686
15687 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15688 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15689 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15690 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15691 salt->salt_buf[4] = salt->salt_iter;
15692
15693 // base64 decode hash
15694
15695 char tmp_buf[100];
15696
15697 memset (tmp_buf, 0, sizeof (tmp_buf));
15698
15699 uint hash_len = input_len - (hash_pos - input_buf);
15700
15701 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15702
15703 base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf);
15704
15705 memcpy (digest, tmp_buf, 32);
15706
15707 digest[0] = byte_swap_32 (digest[0]);
15708 digest[1] = byte_swap_32 (digest[1]);
15709 digest[2] = byte_swap_32 (digest[2]);
15710 digest[3] = byte_swap_32 (digest[3]);
15711 digest[4] = byte_swap_32 (digest[4]);
15712 digest[5] = byte_swap_32 (digest[5]);
15713 digest[6] = byte_swap_32 (digest[6]);
15714 digest[7] = byte_swap_32 (digest[7]);
15715
15716 return (PARSER_OK);
15717 }
15718
15719 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15720 {
15721 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15722
15723 uint32_t *digest = (uint32_t *) hash_buf->digest;
15724
15725 salt_t *salt = hash_buf->salt;
15726
15727 digest[0] = hex_to_uint (&input_buf[ 0]);
15728 digest[1] = hex_to_uint (&input_buf[ 8]);
15729 digest[2] = 0;
15730 digest[3] = 0;
15731
15732 digest[0] = byte_swap_32 (digest[0]);
15733 digest[1] = byte_swap_32 (digest[1]);
15734
15735 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15736 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15737 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15738
15739 char iter_c = input_buf[17];
15740 char iter_d = input_buf[19];
15741
15742 // atm only defaults, let's see if there's more request
15743 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15744 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15745
15746 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15747
15748 salt->salt_buf[0] = hex_to_uint (&salt_buf[ 0]);
15749 salt->salt_buf[1] = hex_to_uint (&salt_buf[ 8]);
15750 salt->salt_buf[2] = hex_to_uint (&salt_buf[16]);
15751 salt->salt_buf[3] = hex_to_uint (&salt_buf[24]);
15752
15753 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15754 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15755 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15756 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15757
15758 salt->salt_len = 16;
15759
15760 return (PARSER_OK);
15761 }
15762
15763 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15764 {
15765 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
15766
15767 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15768
15769 uint32_t *digest = (uint32_t *) hash_buf->digest;
15770
15771 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
15772
15773 salt_t *salt = hash_buf->salt;
15774
15775 char *salt_pos = input_buf + 10;
15776
15777 char *hash_pos = strchr (salt_pos, '$');
15778
15779 uint salt_len = hash_pos - salt_pos;
15780
15781 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15782
15783 hash_pos++;
15784
15785 uint hash_len = input_len - 10 - salt_len - 1;
15786
15787 // base64 decode salt
15788
15789 char tmp_buf[100];
15790
15791 memset (tmp_buf, 0, sizeof (tmp_buf));
15792
15793 salt_len = base64_decode (base64_to_int, salt_pos, salt_len, tmp_buf);
15794
15795 if (salt_len > 55) return (PARSER_SALT_LENGTH);
15796
15797 tmp_buf[salt_len] = 0x80;
15798
15799 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
15800
15801 salt->salt_len = salt_len;
15802
15803 // base64 decode salt
15804
15805 memset (tmp_buf, 0, sizeof (tmp_buf));
15806
15807 hash_len = base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf);
15808
15809 uint user_len = hash_len - 32;
15810
15811 char *tmp_hash = tmp_buf + user_len;
15812
15813 user_len--; // skip the trailing space
15814
15815 digest[0] = hex_to_uint (&tmp_hash[ 0]);
15816 digest[1] = hex_to_uint (&tmp_hash[ 8]);
15817 digest[2] = hex_to_uint (&tmp_hash[16]);
15818 digest[3] = hex_to_uint (&tmp_hash[24]);
15819
15820 digest[0] = byte_swap_32 (digest[0]);
15821 digest[1] = byte_swap_32 (digest[1]);
15822 digest[2] = byte_swap_32 (digest[2]);
15823 digest[3] = byte_swap_32 (digest[3]);
15824
15825 // store username for host only (output hash if cracked)
15826
15827 memset (cram_md5->user, 0, sizeof (cram_md5->user));
15828 memcpy (cram_md5->user, tmp_buf, user_len);
15829
15830 return (PARSER_OK);
15831 }
15832
15833 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15834 {
15835 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
15836
15837 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15838
15839 uint32_t *digest = (uint32_t *) hash_buf->digest;
15840
15841 salt_t *salt = hash_buf->salt;
15842
15843 char *iter_pos = input_buf + 10;
15844
15845 uint32_t iter = atoi (iter_pos);
15846
15847 if (iter < 1)
15848 {
15849 return (PARSER_SALT_ITERATION);
15850 }
15851
15852 iter--; // first iteration is special
15853
15854 salt->salt_iter = iter;
15855
15856 char *base64_pos = strchr (iter_pos, '}');
15857
15858 if (base64_pos == NULL)
15859 {
15860 return (PARSER_SIGNATURE_UNMATCHED);
15861 }
15862
15863 base64_pos++;
15864
15865 // base64 decode salt
15866
15867 uint32_t base64_len = input_len - (base64_pos - input_buf);
15868
15869 char tmp_buf[100];
15870
15871 memset (tmp_buf, 0, sizeof (tmp_buf));
15872
15873 uint32_t decoded_len = base64_decode (base64_to_int, base64_pos, base64_len, tmp_buf);
15874
15875 if (decoded_len < 24)
15876 {
15877 return (PARSER_SALT_LENGTH);
15878 }
15879
15880 // copy the salt
15881
15882 uint salt_len = decoded_len - 20;
15883
15884 if (salt_len < 4) return (PARSER_SALT_LENGTH);
15885 if (salt_len > 16) return (PARSER_SALT_LENGTH);
15886
15887 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
15888
15889 salt->salt_len = salt_len;
15890
15891 // set digest
15892
15893 uint32_t *digest_ptr = (uint32_t*) tmp_buf;
15894
15895 digest[0] = byte_swap_32 (digest_ptr[0]);
15896 digest[1] = byte_swap_32 (digest_ptr[1]);
15897 digest[2] = byte_swap_32 (digest_ptr[2]);
15898 digest[3] = byte_swap_32 (digest_ptr[3]);
15899 digest[4] = byte_swap_32 (digest_ptr[4]);
15900
15901 return (PARSER_OK);
15902 }
15903
15904 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15905 {
15906 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
15907
15908 uint32_t *digest = (uint32_t *) hash_buf->digest;
15909
15910 salt_t *salt = hash_buf->salt;
15911
15912 digest[0] = hex_to_uint (&input_buf[ 0]);
15913 digest[1] = hex_to_uint (&input_buf[ 8]);
15914 digest[2] = hex_to_uint (&input_buf[16]);
15915 digest[3] = hex_to_uint (&input_buf[24]);
15916 digest[4] = hex_to_uint (&input_buf[32]);
15917
15918 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15919
15920 uint salt_len = input_len - 40 - 1;
15921
15922 char *salt_buf = input_buf + 40 + 1;
15923
15924 char *salt_buf_ptr = (char *) salt->salt_buf;
15925
15926 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
15927
15928 if (salt_len != 32) return (PARSER_SALT_LENGTH);
15929
15930 salt->salt_len = salt_len;
15931
15932 return (PARSER_OK);
15933 }
15934
15935 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15936 {
15937 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
15938
15939 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15940
15941 uint32_t *digest = (uint32_t *) hash_buf->digest;
15942
15943 salt_t *salt = hash_buf->salt;
15944
15945 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
15946
15947 /**
15948 * parse line
15949 */
15950
15951 char *V_pos = input_buf + 5;
15952
15953 char *R_pos = strchr (V_pos, '*');
15954
15955 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15956
15957 uint32_t V_len = R_pos - V_pos;
15958
15959 R_pos++;
15960
15961 char *bits_pos = strchr (R_pos, '*');
15962
15963 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15964
15965 uint32_t R_len = bits_pos - R_pos;
15966
15967 bits_pos++;
15968
15969 char *P_pos = strchr (bits_pos, '*');
15970
15971 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15972
15973 uint32_t bits_len = P_pos - bits_pos;
15974
15975 P_pos++;
15976
15977 char *enc_md_pos = strchr (P_pos, '*');
15978
15979 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15980
15981 uint32_t P_len = enc_md_pos - P_pos;
15982
15983 enc_md_pos++;
15984
15985 char *id_len_pos = strchr (enc_md_pos, '*');
15986
15987 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15988
15989 uint32_t enc_md_len = id_len_pos - enc_md_pos;
15990
15991 id_len_pos++;
15992
15993 char *id_buf_pos = strchr (id_len_pos, '*');
15994
15995 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15996
15997 uint32_t id_len_len = id_buf_pos - id_len_pos;
15998
15999 id_buf_pos++;
16000
16001 char *u_len_pos = strchr (id_buf_pos, '*');
16002
16003 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16004
16005 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16006
16007 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16008
16009 u_len_pos++;
16010
16011 char *u_buf_pos = strchr (u_len_pos, '*');
16012
16013 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16014
16015 uint32_t u_len_len = u_buf_pos - u_len_pos;
16016
16017 u_buf_pos++;
16018
16019 char *o_len_pos = strchr (u_buf_pos, '*');
16020
16021 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16022
16023 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16024
16025 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16026
16027 o_len_pos++;
16028
16029 char *o_buf_pos = strchr (o_len_pos, '*');
16030
16031 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16032
16033 uint32_t o_len_len = o_buf_pos - o_len_pos;
16034
16035 o_buf_pos++;
16036
16037 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;
16038
16039 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16040
16041 // validate data
16042
16043 const int V = atoi (V_pos);
16044 const int R = atoi (R_pos);
16045 const int P = atoi (P_pos);
16046
16047 if (V != 1) return (PARSER_SALT_VALUE);
16048 if (R != 2) return (PARSER_SALT_VALUE);
16049
16050 const int enc_md = atoi (enc_md_pos);
16051
16052 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16053
16054 const int id_len = atoi (id_len_pos);
16055 const int u_len = atoi (u_len_pos);
16056 const int o_len = atoi (o_len_pos);
16057
16058 if (id_len != 16) return (PARSER_SALT_VALUE);
16059 if (u_len != 32) return (PARSER_SALT_VALUE);
16060 if (o_len != 32) return (PARSER_SALT_VALUE);
16061
16062 const int bits = atoi (bits_pos);
16063
16064 if (bits != 40) return (PARSER_SALT_VALUE);
16065
16066 // copy data to esalt
16067
16068 pdf->V = V;
16069 pdf->R = R;
16070 pdf->P = P;
16071
16072 pdf->enc_md = enc_md;
16073
16074 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16075 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16076 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16077 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16078 pdf->id_len = id_len;
16079
16080 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16081 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16082 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16083 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16084 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16085 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16086 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16087 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16088 pdf->u_len = u_len;
16089
16090 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16091 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16092 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16093 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16094 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16095 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16096 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16097 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16098 pdf->o_len = o_len;
16099
16100 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16101 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16102 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16103 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16104
16105 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16106 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16107 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16108 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16109 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16110 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16111 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16112 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16113
16114 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16115 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16116 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16117 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16118 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16119 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16120 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16121 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16122
16123 // we use ID for salt, maybe needs to change, we will see...
16124
16125 salt->salt_buf[0] = pdf->id_buf[0];
16126 salt->salt_buf[1] = pdf->id_buf[1];
16127 salt->salt_buf[2] = pdf->id_buf[2];
16128 salt->salt_buf[3] = pdf->id_buf[3];
16129 salt->salt_len = pdf->id_len;
16130
16131 digest[0] = pdf->u_buf[0];
16132 digest[1] = pdf->u_buf[1];
16133 digest[2] = pdf->u_buf[2];
16134 digest[3] = pdf->u_buf[3];
16135
16136 return (PARSER_OK);
16137 }
16138
16139 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16140 {
16141 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16142 }
16143
16144 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16145 {
16146 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16147
16148 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16149
16150 uint32_t *digest = (uint32_t *) hash_buf->digest;
16151
16152 salt_t *salt = hash_buf->salt;
16153
16154 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16155
16156 /**
16157 * parse line
16158 */
16159
16160 char *V_pos = input_buf + 5;
16161
16162 char *R_pos = strchr (V_pos, '*');
16163
16164 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16165
16166 uint32_t V_len = R_pos - V_pos;
16167
16168 R_pos++;
16169
16170 char *bits_pos = strchr (R_pos, '*');
16171
16172 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16173
16174 uint32_t R_len = bits_pos - R_pos;
16175
16176 bits_pos++;
16177
16178 char *P_pos = strchr (bits_pos, '*');
16179
16180 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16181
16182 uint32_t bits_len = P_pos - bits_pos;
16183
16184 P_pos++;
16185
16186 char *enc_md_pos = strchr (P_pos, '*');
16187
16188 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16189
16190 uint32_t P_len = enc_md_pos - P_pos;
16191
16192 enc_md_pos++;
16193
16194 char *id_len_pos = strchr (enc_md_pos, '*');
16195
16196 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16197
16198 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16199
16200 id_len_pos++;
16201
16202 char *id_buf_pos = strchr (id_len_pos, '*');
16203
16204 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16205
16206 uint32_t id_len_len = id_buf_pos - id_len_pos;
16207
16208 id_buf_pos++;
16209
16210 char *u_len_pos = strchr (id_buf_pos, '*');
16211
16212 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16213
16214 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16215
16216 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16217
16218 u_len_pos++;
16219
16220 char *u_buf_pos = strchr (u_len_pos, '*');
16221
16222 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16223
16224 uint32_t u_len_len = u_buf_pos - u_len_pos;
16225
16226 u_buf_pos++;
16227
16228 char *o_len_pos = strchr (u_buf_pos, '*');
16229
16230 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16231
16232 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16233
16234 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16235
16236 o_len_pos++;
16237
16238 char *o_buf_pos = strchr (o_len_pos, '*');
16239
16240 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16241
16242 uint32_t o_len_len = o_buf_pos - o_len_pos;
16243
16244 o_buf_pos++;
16245
16246 char *rc4key_pos = strchr (o_buf_pos, ':');
16247
16248 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16249
16250 uint32_t o_buf_len = rc4key_pos - o_buf_pos;
16251
16252 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16253
16254 rc4key_pos++;
16255
16256 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;
16257
16258 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16259
16260 // validate data
16261
16262 const int V = atoi (V_pos);
16263 const int R = atoi (R_pos);
16264 const int P = atoi (P_pos);
16265
16266 if (V != 1) return (PARSER_SALT_VALUE);
16267 if (R != 2) return (PARSER_SALT_VALUE);
16268
16269 const int enc_md = atoi (enc_md_pos);
16270
16271 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16272
16273 const int id_len = atoi (id_len_pos);
16274 const int u_len = atoi (u_len_pos);
16275 const int o_len = atoi (o_len_pos);
16276
16277 if (id_len != 16) return (PARSER_SALT_VALUE);
16278 if (u_len != 32) return (PARSER_SALT_VALUE);
16279 if (o_len != 32) return (PARSER_SALT_VALUE);
16280
16281 const int bits = atoi (bits_pos);
16282
16283 if (bits != 40) return (PARSER_SALT_VALUE);
16284
16285 // copy data to esalt
16286
16287 pdf->V = V;
16288 pdf->R = R;
16289 pdf->P = P;
16290
16291 pdf->enc_md = enc_md;
16292
16293 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16294 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16295 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16296 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16297 pdf->id_len = id_len;
16298
16299 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16300 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16301 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16302 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16303 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16304 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16305 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16306 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16307 pdf->u_len = u_len;
16308
16309 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16310 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16311 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16312 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16313 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16314 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16315 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16316 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16317 pdf->o_len = o_len;
16318
16319 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16320 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16321 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16322 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16323
16324 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16325 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16326 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16327 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16328 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16329 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16330 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16331 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16332
16333 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16334 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16335 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16336 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16337 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16338 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16339 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16340 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16341
16342 pdf->rc4key[1] = 0;
16343 pdf->rc4key[0] = 0;
16344
16345 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16346 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16347 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16348 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16349 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16350 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16351 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16352 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16353 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16354 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16355
16356 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16357 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16358
16359 // we use ID for salt, maybe needs to change, we will see...
16360
16361 salt->salt_buf[0] = pdf->id_buf[0];
16362 salt->salt_buf[1] = pdf->id_buf[1];
16363 salt->salt_buf[2] = pdf->id_buf[2];
16364 salt->salt_buf[3] = pdf->id_buf[3];
16365 salt->salt_buf[4] = pdf->u_buf[0];
16366 salt->salt_buf[5] = pdf->u_buf[1];
16367 salt->salt_buf[6] = pdf->o_buf[0];
16368 salt->salt_buf[7] = pdf->o_buf[1];
16369 salt->salt_len = pdf->id_len + 16;
16370
16371 digest[0] = pdf->rc4key[0];
16372 digest[1] = pdf->rc4key[1];
16373 digest[2] = 0;
16374 digest[3] = 0;
16375
16376 return (PARSER_OK);
16377 }
16378
16379 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16380 {
16381 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16382
16383 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16384
16385 uint32_t *digest = (uint32_t *) hash_buf->digest;
16386
16387 salt_t *salt = hash_buf->salt;
16388
16389 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16390
16391 /**
16392 * parse line
16393 */
16394
16395 char *V_pos = input_buf + 5;
16396
16397 char *R_pos = strchr (V_pos, '*');
16398
16399 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16400
16401 uint32_t V_len = R_pos - V_pos;
16402
16403 R_pos++;
16404
16405 char *bits_pos = strchr (R_pos, '*');
16406
16407 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16408
16409 uint32_t R_len = bits_pos - R_pos;
16410
16411 bits_pos++;
16412
16413 char *P_pos = strchr (bits_pos, '*');
16414
16415 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16416
16417 uint32_t bits_len = P_pos - bits_pos;
16418
16419 P_pos++;
16420
16421 char *enc_md_pos = strchr (P_pos, '*');
16422
16423 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16424
16425 uint32_t P_len = enc_md_pos - P_pos;
16426
16427 enc_md_pos++;
16428
16429 char *id_len_pos = strchr (enc_md_pos, '*');
16430
16431 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16432
16433 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16434
16435 id_len_pos++;
16436
16437 char *id_buf_pos = strchr (id_len_pos, '*');
16438
16439 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16440
16441 uint32_t id_len_len = id_buf_pos - id_len_pos;
16442
16443 id_buf_pos++;
16444
16445 char *u_len_pos = strchr (id_buf_pos, '*');
16446
16447 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16448
16449 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16450
16451 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16452
16453 u_len_pos++;
16454
16455 char *u_buf_pos = strchr (u_len_pos, '*');
16456
16457 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16458
16459 uint32_t u_len_len = u_buf_pos - u_len_pos;
16460
16461 u_buf_pos++;
16462
16463 char *o_len_pos = strchr (u_buf_pos, '*');
16464
16465 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16466
16467 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16468
16469 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16470
16471 o_len_pos++;
16472
16473 char *o_buf_pos = strchr (o_len_pos, '*');
16474
16475 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16476
16477 uint32_t o_len_len = o_buf_pos - o_len_pos;
16478
16479 o_buf_pos++;
16480
16481 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;
16482
16483 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16484
16485 // validate data
16486
16487 const int V = atoi (V_pos);
16488 const int R = atoi (R_pos);
16489 const int P = atoi (P_pos);
16490
16491 int vr_ok = 0;
16492
16493 if ((V == 2) && (R == 3)) vr_ok = 1;
16494 if ((V == 4) && (R == 4)) vr_ok = 1;
16495
16496 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16497
16498 const int id_len = atoi (id_len_pos);
16499 const int u_len = atoi (u_len_pos);
16500 const int o_len = atoi (o_len_pos);
16501
16502 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16503
16504 if (u_len != 32) return (PARSER_SALT_VALUE);
16505 if (o_len != 32) return (PARSER_SALT_VALUE);
16506
16507 const int bits = atoi (bits_pos);
16508
16509 if (bits != 128) return (PARSER_SALT_VALUE);
16510
16511 int enc_md = 1;
16512
16513 if (R >= 4)
16514 {
16515 enc_md = atoi (enc_md_pos);
16516 }
16517
16518 // copy data to esalt
16519
16520 pdf->V = V;
16521 pdf->R = R;
16522 pdf->P = P;
16523
16524 pdf->enc_md = enc_md;
16525
16526 pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]);
16527 pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]);
16528 pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]);
16529 pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]);
16530
16531 if (id_len == 32)
16532 {
16533 pdf->id_buf[4] = hex_to_uint (&id_buf_pos[32]);
16534 pdf->id_buf[5] = hex_to_uint (&id_buf_pos[40]);
16535 pdf->id_buf[6] = hex_to_uint (&id_buf_pos[48]);
16536 pdf->id_buf[7] = hex_to_uint (&id_buf_pos[56]);
16537 }
16538
16539 pdf->id_len = id_len;
16540
16541 pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]);
16542 pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]);
16543 pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]);
16544 pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]);
16545 pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]);
16546 pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]);
16547 pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]);
16548 pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]);
16549 pdf->u_len = u_len;
16550
16551 pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]);
16552 pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]);
16553 pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]);
16554 pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]);
16555 pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]);
16556 pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]);
16557 pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]);
16558 pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]);
16559 pdf->o_len = o_len;
16560
16561 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16562 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16563 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16564 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16565
16566 if (id_len == 32)
16567 {
16568 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16569 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16570 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16571 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16572 }
16573
16574 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16575 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16576 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16577 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16578 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16579 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16580 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16581 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16582
16583 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16584 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16585 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16586 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16587 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16588 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16589 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16590 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16591
16592 // precompute rc4 data for later use
16593
16594 uint padding[8] =
16595 {
16596 0x5e4ebf28,
16597 0x418a754e,
16598 0x564e0064,
16599 0x0801faff,
16600 0xb6002e2e,
16601 0x803e68d0,
16602 0xfea90c2f,
16603 0x7a695364
16604 };
16605
16606 // md5
16607
16608 uint salt_pc_block[32];
16609
16610 char *salt_pc_ptr = (char *) salt_pc_block;
16611
16612 memcpy (salt_pc_ptr, padding, 32);
16613 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16614
16615 uint salt_pc_digest[4];
16616
16617 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16618
16619 pdf->rc4data[0] = salt_pc_digest[0];
16620 pdf->rc4data[1] = salt_pc_digest[1];
16621
16622 // we use ID for salt, maybe needs to change, we will see...
16623
16624 salt->salt_buf[0] = pdf->id_buf[0];
16625 salt->salt_buf[1] = pdf->id_buf[1];
16626 salt->salt_buf[2] = pdf->id_buf[2];
16627 salt->salt_buf[3] = pdf->id_buf[3];
16628 salt->salt_buf[4] = pdf->u_buf[0];
16629 salt->salt_buf[5] = pdf->u_buf[1];
16630 salt->salt_buf[6] = pdf->o_buf[0];
16631 salt->salt_buf[7] = pdf->o_buf[1];
16632 salt->salt_len = pdf->id_len + 16;
16633
16634 salt->salt_iter = ROUNDS_PDF14;
16635
16636 digest[0] = pdf->u_buf[0];
16637 digest[1] = pdf->u_buf[1];
16638 digest[2] = 0;
16639 digest[3] = 0;
16640
16641 return (PARSER_OK);
16642 }
16643
16644 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16645 {
16646 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16647
16648 if (ret != PARSER_OK)
16649 {
16650 return ret;
16651 }
16652
16653 uint32_t *digest = (uint32_t *) hash_buf->digest;
16654
16655 salt_t *salt = hash_buf->salt;
16656
16657 digest[0] -= SHA256M_A;
16658 digest[1] -= SHA256M_B;
16659 digest[2] -= SHA256M_C;
16660 digest[3] -= SHA256M_D;
16661 digest[4] -= SHA256M_E;
16662 digest[5] -= SHA256M_F;
16663 digest[6] -= SHA256M_G;
16664 digest[7] -= SHA256M_H;
16665
16666 salt->salt_buf[2] = 0x80;
16667
16668 return (PARSER_OK);
16669 }
16670
16671 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16672 {
16673 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16674
16675 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16676
16677 uint32_t *digest = (uint32_t *) hash_buf->digest;
16678
16679 salt_t *salt = hash_buf->salt;
16680
16681 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16682
16683 /**
16684 * parse line
16685 */
16686
16687 char *V_pos = input_buf + 5;
16688
16689 char *R_pos = strchr (V_pos, '*');
16690
16691 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16692
16693 uint32_t V_len = R_pos - V_pos;
16694
16695 R_pos++;
16696
16697 char *bits_pos = strchr (R_pos, '*');
16698
16699 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16700
16701 uint32_t R_len = bits_pos - R_pos;
16702
16703 bits_pos++;
16704
16705 char *P_pos = strchr (bits_pos, '*');
16706
16707 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16708
16709 uint32_t bits_len = P_pos - bits_pos;
16710
16711 P_pos++;
16712
16713 char *enc_md_pos = strchr (P_pos, '*');
16714
16715 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16716
16717 uint32_t P_len = enc_md_pos - P_pos;
16718
16719 enc_md_pos++;
16720
16721 char *id_len_pos = strchr (enc_md_pos, '*');
16722
16723 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16724
16725 uint32_t enc_md_len = id_len_pos - enc_md_pos;
16726
16727 id_len_pos++;
16728
16729 char *id_buf_pos = strchr (id_len_pos, '*');
16730
16731 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16732
16733 uint32_t id_len_len = id_buf_pos - id_len_pos;
16734
16735 id_buf_pos++;
16736
16737 char *u_len_pos = strchr (id_buf_pos, '*');
16738
16739 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16740
16741 uint32_t id_buf_len = u_len_pos - id_buf_pos;
16742
16743 u_len_pos++;
16744
16745 char *u_buf_pos = strchr (u_len_pos, '*');
16746
16747 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16748
16749 uint32_t u_len_len = u_buf_pos - u_len_pos;
16750
16751 u_buf_pos++;
16752
16753 char *o_len_pos = strchr (u_buf_pos, '*');
16754
16755 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16756
16757 uint32_t u_buf_len = o_len_pos - u_buf_pos;
16758
16759 o_len_pos++;
16760
16761 char *o_buf_pos = strchr (o_len_pos, '*');
16762
16763 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16764
16765 uint32_t o_len_len = o_buf_pos - o_len_pos;
16766
16767 o_buf_pos++;
16768
16769 char *last = strchr (o_buf_pos, '*');
16770
16771 if (last == NULL) last = input_buf + input_len;
16772
16773 uint32_t o_buf_len = last - o_buf_pos;
16774
16775 // validate data
16776
16777 const int V = atoi (V_pos);
16778 const int R = atoi (R_pos);
16779
16780 int vr_ok = 0;
16781
16782 if ((V == 5) && (R == 5)) vr_ok = 1;
16783 if ((V == 5) && (R == 6)) vr_ok = 1;
16784
16785 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16786
16787 const int bits = atoi (bits_pos);
16788
16789 if (bits != 256) return (PARSER_SALT_VALUE);
16790
16791 int enc_md = atoi (enc_md_pos);
16792
16793 if (enc_md != 1) return (PARSER_SALT_VALUE);
16794
16795 const uint id_len = atoi (id_len_pos);
16796 const uint u_len = atoi (u_len_pos);
16797 const uint o_len = atoi (o_len_pos);
16798
16799 if (V_len > 6) return (PARSER_SALT_LENGTH);
16800 if (R_len > 6) return (PARSER_SALT_LENGTH);
16801 if (P_len > 6) return (PARSER_SALT_LENGTH);
16802 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
16803 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
16804 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
16805 if (bits_len > 6) return (PARSER_SALT_LENGTH);
16806 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
16807
16808 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
16809 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
16810 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
16811
16812 // copy data to esalt
16813
16814 if (u_len < 40) return (PARSER_SALT_VALUE);
16815
16816 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
16817 {
16818 pdf->u_buf[i] = hex_to_uint (&u_buf_pos[j]);
16819 }
16820
16821 salt->salt_buf[0] = pdf->u_buf[8];
16822 salt->salt_buf[1] = pdf->u_buf[9];
16823
16824 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
16825 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
16826
16827 salt->salt_len = 8;
16828 salt->salt_iter = ROUNDS_PDF17L8;
16829
16830 digest[0] = pdf->u_buf[0];
16831 digest[1] = pdf->u_buf[1];
16832 digest[2] = pdf->u_buf[2];
16833 digest[3] = pdf->u_buf[3];
16834 digest[4] = pdf->u_buf[4];
16835 digest[5] = pdf->u_buf[5];
16836 digest[6] = pdf->u_buf[6];
16837 digest[7] = pdf->u_buf[7];
16838
16839 return (PARSER_OK);
16840 }
16841
16842 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16843 {
16844 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
16845
16846 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
16847
16848 uint32_t *digest = (uint32_t *) hash_buf->digest;
16849
16850 salt_t *salt = hash_buf->salt;
16851
16852 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
16853
16854 /**
16855 * parse line
16856 */
16857
16858 // iterations
16859
16860 char *iter_pos = input_buf + 7;
16861
16862 uint32_t iter = atoi (iter_pos);
16863
16864 if (iter < 1) return (PARSER_SALT_ITERATION);
16865 if (iter > 999999) return (PARSER_SALT_ITERATION);
16866
16867 // first is *raw* salt
16868
16869 char *salt_pos = strchr (iter_pos, ':');
16870
16871 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16872
16873 salt_pos++;
16874
16875 char *hash_pos = strchr (salt_pos, ':');
16876
16877 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16878
16879 uint32_t salt_len = hash_pos - salt_pos;
16880
16881 if (salt_len > 64) return (PARSER_SALT_LENGTH);
16882
16883 hash_pos++;
16884
16885 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
16886
16887 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
16888
16889 // decode salt
16890
16891 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
16892
16893 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
16894
16895 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
16896
16897 salt_buf_ptr[salt_len + 3] = 0x01;
16898 salt_buf_ptr[salt_len + 4] = 0x80;
16899
16900 salt->salt_len = salt_len;
16901 salt->salt_iter = iter - 1;
16902
16903 // decode hash
16904
16905 char tmp_buf[100];
16906
16907 memset (tmp_buf, 0, sizeof (tmp_buf));
16908
16909 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
16910
16911 if (hash_len < 16) return (PARSER_HASH_LENGTH);
16912
16913 memcpy (digest, tmp_buf, 16);
16914
16915 digest[0] = byte_swap_32 (digest[0]);
16916 digest[1] = byte_swap_32 (digest[1]);
16917 digest[2] = byte_swap_32 (digest[2]);
16918 digest[3] = byte_swap_32 (digest[3]);
16919
16920 // add some stuff to normal salt to make sorted happy
16921
16922 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
16923 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
16924 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
16925 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
16926 salt->salt_buf[4] = salt->salt_iter;
16927
16928 return (PARSER_OK);
16929 }
16930
16931 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16932 {
16933 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
16934
16935 uint32_t *digest = (uint32_t *) hash_buf->digest;
16936
16937 salt_t *salt = hash_buf->salt;
16938
16939 digest[0] = hex_to_uint (&input_buf[ 0]);
16940 digest[1] = hex_to_uint (&input_buf[ 8]);
16941 digest[2] = hex_to_uint (&input_buf[16]);
16942 digest[3] = hex_to_uint (&input_buf[24]);
16943
16944 digest[0] = byte_swap_32 (digest[0]);
16945 digest[1] = byte_swap_32 (digest[1]);
16946 digest[2] = byte_swap_32 (digest[2]);
16947 digest[3] = byte_swap_32 (digest[3]);
16948
16949 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16950
16951 uint salt_len = input_len - 32 - 1;
16952
16953 char *salt_buf = input_buf + 32 + 1;
16954
16955 char *salt_buf_ptr = (char *) salt->salt_buf;
16956
16957 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16958
16959 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
16960
16961 salt->salt_len = salt_len;
16962
16963 return (PARSER_OK);
16964 }
16965
16966 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16967 {
16968 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
16969
16970 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16971
16972 uint32_t *digest = (uint32_t *) hash_buf->digest;
16973
16974 salt_t *salt = hash_buf->salt;
16975
16976 char *user_pos = input_buf + 10;
16977
16978 char *salt_pos = strchr (user_pos, '*');
16979
16980 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16981
16982 salt_pos++;
16983
16984 char *hash_pos = strchr (salt_pos, '*');
16985
16986 hash_pos++;
16987
16988 uint hash_len = input_len - (hash_pos - input_buf);
16989
16990 if (hash_len != 32) return (PARSER_HASH_LENGTH);
16991
16992 uint user_len = salt_pos - user_pos - 1;
16993
16994 uint salt_len = hash_pos - salt_pos - 1;
16995
16996 if (salt_len != 8) return (PARSER_SALT_LENGTH);
16997
16998 /*
16999 * store digest
17000 */
17001
17002 digest[0] = hex_to_uint (&hash_pos[ 0]);
17003 digest[1] = hex_to_uint (&hash_pos[ 8]);
17004 digest[2] = hex_to_uint (&hash_pos[16]);
17005 digest[3] = hex_to_uint (&hash_pos[24]);
17006
17007 digest[0] = byte_swap_32 (digest[0]);
17008 digest[1] = byte_swap_32 (digest[1]);
17009 digest[2] = byte_swap_32 (digest[2]);
17010 digest[3] = byte_swap_32 (digest[3]);
17011
17012 digest[0] -= MD5M_A;
17013 digest[1] -= MD5M_B;
17014 digest[2] -= MD5M_C;
17015 digest[3] -= MD5M_D;
17016
17017 /*
17018 * store salt
17019 */
17020
17021 char *salt_buf_ptr = (char *) salt->salt_buf;
17022
17023 // first 4 bytes are the "challenge"
17024
17025 salt_buf_ptr[0] = hex_to_char (&salt_pos[0]);
17026 salt_buf_ptr[1] = hex_to_char (&salt_pos[2]);
17027 salt_buf_ptr[2] = hex_to_char (&salt_pos[4]);
17028 salt_buf_ptr[3] = hex_to_char (&salt_pos[6]);
17029
17030 // append the user name
17031
17032 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17033
17034 salt->salt_len = 4 + user_len;
17035
17036 return (PARSER_OK);
17037 }
17038
17039 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17040 {
17041 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17042
17043 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17044
17045 uint32_t *digest = (uint32_t *) hash_buf->digest;
17046
17047 salt_t *salt = hash_buf->salt;
17048
17049 char *salt_pos = input_buf + 9;
17050
17051 char *hash_pos = strchr (salt_pos, '*');
17052
17053 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17054
17055 hash_pos++;
17056
17057 uint hash_len = input_len - (hash_pos - input_buf);
17058
17059 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17060
17061 uint salt_len = hash_pos - salt_pos - 1;
17062
17063 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17064
17065 /*
17066 * store digest
17067 */
17068
17069 digest[0] = hex_to_uint (&hash_pos[ 0]);
17070 digest[1] = hex_to_uint (&hash_pos[ 8]);
17071 digest[2] = hex_to_uint (&hash_pos[16]);
17072 digest[3] = hex_to_uint (&hash_pos[24]);
17073 digest[4] = hex_to_uint (&hash_pos[32]);
17074
17075 /*
17076 * store salt
17077 */
17078
17079 char *salt_buf_ptr = (char *) salt->salt_buf;
17080
17081 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17082
17083 salt->salt_len = salt_len;
17084
17085 return (PARSER_OK);
17086 }
17087
17088 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17089 {
17090 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17091
17092 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17093
17094 uint32_t *digest = (uint32_t *) hash_buf->digest;
17095
17096 salt_t *salt = hash_buf->salt;
17097
17098 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17099
17100 /**
17101 * parse line
17102 */
17103
17104 char *cry_master_len_pos = input_buf + 9;
17105
17106 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17107
17108 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17109
17110 uint32_t cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17111
17112 cry_master_buf_pos++;
17113
17114 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17115
17116 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17117
17118 uint32_t cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17119
17120 cry_salt_len_pos++;
17121
17122 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17123
17124 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17125
17126 uint32_t cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17127
17128 cry_salt_buf_pos++;
17129
17130 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17131
17132 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17133
17134 uint32_t cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17135
17136 cry_rounds_pos++;
17137
17138 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17139
17140 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17141
17142 uint32_t cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17143
17144 ckey_len_pos++;
17145
17146 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17147
17148 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17149
17150 uint32_t ckey_len_len = ckey_buf_pos - ckey_len_pos;
17151
17152 ckey_buf_pos++;
17153
17154 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17155
17156 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17157
17158 uint32_t ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17159
17160 public_key_len_pos++;
17161
17162 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17163
17164 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17165
17166 uint32_t public_key_len_len = public_key_buf_pos - public_key_len_pos;
17167
17168 public_key_buf_pos++;
17169
17170 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;
17171
17172 const uint cry_master_len = atoi (cry_master_len_pos);
17173 const uint cry_salt_len = atoi (cry_salt_len_pos);
17174 const uint ckey_len = atoi (ckey_len_pos);
17175 const uint public_key_len = atoi (public_key_len_pos);
17176
17177 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17178 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17179 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17180 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17181
17182 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 8)
17183 {
17184 bitcoin_wallet->cry_master_buf[i] = hex_to_uint (&cry_master_buf_pos[j]);
17185
17186 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17187 }
17188
17189 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 8)
17190 {
17191 bitcoin_wallet->ckey_buf[i] = hex_to_uint (&ckey_buf_pos[j]);
17192
17193 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17194 }
17195
17196 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 8)
17197 {
17198 bitcoin_wallet->public_key_buf[i] = hex_to_uint (&public_key_buf_pos[j]);
17199
17200 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17201 }
17202
17203 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17204 bitcoin_wallet->ckey_len = ckey_len / 2;
17205 bitcoin_wallet->public_key_len = public_key_len / 2;
17206
17207 /*
17208 * store digest (should be unique enought, hopefully)
17209 */
17210
17211 digest[0] = bitcoin_wallet->cry_master_buf[0];
17212 digest[1] = bitcoin_wallet->cry_master_buf[1];
17213 digest[2] = bitcoin_wallet->cry_master_buf[2];
17214 digest[3] = bitcoin_wallet->cry_master_buf[3];
17215
17216 /*
17217 * store salt
17218 */
17219
17220 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17221
17222 const uint cry_rounds = atoi (cry_rounds_pos);
17223
17224 salt->salt_iter = cry_rounds - 1;
17225
17226 char *salt_buf_ptr = (char *) salt->salt_buf;
17227
17228 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17229
17230 salt->salt_len = salt_len;
17231
17232 return (PARSER_OK);
17233 }
17234
17235 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17236 {
17237 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17238
17239 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17240
17241 uint32_t *digest = (uint32_t *) hash_buf->digest;
17242
17243 salt_t *salt = hash_buf->salt;
17244
17245 sip_t *sip = (sip_t *) hash_buf->esalt;
17246
17247 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17248
17249 char temp_input_buf[input_len + 1];
17250
17251 memset (temp_input_buf, 0, sizeof (temp_input_buf));
17252 memcpy (temp_input_buf, input_buf, input_len);
17253
17254 // URI_server:
17255
17256 char *URI_server_pos = temp_input_buf + 6;
17257
17258 char *URI_client_pos = strchr (URI_server_pos, '*');
17259
17260 if (URI_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17261
17262 URI_client_pos[0] = 0;
17263 URI_client_pos++;
17264
17265 uint URI_server_len = strlen (URI_server_pos);
17266
17267 if (URI_server_len > 512) return (PARSER_SALT_LENGTH);
17268
17269 // URI_client:
17270
17271 char *user_pos = strchr (URI_client_pos, '*');
17272
17273 if (user_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17274
17275 user_pos[0] = 0;
17276 user_pos++;
17277
17278 uint URI_client_len = strlen (URI_client_pos);
17279
17280 if (URI_client_len > 512) return (PARSER_SALT_LENGTH);
17281
17282 // user:
17283
17284 char *realm_pos = strchr (user_pos, '*');
17285
17286 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17287
17288 realm_pos[0] = 0;
17289 realm_pos++;
17290
17291 uint user_len = strlen (user_pos);
17292
17293 if (user_len > 116) return (PARSER_SALT_LENGTH);
17294
17295 // realm:
17296
17297 char *method_pos = strchr (realm_pos, '*');
17298
17299 if (method_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17300
17301 method_pos[0] = 0;
17302 method_pos++;
17303
17304 uint realm_len = strlen (realm_pos);
17305
17306 if (realm_len > 116) return (PARSER_SALT_LENGTH);
17307
17308 // method:
17309
17310 char *URI_prefix_pos = strchr (method_pos, '*');
17311
17312 if (URI_prefix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17313
17314 URI_prefix_pos[0] = 0;
17315 URI_prefix_pos++;
17316
17317 uint method_len = strlen (method_pos);
17318
17319 if (method_len > 246) return (PARSER_SALT_LENGTH);
17320
17321 // URI_prefix:
17322
17323 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17324
17325 if (URI_resource_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17326
17327 URI_resource_pos[0] = 0;
17328 URI_resource_pos++;
17329
17330 uint URI_prefix_len = strlen (URI_prefix_pos);
17331
17332 if (URI_prefix_len > 245) return (PARSER_SALT_LENGTH);
17333
17334 // URI_resource:
17335
17336 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17337
17338 if (URI_suffix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17339
17340 URI_suffix_pos[0] = 0;
17341 URI_suffix_pos++;
17342
17343 uint URI_resource_len = strlen (URI_resource_pos);
17344
17345 if (URI_resource_len < 1) return (PARSER_SALT_LENGTH);
17346 if (URI_resource_len > 246) return (PARSER_SALT_LENGTH);
17347
17348 // URI_suffix:
17349
17350 char *nonce_pos = strchr (URI_suffix_pos, '*');
17351
17352 if (nonce_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17353
17354 nonce_pos[0] = 0;
17355 nonce_pos++;
17356
17357 uint URI_suffix_len = strlen (URI_suffix_pos);
17358
17359 if (URI_suffix_len > 245) return (PARSER_SALT_LENGTH);
17360
17361 // nonce:
17362
17363 char *nonce_client_pos = strchr (nonce_pos, '*');
17364
17365 if (nonce_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17366
17367 nonce_client_pos[0] = 0;
17368 nonce_client_pos++;
17369
17370 uint nonce_len = strlen (nonce_pos);
17371
17372 if (nonce_len < 1) return (PARSER_SALT_LENGTH);
17373 if (nonce_len > 50) return (PARSER_SALT_LENGTH);
17374
17375 // nonce_client:
17376
17377 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17378
17379 if (nonce_count_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17380
17381 nonce_count_pos[0] = 0;
17382 nonce_count_pos++;
17383
17384 uint nonce_client_len = strlen (nonce_client_pos);
17385
17386 if (nonce_client_len > 50) return (PARSER_SALT_LENGTH);
17387
17388 // nonce_count:
17389
17390 char *qop_pos = strchr (nonce_count_pos, '*');
17391
17392 if (qop_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17393
17394 qop_pos[0] = 0;
17395 qop_pos++;
17396
17397 uint nonce_count_len = strlen (nonce_count_pos);
17398
17399 if (nonce_count_len > 50) return (PARSER_SALT_LENGTH);
17400
17401 // qop:
17402
17403 char *directive_pos = strchr (qop_pos, '*');
17404
17405 if (directive_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17406
17407 directive_pos[0] = 0;
17408 directive_pos++;
17409
17410 uint qop_len = strlen (qop_pos);
17411
17412 if (qop_len > 50) return (PARSER_SALT_LENGTH);
17413
17414 // directive
17415
17416 char *digest_pos = strchr (directive_pos, '*');
17417
17418 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17419
17420 digest_pos[0] = 0;
17421 digest_pos++;
17422
17423 uint directive_len = strlen (directive_pos);
17424
17425 if (directive_len != 3) return (PARSER_SALT_LENGTH);
17426
17427 if (memcmp (directive_pos, "MD5", 3))
17428 {
17429 log_info ("ERROR: only the MD5 directive is currently supported\n");
17430
17431 return (PARSER_SIP_AUTH_DIRECTIVE);
17432 }
17433
17434 /*
17435 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17436 */
17437
17438 uint md5_len = 0;
17439
17440 uint md5_max_len = 4 * 64;
17441
17442 uint md5_remaining_len = md5_max_len;
17443
17444 uint tmp_md5_buf[md5_max_len / 4];
17445
17446 memset (tmp_md5_buf, 0, sizeof (tmp_md5_buf));
17447
17448 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17449
17450 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17451
17452 md5_len += method_len + 1;
17453 tmp_md5_ptr += method_len + 1;
17454
17455 if (URI_prefix_len > 0)
17456 {
17457 md5_remaining_len = md5_max_len - md5_len;
17458
17459 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17460
17461 md5_len += URI_prefix_len + 1;
17462 tmp_md5_ptr += URI_prefix_len + 1;
17463 }
17464
17465 md5_remaining_len = md5_max_len - md5_len;
17466
17467 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17468
17469 md5_len += URI_resource_len;
17470 tmp_md5_ptr += URI_resource_len;
17471
17472 if (URI_suffix_len > 0)
17473 {
17474 md5_remaining_len = md5_max_len - md5_len;
17475
17476 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17477
17478 md5_len += 1 + URI_suffix_len;
17479 }
17480
17481 uint tmp_digest[4];
17482
17483 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17484
17485 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17486 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17487 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17488 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17489
17490 /*
17491 * esalt
17492 */
17493
17494 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17495
17496 uint esalt_len = 0;
17497
17498 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17499
17500 // there are 2 possibilities for the esalt:
17501
17502 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17503 {
17504 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17505
17506 if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH);
17507
17508 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17509 nonce_pos,
17510 nonce_count_pos,
17511 nonce_client_pos,
17512 qop_pos,
17513 tmp_digest[0],
17514 tmp_digest[1],
17515 tmp_digest[2],
17516 tmp_digest[3]);
17517 }
17518 else
17519 {
17520 esalt_len = 1 + nonce_len + 1 + 32;
17521
17522 if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH);
17523
17524 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17525 nonce_pos,
17526 tmp_digest[0],
17527 tmp_digest[1],
17528 tmp_digest[2],
17529 tmp_digest[3]);
17530 }
17531
17532 // add 0x80 to esalt
17533
17534 esalt_buf_ptr[esalt_len] = 0x80;
17535
17536 sip->esalt_len = esalt_len;
17537
17538 /*
17539 * actual salt
17540 */
17541
17542 char *sip_salt_ptr = (char *) sip->salt_buf;
17543
17544 uint salt_len = user_len + 1 + realm_len + 1;
17545
17546 uint max_salt_len = 119;
17547
17548 if (salt_len > max_salt_len) return (PARSER_SALT_LENGTH);
17549
17550 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17551
17552 sip->salt_len = salt_len;
17553
17554 /*
17555 * fake salt (for sorting)
17556 */
17557
17558 char *salt_buf_ptr = (char *) salt->salt_buf;
17559
17560 max_salt_len = 55;
17561
17562 uint fake_salt_len = salt_len;
17563
17564 if (fake_salt_len > max_salt_len)
17565 {
17566 fake_salt_len = max_salt_len;
17567 }
17568
17569 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17570
17571 salt->salt_len = fake_salt_len;
17572
17573 /*
17574 * digest
17575 */
17576
17577 digest[0] = hex_to_uint (&digest_pos[ 0]);
17578 digest[1] = hex_to_uint (&digest_pos[ 8]);
17579 digest[2] = hex_to_uint (&digest_pos[16]);
17580 digest[3] = hex_to_uint (&digest_pos[24]);
17581
17582 digest[0] = byte_swap_32 (digest[0]);
17583 digest[1] = byte_swap_32 (digest[1]);
17584 digest[2] = byte_swap_32 (digest[2]);
17585 digest[3] = byte_swap_32 (digest[3]);
17586
17587 return (PARSER_OK);
17588 }
17589
17590 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17591 {
17592 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17593
17594 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17595
17596 uint32_t *digest = (uint32_t *) hash_buf->digest;
17597
17598 salt_t *salt = hash_buf->salt;
17599
17600 // digest
17601
17602 char *digest_pos = input_buf;
17603
17604 digest[0] = hex_to_uint (&digest_pos[0]);
17605 digest[1] = 0;
17606 digest[2] = 0;
17607 digest[3] = 0;
17608
17609 // salt
17610
17611 char *salt_buf = input_buf + 8 + 1;
17612
17613 uint salt_len = 8;
17614
17615 char *salt_buf_ptr = (char *) salt->salt_buf;
17616
17617 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17618
17619 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17620
17621 salt->salt_len = salt_len;
17622
17623 return (PARSER_OK);
17624 }
17625
17626 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17627 {
17628 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
17629
17630 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17631
17632 uint32_t *digest = (uint32_t *) hash_buf->digest;
17633
17634 salt_t *salt = hash_buf->salt;
17635
17636 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
17637
17638 /**
17639 * parse line
17640 */
17641
17642 char *p_buf_pos = input_buf + 4;
17643
17644 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
17645
17646 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17647
17648 uint32_t p_buf_len = NumCyclesPower_pos - p_buf_pos;
17649
17650 NumCyclesPower_pos++;
17651
17652 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
17653
17654 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17655
17656 uint32_t NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
17657
17658 salt_len_pos++;
17659
17660 char *salt_buf_pos = strchr (salt_len_pos, '$');
17661
17662 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17663
17664 uint32_t salt_len_len = salt_buf_pos - salt_len_pos;
17665
17666 salt_buf_pos++;
17667
17668 char *iv_len_pos = strchr (salt_buf_pos, '$');
17669
17670 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17671
17672 uint32_t salt_buf_len = iv_len_pos - salt_buf_pos;
17673
17674 iv_len_pos++;
17675
17676 char *iv_buf_pos = strchr (iv_len_pos, '$');
17677
17678 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17679
17680 uint32_t iv_len_len = iv_buf_pos - iv_len_pos;
17681
17682 iv_buf_pos++;
17683
17684 char *crc_buf_pos = strchr (iv_buf_pos, '$');
17685
17686 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17687
17688 uint32_t iv_buf_len = crc_buf_pos - iv_buf_pos;
17689
17690 crc_buf_pos++;
17691
17692 char *data_len_pos = strchr (crc_buf_pos, '$');
17693
17694 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17695
17696 uint32_t crc_buf_len = data_len_pos - crc_buf_pos;
17697
17698 data_len_pos++;
17699
17700 char *unpack_size_pos = strchr (data_len_pos, '$');
17701
17702 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17703
17704 uint32_t data_len_len = unpack_size_pos - data_len_pos;
17705
17706 unpack_size_pos++;
17707
17708 char *data_buf_pos = strchr (unpack_size_pos, '$');
17709
17710 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17711
17712 uint32_t unpack_size_len = data_buf_pos - unpack_size_pos;
17713
17714 data_buf_pos++;
17715
17716 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;
17717
17718 const uint iter = atoi (NumCyclesPower_pos);
17719 const uint crc = atoi (crc_buf_pos);
17720 const uint p_buf = atoi (p_buf_pos);
17721 const uint salt_len = atoi (salt_len_pos);
17722 const uint iv_len = atoi (iv_len_pos);
17723 const uint unpack_size = atoi (unpack_size_pos);
17724 const uint data_len = atoi (data_len_pos);
17725
17726 /**
17727 * verify some data
17728 */
17729
17730 if (p_buf != 0) return (PARSER_SALT_VALUE);
17731 if (salt_len != 0) return (PARSER_SALT_VALUE);
17732
17733 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
17734
17735 if (data_len > 384) return (PARSER_SALT_VALUE);
17736
17737 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
17738
17739 /**
17740 * store data
17741 */
17742
17743 seven_zip->iv_buf[0] = hex_to_uint (&iv_buf_pos[ 0]);
17744 seven_zip->iv_buf[1] = hex_to_uint (&iv_buf_pos[ 8]);
17745 seven_zip->iv_buf[2] = hex_to_uint (&iv_buf_pos[16]);
17746 seven_zip->iv_buf[3] = hex_to_uint (&iv_buf_pos[24]);
17747
17748 seven_zip->iv_len = iv_len;
17749
17750 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
17751
17752 seven_zip->salt_len = 0;
17753
17754 seven_zip->crc = crc;
17755
17756 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
17757 {
17758 seven_zip->data_buf[i] = hex_to_uint (&data_buf_pos[j]);
17759
17760 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
17761 }
17762
17763 seven_zip->data_len = data_len;
17764
17765 seven_zip->unpack_size = unpack_size;
17766
17767 // real salt
17768
17769 salt->salt_buf[0] = seven_zip->data_buf[0];
17770 salt->salt_buf[1] = seven_zip->data_buf[1];
17771 salt->salt_buf[2] = seven_zip->data_buf[2];
17772 salt->salt_buf[3] = seven_zip->data_buf[3];
17773
17774 salt->salt_len = 16;
17775
17776 salt->salt_sign[0] = iter;
17777
17778 salt->salt_iter = 1 << iter;
17779
17780 /**
17781 * digest
17782 */
17783
17784 digest[0] = crc;
17785 digest[1] = 0;
17786 digest[2] = 0;
17787 digest[3] = 0;
17788
17789 return (PARSER_OK);
17790 }
17791
17792 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17793 {
17794 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
17795
17796 uint32_t *digest = (uint32_t *) hash_buf->digest;
17797
17798 digest[0] = hex_to_uint (&input_buf[ 0]);
17799 digest[1] = hex_to_uint (&input_buf[ 8]);
17800 digest[2] = hex_to_uint (&input_buf[16]);
17801 digest[3] = hex_to_uint (&input_buf[24]);
17802 digest[4] = hex_to_uint (&input_buf[32]);
17803 digest[5] = hex_to_uint (&input_buf[40]);
17804 digest[6] = hex_to_uint (&input_buf[48]);
17805 digest[7] = hex_to_uint (&input_buf[56]);
17806
17807 digest[0] = byte_swap_32 (digest[0]);
17808 digest[1] = byte_swap_32 (digest[1]);
17809 digest[2] = byte_swap_32 (digest[2]);
17810 digest[3] = byte_swap_32 (digest[3]);
17811 digest[4] = byte_swap_32 (digest[4]);
17812 digest[5] = byte_swap_32 (digest[5]);
17813 digest[6] = byte_swap_32 (digest[6]);
17814 digest[7] = byte_swap_32 (digest[7]);
17815
17816 return (PARSER_OK);
17817 }
17818
17819 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17820 {
17821 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
17822
17823 uint32_t *digest = (uint32_t *) hash_buf->digest;
17824
17825 digest[ 0] = hex_to_uint (&input_buf[ 0]);
17826 digest[ 1] = hex_to_uint (&input_buf[ 8]);
17827 digest[ 2] = hex_to_uint (&input_buf[ 16]);
17828 digest[ 3] = hex_to_uint (&input_buf[ 24]);
17829 digest[ 4] = hex_to_uint (&input_buf[ 32]);
17830 digest[ 5] = hex_to_uint (&input_buf[ 40]);
17831 digest[ 6] = hex_to_uint (&input_buf[ 48]);
17832 digest[ 7] = hex_to_uint (&input_buf[ 56]);
17833 digest[ 8] = hex_to_uint (&input_buf[ 64]);
17834 digest[ 9] = hex_to_uint (&input_buf[ 72]);
17835 digest[10] = hex_to_uint (&input_buf[ 80]);
17836 digest[11] = hex_to_uint (&input_buf[ 88]);
17837 digest[12] = hex_to_uint (&input_buf[ 96]);
17838 digest[13] = hex_to_uint (&input_buf[104]);
17839 digest[14] = hex_to_uint (&input_buf[112]);
17840 digest[15] = hex_to_uint (&input_buf[120]);
17841
17842 digest[ 0] = byte_swap_32 (digest[ 0]);
17843 digest[ 1] = byte_swap_32 (digest[ 1]);
17844 digest[ 2] = byte_swap_32 (digest[ 2]);
17845 digest[ 3] = byte_swap_32 (digest[ 3]);
17846 digest[ 4] = byte_swap_32 (digest[ 4]);
17847 digest[ 5] = byte_swap_32 (digest[ 5]);
17848 digest[ 6] = byte_swap_32 (digest[ 6]);
17849 digest[ 7] = byte_swap_32 (digest[ 7]);
17850 digest[ 8] = byte_swap_32 (digest[ 8]);
17851 digest[ 9] = byte_swap_32 (digest[ 9]);
17852 digest[10] = byte_swap_32 (digest[10]);
17853 digest[11] = byte_swap_32 (digest[11]);
17854 digest[12] = byte_swap_32 (digest[12]);
17855 digest[13] = byte_swap_32 (digest[13]);
17856 digest[14] = byte_swap_32 (digest[14]);
17857 digest[15] = byte_swap_32 (digest[15]);
17858
17859 return (PARSER_OK);
17860 }
17861
17862 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17863 {
17864 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
17865
17866 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17867
17868 uint32_t *digest = (uint32_t *) hash_buf->digest;
17869
17870 salt_t *salt = hash_buf->salt;
17871
17872 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
17873
17874 /**
17875 * parse line
17876 */
17877
17878 // iterations
17879
17880 char *iter_pos = input_buf + 4;
17881
17882 uint32_t iter = atoi (iter_pos);
17883
17884 if (iter < 1) return (PARSER_SALT_ITERATION);
17885 if (iter > 999999) return (PARSER_SALT_ITERATION);
17886
17887 // first is *raw* salt
17888
17889 char *salt_pos = strchr (iter_pos, ':');
17890
17891 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17892
17893 salt_pos++;
17894
17895 char *hash_pos = strchr (salt_pos, ':');
17896
17897 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17898
17899 uint32_t salt_len = hash_pos - salt_pos;
17900
17901 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17902
17903 hash_pos++;
17904
17905 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
17906
17907 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17908
17909 // decode salt
17910
17911 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
17912
17913 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17914
17915 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17916
17917 salt_buf_ptr[salt_len + 3] = 0x01;
17918 salt_buf_ptr[salt_len + 4] = 0x80;
17919
17920 salt->salt_len = salt_len;
17921 salt->salt_iter = iter - 1;
17922
17923 // decode hash
17924
17925 char tmp_buf[100];
17926
17927 memset (tmp_buf, 0, sizeof (tmp_buf));
17928
17929 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
17930
17931 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17932
17933 memcpy (digest, tmp_buf, 16);
17934
17935 // add some stuff to normal salt to make sorted happy
17936
17937 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
17938 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
17939 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
17940 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
17941 salt->salt_buf[4] = salt->salt_iter;
17942
17943 return (PARSER_OK);
17944 }
17945
17946 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17947 {
17948 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
17949
17950 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
17951
17952 uint32_t *digest = (uint32_t *) hash_buf->digest;
17953
17954 salt_t *salt = hash_buf->salt;
17955
17956 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
17957
17958 /**
17959 * parse line
17960 */
17961
17962 // iterations
17963
17964 char *iter_pos = input_buf + 5;
17965
17966 uint32_t iter = atoi (iter_pos);
17967
17968 if (iter < 1) return (PARSER_SALT_ITERATION);
17969 if (iter > 999999) return (PARSER_SALT_ITERATION);
17970
17971 // first is *raw* salt
17972
17973 char *salt_pos = strchr (iter_pos, ':');
17974
17975 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17976
17977 salt_pos++;
17978
17979 char *hash_pos = strchr (salt_pos, ':');
17980
17981 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17982
17983 uint32_t salt_len = hash_pos - salt_pos;
17984
17985 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17986
17987 hash_pos++;
17988
17989 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
17990
17991 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17992
17993 // decode salt
17994
17995 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
17996
17997 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17998
17999 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18000
18001 salt_buf_ptr[salt_len + 3] = 0x01;
18002 salt_buf_ptr[salt_len + 4] = 0x80;
18003
18004 salt->salt_len = salt_len;
18005 salt->salt_iter = iter - 1;
18006
18007 // decode hash
18008
18009 char tmp_buf[100];
18010
18011 memset (tmp_buf, 0, sizeof (tmp_buf));
18012
18013 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
18014
18015 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18016
18017 memcpy (digest, tmp_buf, 16);
18018
18019 digest[0] = byte_swap_32 (digest[0]);
18020 digest[1] = byte_swap_32 (digest[1]);
18021 digest[2] = byte_swap_32 (digest[2]);
18022 digest[3] = byte_swap_32 (digest[3]);
18023
18024 // add some stuff to normal salt to make sorted happy
18025
18026 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18027 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18028 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18029 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18030 salt->salt_buf[4] = salt->salt_iter;
18031
18032 return (PARSER_OK);
18033 }
18034
18035 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18036 {
18037 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18038
18039 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18040
18041 uint64_t *digest = (uint64_t *) hash_buf->digest;
18042
18043 salt_t *salt = hash_buf->salt;
18044
18045 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18046
18047 /**
18048 * parse line
18049 */
18050
18051 // iterations
18052
18053 char *iter_pos = input_buf + 7;
18054
18055 uint32_t iter = atoi (iter_pos);
18056
18057 if (iter < 1) return (PARSER_SALT_ITERATION);
18058 if (iter > 999999) return (PARSER_SALT_ITERATION);
18059
18060 // first is *raw* salt
18061
18062 char *salt_pos = strchr (iter_pos, ':');
18063
18064 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18065
18066 salt_pos++;
18067
18068 char *hash_pos = strchr (salt_pos, ':');
18069
18070 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18071
18072 uint32_t salt_len = hash_pos - salt_pos;
18073
18074 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18075
18076 hash_pos++;
18077
18078 uint32_t hash_b64_len = input_len - (hash_pos - input_buf);
18079
18080 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18081
18082 // decode salt
18083
18084 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18085
18086 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18087
18088 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18089
18090 salt_buf_ptr[salt_len + 3] = 0x01;
18091 salt_buf_ptr[salt_len + 4] = 0x80;
18092
18093 salt->salt_len = salt_len;
18094 salt->salt_iter = iter - 1;
18095
18096 // decode hash
18097
18098 char tmp_buf[100];
18099
18100 memset (tmp_buf, 0, sizeof (tmp_buf));
18101
18102 int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf);
18103
18104 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18105
18106 memcpy (digest, tmp_buf, 64);
18107
18108 digest[0] = byte_swap_64 (digest[0]);
18109 digest[1] = byte_swap_64 (digest[1]);
18110 digest[2] = byte_swap_64 (digest[2]);
18111 digest[3] = byte_swap_64 (digest[3]);
18112 digest[4] = byte_swap_64 (digest[4]);
18113 digest[5] = byte_swap_64 (digest[5]);
18114 digest[6] = byte_swap_64 (digest[6]);
18115 digest[7] = byte_swap_64 (digest[7]);
18116
18117 // add some stuff to normal salt to make sorted happy
18118
18119 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18120 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18121 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18122 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18123 salt->salt_buf[4] = salt->salt_iter;
18124
18125 return (PARSER_OK);
18126 }
18127
18128 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18129 {
18130 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18131
18132 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18133
18134 uint *digest = (uint *) hash_buf->digest;
18135
18136 salt_t *salt = hash_buf->salt;
18137
18138 /**
18139 * parse line
18140 */
18141
18142 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18143
18144 char *hash_pos = strchr (salt_pos, '$');
18145
18146 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18147
18148 uint32_t salt_len = hash_pos - salt_pos;
18149
18150 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18151
18152 hash_pos++;
18153
18154 uint32_t hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18155
18156 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18157
18158 // decode hash
18159
18160 digest[ 0] = hex_to_uint (&hash_pos[0]);
18161 digest[ 1] = hex_to_uint (&hash_pos[8]);
18162 digest[ 2] = 0;
18163 digest[ 3] = 0;
18164 digest[ 4] = 0;
18165 digest[ 5] = 0;
18166 digest[ 6] = 0;
18167 digest[ 7] = 0;
18168 digest[ 8] = 0;
18169 digest[ 9] = 0;
18170 digest[10] = 0;
18171 digest[11] = 0;
18172 digest[12] = 0;
18173 digest[13] = 0;
18174 digest[14] = 0;
18175 digest[15] = 0;
18176
18177 // decode salt
18178
18179 salt->salt_buf[0] = hex_to_uint (&salt_pos[0]);
18180 salt->salt_buf[1] = hex_to_uint (&salt_pos[8]);
18181
18182 salt->salt_iter = ROUNDS_ECRYPTFS;
18183 salt->salt_len = 8;
18184
18185 return (PARSER_OK);
18186 }
18187
18188 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18189 {
18190 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18191
18192 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18193
18194 unsigned char c19 = itoa64_to_int (input_buf[19]);
18195
18196 if (c19 & 3) return (PARSER_HASH_VALUE);
18197
18198 salt_t *salt = hash_buf->salt;
18199
18200 uint32_t *digest = (uint32_t *) hash_buf->digest;
18201
18202 // iteration count
18203
18204 salt->salt_iter = itoa64_to_int (input_buf[1])
18205 | itoa64_to_int (input_buf[2]) << 6
18206 | itoa64_to_int (input_buf[3]) << 12
18207 | itoa64_to_int (input_buf[4]) << 18;
18208
18209 // set salt
18210
18211 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18212 | itoa64_to_int (input_buf[6]) << 6
18213 | itoa64_to_int (input_buf[7]) << 12
18214 | itoa64_to_int (input_buf[8]) << 18;
18215
18216 salt->salt_len = 4;
18217
18218 char tmp_buf[100];
18219
18220 memset (tmp_buf, 0, sizeof (tmp_buf));
18221
18222 base64_decode (itoa64_to_int, input_buf + 9, 11, tmp_buf);
18223
18224 memcpy (digest, tmp_buf, 8);
18225
18226 uint tt;
18227
18228 IP (digest[0], digest[1], tt);
18229
18230 digest[0] = ROTATE_RIGHT (digest[0], 31);
18231 digest[1] = ROTATE_RIGHT (digest[1], 31);
18232 digest[2] = 0;
18233 digest[3] = 0;
18234
18235 return (PARSER_OK);
18236 }
18237
18238 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18239 {
18240 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18241
18242 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18243
18244 uint32_t *digest = (uint32_t *) hash_buf->digest;
18245
18246 salt_t *salt = hash_buf->salt;
18247
18248 /**
18249 * parse line
18250 */
18251
18252 char *type_pos = input_buf + 6 + 1;
18253
18254 char *salt_pos = strchr (type_pos, '*');
18255
18256 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18257
18258 uint32_t type_len = salt_pos - type_pos;
18259
18260 if (type_len != 1) return (PARSER_SALT_LENGTH);
18261
18262 salt_pos++;
18263
18264 char *crypted_pos = strchr (salt_pos, '*');
18265
18266 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18267
18268 uint32_t salt_len = crypted_pos - salt_pos;
18269
18270 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18271
18272 crypted_pos++;
18273
18274 uint32_t crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18275
18276 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18277
18278 /**
18279 * copy data
18280 */
18281
18282 salt->salt_buf[0] = hex_to_uint (&salt_pos[0]);
18283 salt->salt_buf[1] = hex_to_uint (&salt_pos[8]);
18284
18285 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18286 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18287
18288 salt->salt_buf[2] = hex_to_uint (&crypted_pos[ 0]);
18289 salt->salt_buf[3] = hex_to_uint (&crypted_pos[ 8]);
18290 salt->salt_buf[4] = hex_to_uint (&crypted_pos[16]);
18291 salt->salt_buf[5] = hex_to_uint (&crypted_pos[24]);
18292
18293 salt->salt_len = 24;
18294 salt->salt_iter = ROUNDS_RAR3;
18295
18296 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18297 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18298
18299 digest[0] = 0xc43d7b00;
18300 digest[1] = 0x40070000;
18301 digest[2] = 0;
18302 digest[3] = 0;
18303
18304 return (PARSER_OK);
18305 }
18306
18307 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18308 {
18309 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18310
18311 uint32_t *digest = (uint32_t *) hash_buf->digest;
18312
18313 salt_t *salt = hash_buf->salt;
18314
18315 digest[0] = hex_to_uint (&input_buf[ 0]);
18316 digest[1] = hex_to_uint (&input_buf[ 8]);
18317 digest[2] = hex_to_uint (&input_buf[16]);
18318 digest[3] = hex_to_uint (&input_buf[24]);
18319 digest[4] = hex_to_uint (&input_buf[32]);
18320 digest[5] = hex_to_uint (&input_buf[40]);
18321 digest[6] = hex_to_uint (&input_buf[48]);
18322 digest[7] = hex_to_uint (&input_buf[56]);
18323
18324 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18325
18326 uint salt_len = input_len - 64 - 1;
18327
18328 char *salt_buf = input_buf + 64 + 1;
18329
18330 char *salt_buf_ptr = (char *) salt->salt_buf;
18331
18332 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18333
18334 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18335
18336 salt->salt_len = salt_len;
18337
18338 /**
18339 * we can precompute the first sha256 transform
18340 */
18341
18342 uint w[16];
18343
18344 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18345 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18346 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18347 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18348 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18349 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18350 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18351 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18352 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18353 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18354 w[10] = byte_swap_32 (salt->salt_buf[10]);
18355 w[11] = byte_swap_32 (salt->salt_buf[11]);
18356 w[12] = byte_swap_32 (salt->salt_buf[12]);
18357 w[13] = byte_swap_32 (salt->salt_buf[13]);
18358 w[14] = byte_swap_32 (salt->salt_buf[14]);
18359 w[15] = byte_swap_32 (salt->salt_buf[15]);
18360
18361 uint pc256[8];
18362
18363 pc256[0] = SHA256M_A;
18364 pc256[1] = SHA256M_B;
18365 pc256[2] = SHA256M_C;
18366 pc256[3] = SHA256M_D;
18367 pc256[4] = SHA256M_E;
18368 pc256[5] = SHA256M_F;
18369 pc256[6] = SHA256M_G;
18370 pc256[7] = SHA256M_H;
18371
18372 sha256_64 (w, pc256);
18373
18374 salt->salt_buf_pc[0] = pc256[0];
18375 salt->salt_buf_pc[1] = pc256[1];
18376 salt->salt_buf_pc[2] = pc256[2];
18377 salt->salt_buf_pc[3] = pc256[3];
18378 salt->salt_buf_pc[4] = pc256[4];
18379 salt->salt_buf_pc[5] = pc256[5];
18380 salt->salt_buf_pc[6] = pc256[6];
18381 salt->salt_buf_pc[7] = pc256[7];
18382
18383 digest[0] -= pc256[0];
18384 digest[1] -= pc256[1];
18385 digest[2] -= pc256[2];
18386 digest[3] -= pc256[3];
18387 digest[4] -= pc256[4];
18388 digest[5] -= pc256[5];
18389 digest[6] -= pc256[6];
18390 digest[7] -= pc256[7];
18391
18392 return (PARSER_OK);
18393 }
18394
18395 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18396 {
18397 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18398
18399 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18400
18401 uint32_t *digest = (uint32_t *) hash_buf->digest;
18402
18403 salt_t *salt = hash_buf->salt;
18404
18405 /**
18406 * parse line
18407 */
18408
18409 char *data_len_pos = input_buf + 1 + 10 + 1;
18410
18411 char *data_buf_pos = strchr (data_len_pos, '$');
18412
18413 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18414
18415 uint32_t data_len_len = data_buf_pos - data_len_pos;
18416
18417 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18418 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18419
18420 data_buf_pos++;
18421
18422 uint32_t data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18423
18424 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18425
18426 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18427
18428 uint32_t data_len = atoi (data_len_pos);
18429
18430 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18431
18432 /**
18433 * salt
18434 */
18435
18436 char *salt_pos = data_buf_pos;
18437
18438 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
18439 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
18440 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]);
18441 salt->salt_buf[3] = hex_to_uint (&salt_pos[24]);
18442
18443 // this is actually the CT, which is also the hash later (if matched)
18444
18445 salt->salt_buf[4] = hex_to_uint (&salt_pos[32]);
18446 salt->salt_buf[5] = hex_to_uint (&salt_pos[40]);
18447 salt->salt_buf[6] = hex_to_uint (&salt_pos[48]);
18448 salt->salt_buf[7] = hex_to_uint (&salt_pos[56]);
18449
18450 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18451
18452 salt->salt_iter = 10 - 1;
18453
18454 /**
18455 * digest buf
18456 */
18457
18458 digest[0] = salt->salt_buf[4];
18459 digest[1] = salt->salt_buf[5];
18460 digest[2] = salt->salt_buf[6];
18461 digest[3] = salt->salt_buf[7];
18462
18463 return (PARSER_OK);
18464 }
18465
18466 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18467 {
18468 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
18469
18470 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18471
18472 uint32_t *digest = (uint32_t *) hash_buf->digest;
18473
18474 salt_t *salt = hash_buf->salt;
18475
18476 /**
18477 * parse line
18478 */
18479
18480 char *salt_pos = input_buf + 11 + 1;
18481
18482 char *iter_pos = strchr (salt_pos, ',');
18483
18484 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18485
18486 uint32_t salt_len = iter_pos - salt_pos;
18487
18488 if (salt_len != 20) return (PARSER_SALT_LENGTH);
18489
18490 iter_pos++;
18491
18492 char *hash_pos = strchr (iter_pos, ',');
18493
18494 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18495
18496 uint32_t iter_len = hash_pos - iter_pos;
18497
18498 if (iter_len > 5) return (PARSER_SALT_LENGTH);
18499
18500 hash_pos++;
18501
18502 uint32_t hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
18503
18504 if (hash_len != 64) return (PARSER_HASH_LENGTH);
18505
18506 /**
18507 * salt
18508 */
18509
18510 salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]);
18511 salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]);
18512 salt->salt_buf[2] = hex_to_uint (&salt_pos[16]) & 0xffff0000;
18513 salt->salt_buf[3] = 0x00018000;
18514
18515 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18516 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18517 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
18518 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
18519
18520 salt->salt_len = salt_len / 2;
18521
18522 salt->salt_iter = atoi (iter_pos) - 1;
18523
18524 /**
18525 * digest buf
18526 */
18527
18528 digest[0] = hex_to_uint (&hash_pos[ 0]);
18529 digest[1] = hex_to_uint (&hash_pos[ 8]);
18530 digest[2] = hex_to_uint (&hash_pos[16]);
18531 digest[3] = hex_to_uint (&hash_pos[24]);
18532 digest[4] = hex_to_uint (&hash_pos[32]);
18533 digest[5] = hex_to_uint (&hash_pos[40]);
18534 digest[6] = hex_to_uint (&hash_pos[48]);
18535 digest[7] = hex_to_uint (&hash_pos[56]);
18536
18537 return (PARSER_OK);
18538 }
18539
18540 /**
18541 * parallel running threads
18542 */
18543
18544 #ifdef WIN
18545
18546 BOOL WINAPI sigHandler_default (DWORD sig)
18547 {
18548 switch (sig)
18549 {
18550 case CTRL_CLOSE_EVENT:
18551
18552 /*
18553 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
18554 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
18555 * function otherwise it is to late (e.g. after returning from this function)
18556 */
18557
18558 myabort ();
18559
18560 SetConsoleCtrlHandler (NULL, TRUE);
18561
18562 hc_sleep (10);
18563
18564 return TRUE;
18565
18566 case CTRL_C_EVENT:
18567 case CTRL_LOGOFF_EVENT:
18568 case CTRL_SHUTDOWN_EVENT:
18569
18570 myabort ();
18571
18572 SetConsoleCtrlHandler (NULL, TRUE);
18573
18574 return TRUE;
18575 }
18576
18577 return FALSE;
18578 }
18579
18580 BOOL WINAPI sigHandler_benchmark (DWORD sig)
18581 {
18582 switch (sig)
18583 {
18584 case CTRL_CLOSE_EVENT:
18585
18586 myabort ();
18587
18588 SetConsoleCtrlHandler (NULL, TRUE);
18589
18590 hc_sleep (10);
18591
18592 return TRUE;
18593
18594 case CTRL_C_EVENT:
18595 case CTRL_LOGOFF_EVENT:
18596 case CTRL_SHUTDOWN_EVENT:
18597
18598 myquit ();
18599
18600 SetConsoleCtrlHandler (NULL, TRUE);
18601
18602 return TRUE;
18603 }
18604
18605 return FALSE;
18606 }
18607
18608 void hc_signal (BOOL WINAPI (callback) (DWORD))
18609 {
18610 if (callback == NULL)
18611 {
18612 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
18613 }
18614 else
18615 {
18616 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
18617 }
18618 }
18619
18620 #else
18621
18622 void sigHandler_default (int sig)
18623 {
18624 myabort ();
18625
18626 signal (sig, NULL);
18627 }
18628
18629 void sigHandler_benchmark (int sig)
18630 {
18631 myquit ();
18632
18633 signal (sig, NULL);
18634 }
18635
18636 void hc_signal (void (callback) (int))
18637 {
18638 if (callback == NULL) callback = SIG_DFL;
18639
18640 signal (SIGINT, callback);
18641 signal (SIGTERM, callback);
18642 signal (SIGABRT, callback);
18643 }
18644
18645 #endif
18646
18647 void status_display ();
18648
18649 void *thread_keypress (void *p)
18650 {
18651 int benchmark = *((int *) p);
18652
18653 uint quiet = data.quiet;
18654
18655 tty_break();
18656
18657 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
18658 {
18659 int ch = tty_getchar();
18660
18661 if (ch == -1) break;
18662
18663 if (ch == 0) continue;
18664
18665 #ifdef _POSIX
18666 if (ch != '\n')
18667 #endif
18668
18669 hc_thread_mutex_lock (mux_display);
18670
18671 log_info ("");
18672
18673 switch (ch)
18674 {
18675 case 's':
18676 case '\n':
18677
18678 log_info ("");
18679
18680 status_display ();
18681
18682 log_info ("");
18683
18684 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18685 if (quiet == 0) fflush (stdout);
18686
18687 break;
18688
18689 case 'b':
18690
18691 log_info ("");
18692
18693 bypass ();
18694
18695 log_info ("");
18696
18697 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18698 if (quiet == 0) fflush (stdout);
18699
18700 break;
18701
18702 case 'p':
18703
18704 log_info ("");
18705
18706 SuspendThreads ();
18707
18708 log_info ("");
18709
18710 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18711 if (quiet == 0) fflush (stdout);
18712
18713 break;
18714
18715 case 'r':
18716
18717 log_info ("");
18718
18719 ResumeThreads ();
18720
18721 log_info ("");
18722
18723 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18724 if (quiet == 0) fflush (stdout);
18725
18726 break;
18727
18728 case 'c':
18729
18730 log_info ("");
18731
18732 if (benchmark == 1) break;
18733
18734 stop_at_checkpoint ();
18735
18736 log_info ("");
18737
18738 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
18739 if (quiet == 0) fflush (stdout);
18740
18741 break;
18742
18743 case 'q':
18744
18745 log_info ("");
18746
18747 if (benchmark == 1)
18748 {
18749 myquit ();
18750 }
18751 else
18752 {
18753 myabort ();
18754 }
18755
18756 break;
18757 }
18758
18759 hc_thread_mutex_unlock (mux_display);
18760 }
18761
18762 tty_fix();
18763
18764 return (p);
18765 }
18766
18767 /**
18768 * rules common
18769 */
18770
18771 bool class_num (char c)
18772 {
18773 return ((c >= '0') && (c <= '9'));
18774 }
18775
18776 bool class_lower (char c)
18777 {
18778 return ((c >= 'a') && (c <= 'z'));
18779 }
18780
18781 bool class_upper (char c)
18782 {
18783 return ((c >= 'A') && (c <= 'Z'));
18784 }
18785
18786 bool class_alpha (char c)
18787 {
18788 return (class_lower (c) || class_upper (c));
18789 }
18790
18791 char conv_ctoi (char c)
18792 {
18793 if (class_num (c))
18794 {
18795 return c - '0';
18796 }
18797 else if (class_upper (c))
18798 {
18799 return c - 'A' + (char) 10;
18800 }
18801
18802 return (char) (-1);
18803 }
18804
18805 char conv_itoc (char c)
18806 {
18807 if (c < 10)
18808 {
18809 return c + '0';
18810 }
18811 else if (c < 37)
18812 {
18813 return c + 'A' - (char) 10;
18814 }
18815
18816 return (char) (-1);
18817 }
18818
18819 /**
18820 * GPU rules
18821 */
18822
18823 #define INCR_POS if (++rule_pos == rule_len) return (-1)
18824 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
18825 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
18826 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
18827 #define MAX_GPU_RULES 14
18828 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
18829 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
18830 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
18831
18832 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
18833 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
18834 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
18835 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
18836
18837 int cpu_rule_to_gpu_rule (char rule_buf[BUFSIZ], uint rule_len, gpu_rule_t *rule)
18838 {
18839 uint rule_pos;
18840 uint rule_cnt;
18841
18842 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_GPU_RULES; rule_pos++, rule_cnt++)
18843 {
18844 switch (rule_buf[rule_pos])
18845 {
18846 case ' ':
18847 rule_cnt--;
18848 break;
18849
18850 case RULE_OP_MANGLE_NOOP:
18851 SET_NAME (rule, rule_buf[rule_pos]);
18852 break;
18853
18854 case RULE_OP_MANGLE_LREST:
18855 SET_NAME (rule, rule_buf[rule_pos]);
18856 break;
18857
18858 case RULE_OP_MANGLE_UREST:
18859 SET_NAME (rule, rule_buf[rule_pos]);
18860 break;
18861
18862 case RULE_OP_MANGLE_LREST_UFIRST:
18863 SET_NAME (rule, rule_buf[rule_pos]);
18864 break;
18865
18866 case RULE_OP_MANGLE_UREST_LFIRST:
18867 SET_NAME (rule, rule_buf[rule_pos]);
18868 break;
18869
18870 case RULE_OP_MANGLE_TREST:
18871 SET_NAME (rule, rule_buf[rule_pos]);
18872 break;
18873
18874 case RULE_OP_MANGLE_TOGGLE_AT:
18875 SET_NAME (rule, rule_buf[rule_pos]);
18876 SET_P0_CONV (rule, rule_buf[rule_pos]);
18877 break;
18878
18879 case RULE_OP_MANGLE_REVERSE:
18880 SET_NAME (rule, rule_buf[rule_pos]);
18881 break;
18882
18883 case RULE_OP_MANGLE_DUPEWORD:
18884 SET_NAME (rule, rule_buf[rule_pos]);
18885 break;
18886
18887 case RULE_OP_MANGLE_DUPEWORD_TIMES:
18888 SET_NAME (rule, rule_buf[rule_pos]);
18889 SET_P0_CONV (rule, rule_buf[rule_pos]);
18890 break;
18891
18892 case RULE_OP_MANGLE_REFLECT:
18893 SET_NAME (rule, rule_buf[rule_pos]);
18894 break;
18895
18896 case RULE_OP_MANGLE_ROTATE_LEFT:
18897 SET_NAME (rule, rule_buf[rule_pos]);
18898 break;
18899
18900 case RULE_OP_MANGLE_ROTATE_RIGHT:
18901 SET_NAME (rule, rule_buf[rule_pos]);
18902 break;
18903
18904 case RULE_OP_MANGLE_APPEND:
18905 SET_NAME (rule, rule_buf[rule_pos]);
18906 SET_P0 (rule, rule_buf[rule_pos]);
18907 break;
18908
18909 case RULE_OP_MANGLE_PREPEND:
18910 SET_NAME (rule, rule_buf[rule_pos]);
18911 SET_P0 (rule, rule_buf[rule_pos]);
18912 break;
18913
18914 case RULE_OP_MANGLE_DELETE_FIRST:
18915 SET_NAME (rule, rule_buf[rule_pos]);
18916 break;
18917
18918 case RULE_OP_MANGLE_DELETE_LAST:
18919 SET_NAME (rule, rule_buf[rule_pos]);
18920 break;
18921
18922 case RULE_OP_MANGLE_DELETE_AT:
18923 SET_NAME (rule, rule_buf[rule_pos]);
18924 SET_P0_CONV (rule, rule_buf[rule_pos]);
18925 break;
18926
18927 case RULE_OP_MANGLE_EXTRACT:
18928 SET_NAME (rule, rule_buf[rule_pos]);
18929 SET_P0_CONV (rule, rule_buf[rule_pos]);
18930 SET_P1_CONV (rule, rule_buf[rule_pos]);
18931 break;
18932
18933 case RULE_OP_MANGLE_OMIT:
18934 SET_NAME (rule, rule_buf[rule_pos]);
18935 SET_P0_CONV (rule, rule_buf[rule_pos]);
18936 SET_P1_CONV (rule, rule_buf[rule_pos]);
18937 break;
18938
18939 case RULE_OP_MANGLE_INSERT:
18940 SET_NAME (rule, rule_buf[rule_pos]);
18941 SET_P0_CONV (rule, rule_buf[rule_pos]);
18942 SET_P1 (rule, rule_buf[rule_pos]);
18943 break;
18944
18945 case RULE_OP_MANGLE_OVERSTRIKE:
18946 SET_NAME (rule, rule_buf[rule_pos]);
18947 SET_P0_CONV (rule, rule_buf[rule_pos]);
18948 SET_P1 (rule, rule_buf[rule_pos]);
18949 break;
18950
18951 case RULE_OP_MANGLE_TRUNCATE_AT:
18952 SET_NAME (rule, rule_buf[rule_pos]);
18953 SET_P0_CONV (rule, rule_buf[rule_pos]);
18954 break;
18955
18956 case RULE_OP_MANGLE_REPLACE:
18957 SET_NAME (rule, rule_buf[rule_pos]);
18958 SET_P0 (rule, rule_buf[rule_pos]);
18959 SET_P1 (rule, rule_buf[rule_pos]);
18960 break;
18961
18962 case RULE_OP_MANGLE_PURGECHAR:
18963 return (-1);
18964 break;
18965
18966 case RULE_OP_MANGLE_TOGGLECASE_REC:
18967 return (-1);
18968 break;
18969
18970 case RULE_OP_MANGLE_DUPECHAR_FIRST:
18971 SET_NAME (rule, rule_buf[rule_pos]);
18972 SET_P0_CONV (rule, rule_buf[rule_pos]);
18973 break;
18974
18975 case RULE_OP_MANGLE_DUPECHAR_LAST:
18976 SET_NAME (rule, rule_buf[rule_pos]);
18977 SET_P0_CONV (rule, rule_buf[rule_pos]);
18978 break;
18979
18980 case RULE_OP_MANGLE_DUPECHAR_ALL:
18981 SET_NAME (rule, rule_buf[rule_pos]);
18982 break;
18983
18984 case RULE_OP_MANGLE_SWITCH_FIRST:
18985 SET_NAME (rule, rule_buf[rule_pos]);
18986 break;
18987
18988 case RULE_OP_MANGLE_SWITCH_LAST:
18989 SET_NAME (rule, rule_buf[rule_pos]);
18990 break;
18991
18992 case RULE_OP_MANGLE_SWITCH_AT:
18993 SET_NAME (rule, rule_buf[rule_pos]);
18994 SET_P0_CONV (rule, rule_buf[rule_pos]);
18995 SET_P1_CONV (rule, rule_buf[rule_pos]);
18996 break;
18997
18998 case RULE_OP_MANGLE_CHR_SHIFTL:
18999 SET_NAME (rule, rule_buf[rule_pos]);
19000 SET_P0_CONV (rule, rule_buf[rule_pos]);
19001 break;
19002
19003 case RULE_OP_MANGLE_CHR_SHIFTR:
19004 SET_NAME (rule, rule_buf[rule_pos]);
19005 SET_P0_CONV (rule, rule_buf[rule_pos]);
19006 break;
19007
19008 case RULE_OP_MANGLE_CHR_INCR:
19009 SET_NAME (rule, rule_buf[rule_pos]);
19010 SET_P0_CONV (rule, rule_buf[rule_pos]);
19011 break;
19012
19013 case RULE_OP_MANGLE_CHR_DECR:
19014 SET_NAME (rule, rule_buf[rule_pos]);
19015 SET_P0_CONV (rule, rule_buf[rule_pos]);
19016 break;
19017
19018 case RULE_OP_MANGLE_REPLACE_NP1:
19019 SET_NAME (rule, rule_buf[rule_pos]);
19020 SET_P0_CONV (rule, rule_buf[rule_pos]);
19021 break;
19022
19023 case RULE_OP_MANGLE_REPLACE_NM1:
19024 SET_NAME (rule, rule_buf[rule_pos]);
19025 SET_P0_CONV (rule, rule_buf[rule_pos]);
19026 break;
19027
19028 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19029 SET_NAME (rule, rule_buf[rule_pos]);
19030 SET_P0_CONV (rule, rule_buf[rule_pos]);
19031 break;
19032
19033 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19034 SET_NAME (rule, rule_buf[rule_pos]);
19035 SET_P0_CONV (rule, rule_buf[rule_pos]);
19036 break;
19037
19038 case RULE_OP_MANGLE_TITLE:
19039 SET_NAME (rule, rule_buf[rule_pos]);
19040 break;
19041
19042 default:
19043 return (-1);
19044 break;
19045 }
19046 }
19047
19048 if (rule_pos < rule_len) return (-1);
19049
19050 return (0);
19051 }
19052
19053 int gpu_rule_to_cpu_rule (char rule_buf[BUFSIZ], gpu_rule_t *rule)
19054 {
19055 uint rule_cnt;
19056 uint rule_pos;
19057 uint rule_len = BUFSIZ - 1; // maximum possible len
19058
19059 char rule_cmd;
19060
19061 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_GPU_RULES; rule_pos++, rule_cnt++)
19062 {
19063 GET_NAME (rule);
19064
19065 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19066
19067 switch (rule_cmd)
19068 {
19069 case RULE_OP_MANGLE_NOOP:
19070 rule_buf[rule_pos] = rule_cmd;
19071 break;
19072
19073 case RULE_OP_MANGLE_LREST:
19074 rule_buf[rule_pos] = rule_cmd;
19075 break;
19076
19077 case RULE_OP_MANGLE_UREST:
19078 rule_buf[rule_pos] = rule_cmd;
19079 break;
19080
19081 case RULE_OP_MANGLE_LREST_UFIRST:
19082 rule_buf[rule_pos] = rule_cmd;
19083 break;
19084
19085 case RULE_OP_MANGLE_UREST_LFIRST:
19086 rule_buf[rule_pos] = rule_cmd;
19087 break;
19088
19089 case RULE_OP_MANGLE_TREST:
19090 rule_buf[rule_pos] = rule_cmd;
19091 break;
19092
19093 case RULE_OP_MANGLE_TOGGLE_AT:
19094 rule_buf[rule_pos] = rule_cmd;
19095 GET_P0_CONV (rule);
19096 break;
19097
19098 case RULE_OP_MANGLE_REVERSE:
19099 rule_buf[rule_pos] = rule_cmd;
19100 break;
19101
19102 case RULE_OP_MANGLE_DUPEWORD:
19103 rule_buf[rule_pos] = rule_cmd;
19104 break;
19105
19106 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19107 rule_buf[rule_pos] = rule_cmd;
19108 GET_P0_CONV (rule);
19109 break;
19110
19111 case RULE_OP_MANGLE_REFLECT:
19112 rule_buf[rule_pos] = rule_cmd;
19113 break;
19114
19115 case RULE_OP_MANGLE_ROTATE_LEFT:
19116 rule_buf[rule_pos] = rule_cmd;
19117 break;
19118
19119 case RULE_OP_MANGLE_ROTATE_RIGHT:
19120 rule_buf[rule_pos] = rule_cmd;
19121 break;
19122
19123 case RULE_OP_MANGLE_APPEND:
19124 rule_buf[rule_pos] = rule_cmd;
19125 GET_P0 (rule);
19126 break;
19127
19128 case RULE_OP_MANGLE_PREPEND:
19129 rule_buf[rule_pos] = rule_cmd;
19130 GET_P0 (rule);
19131 break;
19132
19133 case RULE_OP_MANGLE_DELETE_FIRST:
19134 rule_buf[rule_pos] = rule_cmd;
19135 break;
19136
19137 case RULE_OP_MANGLE_DELETE_LAST:
19138 rule_buf[rule_pos] = rule_cmd;
19139 break;
19140
19141 case RULE_OP_MANGLE_DELETE_AT:
19142 rule_buf[rule_pos] = rule_cmd;
19143 GET_P0_CONV (rule);
19144 break;
19145
19146 case RULE_OP_MANGLE_EXTRACT:
19147 rule_buf[rule_pos] = rule_cmd;
19148 GET_P0_CONV (rule);
19149 GET_P1_CONV (rule);
19150 break;
19151
19152 case RULE_OP_MANGLE_OMIT:
19153 rule_buf[rule_pos] = rule_cmd;
19154 GET_P0_CONV (rule);
19155 GET_P1_CONV (rule);
19156 break;
19157
19158 case RULE_OP_MANGLE_INSERT:
19159 rule_buf[rule_pos] = rule_cmd;
19160 GET_P0_CONV (rule);
19161 GET_P1 (rule);
19162 break;
19163
19164 case RULE_OP_MANGLE_OVERSTRIKE:
19165 rule_buf[rule_pos] = rule_cmd;
19166 GET_P0_CONV (rule);
19167 GET_P1 (rule);
19168 break;
19169
19170 case RULE_OP_MANGLE_TRUNCATE_AT:
19171 rule_buf[rule_pos] = rule_cmd;
19172 GET_P0_CONV (rule);
19173 break;
19174
19175 case RULE_OP_MANGLE_REPLACE:
19176 rule_buf[rule_pos] = rule_cmd;
19177 GET_P0 (rule);
19178 GET_P1 (rule);
19179 break;
19180
19181 case RULE_OP_MANGLE_PURGECHAR:
19182 return (-1);
19183 break;
19184
19185 case RULE_OP_MANGLE_TOGGLECASE_REC:
19186 return (-1);
19187 break;
19188
19189 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19190 rule_buf[rule_pos] = rule_cmd;
19191 GET_P0_CONV (rule);
19192 break;
19193
19194 case RULE_OP_MANGLE_DUPECHAR_LAST:
19195 rule_buf[rule_pos] = rule_cmd;
19196 GET_P0_CONV (rule);
19197 break;
19198
19199 case RULE_OP_MANGLE_DUPECHAR_ALL:
19200 rule_buf[rule_pos] = rule_cmd;
19201 break;
19202
19203 case RULE_OP_MANGLE_SWITCH_FIRST:
19204 rule_buf[rule_pos] = rule_cmd;
19205 break;
19206
19207 case RULE_OP_MANGLE_SWITCH_LAST:
19208 rule_buf[rule_pos] = rule_cmd;
19209 break;
19210
19211 case RULE_OP_MANGLE_SWITCH_AT:
19212 rule_buf[rule_pos] = rule_cmd;
19213 GET_P0_CONV (rule);
19214 GET_P1_CONV (rule);
19215 break;
19216
19217 case RULE_OP_MANGLE_CHR_SHIFTL:
19218 rule_buf[rule_pos] = rule_cmd;
19219 GET_P0_CONV (rule);
19220 break;
19221
19222 case RULE_OP_MANGLE_CHR_SHIFTR:
19223 rule_buf[rule_pos] = rule_cmd;
19224 GET_P0_CONV (rule);
19225 break;
19226
19227 case RULE_OP_MANGLE_CHR_INCR:
19228 rule_buf[rule_pos] = rule_cmd;
19229 GET_P0_CONV (rule);
19230 break;
19231
19232 case RULE_OP_MANGLE_CHR_DECR:
19233 rule_buf[rule_pos] = rule_cmd;
19234 GET_P0_CONV (rule);
19235 break;
19236
19237 case RULE_OP_MANGLE_REPLACE_NP1:
19238 rule_buf[rule_pos] = rule_cmd;
19239 GET_P0_CONV (rule);
19240 break;
19241
19242 case RULE_OP_MANGLE_REPLACE_NM1:
19243 rule_buf[rule_pos] = rule_cmd;
19244 GET_P0_CONV (rule);
19245 break;
19246
19247 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19248 rule_buf[rule_pos] = rule_cmd;
19249 GET_P0_CONV (rule);
19250 break;
19251
19252 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19253 rule_buf[rule_pos] = rule_cmd;
19254 GET_P0_CONV (rule);
19255 break;
19256
19257 case RULE_OP_MANGLE_TITLE:
19258 rule_buf[rule_pos] = rule_cmd;
19259 break;
19260
19261 case 0:
19262 return rule_pos - 1;
19263 break;
19264
19265 default:
19266 return (-1);
19267 break;
19268 }
19269 }
19270
19271 if (rule_cnt > 0)
19272 {
19273 return rule_pos;
19274 }
19275
19276 return (-1);
19277 }
19278
19279 /**
19280 * CPU rules : this is from hashcat sources, cpu based rules
19281 */
19282
19283 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19284 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19285
19286 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19287 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19288 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19289
19290 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19291 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19292 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19293
19294 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19295 {
19296 int pos;
19297
19298 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19299
19300 return (arr_len);
19301 }
19302
19303 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19304 {
19305 int pos;
19306
19307 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19308
19309 return (arr_len);
19310 }
19311
19312 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19313 {
19314 int pos;
19315
19316 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19317
19318 return (arr_len);
19319 }
19320
19321 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19322 {
19323 int l;
19324 int r;
19325
19326 for (l = 0; l < arr_len; l++)
19327 {
19328 r = arr_len - 1 - l;
19329
19330 if (l >= r) break;
19331
19332 MANGLE_SWITCH (arr, l, r);
19333 }
19334
19335 return (arr_len);
19336 }
19337
19338 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19339 {
19340 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19341
19342 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19343
19344 return (arr_len * 2);
19345 }
19346
19347 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19348 {
19349 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19350
19351 int orig_len = arr_len;
19352
19353 int i;
19354
19355 for (i = 0; i < times; i++)
19356 {
19357 memcpy (&arr[arr_len], arr, orig_len);
19358
19359 arr_len += orig_len;
19360 }
19361
19362 return (arr_len);
19363 }
19364
19365 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19366 {
19367 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19368
19369 mangle_double (arr, arr_len);
19370
19371 mangle_reverse (arr + arr_len, arr_len);
19372
19373 return (arr_len * 2);
19374 }
19375
19376 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19377 {
19378 int l;
19379 int r;
19380
19381 for (l = 0, r = arr_len - 1; r > 0; r--)
19382 {
19383 MANGLE_SWITCH (arr, l, r);
19384 }
19385
19386 return (arr_len);
19387 }
19388
19389 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19390 {
19391 int l;
19392 int r;
19393
19394 for (l = 0, r = arr_len - 1; l < r; l++)
19395 {
19396 MANGLE_SWITCH (arr, l, r);
19397 }
19398
19399 return (arr_len);
19400 }
19401
19402 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19403 {
19404 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19405
19406 arr[arr_len] = c;
19407
19408 return (arr_len + 1);
19409 }
19410
19411 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19412 {
19413 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19414
19415 int arr_pos;
19416
19417 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19418 {
19419 arr[arr_pos + 1] = arr[arr_pos];
19420 }
19421
19422 arr[0] = c;
19423
19424 return (arr_len + 1);
19425 }
19426
19427 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19428 {
19429 if (upos >= arr_len) return (arr_len);
19430
19431 int arr_pos;
19432
19433 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
19434 {
19435 arr[arr_pos] = arr[arr_pos + 1];
19436 }
19437
19438 return (arr_len - 1);
19439 }
19440
19441 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19442 {
19443 if (upos >= arr_len) return (arr_len);
19444
19445 if ((upos + ulen) > arr_len) return (arr_len);
19446
19447 int arr_pos;
19448
19449 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
19450 {
19451 arr[arr_pos] = arr[upos + arr_pos];
19452 }
19453
19454 return (ulen);
19455 }
19456
19457 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19458 {
19459 if (upos >= arr_len) return (arr_len);
19460
19461 if ((upos + ulen) >= arr_len) return (arr_len);
19462
19463 int arr_pos;
19464
19465 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
19466 {
19467 arr[arr_pos] = arr[arr_pos + ulen];
19468 }
19469
19470 return (arr_len - ulen);
19471 }
19472
19473 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19474 {
19475 if (upos >= arr_len) return (arr_len);
19476
19477 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19478
19479 int arr_pos;
19480
19481 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
19482 {
19483 arr[arr_pos + 1] = arr[arr_pos];
19484 }
19485
19486 arr[upos] = c;
19487
19488 return (arr_len + 1);
19489 }
19490
19491 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)
19492 {
19493 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
19494
19495 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
19496
19497 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
19498
19499 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
19500
19501 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
19502
19503 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
19504
19505 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
19506
19507 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
19508
19509 return (arr_len + arr2_cpy);
19510 }
19511
19512 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19513 {
19514 if (upos >= arr_len) return (arr_len);
19515
19516 arr[upos] = c;
19517
19518 return (arr_len);
19519 }
19520
19521 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19522 {
19523 if (upos >= arr_len) return (arr_len);
19524
19525 memset (arr + upos, 0, arr_len - upos);
19526
19527 return (upos);
19528 }
19529
19530 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
19531 {
19532 int arr_pos;
19533
19534 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
19535 {
19536 if (arr[arr_pos] != oldc) continue;
19537
19538 arr[arr_pos] = newc;
19539 }
19540
19541 return (arr_len);
19542 }
19543
19544 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
19545 {
19546 int arr_pos;
19547
19548 int ret_len;
19549
19550 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
19551 {
19552 if (arr[arr_pos] == c) continue;
19553
19554 arr[ret_len] = arr[arr_pos];
19555
19556 ret_len++;
19557 }
19558
19559 return (ret_len);
19560 }
19561
19562 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
19563 {
19564 if (ulen > arr_len) return (arr_len);
19565
19566 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19567
19568 char cs[100];
19569
19570 memcpy (cs, arr, ulen);
19571
19572 int i;
19573
19574 for (i = 0; i < ulen; i++)
19575 {
19576 char c = cs[i];
19577
19578 arr_len = mangle_insert (arr, arr_len, i, c);
19579 }
19580
19581 return (arr_len);
19582 }
19583
19584 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
19585 {
19586 if (ulen > arr_len) return (arr_len);
19587
19588 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19589
19590 int upos = arr_len - ulen;
19591
19592 int i;
19593
19594 for (i = 0; i < ulen; i++)
19595 {
19596 char c = arr[upos + i];
19597
19598 arr_len = mangle_append (arr, arr_len, c);
19599 }
19600
19601 return (arr_len);
19602 }
19603
19604 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19605 {
19606 if ( arr_len == 0) return (arr_len);
19607 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19608
19609 char c = arr[upos];
19610
19611 int i;
19612
19613 for (i = 0; i < ulen; i++)
19614 {
19615 arr_len = mangle_insert (arr, arr_len, upos, c);
19616 }
19617
19618 return (arr_len);
19619 }
19620
19621 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
19622 {
19623 if ( arr_len == 0) return (arr_len);
19624 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
19625
19626 int arr_pos;
19627
19628 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19629 {
19630 int new_pos = arr_pos * 2;
19631
19632 arr[new_pos] = arr[arr_pos];
19633
19634 arr[new_pos + 1] = arr[arr_pos];
19635 }
19636
19637 return (arr_len * 2);
19638 }
19639
19640 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
19641 {
19642 if (upos >= arr_len) return (arr_len);
19643 if (upos2 >= arr_len) return (arr_len);
19644
19645 MANGLE_SWITCH (arr, upos, upos2);
19646
19647 return (arr_len);
19648 }
19649
19650 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
19651 {
19652 MANGLE_SWITCH (arr, upos, upos2);
19653
19654 return (arr_len);
19655 }
19656
19657 int mangle_chr_shiftl (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19658 {
19659 if (upos >= arr_len) return (arr_len);
19660
19661 arr[upos] <<= 1;
19662
19663 return (arr_len);
19664 }
19665
19666 int mangle_chr_shiftr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19667 {
19668 if (upos >= arr_len) return (arr_len);
19669
19670 arr[upos] >>= 1;
19671
19672 return (arr_len);
19673 }
19674
19675 int mangle_chr_incr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19676 {
19677 if (upos >= arr_len) return (arr_len);
19678
19679 arr[upos] += 1;
19680
19681 return (arr_len);
19682 }
19683
19684 int mangle_chr_decr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
19685 {
19686 if (upos >= arr_len) return (arr_len);
19687
19688 arr[upos] -= 1;
19689
19690 return (arr_len);
19691 }
19692
19693 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
19694 {
19695 int upper_next = 1;
19696
19697 int pos;
19698
19699 for (pos = 0; pos < arr_len; pos++)
19700 {
19701 if (arr[pos] == ' ')
19702 {
19703 upper_next = 1;
19704
19705 continue;
19706 }
19707
19708 if (upper_next)
19709 {
19710 upper_next = 0;
19711
19712 MANGLE_UPPER_AT (arr, pos);
19713 }
19714 else
19715 {
19716 MANGLE_LOWER_AT (arr, pos);
19717 }
19718 }
19719
19720 return (arr_len);
19721 }
19722
19723 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], uint32_t rp_gen_func_min, uint32_t rp_gen_func_max)
19724 {
19725 uint32_t rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
19726
19727 uint32_t j;
19728
19729 uint32_t rule_pos = 0;
19730
19731 for (j = 0; j < rp_gen_num; j++)
19732 {
19733 uint32_t r = 0;
19734 uint32_t p1 = 0;
19735 uint32_t p2 = 0;
19736 uint32_t p3 = 0;
19737
19738 switch ((char) get_random_num (0, 9))
19739 {
19740 case 0:
19741 r = get_random_num (0, sizeof (grp_op_nop));
19742 rule_buf[rule_pos++] = grp_op_nop[r];
19743 break;
19744
19745 case 1:
19746 r = get_random_num (0, sizeof (grp_op_pos_p0));
19747 rule_buf[rule_pos++] = grp_op_pos_p0[r];
19748 p1 = get_random_num (0, sizeof (grp_pos));
19749 rule_buf[rule_pos++] = grp_pos[p1];
19750 break;
19751
19752 case 2:
19753 r = get_random_num (0, sizeof (grp_op_pos_p1));
19754 rule_buf[rule_pos++] = grp_op_pos_p1[r];
19755 p1 = get_random_num (1, 6);
19756 rule_buf[rule_pos++] = grp_pos[p1];
19757 break;
19758
19759 case 3:
19760 r = get_random_num (0, sizeof (grp_op_chr));
19761 rule_buf[rule_pos++] = grp_op_chr[r];
19762 p1 = get_random_num (0x20, 0x7e);
19763 rule_buf[rule_pos++] = (char) p1;
19764 break;
19765
19766 case 4:
19767 r = get_random_num (0, sizeof (grp_op_chr_chr));
19768 rule_buf[rule_pos++] = grp_op_chr_chr[r];
19769 p1 = get_random_num (0x20, 0x7e);
19770 rule_buf[rule_pos++] = (char) p1;
19771 p2 = get_random_num (0x20, 0x7e);
19772 while (p1 == p2)
19773 p2 = get_random_num (0x20, 0x7e);
19774 rule_buf[rule_pos++] = (char) p2;
19775 break;
19776
19777 case 5:
19778 r = get_random_num (0, sizeof (grp_op_pos_chr));
19779 rule_buf[rule_pos++] = grp_op_pos_chr[r];
19780 p1 = get_random_num (0, sizeof (grp_pos));
19781 rule_buf[rule_pos++] = grp_pos[p1];
19782 p2 = get_random_num (0x20, 0x7e);
19783 rule_buf[rule_pos++] = (char) p2;
19784 break;
19785
19786 case 6:
19787 r = get_random_num (0, sizeof (grp_op_pos_pos0));
19788 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
19789 p1 = get_random_num (0, sizeof (grp_pos));
19790 rule_buf[rule_pos++] = grp_pos[p1];
19791 p2 = get_random_num (0, sizeof (grp_pos));
19792 while (p1 == p2)
19793 p2 = get_random_num (0, sizeof (grp_pos));
19794 rule_buf[rule_pos++] = grp_pos[p2];
19795 break;
19796
19797 case 7:
19798 r = get_random_num (0, sizeof (grp_op_pos_pos1));
19799 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
19800 p1 = get_random_num (0, sizeof (grp_pos));
19801 rule_buf[rule_pos++] = grp_pos[p1];
19802 p2 = get_random_num (1, sizeof (grp_pos));
19803 while (p1 == p2)
19804 p2 = get_random_num (1, sizeof (grp_pos));
19805 rule_buf[rule_pos++] = grp_pos[p2];
19806 break;
19807
19808 case 8:
19809 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
19810 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
19811 p1 = get_random_num (0, sizeof (grp_pos));
19812 rule_buf[rule_pos++] = grp_pos[p1];
19813 p2 = get_random_num (1, sizeof (grp_pos));
19814 rule_buf[rule_pos++] = grp_pos[p1];
19815 p3 = get_random_num (0, sizeof (grp_pos));
19816 rule_buf[rule_pos++] = grp_pos[p3];
19817 break;
19818 }
19819 }
19820
19821 return (rule_pos);
19822 }
19823
19824 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
19825 {
19826 char mem[BLOCK_SIZE];
19827
19828 if (in == NULL) return (RULE_RC_REJECT_ERROR);
19829
19830 if (out == NULL) return (RULE_RC_REJECT_ERROR);
19831
19832 if (in_len < 1) return (RULE_RC_REJECT_ERROR);
19833
19834 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
19835
19836 int out_len = in_len;
19837 int mem_len = in_len;
19838
19839 memcpy (out, in, out_len);
19840
19841 int rule_pos;
19842
19843 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
19844 {
19845 int upos; int upos2;
19846 int ulen;
19847
19848 switch (rule[rule_pos])
19849 {
19850 case ' ':
19851 break;
19852
19853 case RULE_OP_MANGLE_NOOP:
19854 break;
19855
19856 case RULE_OP_MANGLE_LREST:
19857 out_len = mangle_lrest (out, out_len);
19858 break;
19859
19860 case RULE_OP_MANGLE_UREST:
19861 out_len = mangle_urest (out, out_len);
19862 break;
19863
19864 case RULE_OP_MANGLE_LREST_UFIRST:
19865 out_len = mangle_lrest (out, out_len);
19866 if (out_len) MANGLE_UPPER_AT (out, 0);
19867 break;
19868
19869 case RULE_OP_MANGLE_UREST_LFIRST:
19870 out_len = mangle_urest (out, out_len);
19871 if (out_len) MANGLE_LOWER_AT (out, 0);
19872 break;
19873
19874 case RULE_OP_MANGLE_TREST:
19875 out_len = mangle_trest (out, out_len);
19876 break;
19877
19878 case RULE_OP_MANGLE_TOGGLE_AT:
19879 NEXT_RULEPOS (rule_pos);
19880 NEXT_RPTOI (rule, rule_pos, upos);
19881 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
19882 break;
19883
19884 case RULE_OP_MANGLE_REVERSE:
19885 out_len = mangle_reverse (out, out_len);
19886 break;
19887
19888 case RULE_OP_MANGLE_DUPEWORD:
19889 out_len = mangle_double (out, out_len);
19890 break;
19891
19892 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19893 NEXT_RULEPOS (rule_pos);
19894 NEXT_RPTOI (rule, rule_pos, ulen);
19895 out_len = mangle_double_times (out, out_len, ulen);
19896 break;
19897
19898 case RULE_OP_MANGLE_REFLECT:
19899 out_len = mangle_reflect (out, out_len);
19900 break;
19901
19902 case RULE_OP_MANGLE_ROTATE_LEFT:
19903 mangle_rotate_left (out, out_len);
19904 break;
19905
19906 case RULE_OP_MANGLE_ROTATE_RIGHT:
19907 mangle_rotate_right (out, out_len);
19908 break;
19909
19910 case RULE_OP_MANGLE_APPEND:
19911 NEXT_RULEPOS (rule_pos);
19912 out_len = mangle_append (out, out_len, rule[rule_pos]);
19913 break;
19914
19915 case RULE_OP_MANGLE_PREPEND:
19916 NEXT_RULEPOS (rule_pos);
19917 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
19918 break;
19919
19920 case RULE_OP_MANGLE_DELETE_FIRST:
19921 out_len = mangle_delete_at (out, out_len, 0);
19922 break;
19923
19924 case RULE_OP_MANGLE_DELETE_LAST:
19925 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
19926 break;
19927
19928 case RULE_OP_MANGLE_DELETE_AT:
19929 NEXT_RULEPOS (rule_pos);
19930 NEXT_RPTOI (rule, rule_pos, upos);
19931 out_len = mangle_delete_at (out, out_len, upos);
19932 break;
19933
19934 case RULE_OP_MANGLE_EXTRACT:
19935 NEXT_RULEPOS (rule_pos);
19936 NEXT_RPTOI (rule, rule_pos, upos);
19937 NEXT_RULEPOS (rule_pos);
19938 NEXT_RPTOI (rule, rule_pos, ulen);
19939 out_len = mangle_extract (out, out_len, upos, ulen);
19940 break;
19941
19942 case RULE_OP_MANGLE_OMIT:
19943 NEXT_RULEPOS (rule_pos);
19944 NEXT_RPTOI (rule, rule_pos, upos);
19945 NEXT_RULEPOS (rule_pos);
19946 NEXT_RPTOI (rule, rule_pos, ulen);
19947 out_len = mangle_omit (out, out_len, upos, ulen);
19948 break;
19949
19950 case RULE_OP_MANGLE_INSERT:
19951 NEXT_RULEPOS (rule_pos);
19952 NEXT_RPTOI (rule, rule_pos, upos);
19953 NEXT_RULEPOS (rule_pos);
19954 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
19955 break;
19956
19957 case RULE_OP_MANGLE_OVERSTRIKE:
19958 NEXT_RULEPOS (rule_pos);
19959 NEXT_RPTOI (rule, rule_pos, upos);
19960 NEXT_RULEPOS (rule_pos);
19961 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
19962 break;
19963
19964 case RULE_OP_MANGLE_TRUNCATE_AT:
19965 NEXT_RULEPOS (rule_pos);
19966 NEXT_RPTOI (rule, rule_pos, upos);
19967 out_len = mangle_truncate_at (out, out_len, upos);
19968 break;
19969
19970 case RULE_OP_MANGLE_REPLACE:
19971 NEXT_RULEPOS (rule_pos);
19972 NEXT_RULEPOS (rule_pos);
19973 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
19974 break;
19975
19976 case RULE_OP_MANGLE_PURGECHAR:
19977 NEXT_RULEPOS (rule_pos);
19978 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
19979 break;
19980
19981 case RULE_OP_MANGLE_TOGGLECASE_REC:
19982 /* todo */
19983 break;
19984
19985 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19986 NEXT_RULEPOS (rule_pos);
19987 NEXT_RPTOI (rule, rule_pos, ulen);
19988 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
19989 break;
19990
19991 case RULE_OP_MANGLE_DUPECHAR_LAST:
19992 NEXT_RULEPOS (rule_pos);
19993 NEXT_RPTOI (rule, rule_pos, ulen);
19994 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
19995 break;
19996
19997 case RULE_OP_MANGLE_DUPECHAR_ALL:
19998 out_len = mangle_dupechar (out, out_len);
19999 break;
20000
20001 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20002 NEXT_RULEPOS (rule_pos);
20003 NEXT_RPTOI (rule, rule_pos, ulen);
20004 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20005 break;
20006
20007 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20008 NEXT_RULEPOS (rule_pos);
20009 NEXT_RPTOI (rule, rule_pos, ulen);
20010 out_len = mangle_dupeblock_append (out, out_len, ulen);
20011 break;
20012
20013 case RULE_OP_MANGLE_SWITCH_FIRST:
20014 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20015 break;
20016
20017 case RULE_OP_MANGLE_SWITCH_LAST:
20018 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20019 break;
20020
20021 case RULE_OP_MANGLE_SWITCH_AT:
20022 NEXT_RULEPOS (rule_pos);
20023 NEXT_RPTOI (rule, rule_pos, upos);
20024 NEXT_RULEPOS (rule_pos);
20025 NEXT_RPTOI (rule, rule_pos, upos2);
20026 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20027 break;
20028
20029 case RULE_OP_MANGLE_CHR_SHIFTL:
20030 NEXT_RULEPOS (rule_pos);
20031 NEXT_RPTOI (rule, rule_pos, upos);
20032 mangle_chr_shiftl ((uint8_t *) out, out_len, upos);
20033 break;
20034
20035 case RULE_OP_MANGLE_CHR_SHIFTR:
20036 NEXT_RULEPOS (rule_pos);
20037 NEXT_RPTOI (rule, rule_pos, upos);
20038 mangle_chr_shiftr ((uint8_t *) out, out_len, upos);
20039 break;
20040
20041 case RULE_OP_MANGLE_CHR_INCR:
20042 NEXT_RULEPOS (rule_pos);
20043 NEXT_RPTOI (rule, rule_pos, upos);
20044 mangle_chr_incr ((uint8_t *) out, out_len, upos);
20045 break;
20046
20047 case RULE_OP_MANGLE_CHR_DECR:
20048 NEXT_RULEPOS (rule_pos);
20049 NEXT_RPTOI (rule, rule_pos, upos);
20050 mangle_chr_decr ((uint8_t *) out, out_len, upos);
20051 break;
20052
20053 case RULE_OP_MANGLE_REPLACE_NP1:
20054 NEXT_RULEPOS (rule_pos);
20055 NEXT_RPTOI (rule, rule_pos, upos);
20056 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20057 break;
20058
20059 case RULE_OP_MANGLE_REPLACE_NM1:
20060 NEXT_RULEPOS (rule_pos);
20061 NEXT_RPTOI (rule, rule_pos, upos);
20062 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20063 break;
20064
20065 case RULE_OP_MANGLE_TITLE:
20066 out_len = mangle_title (out, out_len);
20067 break;
20068
20069 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20070 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20071 NEXT_RULEPOS (rule_pos);
20072 NEXT_RPTOI (rule, rule_pos, upos);
20073 NEXT_RULEPOS (rule_pos);
20074 NEXT_RPTOI (rule, rule_pos, ulen);
20075 NEXT_RULEPOS (rule_pos);
20076 NEXT_RPTOI (rule, rule_pos, upos2);
20077 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20078 break;
20079
20080 case RULE_OP_MANGLE_APPEND_MEMORY:
20081 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20082 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20083 memcpy (out + out_len, mem, mem_len);
20084 out_len += mem_len;
20085 break;
20086
20087 case RULE_OP_MANGLE_PREPEND_MEMORY:
20088 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20089 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20090 memcpy (mem + mem_len, out, out_len);
20091 out_len += mem_len;
20092 memcpy (out, mem, out_len);
20093 break;
20094
20095 case RULE_OP_MEMORIZE_WORD:
20096 memcpy (mem, out, out_len);
20097 mem_len = out_len;
20098 break;
20099
20100 case RULE_OP_REJECT_LESS:
20101 NEXT_RULEPOS (rule_pos);
20102 NEXT_RPTOI (rule, rule_pos, upos);
20103 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20104 break;
20105
20106 case RULE_OP_REJECT_GREATER:
20107 NEXT_RULEPOS (rule_pos);
20108 NEXT_RPTOI (rule, rule_pos, upos);
20109 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20110 break;
20111
20112 case RULE_OP_REJECT_CONTAIN:
20113 NEXT_RULEPOS (rule_pos);
20114 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20115 break;
20116
20117 case RULE_OP_REJECT_NOT_CONTAIN:
20118 NEXT_RULEPOS (rule_pos);
20119 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20120 break;
20121
20122 case RULE_OP_REJECT_EQUAL_FIRST:
20123 NEXT_RULEPOS (rule_pos);
20124 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20125 break;
20126
20127 case RULE_OP_REJECT_EQUAL_LAST:
20128 NEXT_RULEPOS (rule_pos);
20129 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20130 break;
20131
20132 case RULE_OP_REJECT_EQUAL_AT:
20133 NEXT_RULEPOS (rule_pos);
20134 NEXT_RPTOI (rule, rule_pos, upos);
20135 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20136 NEXT_RULEPOS (rule_pos);
20137 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20138 break;
20139
20140 case RULE_OP_REJECT_CONTAINS:
20141 NEXT_RULEPOS (rule_pos);
20142 NEXT_RPTOI (rule, rule_pos, upos);
20143 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20144 NEXT_RULEPOS (rule_pos);
20145 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20146 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20147 break;
20148
20149 case RULE_OP_REJECT_MEMORY:
20150 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20151 break;
20152
20153 default:
20154 return (RULE_RC_SYNTAX_ERROR);
20155 break;
20156 }
20157 }
20158
20159 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20160
20161 return (out_len);
20162 }