71f5972c7be8358b1455c7c8c7b750c985088b3f
[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 /**
10 * tuning tools
11 */
12
13 #define GET_ACCEL(x) KERNEL_ACCEL_ ## x
14 #define GET_LOOPS(x) KERNEL_LOOPS_ ## x
15
16 /**
17 * basic bit handling
18 */
19
20 u32 rotl32 (const u32 a, const u32 n)
21 {
22 return ((a << n) | (a >> (32 - n)));
23 }
24
25 u32 rotr32 (const u32 a, const u32 n)
26 {
27 return ((a >> n) | (a << (32 - n)));
28 }
29
30 u64 rotl64 (const u64 a, const u64 n)
31 {
32 return ((a << n) | (a >> (64 - n)));
33 }
34
35 u64 rotr64 (const u64 a, const u64 n)
36 {
37 return ((a >> n) | (a << (64 - n)));
38 }
39
40 u32 byte_swap_32 (const u32 n)
41 {
42 return (n & 0xff000000) >> 24
43 | (n & 0x00ff0000) >> 8
44 | (n & 0x0000ff00) << 8
45 | (n & 0x000000ff) << 24;
46 }
47
48 u64 byte_swap_64 (const u64 n)
49 {
50 return (n & 0xff00000000000000ULL) >> 56
51 | (n & 0x00ff000000000000ULL) >> 40
52 | (n & 0x0000ff0000000000ULL) >> 24
53 | (n & 0x000000ff00000000ULL) >> 8
54 | (n & 0x00000000ff000000ULL) << 8
55 | (n & 0x0000000000ff0000ULL) << 24
56 | (n & 0x000000000000ff00ULL) << 40
57 | (n & 0x00000000000000ffULL) << 56;
58 }
59
60 /**
61 * ciphers for use on cpu
62 */
63
64 #include "cpu-des.c"
65 #include "cpu-aes.c"
66
67 /**
68 * hashes for use on cpu
69 */
70
71 #include "cpu-md5.c"
72 #include "cpu-sha256.c"
73
74 /**
75 * logging
76 */
77
78 int last_len = 0;
79
80 void log_final (FILE *fp, const char *fmt, va_list ap)
81 {
82 if (last_len)
83 {
84 fputc ('\r', fp);
85
86 for (int i = 0; i < last_len; i++)
87 {
88 fputc (' ', fp);
89 }
90
91 fputc ('\r', fp);
92 }
93
94 char s[4096];
95
96 int max_len = (int) sizeof (s);
97
98 int len = vsnprintf (s, max_len, fmt, ap);
99
100 if (len > max_len) len = max_len;
101
102 fwrite (s, len, 1, fp);
103
104 fflush (fp);
105
106 last_len = len;
107 }
108
109 void log_out_nn (FILE *fp, const char *fmt, ...)
110 {
111 if (SUPPRESS_OUTPUT) return;
112
113 va_list ap;
114
115 va_start (ap, fmt);
116
117 log_final (fp, fmt, ap);
118
119 va_end (ap);
120 }
121
122 void log_info_nn (const char *fmt, ...)
123 {
124 if (SUPPRESS_OUTPUT) return;
125
126 va_list ap;
127
128 va_start (ap, fmt);
129
130 log_final (stdout, fmt, ap);
131
132 va_end (ap);
133 }
134
135 void log_error_nn (const char *fmt, ...)
136 {
137 if (SUPPRESS_OUTPUT) return;
138
139 va_list ap;
140
141 va_start (ap, fmt);
142
143 log_final (stderr, fmt, ap);
144
145 va_end (ap);
146 }
147
148 void log_out (FILE *fp, const char *fmt, ...)
149 {
150 if (SUPPRESS_OUTPUT) return;
151
152 va_list ap;
153
154 va_start (ap, fmt);
155
156 log_final (fp, fmt, ap);
157
158 va_end (ap);
159
160 fputc ('\n', fp);
161
162 last_len = 0;
163 }
164
165 void log_info (const char *fmt, ...)
166 {
167 if (SUPPRESS_OUTPUT) return;
168
169 va_list ap;
170
171 va_start (ap, fmt);
172
173 log_final (stdout, fmt, ap);
174
175 va_end (ap);
176
177 fputc ('\n', stdout);
178
179 last_len = 0;
180 }
181
182 void log_error (const char *fmt, ...)
183 {
184 if (SUPPRESS_OUTPUT) return;
185
186 fputc ('\n', stderr);
187 fputc ('\n', stderr);
188
189 va_list ap;
190
191 va_start (ap, fmt);
192
193 log_final (stderr, fmt, ap);
194
195 va_end (ap);
196
197 fputc ('\n', stderr);
198 fputc ('\n', stderr);
199
200 last_len = 0;
201 }
202
203 /**
204 * converter
205 */
206
207 u8 int_to_base32 (const u8 c)
208 {
209 static const u8 tbl[0x20] =
210 {
211 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
212 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
213 };
214
215 return tbl[c];
216 }
217
218 u8 base32_to_int (const u8 c)
219 {
220 if ((c >= 'A') && (c <= 'Z')) return c - 'A';
221 else if ((c >= '2') && (c <= '7')) return c - '2' + 26;
222
223 return 0;
224 }
225
226 u8 int_to_itoa32 (const u8 c)
227 {
228 static const u8 tbl[0x20] =
229 {
230 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
231 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
232 };
233
234 return tbl[c];
235 }
236
237 u8 itoa32_to_int (const u8 c)
238 {
239 if ((c >= '0') && (c <= '9')) return c - '0';
240 else if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10;
241
242 return 0;
243 }
244
245 u8 int_to_itoa64 (const u8 c)
246 {
247 static const u8 tbl[0x40] =
248 {
249 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
250 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
251 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a,
252 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,
253 };
254
255 return tbl[c];
256 }
257
258 u8 itoa64_to_int (const u8 c)
259 {
260 static const u8 tbl[0x100] =
261 {
262 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
263 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
264 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01,
265 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
266 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
267 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
268 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
269 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
270 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
271 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
272 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
273 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
274 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
275 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
276 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34,
277 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04,
278 };
279
280 return tbl[c];
281 }
282
283 u8 int_to_base64 (const u8 c)
284 {
285 static const u8 tbl[0x40] =
286 {
287 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
288 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
289 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
290 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f,
291 };
292
293 return tbl[c];
294 }
295
296 u8 base64_to_int (const u8 c)
297 {
298 static const u8 tbl[0x100] =
299 {
300 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
302 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
303 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
304 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
305 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
306 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
307 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
309 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 };
317
318 return tbl[c];
319 }
320
321 u8 int_to_bf64 (const u8 c)
322 {
323 static const u8 tbl[0x40] =
324 {
325 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e,
326 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
327 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
328 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
329 };
330
331 return tbl[c];
332 }
333
334 u8 bf64_to_int (const u8 c)
335 {
336 static const u8 tbl[0x100] =
337 {
338 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
340 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
341 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
342 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
343 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00,
344 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
345 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00,
346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
347 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 };
355
356 return tbl[c];
357 }
358
359 u8 int_to_lotus64 (const u8 c)
360 {
361 if (c < 10) return '0' + c;
362 else if (c < 36) return 'A' + c - 10;
363 else if (c < 62) return 'a' + c - 36;
364 else if (c == 62) return '+';
365 else if (c == 63) return '/';
366
367 return 0;
368 }
369
370 u8 lotus64_to_int (const u8 c)
371 {
372 if ((c >= '0') && (c <= '9')) return c - '0';
373 else if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10;
374 else if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36;
375 else if (c == '+') return 62;
376 else if (c == '/') return 63;
377 else
378
379 return 0;
380 }
381
382 int base32_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
383 {
384 const u8 *in_ptr = in_buf;
385
386 u8 *out_ptr = out_buf;
387
388 for (int i = 0; i < in_len; i += 8)
389 {
390 const u8 out_val0 = f (in_ptr[0] & 0x7f);
391 const u8 out_val1 = f (in_ptr[1] & 0x7f);
392 const u8 out_val2 = f (in_ptr[2] & 0x7f);
393 const u8 out_val3 = f (in_ptr[3] & 0x7f);
394 const u8 out_val4 = f (in_ptr[4] & 0x7f);
395 const u8 out_val5 = f (in_ptr[5] & 0x7f);
396 const u8 out_val6 = f (in_ptr[6] & 0x7f);
397 const u8 out_val7 = f (in_ptr[7] & 0x7f);
398
399 out_ptr[0] = ((out_val0 << 3) & 0xf8) | ((out_val1 >> 2) & 0x07);
400 out_ptr[1] = ((out_val1 << 6) & 0xc0) | ((out_val2 << 1) & 0x3e) | ((out_val3 >> 4) & 0x01);
401 out_ptr[2] = ((out_val3 << 4) & 0xf0) | ((out_val4 >> 1) & 0x0f);
402 out_ptr[3] = ((out_val4 << 7) & 0x80) | ((out_val5 << 2) & 0x7c) | ((out_val6 >> 3) & 0x03);
403 out_ptr[4] = ((out_val6 << 5) & 0xe0) | ((out_val7 >> 0) & 0x1f);
404
405 in_ptr += 8;
406 out_ptr += 5;
407 }
408
409 for (int i = 0; i < in_len; i++)
410 {
411 if (in_buf[i] != '=') continue;
412
413 in_len = i;
414 }
415
416 int out_len = (in_len * 5) / 8;
417
418 return out_len;
419 }
420
421 int base32_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
422 {
423 const u8 *in_ptr = in_buf;
424
425 u8 *out_ptr = out_buf;
426
427 for (int i = 0; i < in_len; i += 5)
428 {
429 const u8 out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f));
430 const u8 out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03));
431 const u8 out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f));
432 const u8 out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f));
433 const u8 out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01));
434 const u8 out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f));
435 const u8 out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07));
436 const u8 out_val7 = f ( ((in_ptr[4] >> 0) & 0x1f));
437
438 out_ptr[0] = out_val0 & 0x7f;
439 out_ptr[1] = out_val1 & 0x7f;
440 out_ptr[2] = out_val2 & 0x7f;
441 out_ptr[3] = out_val3 & 0x7f;
442 out_ptr[4] = out_val4 & 0x7f;
443 out_ptr[5] = out_val5 & 0x7f;
444 out_ptr[6] = out_val6 & 0x7f;
445 out_ptr[7] = out_val7 & 0x7f;
446
447 in_ptr += 5;
448 out_ptr += 8;
449 }
450
451 int out_len = (in_len * 8) / 5;
452
453 for (int i = 0; i < (7 - (in_len % 7)); i++)
454 {
455 out_len++;
456
457 out_buf[out_len] = '=';
458 }
459
460 return out_len;
461 }
462
463 int base64_decode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
464 {
465 const u8 *in_ptr = in_buf;
466
467 u8 *out_ptr = out_buf;
468
469 for (int i = 0; i < in_len; i += 4)
470 {
471 const u8 out_val0 = f (in_ptr[0] & 0x7f);
472 const u8 out_val1 = f (in_ptr[1] & 0x7f);
473 const u8 out_val2 = f (in_ptr[2] & 0x7f);
474 const u8 out_val3 = f (in_ptr[3] & 0x7f);
475
476 out_ptr[0] = ((out_val0 << 2) & 0xfc) | ((out_val1 >> 4) & 0x03);
477 out_ptr[1] = ((out_val1 << 4) & 0xf0) | ((out_val2 >> 2) & 0x0f);
478 out_ptr[2] = ((out_val2 << 6) & 0xc0) | ((out_val3 >> 0) & 0x3f);
479
480 in_ptr += 4;
481 out_ptr += 3;
482 }
483
484 for (int i = 0; i < in_len; i++)
485 {
486 if (in_buf[i] != '=') continue;
487
488 in_len = i;
489 }
490
491 int out_len = (in_len * 6) / 8;
492
493 return out_len;
494 }
495
496 int base64_encode (u8 (*f) (const u8), const u8 *in_buf, int in_len, u8 *out_buf)
497 {
498 const u8 *in_ptr = in_buf;
499
500 u8 *out_ptr = out_buf;
501
502 for (int i = 0; i < in_len; i += 3)
503 {
504 const u8 out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f));
505 const u8 out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f));
506 const u8 out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03));
507 const u8 out_val3 = f ( ((in_ptr[2] >> 0) & 0x3f));
508
509 out_ptr[0] = out_val0 & 0x7f;
510 out_ptr[1] = out_val1 & 0x7f;
511 out_ptr[2] = out_val2 & 0x7f;
512 out_ptr[3] = out_val3 & 0x7f;
513
514 in_ptr += 3;
515 out_ptr += 4;
516 }
517
518 int out_len = (in_len * 8) / 6;
519
520 for (int i = 0; i < (3 - (in_len % 3)); i++)
521 {
522 out_len++;
523
524 out_buf[out_len] = '=';
525 }
526
527 return out_len;
528 }
529
530 int is_valid_hex_char (const u8 c)
531 {
532 if ((c >= '0') && (c <= '9')) return 1;
533 if ((c >= 'A') && (c <= 'F')) return 1;
534 if ((c >= 'a') && (c <= 'f')) return 1;
535
536 return 0;
537 }
538
539 u8 hex_convert (const u8 c)
540 {
541 return (c & 15) + (c >> 6) * 9;
542 }
543
544 u8 hex_to_u8 (const u8 hex[2])
545 {
546 u8 v = 0;
547
548 v |= (hex_convert (hex[1]) << 0);
549 v |= (hex_convert (hex[0]) << 4);
550
551 return (v);
552 }
553
554 u32 hex_to_u32 (const u8 hex[8])
555 {
556 u32 v = 0;
557
558 v |= ((u32) hex_convert (hex[7])) << 0;
559 v |= ((u32) hex_convert (hex[6])) << 4;
560 v |= ((u32) hex_convert (hex[5])) << 8;
561 v |= ((u32) hex_convert (hex[4])) << 12;
562 v |= ((u32) hex_convert (hex[3])) << 16;
563 v |= ((u32) hex_convert (hex[2])) << 20;
564 v |= ((u32) hex_convert (hex[1])) << 24;
565 v |= ((u32) hex_convert (hex[0])) << 28;
566
567 return (v);
568 }
569
570 u64 hex_to_u64 (const u8 hex[16])
571 {
572 u64 v = 0;
573
574 v |= ((u64) hex_convert (hex[15]) << 0);
575 v |= ((u64) hex_convert (hex[14]) << 4);
576 v |= ((u64) hex_convert (hex[13]) << 8);
577 v |= ((u64) hex_convert (hex[12]) << 12);
578 v |= ((u64) hex_convert (hex[11]) << 16);
579 v |= ((u64) hex_convert (hex[10]) << 20);
580 v |= ((u64) hex_convert (hex[ 9]) << 24);
581 v |= ((u64) hex_convert (hex[ 8]) << 28);
582 v |= ((u64) hex_convert (hex[ 7]) << 32);
583 v |= ((u64) hex_convert (hex[ 6]) << 36);
584 v |= ((u64) hex_convert (hex[ 5]) << 40);
585 v |= ((u64) hex_convert (hex[ 4]) << 44);
586 v |= ((u64) hex_convert (hex[ 3]) << 48);
587 v |= ((u64) hex_convert (hex[ 2]) << 52);
588 v |= ((u64) hex_convert (hex[ 1]) << 56);
589 v |= ((u64) hex_convert (hex[ 0]) << 60);
590
591 return (v);
592 }
593
594 void bin_to_hex_lower (const u32 v, u8 hex[8])
595 {
596 hex[0] = v >> 28 & 15;
597 hex[1] = v >> 24 & 15;
598 hex[2] = v >> 20 & 15;
599 hex[3] = v >> 16 & 15;
600 hex[4] = v >> 12 & 15;
601 hex[5] = v >> 8 & 15;
602 hex[6] = v >> 4 & 15;
603 hex[7] = v >> 0 & 15;
604
605 u32 add;
606
607 hex[0] += 6; add = ((hex[0] & 0x10) >> 4) * 39; hex[0] += 42 + add;
608 hex[1] += 6; add = ((hex[1] & 0x10) >> 4) * 39; hex[1] += 42 + add;
609 hex[2] += 6; add = ((hex[2] & 0x10) >> 4) * 39; hex[2] += 42 + add;
610 hex[3] += 6; add = ((hex[3] & 0x10) >> 4) * 39; hex[3] += 42 + add;
611 hex[4] += 6; add = ((hex[4] & 0x10) >> 4) * 39; hex[4] += 42 + add;
612 hex[5] += 6; add = ((hex[5] & 0x10) >> 4) * 39; hex[5] += 42 + add;
613 hex[6] += 6; add = ((hex[6] & 0x10) >> 4) * 39; hex[6] += 42 + add;
614 hex[7] += 6; add = ((hex[7] & 0x10) >> 4) * 39; hex[7] += 42 + add;
615 }
616
617 /**
618 * decoder
619 */
620
621 static void AES128_decrypt_cbc (const u32 key[4], const u32 iv[4], const u32 in[16], u32 out[16])
622 {
623 AES_KEY skey;
624
625 AES_set_decrypt_key ((const u8 *) key, 128, &skey);
626
627 u32 _iv[4];
628
629 _iv[0] = iv[0];
630 _iv[1] = iv[1];
631 _iv[2] = iv[2];
632 _iv[3] = iv[3];
633
634 for (int i = 0; i < 16; i += 4)
635 {
636 u32 _in[4];
637 u32 _out[4];
638
639 _in[0] = in[i + 0];
640 _in[1] = in[i + 1];
641 _in[2] = in[i + 2];
642 _in[3] = in[i + 3];
643
644 AES_decrypt (&skey, (const u8 *) _in, (u8 *) _out);
645
646 _out[0] ^= _iv[0];
647 _out[1] ^= _iv[1];
648 _out[2] ^= _iv[2];
649 _out[3] ^= _iv[3];
650
651 out[i + 0] = _out[0];
652 out[i + 1] = _out[1];
653 out[i + 2] = _out[2];
654 out[i + 3] = _out[3];
655
656 _iv[0] = _in[0];
657 _iv[1] = _in[1];
658 _iv[2] = _in[2];
659 _iv[3] = _in[3];
660 }
661 }
662
663 static void juniper_decrypt_hash (char *in, char *out)
664 {
665 // base64 decode
666
667 u8 base64_buf[100];
668
669 memset (base64_buf, 0, sizeof (base64_buf));
670
671 base64_decode (base64_to_int, (const u8 *) in, DISPLAY_LEN_MIN_501, base64_buf);
672
673 // iv stuff
674
675 u32 juniper_iv[4] = { 0 };
676
677 memcpy (juniper_iv, base64_buf, 12);
678
679 memcpy (out, juniper_iv, 12);
680
681 // reversed key
682
683 u32 juniper_key[4];
684
685 juniper_key[0] = byte_swap_32 (0xa6707a7e);
686 juniper_key[1] = byte_swap_32 (0x8df91059);
687 juniper_key[2] = byte_swap_32 (0xdea70ae5);
688 juniper_key[3] = byte_swap_32 (0x2f9c2442);
689
690 // AES decrypt
691
692 u32 *in_ptr = (u32 *) (base64_buf + 12);
693 u32 *out_ptr = (u32 *) (out + 12);
694
695 AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr);
696 }
697
698 void phpass_decode (u8 digest[16], u8 buf[22])
699 {
700 int l;
701
702 l = itoa64_to_int (buf[ 0]) << 0;
703 l |= itoa64_to_int (buf[ 1]) << 6;
704 l |= itoa64_to_int (buf[ 2]) << 12;
705 l |= itoa64_to_int (buf[ 3]) << 18;
706
707 digest[ 0] = (l >> 0) & 0xff;
708 digest[ 1] = (l >> 8) & 0xff;
709 digest[ 2] = (l >> 16) & 0xff;
710
711 l = itoa64_to_int (buf[ 4]) << 0;
712 l |= itoa64_to_int (buf[ 5]) << 6;
713 l |= itoa64_to_int (buf[ 6]) << 12;
714 l |= itoa64_to_int (buf[ 7]) << 18;
715
716 digest[ 3] = (l >> 0) & 0xff;
717 digest[ 4] = (l >> 8) & 0xff;
718 digest[ 5] = (l >> 16) & 0xff;
719
720 l = itoa64_to_int (buf[ 8]) << 0;
721 l |= itoa64_to_int (buf[ 9]) << 6;
722 l |= itoa64_to_int (buf[10]) << 12;
723 l |= itoa64_to_int (buf[11]) << 18;
724
725 digest[ 6] = (l >> 0) & 0xff;
726 digest[ 7] = (l >> 8) & 0xff;
727 digest[ 8] = (l >> 16) & 0xff;
728
729 l = itoa64_to_int (buf[12]) << 0;
730 l |= itoa64_to_int (buf[13]) << 6;
731 l |= itoa64_to_int (buf[14]) << 12;
732 l |= itoa64_to_int (buf[15]) << 18;
733
734 digest[ 9] = (l >> 0) & 0xff;
735 digest[10] = (l >> 8) & 0xff;
736 digest[11] = (l >> 16) & 0xff;
737
738 l = itoa64_to_int (buf[16]) << 0;
739 l |= itoa64_to_int (buf[17]) << 6;
740 l |= itoa64_to_int (buf[18]) << 12;
741 l |= itoa64_to_int (buf[19]) << 18;
742
743 digest[12] = (l >> 0) & 0xff;
744 digest[13] = (l >> 8) & 0xff;
745 digest[14] = (l >> 16) & 0xff;
746
747 l = itoa64_to_int (buf[20]) << 0;
748 l |= itoa64_to_int (buf[21]) << 6;
749
750 digest[15] = (l >> 0) & 0xff;
751 }
752
753 void phpass_encode (u8 digest[16], u8 buf[22])
754 {
755 int l;
756
757 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
758
759 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
760 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
761 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
762 buf[ 3] = int_to_itoa64 (l & 0x3f);
763
764 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
765
766 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
767 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
768 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
769 buf[ 7] = int_to_itoa64 (l & 0x3f);
770
771 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
772
773 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
774 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
775 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
776 buf[11] = int_to_itoa64 (l & 0x3f);
777
778 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
779
780 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
781 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
782 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
783 buf[15] = int_to_itoa64 (l & 0x3f);
784
785 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
786
787 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
788 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
789 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
790 buf[19] = int_to_itoa64 (l & 0x3f);
791
792 l = (digest[15] << 0);
793
794 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
795 buf[21] = int_to_itoa64 (l & 0x3f);
796 }
797
798 void md5crypt_decode (u8 digest[16], u8 buf[22])
799 {
800 int l;
801
802 l = itoa64_to_int (buf[ 0]) << 0;
803 l |= itoa64_to_int (buf[ 1]) << 6;
804 l |= itoa64_to_int (buf[ 2]) << 12;
805 l |= itoa64_to_int (buf[ 3]) << 18;
806
807 digest[ 0] = (l >> 16) & 0xff;
808 digest[ 6] = (l >> 8) & 0xff;
809 digest[12] = (l >> 0) & 0xff;
810
811 l = itoa64_to_int (buf[ 4]) << 0;
812 l |= itoa64_to_int (buf[ 5]) << 6;
813 l |= itoa64_to_int (buf[ 6]) << 12;
814 l |= itoa64_to_int (buf[ 7]) << 18;
815
816 digest[ 1] = (l >> 16) & 0xff;
817 digest[ 7] = (l >> 8) & 0xff;
818 digest[13] = (l >> 0) & 0xff;
819
820 l = itoa64_to_int (buf[ 8]) << 0;
821 l |= itoa64_to_int (buf[ 9]) << 6;
822 l |= itoa64_to_int (buf[10]) << 12;
823 l |= itoa64_to_int (buf[11]) << 18;
824
825 digest[ 2] = (l >> 16) & 0xff;
826 digest[ 8] = (l >> 8) & 0xff;
827 digest[14] = (l >> 0) & 0xff;
828
829 l = itoa64_to_int (buf[12]) << 0;
830 l |= itoa64_to_int (buf[13]) << 6;
831 l |= itoa64_to_int (buf[14]) << 12;
832 l |= itoa64_to_int (buf[15]) << 18;
833
834 digest[ 3] = (l >> 16) & 0xff;
835 digest[ 9] = (l >> 8) & 0xff;
836 digest[15] = (l >> 0) & 0xff;
837
838 l = itoa64_to_int (buf[16]) << 0;
839 l |= itoa64_to_int (buf[17]) << 6;
840 l |= itoa64_to_int (buf[18]) << 12;
841 l |= itoa64_to_int (buf[19]) << 18;
842
843 digest[ 4] = (l >> 16) & 0xff;
844 digest[10] = (l >> 8) & 0xff;
845 digest[ 5] = (l >> 0) & 0xff;
846
847 l = itoa64_to_int (buf[20]) << 0;
848 l |= itoa64_to_int (buf[21]) << 6;
849
850 digest[11] = (l >> 0) & 0xff;
851 }
852
853 void md5crypt_encode (u8 digest[16], u8 buf[22])
854 {
855 int l;
856
857 l = (digest[ 0] << 16) | (digest[ 6] << 8) | (digest[12] << 0);
858
859 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
860 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
861 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
862 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
863
864 l = (digest[ 1] << 16) | (digest[ 7] << 8) | (digest[13] << 0);
865
866 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
867 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
868 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
869 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
870
871 l = (digest[ 2] << 16) | (digest[ 8] << 8) | (digest[14] << 0);
872
873 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
874 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
875 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
876 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
877
878 l = (digest[ 3] << 16) | (digest[ 9] << 8) | (digest[15] << 0);
879
880 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
881 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
882 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
883 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
884
885 l = (digest[ 4] << 16) | (digest[10] << 8) | (digest[ 5] << 0);
886
887 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
888 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
889 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
890 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
891
892 l = (digest[11] << 0);
893
894 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
895 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
896 }
897
898 void sha512crypt_decode (u8 digest[64], u8 buf[86])
899 {
900 int l;
901
902 l = itoa64_to_int (buf[ 0]) << 0;
903 l |= itoa64_to_int (buf[ 1]) << 6;
904 l |= itoa64_to_int (buf[ 2]) << 12;
905 l |= itoa64_to_int (buf[ 3]) << 18;
906
907 digest[ 0] = (l >> 16) & 0xff;
908 digest[21] = (l >> 8) & 0xff;
909 digest[42] = (l >> 0) & 0xff;
910
911 l = itoa64_to_int (buf[ 4]) << 0;
912 l |= itoa64_to_int (buf[ 5]) << 6;
913 l |= itoa64_to_int (buf[ 6]) << 12;
914 l |= itoa64_to_int (buf[ 7]) << 18;
915
916 digest[22] = (l >> 16) & 0xff;
917 digest[43] = (l >> 8) & 0xff;
918 digest[ 1] = (l >> 0) & 0xff;
919
920 l = itoa64_to_int (buf[ 8]) << 0;
921 l |= itoa64_to_int (buf[ 9]) << 6;
922 l |= itoa64_to_int (buf[10]) << 12;
923 l |= itoa64_to_int (buf[11]) << 18;
924
925 digest[44] = (l >> 16) & 0xff;
926 digest[ 2] = (l >> 8) & 0xff;
927 digest[23] = (l >> 0) & 0xff;
928
929 l = itoa64_to_int (buf[12]) << 0;
930 l |= itoa64_to_int (buf[13]) << 6;
931 l |= itoa64_to_int (buf[14]) << 12;
932 l |= itoa64_to_int (buf[15]) << 18;
933
934 digest[ 3] = (l >> 16) & 0xff;
935 digest[24] = (l >> 8) & 0xff;
936 digest[45] = (l >> 0) & 0xff;
937
938 l = itoa64_to_int (buf[16]) << 0;
939 l |= itoa64_to_int (buf[17]) << 6;
940 l |= itoa64_to_int (buf[18]) << 12;
941 l |= itoa64_to_int (buf[19]) << 18;
942
943 digest[25] = (l >> 16) & 0xff;
944 digest[46] = (l >> 8) & 0xff;
945 digest[ 4] = (l >> 0) & 0xff;
946
947 l = itoa64_to_int (buf[20]) << 0;
948 l |= itoa64_to_int (buf[21]) << 6;
949 l |= itoa64_to_int (buf[22]) << 12;
950 l |= itoa64_to_int (buf[23]) << 18;
951
952 digest[47] = (l >> 16) & 0xff;
953 digest[ 5] = (l >> 8) & 0xff;
954 digest[26] = (l >> 0) & 0xff;
955
956 l = itoa64_to_int (buf[24]) << 0;
957 l |= itoa64_to_int (buf[25]) << 6;
958 l |= itoa64_to_int (buf[26]) << 12;
959 l |= itoa64_to_int (buf[27]) << 18;
960
961 digest[ 6] = (l >> 16) & 0xff;
962 digest[27] = (l >> 8) & 0xff;
963 digest[48] = (l >> 0) & 0xff;
964
965 l = itoa64_to_int (buf[28]) << 0;
966 l |= itoa64_to_int (buf[29]) << 6;
967 l |= itoa64_to_int (buf[30]) << 12;
968 l |= itoa64_to_int (buf[31]) << 18;
969
970 digest[28] = (l >> 16) & 0xff;
971 digest[49] = (l >> 8) & 0xff;
972 digest[ 7] = (l >> 0) & 0xff;
973
974 l = itoa64_to_int (buf[32]) << 0;
975 l |= itoa64_to_int (buf[33]) << 6;
976 l |= itoa64_to_int (buf[34]) << 12;
977 l |= itoa64_to_int (buf[35]) << 18;
978
979 digest[50] = (l >> 16) & 0xff;
980 digest[ 8] = (l >> 8) & 0xff;
981 digest[29] = (l >> 0) & 0xff;
982
983 l = itoa64_to_int (buf[36]) << 0;
984 l |= itoa64_to_int (buf[37]) << 6;
985 l |= itoa64_to_int (buf[38]) << 12;
986 l |= itoa64_to_int (buf[39]) << 18;
987
988 digest[ 9] = (l >> 16) & 0xff;
989 digest[30] = (l >> 8) & 0xff;
990 digest[51] = (l >> 0) & 0xff;
991
992 l = itoa64_to_int (buf[40]) << 0;
993 l |= itoa64_to_int (buf[41]) << 6;
994 l |= itoa64_to_int (buf[42]) << 12;
995 l |= itoa64_to_int (buf[43]) << 18;
996
997 digest[31] = (l >> 16) & 0xff;
998 digest[52] = (l >> 8) & 0xff;
999 digest[10] = (l >> 0) & 0xff;
1000
1001 l = itoa64_to_int (buf[44]) << 0;
1002 l |= itoa64_to_int (buf[45]) << 6;
1003 l |= itoa64_to_int (buf[46]) << 12;
1004 l |= itoa64_to_int (buf[47]) << 18;
1005
1006 digest[53] = (l >> 16) & 0xff;
1007 digest[11] = (l >> 8) & 0xff;
1008 digest[32] = (l >> 0) & 0xff;
1009
1010 l = itoa64_to_int (buf[48]) << 0;
1011 l |= itoa64_to_int (buf[49]) << 6;
1012 l |= itoa64_to_int (buf[50]) << 12;
1013 l |= itoa64_to_int (buf[51]) << 18;
1014
1015 digest[12] = (l >> 16) & 0xff;
1016 digest[33] = (l >> 8) & 0xff;
1017 digest[54] = (l >> 0) & 0xff;
1018
1019 l = itoa64_to_int (buf[52]) << 0;
1020 l |= itoa64_to_int (buf[53]) << 6;
1021 l |= itoa64_to_int (buf[54]) << 12;
1022 l |= itoa64_to_int (buf[55]) << 18;
1023
1024 digest[34] = (l >> 16) & 0xff;
1025 digest[55] = (l >> 8) & 0xff;
1026 digest[13] = (l >> 0) & 0xff;
1027
1028 l = itoa64_to_int (buf[56]) << 0;
1029 l |= itoa64_to_int (buf[57]) << 6;
1030 l |= itoa64_to_int (buf[58]) << 12;
1031 l |= itoa64_to_int (buf[59]) << 18;
1032
1033 digest[56] = (l >> 16) & 0xff;
1034 digest[14] = (l >> 8) & 0xff;
1035 digest[35] = (l >> 0) & 0xff;
1036
1037 l = itoa64_to_int (buf[60]) << 0;
1038 l |= itoa64_to_int (buf[61]) << 6;
1039 l |= itoa64_to_int (buf[62]) << 12;
1040 l |= itoa64_to_int (buf[63]) << 18;
1041
1042 digest[15] = (l >> 16) & 0xff;
1043 digest[36] = (l >> 8) & 0xff;
1044 digest[57] = (l >> 0) & 0xff;
1045
1046 l = itoa64_to_int (buf[64]) << 0;
1047 l |= itoa64_to_int (buf[65]) << 6;
1048 l |= itoa64_to_int (buf[66]) << 12;
1049 l |= itoa64_to_int (buf[67]) << 18;
1050
1051 digest[37] = (l >> 16) & 0xff;
1052 digest[58] = (l >> 8) & 0xff;
1053 digest[16] = (l >> 0) & 0xff;
1054
1055 l = itoa64_to_int (buf[68]) << 0;
1056 l |= itoa64_to_int (buf[69]) << 6;
1057 l |= itoa64_to_int (buf[70]) << 12;
1058 l |= itoa64_to_int (buf[71]) << 18;
1059
1060 digest[59] = (l >> 16) & 0xff;
1061 digest[17] = (l >> 8) & 0xff;
1062 digest[38] = (l >> 0) & 0xff;
1063
1064 l = itoa64_to_int (buf[72]) << 0;
1065 l |= itoa64_to_int (buf[73]) << 6;
1066 l |= itoa64_to_int (buf[74]) << 12;
1067 l |= itoa64_to_int (buf[75]) << 18;
1068
1069 digest[18] = (l >> 16) & 0xff;
1070 digest[39] = (l >> 8) & 0xff;
1071 digest[60] = (l >> 0) & 0xff;
1072
1073 l = itoa64_to_int (buf[76]) << 0;
1074 l |= itoa64_to_int (buf[77]) << 6;
1075 l |= itoa64_to_int (buf[78]) << 12;
1076 l |= itoa64_to_int (buf[79]) << 18;
1077
1078 digest[40] = (l >> 16) & 0xff;
1079 digest[61] = (l >> 8) & 0xff;
1080 digest[19] = (l >> 0) & 0xff;
1081
1082 l = itoa64_to_int (buf[80]) << 0;
1083 l |= itoa64_to_int (buf[81]) << 6;
1084 l |= itoa64_to_int (buf[82]) << 12;
1085 l |= itoa64_to_int (buf[83]) << 18;
1086
1087 digest[62] = (l >> 16) & 0xff;
1088 digest[20] = (l >> 8) & 0xff;
1089 digest[41] = (l >> 0) & 0xff;
1090
1091 l = itoa64_to_int (buf[84]) << 0;
1092 l |= itoa64_to_int (buf[85]) << 6;
1093
1094 digest[63] = (l >> 0) & 0xff;
1095 }
1096
1097 void sha512crypt_encode (u8 digest[64], u8 buf[86])
1098 {
1099 int l;
1100
1101 l = (digest[ 0] << 16) | (digest[21] << 8) | (digest[42] << 0);
1102
1103 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1104 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1105 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1106 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
1107
1108 l = (digest[22] << 16) | (digest[43] << 8) | (digest[ 1] << 0);
1109
1110 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1111 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1112 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1113 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
1114
1115 l = (digest[44] << 16) | (digest[ 2] << 8) | (digest[23] << 0);
1116
1117 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1118 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1119 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1120 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
1121
1122 l = (digest[ 3] << 16) | (digest[24] << 8) | (digest[45] << 0);
1123
1124 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1125 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1126 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1127 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
1128
1129 l = (digest[25] << 16) | (digest[46] << 8) | (digest[ 4] << 0);
1130
1131 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1132 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1133 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1134 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
1135
1136 l = (digest[47] << 16) | (digest[ 5] << 8) | (digest[26] << 0);
1137
1138 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1139 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1140 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1141 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
1142
1143 l = (digest[ 6] << 16) | (digest[27] << 8) | (digest[48] << 0);
1144
1145 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1146 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1147 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1148 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
1149
1150 l = (digest[28] << 16) | (digest[49] << 8) | (digest[ 7] << 0);
1151
1152 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1153 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1154 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1155 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
1156
1157 l = (digest[50] << 16) | (digest[ 8] << 8) | (digest[29] << 0);
1158
1159 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1160 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1161 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1162 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
1163
1164 l = (digest[ 9] << 16) | (digest[30] << 8) | (digest[51] << 0);
1165
1166 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1167 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1168 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1169 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
1170
1171 l = (digest[31] << 16) | (digest[52] << 8) | (digest[10] << 0);
1172
1173 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1174 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1175 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1176 buf[43] = int_to_itoa64 (l & 0x3f); l >>= 6;
1177
1178 l = (digest[53] << 16) | (digest[11] << 8) | (digest[32] << 0);
1179
1180 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1181 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1182 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1183 buf[47] = int_to_itoa64 (l & 0x3f); l >>= 6;
1184
1185 l = (digest[12] << 16) | (digest[33] << 8) | (digest[54] << 0);
1186
1187 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1188 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1189 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1190 buf[51] = int_to_itoa64 (l & 0x3f); l >>= 6;
1191
1192 l = (digest[34] << 16) | (digest[55] << 8) | (digest[13] << 0);
1193
1194 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1195 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1196 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1197 buf[55] = int_to_itoa64 (l & 0x3f); l >>= 6;
1198
1199 l = (digest[56] << 16) | (digest[14] << 8) | (digest[35] << 0);
1200
1201 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1202 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1203 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1204 buf[59] = int_to_itoa64 (l & 0x3f); l >>= 6;
1205
1206 l = (digest[15] << 16) | (digest[36] << 8) | (digest[57] << 0);
1207
1208 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1209 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1210 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1211 buf[63] = int_to_itoa64 (l & 0x3f); l >>= 6;
1212
1213 l = (digest[37] << 16) | (digest[58] << 8) | (digest[16] << 0);
1214
1215 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1216 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1217 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1218 buf[67] = int_to_itoa64 (l & 0x3f); l >>= 6;
1219
1220 l = (digest[59] << 16) | (digest[17] << 8) | (digest[38] << 0);
1221
1222 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1223 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1224 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1225 buf[71] = int_to_itoa64 (l & 0x3f); l >>= 6;
1226
1227 l = (digest[18] << 16) | (digest[39] << 8) | (digest[60] << 0);
1228
1229 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1230 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1231 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1232 buf[75] = int_to_itoa64 (l & 0x3f); l >>= 6;
1233
1234 l = (digest[40] << 16) | (digest[61] << 8) | (digest[19] << 0);
1235
1236 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1237 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1238 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1239 buf[79] = int_to_itoa64 (l & 0x3f); l >>= 6;
1240
1241 l = (digest[62] << 16) | (digest[20] << 8) | (digest[41] << 0);
1242
1243 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1244 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1245 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1246 buf[83] = int_to_itoa64 (l & 0x3f); l >>= 6;
1247
1248 l = 0 | 0 | (digest[63] << 0);
1249
1250 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1251 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1252 }
1253
1254 void sha1aix_decode (u8 digest[20], u8 buf[27])
1255 {
1256 int l;
1257
1258 l = itoa64_to_int (buf[ 0]) << 0;
1259 l |= itoa64_to_int (buf[ 1]) << 6;
1260 l |= itoa64_to_int (buf[ 2]) << 12;
1261 l |= itoa64_to_int (buf[ 3]) << 18;
1262
1263 digest[ 2] = (l >> 0) & 0xff;
1264 digest[ 1] = (l >> 8) & 0xff;
1265 digest[ 0] = (l >> 16) & 0xff;
1266
1267 l = itoa64_to_int (buf[ 4]) << 0;
1268 l |= itoa64_to_int (buf[ 5]) << 6;
1269 l |= itoa64_to_int (buf[ 6]) << 12;
1270 l |= itoa64_to_int (buf[ 7]) << 18;
1271
1272 digest[ 5] = (l >> 0) & 0xff;
1273 digest[ 4] = (l >> 8) & 0xff;
1274 digest[ 3] = (l >> 16) & 0xff;
1275
1276 l = itoa64_to_int (buf[ 8]) << 0;
1277 l |= itoa64_to_int (buf[ 9]) << 6;
1278 l |= itoa64_to_int (buf[10]) << 12;
1279 l |= itoa64_to_int (buf[11]) << 18;
1280
1281 digest[ 8] = (l >> 0) & 0xff;
1282 digest[ 7] = (l >> 8) & 0xff;
1283 digest[ 6] = (l >> 16) & 0xff;
1284
1285 l = itoa64_to_int (buf[12]) << 0;
1286 l |= itoa64_to_int (buf[13]) << 6;
1287 l |= itoa64_to_int (buf[14]) << 12;
1288 l |= itoa64_to_int (buf[15]) << 18;
1289
1290 digest[11] = (l >> 0) & 0xff;
1291 digest[10] = (l >> 8) & 0xff;
1292 digest[ 9] = (l >> 16) & 0xff;
1293
1294 l = itoa64_to_int (buf[16]) << 0;
1295 l |= itoa64_to_int (buf[17]) << 6;
1296 l |= itoa64_to_int (buf[18]) << 12;
1297 l |= itoa64_to_int (buf[19]) << 18;
1298
1299 digest[14] = (l >> 0) & 0xff;
1300 digest[13] = (l >> 8) & 0xff;
1301 digest[12] = (l >> 16) & 0xff;
1302
1303 l = itoa64_to_int (buf[20]) << 0;
1304 l |= itoa64_to_int (buf[21]) << 6;
1305 l |= itoa64_to_int (buf[22]) << 12;
1306 l |= itoa64_to_int (buf[23]) << 18;
1307
1308 digest[17] = (l >> 0) & 0xff;
1309 digest[16] = (l >> 8) & 0xff;
1310 digest[15] = (l >> 16) & 0xff;
1311
1312 l = itoa64_to_int (buf[24]) << 0;
1313 l |= itoa64_to_int (buf[25]) << 6;
1314 l |= itoa64_to_int (buf[26]) << 12;
1315
1316 digest[19] = (l >> 8) & 0xff;
1317 digest[18] = (l >> 16) & 0xff;
1318 }
1319
1320 void sha1aix_encode (u8 digest[20], u8 buf[27])
1321 {
1322 int l;
1323
1324 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1325
1326 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1327 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1328 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1329 buf[ 3] = int_to_itoa64 (l & 0x3f);
1330
1331 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1332
1333 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1334 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1335 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1336 buf[ 7] = int_to_itoa64 (l & 0x3f);
1337
1338 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1339
1340 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1341 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1342 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1343 buf[11] = int_to_itoa64 (l & 0x3f);
1344
1345 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1346
1347 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1348 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1349 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1350 buf[15] = int_to_itoa64 (l & 0x3f);
1351
1352 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1353
1354 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1355 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1356 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1357 buf[19] = int_to_itoa64 (l & 0x3f);
1358
1359 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1360
1361 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1362 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1363 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1364 buf[23] = int_to_itoa64 (l & 0x3f);
1365
1366 l = 0 | (digest[19] << 8) | (digest[18] << 16);
1367
1368 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1369 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1370 buf[26] = int_to_itoa64 (l & 0x3f);
1371 }
1372
1373 void sha256aix_decode (u8 digest[32], u8 buf[43])
1374 {
1375 int l;
1376
1377 l = itoa64_to_int (buf[ 0]) << 0;
1378 l |= itoa64_to_int (buf[ 1]) << 6;
1379 l |= itoa64_to_int (buf[ 2]) << 12;
1380 l |= itoa64_to_int (buf[ 3]) << 18;
1381
1382 digest[ 2] = (l >> 0) & 0xff;
1383 digest[ 1] = (l >> 8) & 0xff;
1384 digest[ 0] = (l >> 16) & 0xff;
1385
1386 l = itoa64_to_int (buf[ 4]) << 0;
1387 l |= itoa64_to_int (buf[ 5]) << 6;
1388 l |= itoa64_to_int (buf[ 6]) << 12;
1389 l |= itoa64_to_int (buf[ 7]) << 18;
1390
1391 digest[ 5] = (l >> 0) & 0xff;
1392 digest[ 4] = (l >> 8) & 0xff;
1393 digest[ 3] = (l >> 16) & 0xff;
1394
1395 l = itoa64_to_int (buf[ 8]) << 0;
1396 l |= itoa64_to_int (buf[ 9]) << 6;
1397 l |= itoa64_to_int (buf[10]) << 12;
1398 l |= itoa64_to_int (buf[11]) << 18;
1399
1400 digest[ 8] = (l >> 0) & 0xff;
1401 digest[ 7] = (l >> 8) & 0xff;
1402 digest[ 6] = (l >> 16) & 0xff;
1403
1404 l = itoa64_to_int (buf[12]) << 0;
1405 l |= itoa64_to_int (buf[13]) << 6;
1406 l |= itoa64_to_int (buf[14]) << 12;
1407 l |= itoa64_to_int (buf[15]) << 18;
1408
1409 digest[11] = (l >> 0) & 0xff;
1410 digest[10] = (l >> 8) & 0xff;
1411 digest[ 9] = (l >> 16) & 0xff;
1412
1413 l = itoa64_to_int (buf[16]) << 0;
1414 l |= itoa64_to_int (buf[17]) << 6;
1415 l |= itoa64_to_int (buf[18]) << 12;
1416 l |= itoa64_to_int (buf[19]) << 18;
1417
1418 digest[14] = (l >> 0) & 0xff;
1419 digest[13] = (l >> 8) & 0xff;
1420 digest[12] = (l >> 16) & 0xff;
1421
1422 l = itoa64_to_int (buf[20]) << 0;
1423 l |= itoa64_to_int (buf[21]) << 6;
1424 l |= itoa64_to_int (buf[22]) << 12;
1425 l |= itoa64_to_int (buf[23]) << 18;
1426
1427 digest[17] = (l >> 0) & 0xff;
1428 digest[16] = (l >> 8) & 0xff;
1429 digest[15] = (l >> 16) & 0xff;
1430
1431 l = itoa64_to_int (buf[24]) << 0;
1432 l |= itoa64_to_int (buf[25]) << 6;
1433 l |= itoa64_to_int (buf[26]) << 12;
1434 l |= itoa64_to_int (buf[27]) << 18;
1435
1436 digest[20] = (l >> 0) & 0xff;
1437 digest[19] = (l >> 8) & 0xff;
1438 digest[18] = (l >> 16) & 0xff;
1439
1440 l = itoa64_to_int (buf[28]) << 0;
1441 l |= itoa64_to_int (buf[29]) << 6;
1442 l |= itoa64_to_int (buf[30]) << 12;
1443 l |= itoa64_to_int (buf[31]) << 18;
1444
1445 digest[23] = (l >> 0) & 0xff;
1446 digest[22] = (l >> 8) & 0xff;
1447 digest[21] = (l >> 16) & 0xff;
1448
1449 l = itoa64_to_int (buf[32]) << 0;
1450 l |= itoa64_to_int (buf[33]) << 6;
1451 l |= itoa64_to_int (buf[34]) << 12;
1452 l |= itoa64_to_int (buf[35]) << 18;
1453
1454 digest[26] = (l >> 0) & 0xff;
1455 digest[25] = (l >> 8) & 0xff;
1456 digest[24] = (l >> 16) & 0xff;
1457
1458 l = itoa64_to_int (buf[36]) << 0;
1459 l |= itoa64_to_int (buf[37]) << 6;
1460 l |= itoa64_to_int (buf[38]) << 12;
1461 l |= itoa64_to_int (buf[39]) << 18;
1462
1463 digest[29] = (l >> 0) & 0xff;
1464 digest[28] = (l >> 8) & 0xff;
1465 digest[27] = (l >> 16) & 0xff;
1466
1467 l = itoa64_to_int (buf[40]) << 0;
1468 l |= itoa64_to_int (buf[41]) << 6;
1469 l |= itoa64_to_int (buf[42]) << 12;
1470
1471 //digest[32] = (l >> 0) & 0xff;
1472 digest[31] = (l >> 8) & 0xff;
1473 digest[30] = (l >> 16) & 0xff;
1474 }
1475
1476 void sha256aix_encode (u8 digest[32], u8 buf[43])
1477 {
1478 int l;
1479
1480 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1481
1482 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1483 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1484 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1485 buf[ 3] = int_to_itoa64 (l & 0x3f);
1486
1487 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1488
1489 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1490 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1491 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1492 buf[ 7] = int_to_itoa64 (l & 0x3f);
1493
1494 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1495
1496 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1497 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1498 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1499 buf[11] = int_to_itoa64 (l & 0x3f);
1500
1501 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1502
1503 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1504 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1505 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1506 buf[15] = int_to_itoa64 (l & 0x3f);
1507
1508 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1509
1510 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1511 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1512 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1513 buf[19] = int_to_itoa64 (l & 0x3f);
1514
1515 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1516
1517 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1518 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1519 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1520 buf[23] = int_to_itoa64 (l & 0x3f);
1521
1522 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1523
1524 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1525 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1526 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1527 buf[27] = int_to_itoa64 (l & 0x3f);
1528
1529 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1530
1531 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1532 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1533 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1534 buf[31] = int_to_itoa64 (l & 0x3f);
1535
1536 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1537
1538 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1539 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1540 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1541 buf[35] = int_to_itoa64 (l & 0x3f);
1542
1543 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1544
1545 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1546 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1547 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1548 buf[39] = int_to_itoa64 (l & 0x3f);
1549
1550 l = 0 | (digest[31] << 8) | (digest[30] << 16);
1551
1552 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1553 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1554 buf[42] = int_to_itoa64 (l & 0x3f);
1555 }
1556
1557 void sha512aix_decode (u8 digest[64], u8 buf[86])
1558 {
1559 int l;
1560
1561 l = itoa64_to_int (buf[ 0]) << 0;
1562 l |= itoa64_to_int (buf[ 1]) << 6;
1563 l |= itoa64_to_int (buf[ 2]) << 12;
1564 l |= itoa64_to_int (buf[ 3]) << 18;
1565
1566 digest[ 2] = (l >> 0) & 0xff;
1567 digest[ 1] = (l >> 8) & 0xff;
1568 digest[ 0] = (l >> 16) & 0xff;
1569
1570 l = itoa64_to_int (buf[ 4]) << 0;
1571 l |= itoa64_to_int (buf[ 5]) << 6;
1572 l |= itoa64_to_int (buf[ 6]) << 12;
1573 l |= itoa64_to_int (buf[ 7]) << 18;
1574
1575 digest[ 5] = (l >> 0) & 0xff;
1576 digest[ 4] = (l >> 8) & 0xff;
1577 digest[ 3] = (l >> 16) & 0xff;
1578
1579 l = itoa64_to_int (buf[ 8]) << 0;
1580 l |= itoa64_to_int (buf[ 9]) << 6;
1581 l |= itoa64_to_int (buf[10]) << 12;
1582 l |= itoa64_to_int (buf[11]) << 18;
1583
1584 digest[ 8] = (l >> 0) & 0xff;
1585 digest[ 7] = (l >> 8) & 0xff;
1586 digest[ 6] = (l >> 16) & 0xff;
1587
1588 l = itoa64_to_int (buf[12]) << 0;
1589 l |= itoa64_to_int (buf[13]) << 6;
1590 l |= itoa64_to_int (buf[14]) << 12;
1591 l |= itoa64_to_int (buf[15]) << 18;
1592
1593 digest[11] = (l >> 0) & 0xff;
1594 digest[10] = (l >> 8) & 0xff;
1595 digest[ 9] = (l >> 16) & 0xff;
1596
1597 l = itoa64_to_int (buf[16]) << 0;
1598 l |= itoa64_to_int (buf[17]) << 6;
1599 l |= itoa64_to_int (buf[18]) << 12;
1600 l |= itoa64_to_int (buf[19]) << 18;
1601
1602 digest[14] = (l >> 0) & 0xff;
1603 digest[13] = (l >> 8) & 0xff;
1604 digest[12] = (l >> 16) & 0xff;
1605
1606 l = itoa64_to_int (buf[20]) << 0;
1607 l |= itoa64_to_int (buf[21]) << 6;
1608 l |= itoa64_to_int (buf[22]) << 12;
1609 l |= itoa64_to_int (buf[23]) << 18;
1610
1611 digest[17] = (l >> 0) & 0xff;
1612 digest[16] = (l >> 8) & 0xff;
1613 digest[15] = (l >> 16) & 0xff;
1614
1615 l = itoa64_to_int (buf[24]) << 0;
1616 l |= itoa64_to_int (buf[25]) << 6;
1617 l |= itoa64_to_int (buf[26]) << 12;
1618 l |= itoa64_to_int (buf[27]) << 18;
1619
1620 digest[20] = (l >> 0) & 0xff;
1621 digest[19] = (l >> 8) & 0xff;
1622 digest[18] = (l >> 16) & 0xff;
1623
1624 l = itoa64_to_int (buf[28]) << 0;
1625 l |= itoa64_to_int (buf[29]) << 6;
1626 l |= itoa64_to_int (buf[30]) << 12;
1627 l |= itoa64_to_int (buf[31]) << 18;
1628
1629 digest[23] = (l >> 0) & 0xff;
1630 digest[22] = (l >> 8) & 0xff;
1631 digest[21] = (l >> 16) & 0xff;
1632
1633 l = itoa64_to_int (buf[32]) << 0;
1634 l |= itoa64_to_int (buf[33]) << 6;
1635 l |= itoa64_to_int (buf[34]) << 12;
1636 l |= itoa64_to_int (buf[35]) << 18;
1637
1638 digest[26] = (l >> 0) & 0xff;
1639 digest[25] = (l >> 8) & 0xff;
1640 digest[24] = (l >> 16) & 0xff;
1641
1642 l = itoa64_to_int (buf[36]) << 0;
1643 l |= itoa64_to_int (buf[37]) << 6;
1644 l |= itoa64_to_int (buf[38]) << 12;
1645 l |= itoa64_to_int (buf[39]) << 18;
1646
1647 digest[29] = (l >> 0) & 0xff;
1648 digest[28] = (l >> 8) & 0xff;
1649 digest[27] = (l >> 16) & 0xff;
1650
1651 l = itoa64_to_int (buf[40]) << 0;
1652 l |= itoa64_to_int (buf[41]) << 6;
1653 l |= itoa64_to_int (buf[42]) << 12;
1654 l |= itoa64_to_int (buf[43]) << 18;
1655
1656 digest[32] = (l >> 0) & 0xff;
1657 digest[31] = (l >> 8) & 0xff;
1658 digest[30] = (l >> 16) & 0xff;
1659
1660 l = itoa64_to_int (buf[44]) << 0;
1661 l |= itoa64_to_int (buf[45]) << 6;
1662 l |= itoa64_to_int (buf[46]) << 12;
1663 l |= itoa64_to_int (buf[47]) << 18;
1664
1665 digest[35] = (l >> 0) & 0xff;
1666 digest[34] = (l >> 8) & 0xff;
1667 digest[33] = (l >> 16) & 0xff;
1668
1669 l = itoa64_to_int (buf[48]) << 0;
1670 l |= itoa64_to_int (buf[49]) << 6;
1671 l |= itoa64_to_int (buf[50]) << 12;
1672 l |= itoa64_to_int (buf[51]) << 18;
1673
1674 digest[38] = (l >> 0) & 0xff;
1675 digest[37] = (l >> 8) & 0xff;
1676 digest[36] = (l >> 16) & 0xff;
1677
1678 l = itoa64_to_int (buf[52]) << 0;
1679 l |= itoa64_to_int (buf[53]) << 6;
1680 l |= itoa64_to_int (buf[54]) << 12;
1681 l |= itoa64_to_int (buf[55]) << 18;
1682
1683 digest[41] = (l >> 0) & 0xff;
1684 digest[40] = (l >> 8) & 0xff;
1685 digest[39] = (l >> 16) & 0xff;
1686
1687 l = itoa64_to_int (buf[56]) << 0;
1688 l |= itoa64_to_int (buf[57]) << 6;
1689 l |= itoa64_to_int (buf[58]) << 12;
1690 l |= itoa64_to_int (buf[59]) << 18;
1691
1692 digest[44] = (l >> 0) & 0xff;
1693 digest[43] = (l >> 8) & 0xff;
1694 digest[42] = (l >> 16) & 0xff;
1695
1696 l = itoa64_to_int (buf[60]) << 0;
1697 l |= itoa64_to_int (buf[61]) << 6;
1698 l |= itoa64_to_int (buf[62]) << 12;
1699 l |= itoa64_to_int (buf[63]) << 18;
1700
1701 digest[47] = (l >> 0) & 0xff;
1702 digest[46] = (l >> 8) & 0xff;
1703 digest[45] = (l >> 16) & 0xff;
1704
1705 l = itoa64_to_int (buf[64]) << 0;
1706 l |= itoa64_to_int (buf[65]) << 6;
1707 l |= itoa64_to_int (buf[66]) << 12;
1708 l |= itoa64_to_int (buf[67]) << 18;
1709
1710 digest[50] = (l >> 0) & 0xff;
1711 digest[49] = (l >> 8) & 0xff;
1712 digest[48] = (l >> 16) & 0xff;
1713
1714 l = itoa64_to_int (buf[68]) << 0;
1715 l |= itoa64_to_int (buf[69]) << 6;
1716 l |= itoa64_to_int (buf[70]) << 12;
1717 l |= itoa64_to_int (buf[71]) << 18;
1718
1719 digest[53] = (l >> 0) & 0xff;
1720 digest[52] = (l >> 8) & 0xff;
1721 digest[51] = (l >> 16) & 0xff;
1722
1723 l = itoa64_to_int (buf[72]) << 0;
1724 l |= itoa64_to_int (buf[73]) << 6;
1725 l |= itoa64_to_int (buf[74]) << 12;
1726 l |= itoa64_to_int (buf[75]) << 18;
1727
1728 digest[56] = (l >> 0) & 0xff;
1729 digest[55] = (l >> 8) & 0xff;
1730 digest[54] = (l >> 16) & 0xff;
1731
1732 l = itoa64_to_int (buf[76]) << 0;
1733 l |= itoa64_to_int (buf[77]) << 6;
1734 l |= itoa64_to_int (buf[78]) << 12;
1735 l |= itoa64_to_int (buf[79]) << 18;
1736
1737 digest[59] = (l >> 0) & 0xff;
1738 digest[58] = (l >> 8) & 0xff;
1739 digest[57] = (l >> 16) & 0xff;
1740
1741 l = itoa64_to_int (buf[80]) << 0;
1742 l |= itoa64_to_int (buf[81]) << 6;
1743 l |= itoa64_to_int (buf[82]) << 12;
1744 l |= itoa64_to_int (buf[83]) << 18;
1745
1746 digest[62] = (l >> 0) & 0xff;
1747 digest[61] = (l >> 8) & 0xff;
1748 digest[60] = (l >> 16) & 0xff;
1749
1750 l = itoa64_to_int (buf[84]) << 0;
1751 l |= itoa64_to_int (buf[85]) << 6;
1752
1753 digest[63] = (l >> 16) & 0xff;
1754 }
1755
1756 void sha512aix_encode (u8 digest[64], u8 buf[86])
1757 {
1758 int l;
1759
1760 l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16);
1761
1762 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
1763 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
1764 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
1765 buf[ 3] = int_to_itoa64 (l & 0x3f);
1766
1767 l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16);
1768
1769 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
1770 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
1771 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
1772 buf[ 7] = int_to_itoa64 (l & 0x3f);
1773
1774 l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16);
1775
1776 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
1777 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
1778 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
1779 buf[11] = int_to_itoa64 (l & 0x3f);
1780
1781 l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16);
1782
1783 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
1784 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
1785 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
1786 buf[15] = int_to_itoa64 (l & 0x3f);
1787
1788 l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16);
1789
1790 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
1791 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
1792 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
1793 buf[19] = int_to_itoa64 (l & 0x3f);
1794
1795 l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16);
1796
1797 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
1798 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
1799 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
1800 buf[23] = int_to_itoa64 (l & 0x3f);
1801
1802 l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16);
1803
1804 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
1805 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
1806 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
1807 buf[27] = int_to_itoa64 (l & 0x3f);
1808
1809 l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16);
1810
1811 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
1812 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
1813 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
1814 buf[31] = int_to_itoa64 (l & 0x3f);
1815
1816 l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16);
1817
1818 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
1819 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
1820 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
1821 buf[35] = int_to_itoa64 (l & 0x3f);
1822
1823 l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16);
1824
1825 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
1826 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
1827 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
1828 buf[39] = int_to_itoa64 (l & 0x3f);
1829
1830 l = (digest[32] << 0) | (digest[31] << 8) | (digest[30] << 16);
1831
1832 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
1833 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
1834 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
1835 buf[43] = int_to_itoa64 (l & 0x3f);
1836
1837 l = (digest[35] << 0) | (digest[34] << 8) | (digest[33] << 16);
1838
1839 buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6;
1840 buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6;
1841 buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6;
1842 buf[47] = int_to_itoa64 (l & 0x3f);
1843
1844 l = (digest[38] << 0) | (digest[37] << 8) | (digest[36] << 16);
1845
1846 buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6;
1847 buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6;
1848 buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6;
1849 buf[51] = int_to_itoa64 (l & 0x3f);
1850
1851 l = (digest[41] << 0) | (digest[40] << 8) | (digest[39] << 16);
1852
1853 buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6;
1854 buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6;
1855 buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6;
1856 buf[55] = int_to_itoa64 (l & 0x3f);
1857
1858 l = (digest[44] << 0) | (digest[43] << 8) | (digest[42] << 16);
1859
1860 buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6;
1861 buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6;
1862 buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6;
1863 buf[59] = int_to_itoa64 (l & 0x3f);
1864
1865 l = (digest[47] << 0) | (digest[46] << 8) | (digest[45] << 16);
1866
1867 buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6;
1868 buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6;
1869 buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6;
1870 buf[63] = int_to_itoa64 (l & 0x3f);
1871
1872 l = (digest[50] << 0) | (digest[49] << 8) | (digest[48] << 16);
1873
1874 buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6;
1875 buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6;
1876 buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6;
1877 buf[67] = int_to_itoa64 (l & 0x3f);
1878
1879 l = (digest[53] << 0) | (digest[52] << 8) | (digest[51] << 16);
1880
1881 buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6;
1882 buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6;
1883 buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6;
1884 buf[71] = int_to_itoa64 (l & 0x3f);
1885
1886 l = (digest[56] << 0) | (digest[55] << 8) | (digest[54] << 16);
1887
1888 buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6;
1889 buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6;
1890 buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6;
1891 buf[75] = int_to_itoa64 (l & 0x3f);
1892
1893 l = (digest[59] << 0) | (digest[58] << 8) | (digest[57] << 16);
1894
1895 buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6;
1896 buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6;
1897 buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6;
1898 buf[79] = int_to_itoa64 (l & 0x3f);
1899
1900 l = (digest[62] << 0) | (digest[61] << 8) | (digest[60] << 16);
1901
1902 buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6;
1903 buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6;
1904 buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6;
1905 buf[83] = int_to_itoa64 (l & 0x3f);
1906
1907 l = 0 | 0 | (digest[63] << 16);
1908
1909 buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6;
1910 buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6;
1911 }
1912
1913 void sha256crypt_decode (u8 digest[32], u8 buf[43])
1914 {
1915 int l;
1916
1917 l = itoa64_to_int (buf[ 0]) << 0;
1918 l |= itoa64_to_int (buf[ 1]) << 6;
1919 l |= itoa64_to_int (buf[ 2]) << 12;
1920 l |= itoa64_to_int (buf[ 3]) << 18;
1921
1922 digest[ 0] = (l >> 16) & 0xff;
1923 digest[10] = (l >> 8) & 0xff;
1924 digest[20] = (l >> 0) & 0xff;
1925
1926 l = itoa64_to_int (buf[ 4]) << 0;
1927 l |= itoa64_to_int (buf[ 5]) << 6;
1928 l |= itoa64_to_int (buf[ 6]) << 12;
1929 l |= itoa64_to_int (buf[ 7]) << 18;
1930
1931 digest[21] = (l >> 16) & 0xff;
1932 digest[ 1] = (l >> 8) & 0xff;
1933 digest[11] = (l >> 0) & 0xff;
1934
1935 l = itoa64_to_int (buf[ 8]) << 0;
1936 l |= itoa64_to_int (buf[ 9]) << 6;
1937 l |= itoa64_to_int (buf[10]) << 12;
1938 l |= itoa64_to_int (buf[11]) << 18;
1939
1940 digest[12] = (l >> 16) & 0xff;
1941 digest[22] = (l >> 8) & 0xff;
1942 digest[ 2] = (l >> 0) & 0xff;
1943
1944 l = itoa64_to_int (buf[12]) << 0;
1945 l |= itoa64_to_int (buf[13]) << 6;
1946 l |= itoa64_to_int (buf[14]) << 12;
1947 l |= itoa64_to_int (buf[15]) << 18;
1948
1949 digest[ 3] = (l >> 16) & 0xff;
1950 digest[13] = (l >> 8) & 0xff;
1951 digest[23] = (l >> 0) & 0xff;
1952
1953 l = itoa64_to_int (buf[16]) << 0;
1954 l |= itoa64_to_int (buf[17]) << 6;
1955 l |= itoa64_to_int (buf[18]) << 12;
1956 l |= itoa64_to_int (buf[19]) << 18;
1957
1958 digest[24] = (l >> 16) & 0xff;
1959 digest[ 4] = (l >> 8) & 0xff;
1960 digest[14] = (l >> 0) & 0xff;
1961
1962 l = itoa64_to_int (buf[20]) << 0;
1963 l |= itoa64_to_int (buf[21]) << 6;
1964 l |= itoa64_to_int (buf[22]) << 12;
1965 l |= itoa64_to_int (buf[23]) << 18;
1966
1967 digest[15] = (l >> 16) & 0xff;
1968 digest[25] = (l >> 8) & 0xff;
1969 digest[ 5] = (l >> 0) & 0xff;
1970
1971 l = itoa64_to_int (buf[24]) << 0;
1972 l |= itoa64_to_int (buf[25]) << 6;
1973 l |= itoa64_to_int (buf[26]) << 12;
1974 l |= itoa64_to_int (buf[27]) << 18;
1975
1976 digest[ 6] = (l >> 16) & 0xff;
1977 digest[16] = (l >> 8) & 0xff;
1978 digest[26] = (l >> 0) & 0xff;
1979
1980 l = itoa64_to_int (buf[28]) << 0;
1981 l |= itoa64_to_int (buf[29]) << 6;
1982 l |= itoa64_to_int (buf[30]) << 12;
1983 l |= itoa64_to_int (buf[31]) << 18;
1984
1985 digest[27] = (l >> 16) & 0xff;
1986 digest[ 7] = (l >> 8) & 0xff;
1987 digest[17] = (l >> 0) & 0xff;
1988
1989 l = itoa64_to_int (buf[32]) << 0;
1990 l |= itoa64_to_int (buf[33]) << 6;
1991 l |= itoa64_to_int (buf[34]) << 12;
1992 l |= itoa64_to_int (buf[35]) << 18;
1993
1994 digest[18] = (l >> 16) & 0xff;
1995 digest[28] = (l >> 8) & 0xff;
1996 digest[ 8] = (l >> 0) & 0xff;
1997
1998 l = itoa64_to_int (buf[36]) << 0;
1999 l |= itoa64_to_int (buf[37]) << 6;
2000 l |= itoa64_to_int (buf[38]) << 12;
2001 l |= itoa64_to_int (buf[39]) << 18;
2002
2003 digest[ 9] = (l >> 16) & 0xff;
2004 digest[19] = (l >> 8) & 0xff;
2005 digest[29] = (l >> 0) & 0xff;
2006
2007 l = itoa64_to_int (buf[40]) << 0;
2008 l |= itoa64_to_int (buf[41]) << 6;
2009 l |= itoa64_to_int (buf[42]) << 12;
2010
2011 digest[31] = (l >> 8) & 0xff;
2012 digest[30] = (l >> 0) & 0xff;
2013 }
2014
2015 void sha256crypt_encode (u8 digest[32], u8 buf[43])
2016 {
2017 int l;
2018
2019 l = (digest[ 0] << 16) | (digest[10] << 8) | (digest[20] << 0);
2020
2021 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2022 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2023 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2024 buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6;
2025
2026 l = (digest[21] << 16) | (digest[ 1] << 8) | (digest[11] << 0);
2027
2028 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2029 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2030 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2031 buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6;
2032
2033 l = (digest[12] << 16) | (digest[22] << 8) | (digest[ 2] << 0);
2034
2035 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2036 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2037 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2038 buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6;
2039
2040 l = (digest[ 3] << 16) | (digest[13] << 8) | (digest[23] << 0);
2041
2042 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2043 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2044 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2045 buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6;
2046
2047 l = (digest[24] << 16) | (digest[ 4] << 8) | (digest[14] << 0);
2048
2049 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2050 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2051 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2052 buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6;
2053
2054 l = (digest[15] << 16) | (digest[25] << 8) | (digest[ 5] << 0);
2055
2056 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2057 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2058 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2059 buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6;
2060
2061 l = (digest[ 6] << 16) | (digest[16] << 8) | (digest[26] << 0);
2062
2063 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2064 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2065 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2066 buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6;
2067
2068 l = (digest[27] << 16) | (digest[ 7] << 8) | (digest[17] << 0);
2069
2070 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2071 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2072 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2073 buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6;
2074
2075 l = (digest[18] << 16) | (digest[28] << 8) | (digest[ 8] << 0);
2076
2077 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2078 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2079 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2080 buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6;
2081
2082 l = (digest[ 9] << 16) | (digest[19] << 8) | (digest[29] << 0);
2083
2084 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2085 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2086 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2087 buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6;
2088
2089 l = 0 | (digest[31] << 8) | (digest[30] << 0);
2090
2091 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2092 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2093 buf[42] = int_to_itoa64 (l & 0x3f);
2094 }
2095
2096 void drupal7_decode (u8 digest[64], u8 buf[44])
2097 {
2098 int l;
2099
2100 l = itoa64_to_int (buf[ 0]) << 0;
2101 l |= itoa64_to_int (buf[ 1]) << 6;
2102 l |= itoa64_to_int (buf[ 2]) << 12;
2103 l |= itoa64_to_int (buf[ 3]) << 18;
2104
2105 digest[ 0] = (l >> 0) & 0xff;
2106 digest[ 1] = (l >> 8) & 0xff;
2107 digest[ 2] = (l >> 16) & 0xff;
2108
2109 l = itoa64_to_int (buf[ 4]) << 0;
2110 l |= itoa64_to_int (buf[ 5]) << 6;
2111 l |= itoa64_to_int (buf[ 6]) << 12;
2112 l |= itoa64_to_int (buf[ 7]) << 18;
2113
2114 digest[ 3] = (l >> 0) & 0xff;
2115 digest[ 4] = (l >> 8) & 0xff;
2116 digest[ 5] = (l >> 16) & 0xff;
2117
2118 l = itoa64_to_int (buf[ 8]) << 0;
2119 l |= itoa64_to_int (buf[ 9]) << 6;
2120 l |= itoa64_to_int (buf[10]) << 12;
2121 l |= itoa64_to_int (buf[11]) << 18;
2122
2123 digest[ 6] = (l >> 0) & 0xff;
2124 digest[ 7] = (l >> 8) & 0xff;
2125 digest[ 8] = (l >> 16) & 0xff;
2126
2127 l = itoa64_to_int (buf[12]) << 0;
2128 l |= itoa64_to_int (buf[13]) << 6;
2129 l |= itoa64_to_int (buf[14]) << 12;
2130 l |= itoa64_to_int (buf[15]) << 18;
2131
2132 digest[ 9] = (l >> 0) & 0xff;
2133 digest[10] = (l >> 8) & 0xff;
2134 digest[11] = (l >> 16) & 0xff;
2135
2136 l = itoa64_to_int (buf[16]) << 0;
2137 l |= itoa64_to_int (buf[17]) << 6;
2138 l |= itoa64_to_int (buf[18]) << 12;
2139 l |= itoa64_to_int (buf[19]) << 18;
2140
2141 digest[12] = (l >> 0) & 0xff;
2142 digest[13] = (l >> 8) & 0xff;
2143 digest[14] = (l >> 16) & 0xff;
2144
2145 l = itoa64_to_int (buf[20]) << 0;
2146 l |= itoa64_to_int (buf[21]) << 6;
2147 l |= itoa64_to_int (buf[22]) << 12;
2148 l |= itoa64_to_int (buf[23]) << 18;
2149
2150 digest[15] = (l >> 0) & 0xff;
2151 digest[16] = (l >> 8) & 0xff;
2152 digest[17] = (l >> 16) & 0xff;
2153
2154 l = itoa64_to_int (buf[24]) << 0;
2155 l |= itoa64_to_int (buf[25]) << 6;
2156 l |= itoa64_to_int (buf[26]) << 12;
2157 l |= itoa64_to_int (buf[27]) << 18;
2158
2159 digest[18] = (l >> 0) & 0xff;
2160 digest[19] = (l >> 8) & 0xff;
2161 digest[20] = (l >> 16) & 0xff;
2162
2163 l = itoa64_to_int (buf[28]) << 0;
2164 l |= itoa64_to_int (buf[29]) << 6;
2165 l |= itoa64_to_int (buf[30]) << 12;
2166 l |= itoa64_to_int (buf[31]) << 18;
2167
2168 digest[21] = (l >> 0) & 0xff;
2169 digest[22] = (l >> 8) & 0xff;
2170 digest[23] = (l >> 16) & 0xff;
2171
2172 l = itoa64_to_int (buf[32]) << 0;
2173 l |= itoa64_to_int (buf[33]) << 6;
2174 l |= itoa64_to_int (buf[34]) << 12;
2175 l |= itoa64_to_int (buf[35]) << 18;
2176
2177 digest[24] = (l >> 0) & 0xff;
2178 digest[25] = (l >> 8) & 0xff;
2179 digest[26] = (l >> 16) & 0xff;
2180
2181 l = itoa64_to_int (buf[36]) << 0;
2182 l |= itoa64_to_int (buf[37]) << 6;
2183 l |= itoa64_to_int (buf[38]) << 12;
2184 l |= itoa64_to_int (buf[39]) << 18;
2185
2186 digest[27] = (l >> 0) & 0xff;
2187 digest[28] = (l >> 8) & 0xff;
2188 digest[29] = (l >> 16) & 0xff;
2189
2190 l = itoa64_to_int (buf[40]) << 0;
2191 l |= itoa64_to_int (buf[41]) << 6;
2192 l |= itoa64_to_int (buf[42]) << 12;
2193 l |= itoa64_to_int (buf[43]) << 18;
2194
2195 digest[30] = (l >> 0) & 0xff;
2196 digest[31] = (l >> 8) & 0xff;
2197 digest[32] = (l >> 16) & 0xff;
2198
2199 digest[33] = 0;
2200 digest[34] = 0;
2201 digest[35] = 0;
2202 digest[36] = 0;
2203 digest[37] = 0;
2204 digest[38] = 0;
2205 digest[39] = 0;
2206 digest[40] = 0;
2207 digest[41] = 0;
2208 digest[42] = 0;
2209 digest[43] = 0;
2210 digest[44] = 0;
2211 digest[45] = 0;
2212 digest[46] = 0;
2213 digest[47] = 0;
2214 digest[48] = 0;
2215 digest[49] = 0;
2216 digest[50] = 0;
2217 digest[51] = 0;
2218 digest[52] = 0;
2219 digest[53] = 0;
2220 digest[54] = 0;
2221 digest[55] = 0;
2222 digest[56] = 0;
2223 digest[57] = 0;
2224 digest[58] = 0;
2225 digest[59] = 0;
2226 digest[60] = 0;
2227 digest[61] = 0;
2228 digest[62] = 0;
2229 digest[63] = 0;
2230 }
2231
2232 void drupal7_encode (u8 digest[64], u8 buf[43])
2233 {
2234 int l;
2235
2236 l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16);
2237
2238 buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6;
2239 buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6;
2240 buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6;
2241 buf[ 3] = int_to_itoa64 (l & 0x3f);
2242
2243 l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16);
2244
2245 buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6;
2246 buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6;
2247 buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6;
2248 buf[ 7] = int_to_itoa64 (l & 0x3f);
2249
2250 l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16);
2251
2252 buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6;
2253 buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6;
2254 buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6;
2255 buf[11] = int_to_itoa64 (l & 0x3f);
2256
2257 l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16);
2258
2259 buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6;
2260 buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6;
2261 buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6;
2262 buf[15] = int_to_itoa64 (l & 0x3f);
2263
2264 l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16);
2265
2266 buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6;
2267 buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6;
2268 buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6;
2269 buf[19] = int_to_itoa64 (l & 0x3f);
2270
2271 l = (digest[15] << 0) | (digest[16] << 8) | (digest[17] << 16);
2272
2273 buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6;
2274 buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6;
2275 buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6;
2276 buf[23] = int_to_itoa64 (l & 0x3f);
2277
2278 l = (digest[18] << 0) | (digest[19] << 8) | (digest[20] << 16);
2279
2280 buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6;
2281 buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6;
2282 buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6;
2283 buf[27] = int_to_itoa64 (l & 0x3f);
2284
2285 l = (digest[21] << 0) | (digest[22] << 8) | (digest[23] << 16);
2286
2287 buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6;
2288 buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6;
2289 buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6;
2290 buf[31] = int_to_itoa64 (l & 0x3f);
2291
2292 l = (digest[24] << 0) | (digest[25] << 8) | (digest[26] << 16);
2293
2294 buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6;
2295 buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6;
2296 buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6;
2297 buf[35] = int_to_itoa64 (l & 0x3f);
2298
2299 l = (digest[27] << 0) | (digest[28] << 8) | (digest[29] << 16);
2300
2301 buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6;
2302 buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6;
2303 buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6;
2304 buf[39] = int_to_itoa64 (l & 0x3f);
2305
2306 l = (digest[30] << 0) | (digest[31] << 8) | (digest[32] << 16);
2307
2308 buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6;
2309 buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6;
2310 buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6;
2311 //buf[43] = int_to_itoa64 (l & 0x3f);
2312 }
2313
2314 /**
2315 * tty
2316 */
2317
2318 #ifdef LINUX
2319 static struct termio savemodes;
2320 static int havemodes = 0;
2321
2322 int tty_break()
2323 {
2324 struct termio modmodes;
2325
2326 if (ioctl (fileno (stdin), TCGETA, &savemodes) < 0) return -1;
2327
2328 havemodes = 1;
2329
2330 modmodes = savemodes;
2331 modmodes.c_lflag &= ~ICANON;
2332 modmodes.c_cc[VMIN] = 1;
2333 modmodes.c_cc[VTIME] = 0;
2334
2335 return ioctl (fileno (stdin), TCSETAW, &modmodes);
2336 }
2337
2338 int tty_getchar()
2339 {
2340 fd_set rfds;
2341
2342 FD_ZERO (&rfds);
2343
2344 FD_SET (fileno (stdin), &rfds);
2345
2346 struct timeval tv;
2347
2348 tv.tv_sec = 1;
2349 tv.tv_usec = 0;
2350
2351 int retval = select (1, &rfds, NULL, NULL, &tv);
2352
2353 if (retval == 0) return 0;
2354 if (retval == -1) return -1;
2355
2356 return getchar();
2357 }
2358
2359 int tty_fix()
2360 {
2361 if (!havemodes) return 0;
2362
2363 return ioctl (fileno (stdin), TCSETAW, &savemodes);
2364 }
2365 #endif
2366
2367 #ifdef OSX
2368 static struct termios savemodes;
2369 static int havemodes = 0;
2370
2371 int tty_break()
2372 {
2373 struct termios modmodes;
2374
2375 if (ioctl (fileno (stdin), TIOCGETA, &savemodes) < 0) return -1;
2376
2377 havemodes = 1;
2378
2379 modmodes = savemodes;
2380 modmodes.c_lflag &= ~ICANON;
2381 modmodes.c_cc[VMIN] = 1;
2382 modmodes.c_cc[VTIME] = 0;
2383
2384 return ioctl (fileno (stdin), TIOCSETAW, &modmodes);
2385 }
2386
2387 int tty_getchar()
2388 {
2389 fd_set rfds;
2390
2391 FD_ZERO (&rfds);
2392
2393 FD_SET (fileno (stdin), &rfds);
2394
2395 struct timeval tv;
2396
2397 tv.tv_sec = 1;
2398 tv.tv_usec = 0;
2399
2400 int retval = select (1, &rfds, NULL, NULL, &tv);
2401
2402 if (retval == 0) return 0;
2403 if (retval == -1) return -1;
2404
2405 return getchar();
2406 }
2407
2408 int tty_fix()
2409 {
2410 if (!havemodes) return 0;
2411
2412 return ioctl (fileno (stdin), TIOCSETAW, &savemodes);
2413 }
2414 #endif
2415
2416 #ifdef WIN
2417 static DWORD saveMode = 0;
2418
2419 int tty_break()
2420 {
2421 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2422
2423 GetConsoleMode (stdinHandle, &saveMode);
2424 SetConsoleMode (stdinHandle, ENABLE_PROCESSED_INPUT);
2425
2426 return 0;
2427 }
2428
2429 int tty_getchar()
2430 {
2431 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2432
2433 DWORD rc = WaitForSingleObject (stdinHandle, 1000);
2434
2435 if (rc == WAIT_TIMEOUT) return 0;
2436 if (rc == WAIT_ABANDONED) return -1;
2437 if (rc == WAIT_FAILED) return -1;
2438
2439 // The whole ReadConsoleInput () part is a workaround.
2440 // For some unknown reason, maybe a mingw bug, a random signal
2441 // is sent to stdin which unblocks WaitForSingleObject () and sets rc 0.
2442 // Then it wants to read with getche () a keyboard input
2443 // which has never been made.
2444
2445 INPUT_RECORD buf[100];
2446
2447 DWORD num = 0;
2448
2449 ReadConsoleInput (stdinHandle, buf, 100, &num);
2450
2451 FlushConsoleInputBuffer (stdinHandle);
2452
2453 for (uint i = 0; i < num; i++)
2454 {
2455 if (buf[i].EventType != KEY_EVENT) continue;
2456
2457 KEY_EVENT_RECORD KeyEvent = buf[i].Event.KeyEvent;
2458
2459 if (KeyEvent.bKeyDown != TRUE) continue;
2460
2461 return KeyEvent.uChar.AsciiChar;
2462 }
2463
2464 return 0;
2465 }
2466
2467 int tty_fix()
2468 {
2469 HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE);
2470
2471 SetConsoleMode (stdinHandle, saveMode);
2472
2473 return 0;
2474 }
2475 #endif
2476
2477 /**
2478 * mem alloc
2479 */
2480
2481 #define MSG_ENOMEM "Insufficient memory available"
2482
2483 void *mycalloc (size_t nmemb, size_t size)
2484 {
2485 void *p = calloc (nmemb, size);
2486
2487 if (p == NULL)
2488 {
2489 log_error ("ERROR: %s", MSG_ENOMEM);
2490
2491 exit (-1);
2492 }
2493
2494 return (p);
2495 }
2496
2497 void *mymalloc (size_t size)
2498 {
2499 void *p = malloc (size);
2500
2501 if (p == NULL)
2502 {
2503 log_error ("ERROR: %s", MSG_ENOMEM);
2504
2505 exit (-1);
2506 }
2507
2508 memset (p, 0, size);
2509
2510 return (p);
2511 }
2512
2513 void myfree (void *ptr)
2514 {
2515 if (ptr == NULL) return;
2516
2517 free (ptr);
2518 }
2519
2520 void *myrealloc (void *ptr, size_t oldsz, size_t add)
2521 {
2522 void *p = realloc (ptr, oldsz + add);
2523
2524 if (p == NULL)
2525 {
2526 log_error ("ERROR: %s", MSG_ENOMEM);
2527
2528 exit (-1);
2529 }
2530
2531 memset ((char *) p + oldsz, 0, add);
2532
2533 return (p);
2534 }
2535
2536 char *mystrdup (const char *s)
2537 {
2538 const size_t len = strlen (s);
2539
2540 char *b = (char *) mymalloc (len + 1);
2541
2542 memcpy (b, s, len);
2543
2544 return (b);
2545 }
2546
2547 FILE *logfile_open (char *logfile)
2548 {
2549 FILE *fp = fopen (logfile, "ab");
2550
2551 if (fp == NULL)
2552 {
2553 fp = stdout;
2554 }
2555
2556 return fp;
2557 }
2558
2559 void logfile_close (FILE *fp)
2560 {
2561 if (fp == stdout) return;
2562
2563 fclose (fp);
2564 }
2565
2566 void logfile_append (const char *fmt, ...)
2567 {
2568 if (data.logfile_disable == 1) return;
2569
2570 FILE *fp = logfile_open (data.logfile);
2571
2572 va_list ap;
2573
2574 va_start (ap, fmt);
2575
2576 vfprintf (fp, fmt, ap);
2577
2578 va_end (ap);
2579
2580 fputc ('\n', fp);
2581
2582 fflush (fp);
2583
2584 logfile_close (fp);
2585 }
2586
2587 int logfile_generate_id ()
2588 {
2589 const int n = rand ();
2590
2591 time_t t;
2592
2593 time (&t);
2594
2595 return t + n;
2596 }
2597
2598 char *logfile_generate_topid ()
2599 {
2600 const int id = logfile_generate_id ();
2601
2602 char *topid = (char *) mymalloc (1 + 16 + 1);
2603
2604 sprintf (topid, "TOP%08x", id);
2605
2606 return topid;
2607 }
2608
2609 char *logfile_generate_subid ()
2610 {
2611 const int id = logfile_generate_id ();
2612
2613 char *subid = (char *) mymalloc (1 + 16 + 1);
2614
2615 sprintf (subid, "SUB%08x", id);
2616
2617 return subid;
2618 }
2619
2620 /**
2621 * system
2622 */
2623
2624 #ifdef _WIN
2625 void fsync (int fd)
2626 {
2627 HANDLE h = (HANDLE) _get_osfhandle (fd);
2628
2629 FlushFileBuffers (h);
2630 }
2631 #endif
2632
2633 /**
2634 * thermal
2635 */
2636
2637 #ifdef _WIN
2638 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2639 {
2640 NvU32 pGpuCount;
2641
2642 if (hc_NvAPI_EnumPhysicalGPUs (nvGPUHandle, &pGpuCount) != NVAPI_OK) return (0);
2643
2644 if (pGpuCount == 0)
2645 {
2646 log_info ("WARN: No NvAPI adapters found");
2647
2648 return (0);
2649 }
2650
2651 return (pGpuCount);
2652 }
2653 #endif
2654
2655 #ifdef LINUX
2656 int hm_get_adapter_index_nv (HM_ADAPTER_NV nvGPUHandle[DEVICES_MAX])
2657 {
2658 int pGpuCount = 0;
2659
2660 for (uint i = 0; i < DEVICES_MAX; i++)
2661 {
2662 if (hc_NVML_nvmlDeviceGetHandleByIndex (data.hm_dll_nv, 1, i, &nvGPUHandle[i]) != NVML_SUCCESS) break;
2663
2664 // can be used to determine if the device by index matches the cuda device by index
2665 // char name[100]; memset (name, 0, sizeof (name));
2666 // hc_NVML_nvmlDeviceGetName (data.hm_dll_nv, nvGPUHandle[i], name, sizeof (name) - 1);
2667
2668 pGpuCount++;
2669 }
2670
2671 if (pGpuCount == 0)
2672 {
2673 log_info ("WARN: No NVML adapters found");
2674
2675 return (0);
2676 }
2677
2678 return (pGpuCount);
2679 }
2680 #endif
2681
2682 void hm_close (HM_LIB hm_dll)
2683 {
2684 #ifdef _POSIX
2685 dlclose (hm_dll);
2686
2687 #elif _WIN
2688 FreeLibrary (hm_dll);
2689
2690 #endif
2691 }
2692
2693 HM_LIB hm_init (const cl_uint vendor_id)
2694 {
2695 HM_LIB hm_dll = NULL;
2696
2697 if (vendor_id == VENDOR_ID_AMD)
2698 {
2699 #ifdef _POSIX
2700 hm_dll = dlopen ("libatiadlxx.so", RTLD_LAZY | RTLD_GLOBAL);
2701
2702 #elif _WIN
2703 hm_dll = LoadLibrary ("atiadlxx.dll");
2704
2705 if (hm_dll == NULL)
2706 {
2707 hm_dll = LoadLibrary ("atiadlxy.dll");
2708 }
2709
2710 #endif
2711 }
2712
2713 #ifdef LINUX
2714 if (vendor_id == VENDOR_ID_NV)
2715 {
2716 hm_dll = dlopen ("libnvidia-ml.so", RTLD_LAZY | RTLD_GLOBAL);
2717 }
2718 #endif
2719
2720 return hm_dll;
2721 }
2722
2723 int get_adapters_num_amd (HM_LIB hm_dll_amd, int *iNumberAdapters)
2724 {
2725 if (hc_ADL_Adapter_NumberOfAdapters_Get (hm_dll_amd, iNumberAdapters) != ADL_OK) return -1;
2726
2727 if (iNumberAdapters == 0)
2728 {
2729 log_info ("WARN: No ADL adapters found.");
2730
2731 return -1;
2732 }
2733
2734 return 0;
2735 }
2736
2737 /*
2738 int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex)
2739 {
2740 ADLODPerformanceLevels *lpOdPerformanceLevels = NULL;
2741 ADLODParameters lpOdParameters;
2742
2743 lpOdParameters.iSize = sizeof (ADLODParameters);
2744 size_t plevels_size = 0;
2745
2746 if (hc_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1;
2747
2748 log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s",
2749 __func__, iAdapterIndex,
2750 lpOdParameters.iNumberOfPerformanceLevels,
2751 (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "",
2752 (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges");
2753
2754 plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2755
2756 lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size);
2757
2758 lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1);
2759
2760 if (hc_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1;
2761
2762 for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++)
2763 log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d",
2764 __func__, iAdapterIndex, j,
2765 lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc);
2766
2767 myfree (lpOdPerformanceLevels);
2768
2769 return 0;
2770 }
2771 */
2772
2773 LPAdapterInfo hm_get_adapter_info_amd (HM_LIB hm_dll_amd, int iNumberAdapters)
2774 {
2775 size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo);
2776
2777 LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize);
2778
2779 if (hc_ADL_Adapter_AdapterInfo_Get (hm_dll_amd, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL;
2780
2781 return lpAdapterInfo;
2782 }
2783
2784 /*
2785 //
2786 // does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups
2787 //
2788
2789 int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num)
2790 {
2791 u32 idx = -1;
2792
2793 for (uint i = 0; i < num_adl_adapters; i++)
2794 {
2795 int opencl_bus_num = hm_device[i].busid;
2796 int opencl_dev_num = hm_device[i].devid;
2797
2798 if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num))
2799 {
2800 idx = i;
2801
2802 break;
2803 }
2804 }
2805
2806 if (idx >= DEVICES_MAX) return -1;
2807
2808 return idx;
2809 }
2810
2811 void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices)
2812 {
2813 for (uint i = 0; i < opencl_num_devices; i++)
2814 {
2815 cl_device_topology_amd device_topology;
2816
2817 hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL);
2818
2819 hm_device[i].busid = device_topology.pcie.bus;
2820 hm_device[i].devid = device_topology.pcie.device;
2821 }
2822 }
2823 */
2824
2825 void hm_sort_adl_adapters_by_busid_devid (u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2826 {
2827 // basically bubble sort
2828
2829 for (int i = 0; i < num_adl_adapters; i++)
2830 {
2831 for (int j = 0; j < num_adl_adapters - 1; j++)
2832 {
2833 // get info of adapter [x]
2834
2835 u32 adapter_index_x = valid_adl_device_list[j];
2836 AdapterInfo info_x = lpAdapterInfo[adapter_index_x];
2837
2838 u32 bus_num_x = info_x.iBusNumber;
2839 u32 dev_num_x = info_x.iDeviceNumber;
2840
2841 // get info of adapter [y]
2842
2843 u32 adapter_index_y = valid_adl_device_list[j + 1];
2844 AdapterInfo info_y = lpAdapterInfo[adapter_index_y];
2845
2846 u32 bus_num_y = info_y.iBusNumber;
2847 u32 dev_num_y = info_y.iDeviceNumber;
2848
2849 uint need_swap = 0;
2850
2851 if (bus_num_y < bus_num_x)
2852 {
2853 need_swap = 1;
2854 }
2855 else if (bus_num_y == bus_num_x)
2856 {
2857 if (dev_num_y < dev_num_x)
2858 {
2859 need_swap = 1;
2860 }
2861 }
2862
2863 if (need_swap == 1)
2864 {
2865 u32 temp = valid_adl_device_list[j + 1];
2866
2867 valid_adl_device_list[j + 1] = valid_adl_device_list[j];
2868 valid_adl_device_list[j + 0] = temp;
2869 }
2870 }
2871 }
2872 }
2873
2874 u32 *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2875 {
2876 *num_adl_adapters = 0;
2877
2878 u32 *adl_adapters = NULL;
2879
2880 int *bus_numbers = NULL;
2881 int *device_numbers = NULL;
2882
2883 for (int i = 0; i < iNumberAdapters; i++)
2884 {
2885 AdapterInfo info = lpAdapterInfo[i];
2886
2887 if (strlen (info.strUDID) < 1) continue;
2888
2889 #ifdef WIN
2890 if (info.iVendorID != 1002) continue;
2891 #else
2892 if (info.iVendorID != 0x1002) continue;
2893 #endif
2894
2895 if (info.iBusNumber < 0) continue;
2896 if (info.iDeviceNumber < 0) continue;
2897
2898 int found = 0;
2899
2900 for (int pos = 0; pos < *num_adl_adapters; pos++)
2901 {
2902 if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber))
2903 {
2904 found = 1;
2905 break;
2906 }
2907 }
2908
2909 if (found) continue;
2910
2911 // add it to the list
2912
2913 adl_adapters = (u32 *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int));
2914
2915 adl_adapters[*num_adl_adapters] = i;
2916
2917 // rest is just bookkeeping
2918
2919 bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2920 device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int));
2921
2922 bus_numbers[*num_adl_adapters] = info.iBusNumber;
2923 device_numbers[*num_adl_adapters] = info.iDeviceNumber;
2924
2925 (*num_adl_adapters)++;
2926 }
2927
2928 myfree (bus_numbers);
2929 myfree (device_numbers);
2930
2931 // sort the list by increasing bus id, device id number
2932
2933 hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo);
2934
2935 return adl_adapters;
2936 }
2937
2938 int hm_check_fanspeed_control (HM_LIB hm_dll_amd, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
2939 {
2940 // loop through all valid devices
2941
2942 for (int i = 0; i < num_adl_adapters; i++)
2943 {
2944 u32 adapter_index = valid_adl_device_list[i];
2945
2946 // get AdapterInfo
2947
2948 AdapterInfo info = lpAdapterInfo[adapter_index];
2949
2950 // unfortunately this doesn't work since bus id and dev id are not unique
2951 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
2952 // if (opencl_device_index == -1) continue;
2953
2954 int opencl_device_index = i;
2955
2956 // if (hm_show_performance_level (hm_dll_amd, info.iAdapterIndex) != 0) return -1;
2957
2958 // get fanspeed info
2959
2960 if (hm_device[opencl_device_index].od_version == 5)
2961 {
2962 ADLFanSpeedInfo FanSpeedInfo;
2963
2964 memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo));
2965
2966 FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo);
2967
2968 if (hc_ADL_Overdrive5_FanSpeedInfo_Get (hm_dll_amd, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1;
2969
2970 // check read and write capability in fanspeedinfo
2971
2972 if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) &&
2973 (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE))
2974 {
2975 hm_device[opencl_device_index].fan_supported = 1;
2976 }
2977 else
2978 {
2979 hm_device[opencl_device_index].fan_supported = 0;
2980 }
2981 }
2982 else // od_version == 6
2983 {
2984 ADLOD6FanSpeedInfo faninfo;
2985
2986 memset (&faninfo, 0, sizeof (faninfo));
2987
2988 if (hc_ADL_Overdrive6_FanSpeed_Get (hm_dll_amd, info.iAdapterIndex, &faninfo) != ADL_OK) return -1;
2989
2990 // check read capability in fanspeedinfo
2991
2992 if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT)
2993 {
2994 hm_device[opencl_device_index].fan_supported = 1;
2995 }
2996 else
2997 {
2998 hm_device[opencl_device_index].fan_supported = 0;
2999 }
3000 }
3001 }
3002
3003 return 0;
3004 }
3005
3006 int hm_get_overdrive_version (HM_LIB hm_dll_amd, hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3007 {
3008 for (int i = 0; i < num_adl_adapters; i++)
3009 {
3010 u32 adapter_index = valid_adl_device_list[i];
3011
3012 // get AdapterInfo
3013
3014 AdapterInfo info = lpAdapterInfo[adapter_index];
3015
3016 // get overdrive version
3017
3018 int od_supported = 0;
3019 int od_enabled = 0;
3020 int od_version = 0;
3021
3022 if (hc_ADL_Overdrive_Caps (hm_dll_amd, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1;
3023
3024 // store the overdrive version in hm_device
3025
3026 // unfortunately this doesn't work since bus id and dev id are not unique
3027 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3028 // if (opencl_device_index == -1) continue;
3029
3030 int opencl_device_index = i;
3031
3032 hm_device[opencl_device_index].od_version = od_version;
3033 }
3034
3035 return 0;
3036 }
3037
3038 int hm_get_adapter_index_amd (hm_attrs_t *hm_device, u32 *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo)
3039 {
3040 for (int i = 0; i < num_adl_adapters; i++)
3041 {
3042 u32 adapter_index = valid_adl_device_list[i];
3043
3044 // get AdapterInfo
3045
3046 AdapterInfo info = lpAdapterInfo[adapter_index];
3047
3048 // store the iAdapterIndex in hm_device
3049
3050 // unfortunately this doesn't work since bus id and dev id are not unique
3051 // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber);
3052 // if (opencl_device_index == -1) continue;
3053
3054 int opencl_device_index = i;
3055
3056 hm_device[opencl_device_index].adapter_index.amd = info.iAdapterIndex;
3057 }
3058
3059 return num_adl_adapters;
3060 }
3061
3062 int hm_get_temperature_with_device_id (const uint device_id)
3063 {
3064 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3065
3066 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3067 {
3068 if (data.hm_dll_amd)
3069 {
3070 if (data.hm_device[device_id].od_version == 5)
3071 {
3072 ADLTemperature Temperature;
3073
3074 Temperature.iSize = sizeof (ADLTemperature);
3075
3076 if (hc_ADL_Overdrive5_Temperature_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, 0, &Temperature) != ADL_OK) return -1;
3077
3078 return Temperature.iTemperature / 1000;
3079 }
3080 else if (data.hm_device[device_id].od_version == 6)
3081 {
3082 int Temperature = 0;
3083
3084 if (hc_ADL_Overdrive6_Temperature_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &Temperature) != ADL_OK) return -1;
3085
3086 return Temperature / 1000;
3087 }
3088 }
3089 }
3090 else if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3091 {
3092 #ifdef LINUX
3093 int temperature = 0;
3094
3095 hc_NVML_nvmlDeviceGetTemperature (data.hm_dll_nv, data.hm_device[device_id].adapter_index.nv, NVML_TEMPERATURE_GPU, (unsigned int *) &temperature);
3096
3097 return temperature;
3098 #endif
3099
3100 #ifdef WIN
3101 NV_GPU_THERMAL_SETTINGS pThermalSettings;
3102
3103 pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER;
3104 pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU;
3105 pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN;
3106 pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
3107
3108 if (hc_NvAPI_GPU_GetThermalSettings (data.hm_device[device_id].adapter_index.nv, 0, &pThermalSettings) != NVAPI_OK) return -1;
3109
3110 return pThermalSettings.sensor[0].currentTemp;
3111 #endif
3112 }
3113
3114 return -1;
3115 }
3116
3117 int hm_get_fanspeed_with_device_id (const uint device_id)
3118 {
3119 // we shouldn't really need this extra CL_DEVICE_TYPE_GPU check, because fan_supported should not be set w/ CPUs
3120 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3121
3122 if (data.hm_device[device_id].fan_supported == 1)
3123 {
3124 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3125 {
3126 if (data.hm_dll_amd)
3127 {
3128 if (data.hm_device[device_id].od_version == 5)
3129 {
3130 ADLFanSpeedValue lpFanSpeedValue;
3131
3132 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3133
3134 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3135 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3136 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3137
3138 if (hc_ADL_Overdrive5_FanSpeed_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3139
3140 return lpFanSpeedValue.iFanSpeed;
3141 }
3142 else // od_version == 6
3143 {
3144 ADLOD6FanSpeedInfo faninfo;
3145
3146 memset (&faninfo, 0, sizeof (faninfo));
3147
3148 if (hc_ADL_Overdrive6_FanSpeed_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &faninfo) != ADL_OK) return -1;
3149
3150 return faninfo.iFanSpeedPercent;
3151 }
3152 }
3153 }
3154 else if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3155 {
3156 #ifdef LINUX
3157 int speed = 0;
3158
3159 hc_NVML_nvmlDeviceGetFanSpeed (data.hm_dll_nv, 1, data.hm_device[device_id].adapter_index.nv, (unsigned int *) &speed);
3160
3161 return speed;
3162 #endif
3163
3164 #ifdef WIN
3165 NvU32 speed = 0;
3166
3167 hc_NvAPI_GPU_GetTachReading (data.hm_device[device_id].adapter_index.nv, &speed);
3168
3169 return speed;
3170 #endif
3171 }
3172 }
3173
3174 return -1;
3175 }
3176
3177 int hm_get_utilization_with_device_id (const uint device_id)
3178 {
3179 if ((data.devices_param[device_id].device_type & CL_DEVICE_TYPE_GPU) == 0) return -1;
3180
3181 if (data.devices_param[device_id].vendor_id == VENDOR_ID_AMD)
3182 {
3183 if (data.hm_dll_amd)
3184 {
3185 ADLPMActivity PMActivity;
3186
3187 PMActivity.iSize = sizeof (ADLPMActivity);
3188
3189 if (hc_ADL_Overdrive_CurrentActivity_Get (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &PMActivity) != ADL_OK) return -1;
3190
3191 return PMActivity.iActivityPercent;
3192 }
3193 }
3194 else if (data.devices_param[device_id].vendor_id == VENDOR_ID_NV)
3195 {
3196 #ifdef LINUX
3197 nvmlUtilization_t utilization;
3198
3199 hc_NVML_nvmlDeviceGetUtilizationRates (data.hm_dll_nv, data.hm_device[device_id].adapter_index.nv, &utilization);
3200
3201 return utilization.gpu;
3202 #endif
3203
3204 #ifdef WIN
3205 NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx;
3206
3207 pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER;
3208
3209 if (hc_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_device[device_id].adapter_index.nv, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1;
3210
3211 return pDynamicPstatesInfoEx.utilization[0].percentage;
3212 #endif
3213 }
3214
3215 return -1;
3216 }
3217
3218 int hm_set_fanspeed_with_device_id_amd (const uint device_id, const int fanspeed)
3219 {
3220 if (data.hm_device[device_id].fan_supported == 1)
3221 {
3222 if (data.hm_dll_amd)
3223 {
3224 if (data.hm_device[device_id].od_version == 5)
3225 {
3226 ADLFanSpeedValue lpFanSpeedValue;
3227
3228 memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
3229
3230 lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue);
3231 lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
3232 lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
3233 lpFanSpeedValue.iFanSpeed = fanspeed;
3234
3235 if (hc_ADL_Overdrive5_FanSpeed_Set (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, 0, &lpFanSpeedValue) != ADL_OK) return -1;
3236
3237 return 0;
3238 }
3239 else // od_version == 6
3240 {
3241 ADLOD6FanSpeedValue fan_speed_value;
3242
3243 memset (&fan_speed_value, 0, sizeof (fan_speed_value));
3244
3245 fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
3246 fan_speed_value.iFanSpeed = fanspeed;
3247
3248 if (hc_ADL_Overdrive6_FanSpeed_Set (data.hm_dll_amd, data.hm_device[device_id].adapter_index.amd, &fan_speed_value) != ADL_OK) return -1;
3249
3250 return 0;
3251 }
3252 }
3253 }
3254
3255 return -1;
3256 }
3257
3258 // helper function for status display
3259
3260 void hm_device_val_to_str (char *target_buf, int max_buf_size, char *suffix, int value)
3261 {
3262 #define VALUE_NOT_AVAILABLE "N/A"
3263
3264 if (value == -1)
3265 {
3266 snprintf (target_buf, max_buf_size, VALUE_NOT_AVAILABLE);
3267 }
3268 else
3269 {
3270 snprintf (target_buf, max_buf_size, "%2d%s", value, suffix);
3271 }
3272 }
3273
3274 /**
3275 * maskprocessor
3276 */
3277
3278 void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ])
3279 {
3280 /* generates a lookup table where key is the char itself for fastest possible lookup performance */
3281
3282 if (css_cnt > SP_PW_MAX)
3283 {
3284 log_error ("ERROR: mask length is too long");
3285
3286 exit (-1);
3287 }
3288
3289 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3290 {
3291 uint *uniq_tbl = uniq_tbls[css_pos];
3292
3293 uint *cs_buf = css[css_pos].cs_buf;
3294 uint cs_len = css[css_pos].cs_len;
3295
3296 for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++)
3297 {
3298 uint c = cs_buf[cs_pos] & 0xff;
3299
3300 uniq_tbl[c] = 1;
3301 }
3302 }
3303 }
3304
3305 void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt)
3306 {
3307 cs_t *cs = &css[css_cnt];
3308
3309 size_t css_uniq_sz = CHARSIZ * sizeof (uint);
3310
3311 uint *css_uniq = (uint *) mymalloc (css_uniq_sz);
3312
3313 memset (css_uniq, 0, css_uniq_sz);
3314
3315 size_t i;
3316
3317 for (i = 0; i < cs->cs_len; i++)
3318 {
3319 const uint u = cs->cs_buf[i];
3320
3321 css_uniq[u] = 1;
3322 }
3323
3324 for (i = 0; i < in_len; i++)
3325 {
3326 uint u = in_buf[i] & 0xff;
3327
3328 if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u);
3329
3330 if (css_uniq[u] == 1) continue;
3331
3332 css_uniq[u] = 1;
3333
3334 cs->cs_buf[cs->cs_len] = u;
3335
3336 cs->cs_len++;
3337 }
3338
3339 myfree (css_uniq);
3340 }
3341
3342 void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret)
3343 {
3344 size_t in_pos;
3345
3346 for (in_pos = 0; in_pos < in_len; in_pos++)
3347 {
3348 uint p0 = in_buf[in_pos] & 0xff;
3349
3350 if (interpret == 1 && p0 == '?')
3351 {
3352 in_pos++;
3353
3354 if (in_pos == in_len) break;
3355
3356 uint p1 = in_buf[in_pos] & 0xff;
3357
3358 switch (p1)
3359 {
3360 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset);
3361 break;
3362 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset);
3363 break;
3364 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset);
3365 break;
3366 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset);
3367 break;
3368 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset);
3369 break;
3370 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset);
3371 break;
3372 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3373 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset);
3374 break;
3375 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3376 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset);
3377 break;
3378 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3379 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset);
3380 break;
3381 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3382 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset);
3383 break;
3384 case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset);
3385 break;
3386 default: log_error ("Syntax error: %s", in_buf);
3387 exit (-1);
3388 }
3389 }
3390 else
3391 {
3392 if (data.hex_charset)
3393 {
3394 in_pos++;
3395
3396 if (in_pos == in_len)
3397 {
3398 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf);
3399
3400 exit (-1);
3401 }
3402
3403 uint p1 = in_buf[in_pos] & 0xff;
3404
3405 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3406 {
3407 log_error ("ERROR: invalid hex character detected in mask %s", in_buf);
3408
3409 exit (-1);
3410 }
3411
3412 uint chr = 0;
3413
3414 chr = hex_convert (p1) << 0;
3415 chr |= hex_convert (p0) << 4;
3416
3417 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3418 }
3419 else
3420 {
3421 uint chr = p0;
3422
3423 mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset);
3424 }
3425 }
3426 }
3427 }
3428
3429 u64 mp_get_sum (uint css_cnt, cs_t *css)
3430 {
3431 u64 sum = 1;
3432
3433 for (uint css_pos = 0; css_pos < css_cnt; css_pos++)
3434 {
3435 sum *= css[css_pos].cs_len;
3436 }
3437
3438 return (sum);
3439 }
3440
3441 cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt)
3442 {
3443 cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t));
3444
3445 uint mask_pos;
3446 uint css_pos;
3447
3448 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3449 {
3450 char p0 = mask_buf[mask_pos];
3451
3452 if (p0 == '?')
3453 {
3454 mask_pos++;
3455
3456 if (mask_pos == mask_len) break;
3457
3458 char p1 = mask_buf[mask_pos];
3459
3460 uint chr = p1;
3461
3462 switch (p1)
3463 {
3464 case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos);
3465 break;
3466 case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos);
3467 break;
3468 case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos);
3469 break;
3470 case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos);
3471 break;
3472 case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos);
3473 break;
3474 case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos);
3475 break;
3476 case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); }
3477 mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos);
3478 break;
3479 case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); }
3480 mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos);
3481 break;
3482 case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); }
3483 mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos);
3484 break;
3485 case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); }
3486 mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos);
3487 break;
3488 case '?': mp_add_cs_buf (&chr, 1, css, css_pos);
3489 break;
3490 default: log_error ("ERROR: syntax error: %s", mask_buf);
3491 exit (-1);
3492 }
3493 }
3494 else
3495 {
3496 if (data.hex_charset)
3497 {
3498 mask_pos++;
3499
3500 // if there is no 2nd hex character, show an error:
3501
3502 if (mask_pos == mask_len)
3503 {
3504 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3505
3506 exit (-1);
3507 }
3508
3509 char p1 = mask_buf[mask_pos];
3510
3511 // if they are not valid hex character, show an error:
3512
3513 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3514 {
3515 log_error ("ERROR: invalid hex character detected in mask %s", mask_buf);
3516
3517 exit (-1);
3518 }
3519
3520 uint chr = 0;
3521
3522 chr |= hex_convert (p1) << 0;
3523 chr |= hex_convert (p0) << 4;
3524
3525 mp_add_cs_buf (&chr, 1, css, css_pos);
3526 }
3527 else
3528 {
3529 uint chr = p0;
3530
3531 mp_add_cs_buf (&chr, 1, css, css_pos);
3532 }
3533 }
3534 }
3535
3536 if (css_pos == 0)
3537 {
3538 log_error ("ERROR: invalid mask length (0)");
3539
3540 exit (-1);
3541 }
3542
3543 *css_cnt = css_pos;
3544
3545 return (css);
3546 }
3547
3548 void mp_exec (u64 val, char *buf, cs_t *css, int css_cnt)
3549 {
3550 for (int i = 0; i < css_cnt; i++)
3551 {
3552 uint len = css[i].cs_len;
3553 u64 next = val / len;
3554 uint pos = val % len;
3555 buf[i] = (char) css[i].cs_buf[pos] & 0xff;
3556 val = next;
3557 }
3558 }
3559
3560 void mp_cut_at (char *mask, uint max)
3561 {
3562 uint i;
3563 uint j;
3564 uint mask_len = strlen (mask);
3565
3566 for (i = 0, j = 0; i < mask_len && j < max; i++, j++)
3567 {
3568 if (mask[i] == '?') i++;
3569 }
3570
3571 mask[i] = 0;
3572 }
3573
3574 void mp_setup_sys (cs_t *mp_sys)
3575 {
3576 uint pos;
3577 uint chr;
3578 uint donec[CHARSIZ];
3579
3580 memset (donec, 0, sizeof (donec));
3581
3582 for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1;
3583 mp_sys[0].cs_buf[pos++] = chr;
3584 mp_sys[0].cs_len = pos; }
3585
3586 for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1;
3587 mp_sys[1].cs_buf[pos++] = chr;
3588 mp_sys[1].cs_len = pos; }
3589
3590 for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1;
3591 mp_sys[2].cs_buf[pos++] = chr;
3592 mp_sys[2].cs_len = pos; }
3593
3594 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue;
3595 mp_sys[3].cs_buf[pos++] = chr;
3596 mp_sys[3].cs_len = pos; }
3597
3598 for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr;
3599 mp_sys[4].cs_len = pos; }
3600
3601 for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr;
3602 mp_sys[5].cs_len = pos; }
3603 }
3604
3605 void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index)
3606 {
3607 FILE *fp = fopen (buf, "rb");
3608
3609 if (fp == NULL || feof (fp)) // feof() in case if file is empty
3610 {
3611 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3612 }
3613 else
3614 {
3615 char mp_file[1024];
3616
3617 memset (mp_file, 0, sizeof (mp_file));
3618
3619 size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp);
3620
3621 fclose (fp);
3622
3623 len = in_superchop (mp_file);
3624
3625 if (len == 0)
3626 {
3627 log_info ("WARNING: charset file corrupted");
3628
3629 mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1);
3630 }
3631 else
3632 {
3633 mp_expand (mp_file, len, mp_sys, mp_usr, index, 0);
3634 }
3635 }
3636 }
3637
3638 void mp_reset_usr (cs_t *mp_usr, uint index)
3639 {
3640 mp_usr[index].cs_len = 0;
3641
3642 memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf));
3643 }
3644
3645 char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len)
3646 {
3647 char *new_mask_buf = (char *) mymalloc (256);
3648
3649 uint mask_pos;
3650
3651 uint css_pos;
3652
3653 for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++)
3654 {
3655 if (css_pos == len) break;
3656
3657 char p0 = mask_buf[mask_pos];
3658
3659 new_mask_buf[mask_pos] = p0;
3660
3661 if (p0 == '?')
3662 {
3663 mask_pos++;
3664
3665 if (mask_pos == mask_len) break;
3666
3667 new_mask_buf[mask_pos] = mask_buf[mask_pos];
3668 }
3669 else
3670 {
3671 if (data.hex_charset)
3672 {
3673 mask_pos++;
3674
3675 if (mask_pos == mask_len)
3676 {
3677 log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf);
3678
3679 exit (-1);
3680 }
3681
3682 char p1 = mask_buf[mask_pos];
3683
3684 // if they are not valid hex character, show an error:
3685
3686 if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0))
3687 {
3688 log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf);
3689
3690 exit (-1);
3691 }
3692
3693 new_mask_buf[mask_pos] = p1;
3694 }
3695 }
3696 }
3697
3698 if (css_pos == len) return (new_mask_buf);
3699
3700 myfree (new_mask_buf);
3701
3702 return (NULL);
3703 }
3704
3705 /**
3706 * statprocessor
3707 */
3708
3709 u64 sp_get_sum (uint start, uint stop, cs_t *root_css_buf)
3710 {
3711 u64 sum = 1;
3712
3713 uint i;
3714
3715 for (i = start; i < stop; i++)
3716 {
3717 sum *= root_css_buf[i].cs_len;
3718 }
3719
3720 return (sum);
3721 }
3722
3723 void sp_exec (u64 ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop)
3724 {
3725 u64 v = ctx;
3726
3727 cs_t *cs = &root_css_buf[start];
3728
3729 uint i;
3730
3731 for (i = start; i < stop; i++)
3732 {
3733 const u64 m = v % cs->cs_len;
3734 const u64 d = v / cs->cs_len;
3735
3736 v = d;
3737
3738 const uint k = cs->cs_buf[m];
3739
3740 pw_buf[i - start] = (char) k;
3741
3742 cs = &markov_css_buf[(i * CHARSIZ) + k];
3743 }
3744 }
3745
3746 int sp_comp_val (const void *p1, const void *p2)
3747 {
3748 hcstat_table_t *b1 = (hcstat_table_t *) p1;
3749 hcstat_table_t *b2 = (hcstat_table_t *) p2;
3750
3751 return b2->val - b1->val;
3752 }
3753
3754 void sp_setup_tbl (const char *shared_dir, char *hcstat, uint disable, uint classic, hcstat_table_t *root_table_buf, hcstat_table_t *markov_table_buf)
3755 {
3756 uint i;
3757 uint j;
3758 uint k;
3759
3760 /**
3761 * Initialize hcstats
3762 */
3763
3764 u64 *root_stats_buf = (u64 *) mycalloc (SP_ROOT_CNT, sizeof (u64));
3765
3766 u64 *root_stats_ptr = root_stats_buf;
3767
3768 u64 *root_stats_buf_by_pos[SP_PW_MAX];
3769
3770 for (i = 0; i < SP_PW_MAX; i++)
3771 {
3772 root_stats_buf_by_pos[i] = root_stats_ptr;
3773
3774 root_stats_ptr += CHARSIZ;
3775 }
3776
3777 u64 *markov_stats_buf = (u64 *) mycalloc (SP_MARKOV_CNT, sizeof (u64));
3778
3779 u64 *markov_stats_ptr = markov_stats_buf;
3780
3781 u64 *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ];
3782
3783 for (i = 0; i < SP_PW_MAX; i++)
3784 {
3785 for (j = 0; j < CHARSIZ; j++)
3786 {
3787 markov_stats_buf_by_key[i][j] = markov_stats_ptr;
3788
3789 markov_stats_ptr += CHARSIZ;
3790 }
3791 }
3792
3793 /**
3794 * Load hcstats File
3795 */
3796
3797 if (hcstat == NULL)
3798 {
3799 char hcstat_tmp[256];
3800
3801 memset (hcstat_tmp, 0, sizeof (hcstat_tmp));
3802
3803 snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", shared_dir, SP_HCSTAT);
3804
3805 hcstat = hcstat_tmp;
3806 }
3807
3808 FILE *fd = fopen (hcstat, "rb");
3809
3810 if (fd == NULL)
3811 {
3812 log_error ("%s: %s", hcstat, strerror (errno));
3813
3814 exit (-1);
3815 }
3816
3817 if (fread (root_stats_buf, sizeof (u64), SP_ROOT_CNT, fd) != SP_ROOT_CNT)
3818 {
3819 log_error ("%s: Could not load data", hcstat);
3820
3821 exit (-1);
3822 }
3823
3824 if (fread (markov_stats_buf, sizeof (u64), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT)
3825 {
3826 log_error ("%s: Could not load data", hcstat);
3827
3828 exit (-1);
3829 }
3830
3831 fclose (fd);
3832
3833 /**
3834 * Markov modifier of hcstat_table on user request
3835 */
3836
3837 if (disable)
3838 {
3839 memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64));
3840 memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64));
3841 }
3842
3843 if (classic)
3844 {
3845 /* Add all stats to first position */
3846
3847 for (i = 1; i < SP_PW_MAX; i++)
3848 {
3849 u64 *out = root_stats_buf_by_pos[0];
3850 u64 *in = root_stats_buf_by_pos[i];
3851
3852 for (j = 0; j < CHARSIZ; j++)
3853 {
3854 *out++ += *in++;
3855 }
3856 }
3857
3858 for (i = 1; i < SP_PW_MAX; i++)
3859 {
3860 u64 *out = markov_stats_buf_by_key[0][0];
3861 u64 *in = markov_stats_buf_by_key[i][0];
3862
3863 for (j = 0; j < CHARSIZ; j++)
3864 {
3865 for (k = 0; k < CHARSIZ; k++)
3866 {
3867 *out++ += *in++;
3868 }
3869 }
3870 }
3871
3872 /* copy them to all pw_positions */
3873
3874 for (i = 1; i < SP_PW_MAX; i++)
3875 {
3876 memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (u64));
3877 }
3878
3879 for (i = 1; i < SP_PW_MAX; i++)
3880 {
3881 memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (u64));
3882 }
3883 }
3884
3885 /**
3886 * Initialize tables
3887 */
3888
3889 hcstat_table_t *root_table_ptr = root_table_buf;
3890
3891 hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX];
3892
3893 for (i = 0; i < SP_PW_MAX; i++)
3894 {
3895 root_table_buf_by_pos[i] = root_table_ptr;
3896
3897 root_table_ptr += CHARSIZ;
3898 }
3899
3900 hcstat_table_t *markov_table_ptr = markov_table_buf;
3901
3902 hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ];
3903
3904 for (i = 0; i < SP_PW_MAX; i++)
3905 {
3906 for (j = 0; j < CHARSIZ; j++)
3907 {
3908 markov_table_buf_by_key[i][j] = markov_table_ptr;
3909
3910 markov_table_ptr += CHARSIZ;
3911 }
3912 }
3913
3914 /**
3915 * Convert hcstat to tables
3916 */
3917
3918 for (i = 0; i < SP_ROOT_CNT; i++)
3919 {
3920 uint key = i % CHARSIZ;
3921
3922 root_table_buf[i].key = key;
3923 root_table_buf[i].val = root_stats_buf[i];
3924 }
3925
3926 for (i = 0; i < SP_MARKOV_CNT; i++)
3927 {
3928 uint key = i % CHARSIZ;
3929
3930 markov_table_buf[i].key = key;
3931 markov_table_buf[i].val = markov_stats_buf[i];
3932 }
3933
3934 myfree (root_stats_buf);
3935 myfree (markov_stats_buf);
3936
3937 /**
3938 * Finally sort them
3939 */
3940
3941 for (i = 0; i < SP_PW_MAX; i++)
3942 {
3943 qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3944 }
3945
3946 for (i = 0; i < SP_PW_MAX; i++)
3947 {
3948 for (j = 0; j < CHARSIZ; j++)
3949 {
3950 qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val);
3951 }
3952 }
3953 }
3954
3955 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])
3956 {
3957 /**
3958 * Convert tables to css
3959 */
3960
3961 for (uint i = 0; i < SP_ROOT_CNT; i++)
3962 {
3963 uint pw_pos = i / CHARSIZ;
3964
3965 cs_t *cs = &root_css_buf[pw_pos];
3966
3967 if (cs->cs_len == threshold) continue;
3968
3969 uint key = root_table_buf[i].key;
3970
3971 if (uniq_tbls[pw_pos][key] == 0) continue;
3972
3973 cs->cs_buf[cs->cs_len] = key;
3974
3975 cs->cs_len++;
3976 }
3977
3978 /**
3979 * Convert table to css
3980 */
3981
3982 for (uint i = 0; i < SP_MARKOV_CNT; i++)
3983 {
3984 uint c = i / CHARSIZ;
3985
3986 cs_t *cs = &markov_css_buf[c];
3987
3988 if (cs->cs_len == threshold) continue;
3989
3990 uint pw_pos = c / CHARSIZ;
3991
3992 uint key = markov_table_buf[i].key;
3993
3994 if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue;
3995
3996 cs->cs_buf[cs->cs_len] = key;
3997
3998 cs->cs_len++;
3999 }
4000
4001 /*
4002 for (uint i = 0; i < 8; i++)
4003 {
4004 for (uint j = 0x20; j < 0x80; j++)
4005 {
4006 cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j];
4007
4008 printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len);
4009
4010 for (uint k = 0; k < 10; k++)
4011 {
4012 printf (" %u\n", ptr->cs_buf[k]);
4013 }
4014 }
4015 }
4016 */
4017 }
4018
4019 void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out)
4020 {
4021 for (uint i = 0; i < SP_PW_MAX; i += 2)
4022 {
4023 memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t));
4024
4025 out += CHARSIZ;
4026 in += CHARSIZ;
4027
4028 out->key = 0;
4029 out->val = 1;
4030
4031 out++;
4032
4033 for (uint j = 1; j < CHARSIZ; j++)
4034 {
4035 out->key = j;
4036 out->val = 0;
4037
4038 out++;
4039 }
4040 }
4041 }
4042
4043 void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out)
4044 {
4045 for (uint i = 0; i < SP_PW_MAX; i += 2)
4046 {
4047 memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t));
4048
4049 out += CHARSIZ * CHARSIZ;
4050 in += CHARSIZ * CHARSIZ;
4051
4052 for (uint j = 0; j < CHARSIZ; j++)
4053 {
4054 out->key = 0;
4055 out->val = 1;
4056
4057 out++;
4058
4059 for (uint k = 1; k < CHARSIZ; k++)
4060 {
4061 out->key = k;
4062 out->val = 0;
4063
4064 out++;
4065 }
4066 }
4067 }
4068 }
4069
4070 /**
4071 * mixed shared functions
4072 */
4073
4074 void dump_hex (const u8 *s, const int sz)
4075 {
4076 for (int i = 0; i < sz; i++)
4077 {
4078 log_info_nn ("%02x ", s[i]);
4079 }
4080
4081 log_info ("");
4082 }
4083
4084 void usage_mini_print (const char *progname)
4085 {
4086 for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname);
4087 }
4088
4089 void usage_big_print (const char *progname)
4090 {
4091 for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname);
4092 }
4093
4094 char *get_exec_path ()
4095 {
4096 int exec_path_len = 1024;
4097
4098 char *exec_path = (char *) mymalloc (exec_path_len);
4099
4100 #ifdef LINUX
4101
4102 char tmp[32];
4103
4104 sprintf (tmp, "/proc/%d/exe", getpid ());
4105
4106 const int len = readlink (tmp, exec_path, exec_path_len - 1);
4107
4108 #endif
4109
4110 #ifdef WIN
4111
4112 const int len = GetModuleFileName (NULL, exec_path, exec_path_len - 1);
4113
4114 #endif
4115
4116 exec_path[len] = 0;
4117
4118 return exec_path;
4119 }
4120
4121 char *get_install_dir (const char *progname)
4122 {
4123 char *install_dir = mystrdup (progname);
4124 char *last_slash = NULL;
4125
4126 if ((last_slash = strrchr (install_dir, '/')) != NULL)
4127 {
4128 *last_slash = 0;
4129 }
4130 else if ((last_slash = strrchr (install_dir, '\\')) != NULL)
4131 {
4132 *last_slash = 0;
4133 }
4134 else
4135 {
4136 install_dir[0] = '.';
4137 install_dir[1] = 0;
4138 }
4139
4140 return (install_dir);
4141 }
4142
4143 char *get_profile_dir (const char *homedir)
4144 {
4145 #define DOT_HASHCAT ".hashcat"
4146
4147 char *profile_dir = (char *) mymalloc (strlen (homedir) + 1 + strlen (DOT_HASHCAT) + 1);
4148
4149 sprintf (profile_dir, "%s/%s", homedir, DOT_HASHCAT);
4150
4151 return profile_dir;
4152 }
4153
4154 char *get_session_dir (const char *profile_dir)
4155 {
4156 #define SESSIONS_FOLDER "sessions"
4157
4158 char *session_dir = (char *) mymalloc (strlen (profile_dir) + 1 + strlen (SESSIONS_FOLDER) + 1);
4159
4160 sprintf (session_dir, "%s/%s", profile_dir, SESSIONS_FOLDER);
4161
4162 return session_dir;
4163 }
4164
4165 void truecrypt_crc32 (const char *filename, u8 keytab[64])
4166 {
4167 uint crc = ~0;
4168
4169 FILE *fd = fopen (filename, "rb");
4170
4171 if (fd == NULL)
4172 {
4173 log_error ("%s: %s", filename, strerror (errno));
4174
4175 exit (-1);
4176 }
4177
4178 #define MAX_KEY_SIZE (1024 * 1024)
4179
4180 u8 *buf = (u8 *) mymalloc (MAX_KEY_SIZE + 1);
4181
4182 int nread = fread (buf, sizeof (u8), MAX_KEY_SIZE, fd);
4183
4184 fclose (fd);
4185
4186 int kpos = 0;
4187
4188 for (int fpos = 0; fpos < nread; fpos++)
4189 {
4190 crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8);
4191
4192 keytab[kpos++] += (crc >> 24) & 0xff;
4193 keytab[kpos++] += (crc >> 16) & 0xff;
4194 keytab[kpos++] += (crc >> 8) & 0xff;
4195 keytab[kpos++] += (crc >> 0) & 0xff;
4196
4197 if (kpos >= 64) kpos = 0;
4198 }
4199
4200 myfree (buf);
4201 }
4202
4203 void set_cpu_affinity (char *cpu_affinity)
4204 {
4205 #ifdef WIN
4206 DWORD_PTR aff_mask = 0;
4207 #endif
4208
4209 #ifdef LINUX
4210 cpu_set_t cpuset;
4211
4212 CPU_ZERO (&cpuset);
4213 #endif
4214
4215 if (cpu_affinity)
4216 {
4217 char *devices = strdup (cpu_affinity);
4218
4219 char *next = strtok (devices, ",");
4220
4221 do
4222 {
4223 uint cpu_id = atoi (next);
4224
4225 if (cpu_id == 0)
4226 {
4227 #ifdef WIN
4228 aff_mask = 0;
4229 #endif
4230
4231 #ifdef LINUX
4232 CPU_ZERO (&cpuset);
4233 #endif
4234
4235 break;
4236 }
4237
4238 if (cpu_id > 32)
4239 {
4240 log_error ("ERROR: invalid cpu_id %u specified", cpu_id);
4241
4242 exit (-1);
4243 }
4244
4245 #ifdef WIN
4246 aff_mask |= 1 << (cpu_id - 1);
4247 #endif
4248
4249 #ifdef LINUX
4250 CPU_SET ((cpu_id - 1), &cpuset);
4251 #endif
4252
4253 } while ((next = strtok (NULL, ",")) != NULL);
4254
4255 free (devices);
4256 }
4257
4258 #ifdef WIN
4259 SetProcessAffinityMask (GetCurrentProcess (), aff_mask);
4260 SetThreadAffinityMask (GetCurrentThread (), aff_mask);
4261 #endif
4262
4263 #ifdef LINUX
4264 pthread_t thread = pthread_self ();
4265 pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset);
4266 #endif
4267 }
4268
4269 void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *))
4270 {
4271 char *element, *end;
4272
4273 end = (char *) base + nmemb * size;
4274
4275 for (element = (char *) base; element < end; element += size)
4276 if (!compar (element, key))
4277 return element;
4278
4279 return NULL;
4280 }
4281
4282 int sort_by_salt (const void *v1, const void *v2)
4283 {
4284 const salt_t *s1 = (const salt_t *) v1;
4285 const salt_t *s2 = (const salt_t *) v2;
4286
4287 const int res1 = s1->salt_len - s2->salt_len;
4288
4289 if (res1 != 0) return (res1);
4290
4291 const int res2 = s1->salt_iter - s2->salt_iter;
4292
4293 if (res2 != 0) return (res2);
4294
4295 uint n;
4296
4297 n = 12;
4298
4299 while (n--)
4300 {
4301 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4302 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4303 }
4304
4305 n = 8;
4306
4307 while (n--)
4308 {
4309 if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1);
4310 if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1);
4311 }
4312
4313 return (0);
4314 }
4315
4316 int sort_by_salt_buf (const void *v1, const void *v2)
4317 {
4318 const pot_t *p1 = (const pot_t *) v1;
4319 const pot_t *p2 = (const pot_t *) v2;
4320
4321 const hash_t *h1 = &p1->hash;
4322 const hash_t *h2 = &p2->hash;
4323
4324 const salt_t *s1 = h1->salt;
4325 const salt_t *s2 = h2->salt;
4326
4327 uint n = 12;
4328
4329 while (n--)
4330 {
4331 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4332 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4333 }
4334
4335 return 0;
4336 }
4337
4338 int sort_by_hash_t_salt (const void *v1, const void *v2)
4339 {
4340 const hash_t *h1 = (const hash_t *) v1;
4341 const hash_t *h2 = (const hash_t *) v2;
4342
4343 const salt_t *s1 = h1->salt;
4344 const salt_t *s2 = h2->salt;
4345
4346 // testphase: this should work
4347 uint n = 12;
4348
4349 while (n--)
4350 {
4351 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4352 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4353 }
4354
4355 /* original code, seems buggy since salt_len can be very big (had a case with 131 len)
4356 also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4
4357 if (s1->salt_len > s2->salt_len) return ( 1);
4358 if (s1->salt_len < s2->salt_len) return (-1);
4359
4360 uint n = s1->salt_len;
4361
4362 while (n--)
4363 {
4364 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4365 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4366 }
4367 */
4368
4369 return 0;
4370 }
4371
4372 int sort_by_hash_t_salt_hccap (const void *v1, const void *v2)
4373 {
4374 const hash_t *h1 = (const hash_t *) v1;
4375 const hash_t *h2 = (const hash_t *) v2;
4376
4377 const salt_t *s1 = h1->salt;
4378 const salt_t *s2 = h2->salt;
4379
4380 // 12 - 2 (since last 2 uints contain the digest)
4381 uint n = 10;
4382
4383 while (n--)
4384 {
4385 if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1);
4386 if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1);
4387 }
4388
4389 return 0;
4390 }
4391
4392 int sort_by_hash_no_salt (const void *v1, const void *v2)
4393 {
4394 const hash_t *h1 = (const hash_t *) v1;
4395 const hash_t *h2 = (const hash_t *) v2;
4396
4397 const void *d1 = h1->digest;
4398 const void *d2 = h2->digest;
4399
4400 return data.sort_by_digest (d1, d2);
4401 }
4402
4403 int sort_by_hash (const void *v1, const void *v2)
4404 {
4405 const hash_t *h1 = (const hash_t *) v1;
4406 const hash_t *h2 = (const hash_t *) v2;
4407
4408 if (data.isSalted)
4409 {
4410 const salt_t *s1 = h1->salt;
4411 const salt_t *s2 = h2->salt;
4412
4413 int res = sort_by_salt (s1, s2);
4414
4415 if (res != 0) return (res);
4416 }
4417
4418 const void *d1 = h1->digest;
4419 const void *d2 = h2->digest;
4420
4421 return data.sort_by_digest (d1, d2);
4422 }
4423
4424 int sort_by_pot (const void *v1, const void *v2)
4425 {
4426 const pot_t *p1 = (const pot_t *) v1;
4427 const pot_t *p2 = (const pot_t *) v2;
4428
4429 const hash_t *h1 = &p1->hash;
4430 const hash_t *h2 = &p2->hash;
4431
4432 return sort_by_hash (h1, h2);
4433 }
4434
4435 int sort_by_mtime (const void *p1, const void *p2)
4436 {
4437 const char **f1 = (const char **) p1;
4438 const char **f2 = (const char **) p2;
4439
4440 struct stat s1; stat (*f1, &s1);
4441 struct stat s2; stat (*f2, &s2);
4442
4443 return s2.st_mtime - s1.st_mtime;
4444 }
4445
4446 int sort_by_cpu_rule (const void *p1, const void *p2)
4447 {
4448 const cpu_rule_t *r1 = (const cpu_rule_t *) p1;
4449 const cpu_rule_t *r2 = (const cpu_rule_t *) p2;
4450
4451 return memcmp (r1, r2, sizeof (cpu_rule_t));
4452 }
4453
4454 int sort_by_kernel_rule (const void *p1, const void *p2)
4455 {
4456 const kernel_rule_t *r1 = (const kernel_rule_t *) p1;
4457 const kernel_rule_t *r2 = (const kernel_rule_t *) p2;
4458
4459 return memcmp (r1, r2, sizeof (kernel_rule_t));
4460 }
4461
4462 int sort_by_stringptr (const void *p1, const void *p2)
4463 {
4464 const char **s1 = (const char **) p1;
4465 const char **s2 = (const char **) p2;
4466
4467 return strcmp (*s1, *s2);
4468 }
4469
4470 int sort_by_dictstat (const void *s1, const void *s2)
4471 {
4472 dictstat_t *d1 = (dictstat_t *) s1;
4473 dictstat_t *d2 = (dictstat_t *) s2;
4474
4475 #ifdef _POSIX
4476 d2->stat.st_atim = d1->stat.st_atim;
4477 #else
4478 d2->stat.st_atime = d1->stat.st_atime;
4479 #endif
4480
4481 return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
4482 }
4483
4484 int sort_by_bitmap (const void *p1, const void *p2)
4485 {
4486 const bitmap_result_t *b1 = (const bitmap_result_t *) p1;
4487 const bitmap_result_t *b2 = (const bitmap_result_t *) p2;
4488
4489 return b1->collisions - b2->collisions;
4490 }
4491
4492 int sort_by_digest_4_2 (const void *v1, const void *v2)
4493 {
4494 const u32 *d1 = (const u32 *) v1;
4495 const u32 *d2 = (const u32 *) v2;
4496
4497 uint n = 2;
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_4 (const void *v1, const void *v2)
4509 {
4510 const u32 *d1 = (const u32 *) v1;
4511 const u32 *d2 = (const u32 *) v2;
4512
4513 uint n = 4;
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_5 (const void *v1, const void *v2)
4525 {
4526 const u32 *d1 = (const u32 *) v1;
4527 const u32 *d2 = (const u32 *) v2;
4528
4529 uint n = 5;
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_6 (const void *v1, const void *v2)
4541 {
4542 const u32 *d1 = (const u32 *) v1;
4543 const u32 *d2 = (const u32 *) v2;
4544
4545 uint n = 6;
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_8 (const void *v1, const void *v2)
4557 {
4558 const u32 *d1 = (const u32 *) v1;
4559 const u32 *d2 = (const u32 *) v2;
4560
4561 uint n = 8;
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_4_16 (const void *v1, const void *v2)
4573 {
4574 const u32 *d1 = (const u32 *) v1;
4575 const u32 *d2 = (const u32 *) v2;
4576
4577 uint n = 16;
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_4_32 (const void *v1, const void *v2)
4589 {
4590 const u32 *d1 = (const u32 *) v1;
4591 const u32 *d2 = (const u32 *) v2;
4592
4593 uint n = 32;
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_4_64 (const void *v1, const void *v2)
4605 {
4606 const u32 *d1 = (const u32 *) v1;
4607 const u32 *d2 = (const u32 *) v2;
4608
4609 uint n = 64;
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_8_8 (const void *v1, const void *v2)
4621 {
4622 const u64 *d1 = (const u64 *) v1;
4623 const u64 *d2 = (const u64 *) v2;
4624
4625 uint n = 8;
4626
4627 while (n--)
4628 {
4629 if (d1[n] > d2[n]) return ( 1);
4630 if (d1[n] < d2[n]) return (-1);
4631 }
4632
4633 return (0);
4634 }
4635
4636 int sort_by_digest_8_16 (const void *v1, const void *v2)
4637 {
4638 const u64 *d1 = (const u64 *) v1;
4639 const u64 *d2 = (const u64 *) v2;
4640
4641 uint n = 16;
4642
4643 while (n--)
4644 {
4645 if (d1[n] > d2[n]) return ( 1);
4646 if (d1[n] < d2[n]) return (-1);
4647 }
4648
4649 return (0);
4650 }
4651
4652 int sort_by_digest_8_25 (const void *v1, const void *v2)
4653 {
4654 const u64 *d1 = (const u64 *) v1;
4655 const u64 *d2 = (const u64 *) v2;
4656
4657 uint n = 25;
4658
4659 while (n--)
4660 {
4661 if (d1[n] > d2[n]) return ( 1);
4662 if (d1[n] < d2[n]) return (-1);
4663 }
4664
4665 return (0);
4666 }
4667
4668 int sort_by_digest_p0p1 (const void *v1, const void *v2)
4669 {
4670 const u32 *d1 = (const u32 *) v1;
4671 const u32 *d2 = (const u32 *) v2;
4672
4673 const uint dgst_pos0 = data.dgst_pos0;
4674 const uint dgst_pos1 = data.dgst_pos1;
4675 const uint dgst_pos2 = data.dgst_pos2;
4676 const uint dgst_pos3 = data.dgst_pos3;
4677
4678 if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1);
4679 if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1);
4680 if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1);
4681 if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1);
4682 if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1);
4683 if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1);
4684 if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1);
4685 if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1);
4686
4687 return (0);
4688 }
4689
4690 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)
4691 {
4692 uint outfile_autohex = data.outfile_autohex;
4693
4694 unsigned char *rule_ptr = (unsigned char *) rule_buf;
4695
4696 FILE *debug_fp = NULL;
4697
4698 if (debug_file != NULL)
4699 {
4700 debug_fp = fopen (debug_file, "ab");
4701 }
4702 else
4703 {
4704 debug_fp = stderr;
4705 }
4706
4707 if (debug_fp == NULL)
4708 {
4709 log_info ("WARNING: Could not open debug-file for writing");
4710 }
4711 else
4712 {
4713 if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4))
4714 {
4715 format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex);
4716
4717 if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp);
4718 }
4719
4720 fwrite (rule_ptr, rule_len, 1, debug_fp);
4721
4722 if (debug_mode == 4)
4723 {
4724 fputc (':', debug_fp);
4725
4726 format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex);
4727 }
4728
4729 fputc ('\n', debug_fp);
4730
4731 if (debug_file != NULL) fclose (debug_fp);
4732 }
4733 }
4734
4735 void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex)
4736 {
4737 int needs_hexify = 0;
4738
4739 if (outfile_autohex == 1)
4740 {
4741 for (uint i = 0; i < plain_len; i++)
4742 {
4743 if (plain_ptr[i] < 0x20)
4744 {
4745 needs_hexify = 1;
4746
4747 break;
4748 }
4749
4750 if (plain_ptr[i] > 0x7f)
4751 {
4752 needs_hexify = 1;
4753
4754 break;
4755 }
4756 }
4757 }
4758
4759 if (needs_hexify == 1)
4760 {
4761 fprintf (fp, "$HEX[");
4762
4763 for (uint i = 0; i < plain_len; i++)
4764 {
4765 fprintf (fp, "%02x", plain_ptr[i]);
4766 }
4767
4768 fprintf (fp, "]");
4769 }
4770 else
4771 {
4772 fwrite (plain_ptr, plain_len, 1, fp);
4773 }
4774 }
4775
4776 void format_output (FILE *out_fp, char *out_buf, unsigned char *plain_ptr, const uint plain_len, const u64 crackpos, unsigned char *username, const uint user_len)
4777 {
4778 uint outfile_format = data.outfile_format;
4779
4780 char separator = data.separator;
4781
4782 if (outfile_format & OUTFILE_FMT_HASH)
4783 {
4784 fprintf (out_fp, "%s", out_buf);
4785
4786 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4787 {
4788 fputc (separator, out_fp);
4789 }
4790 }
4791 else if (data.username)
4792 {
4793 if (username != NULL)
4794 {
4795 for (uint i = 0; i < user_len; i++)
4796 {
4797 fprintf (out_fp, "%c", username[i]);
4798 }
4799
4800 if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4801 {
4802 fputc (separator, out_fp);
4803 }
4804 }
4805 }
4806
4807 if (outfile_format & OUTFILE_FMT_PLAIN)
4808 {
4809 format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex);
4810
4811 if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS))
4812 {
4813 fputc (separator, out_fp);
4814 }
4815 }
4816
4817 if (outfile_format & OUTFILE_FMT_HEXPLAIN)
4818 {
4819 for (uint i = 0; i < plain_len; i++)
4820 {
4821 fprintf (out_fp, "%02x", plain_ptr[i]);
4822 }
4823
4824 if (outfile_format & (OUTFILE_FMT_CRACKPOS))
4825 {
4826 fputc (separator, out_fp);
4827 }
4828 }
4829
4830 if (outfile_format & OUTFILE_FMT_CRACKPOS)
4831 {
4832 #ifdef _WIN
4833 __mingw_fprintf (out_fp, "%llu", crackpos);
4834 #endif
4835
4836 #ifdef _POSIX
4837 #ifdef __x86_64__
4838 fprintf (out_fp, "%lu", crackpos);
4839 #else
4840 fprintf (out_fp, "%llu", crackpos);
4841 #endif
4842 #endif
4843 }
4844
4845 fputc ('\n', out_fp);
4846 }
4847
4848 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)
4849 {
4850 pot_t pot_key;
4851
4852 pot_key.hash.salt = hashes_buf->salt;
4853 pot_key.hash.digest = hashes_buf->digest;
4854
4855 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4856
4857 if (pot_ptr)
4858 {
4859 log_info_nn ("");
4860
4861 input_buf[input_len] = 0;
4862
4863 // user
4864 unsigned char *username = NULL;
4865 uint user_len = 0;
4866
4867 if (data.username)
4868 {
4869 user_t *user = hashes_buf->hash_info->user;
4870
4871 if (user)
4872 {
4873 username = (unsigned char *) (user->user_name);
4874
4875 user_len = user->user_len;
4876 }
4877 }
4878
4879 // do output the line
4880 format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len);
4881 }
4882 }
4883
4884 #define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1"
4885 #define LM_MASKED_PLAIN "[notfound]"
4886
4887 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)
4888 {
4889 // left
4890
4891 pot_t pot_left_key;
4892
4893 pot_left_key.hash.salt = hash_left->salt;
4894 pot_left_key.hash.digest = hash_left->digest;
4895
4896 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4897
4898 // right
4899
4900 uint weak_hash_found = 0;
4901
4902 pot_t pot_right_key;
4903
4904 pot_right_key.hash.salt = hash_right->salt;
4905 pot_right_key.hash.digest = hash_right->digest;
4906
4907 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
4908
4909 if (pot_right_ptr == NULL)
4910 {
4911 // special case, if "weak hash"
4912
4913 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
4914 {
4915 weak_hash_found = 1;
4916
4917 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4918
4919 // in theory this is not needed, but we are paranoia:
4920
4921 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4922 pot_right_ptr->plain_len = 0;
4923 }
4924 }
4925
4926 if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL))
4927 {
4928 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
4929
4930 return;
4931 }
4932
4933 // at least one half was found:
4934
4935 log_info_nn ("");
4936
4937 input_buf[input_len] = 0;
4938
4939 // user
4940
4941 unsigned char *username = NULL;
4942 uint user_len = 0;
4943
4944 if (data.username)
4945 {
4946 user_t *user = hash_left->hash_info->user;
4947
4948 if (user)
4949 {
4950 username = (unsigned char *) (user->user_name);
4951
4952 user_len = user->user_len;
4953 }
4954 }
4955
4956 // mask the part which was not found
4957
4958 uint left_part_masked = 0;
4959 uint right_part_masked = 0;
4960
4961 uint mask_plain_len = strlen (LM_MASKED_PLAIN);
4962
4963 if (pot_left_ptr == NULL)
4964 {
4965 left_part_masked = 1;
4966
4967 pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4968
4969 memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf));
4970
4971 memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
4972 pot_left_ptr->plain_len = mask_plain_len;
4973 }
4974
4975 if (pot_right_ptr == NULL)
4976 {
4977 right_part_masked = 1;
4978
4979 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
4980
4981 memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf));
4982
4983 memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len);
4984 pot_right_ptr->plain_len = mask_plain_len;
4985 }
4986
4987 // create the pot_ptr out of pot_left_ptr and pot_right_ptr
4988
4989 pot_t pot_ptr;
4990
4991 pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len;
4992
4993 memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len);
4994
4995 memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len);
4996
4997 // do output the line
4998
4999 format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len);
5000
5001 if (weak_hash_found == 1) myfree (pot_right_ptr);
5002
5003 if (left_part_masked == 1) myfree (pot_left_ptr);
5004 if (right_part_masked == 1) myfree (pot_right_ptr);
5005 }
5006
5007 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)
5008 {
5009 pot_t pot_key;
5010
5011 memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t));
5012
5013 pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5014
5015 if (pot_ptr == NULL)
5016 {
5017 log_info_nn ("");
5018
5019 input_buf[input_len] = 0;
5020
5021 format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0);
5022 }
5023 }
5024
5025 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)
5026 {
5027 // left
5028
5029 pot_t pot_left_key;
5030
5031 memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t));
5032
5033 pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5034
5035 // right
5036
5037 pot_t pot_right_key;
5038
5039 memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t));
5040
5041 pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot);
5042
5043 uint weak_hash_found = 0;
5044
5045 if (pot_right_ptr == NULL)
5046 {
5047 // special case, if "weak hash"
5048
5049 if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0)
5050 {
5051 weak_hash_found = 1;
5052
5053 // we just need that pot_right_ptr is not a NULL pointer
5054
5055 pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t));
5056 }
5057 }
5058
5059 if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL))
5060 {
5061 if (weak_hash_found == 1) myfree (pot_right_ptr);
5062
5063 return;
5064 }
5065
5066 // ... at least one part was not cracked
5067
5068 log_info_nn ("");
5069
5070 input_buf[input_len] = 0;
5071
5072 // only show the hash part which is still not cracked
5073
5074 uint user_len = input_len - 32;
5075
5076 char hash_output[user_len + 33];
5077
5078 memset (hash_output, 0, sizeof (hash_output));
5079
5080 memcpy (hash_output, input_buf, input_len);
5081
5082 if (pot_left_ptr != NULL)
5083 {
5084 // only show right part (because left part was already found)
5085
5086 memcpy (hash_output + user_len, input_buf + user_len + 16, 16);
5087
5088 hash_output[user_len + 16] = 0;
5089 }
5090
5091 if (pot_right_ptr != NULL)
5092 {
5093 // only show left part (because right part was already found)
5094
5095 memcpy (hash_output + user_len, input_buf + user_len, 16);
5096
5097 hash_output[user_len + 16] = 0;
5098 }
5099
5100 format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0);
5101
5102 if (weak_hash_found == 1) myfree (pot_right_ptr);
5103 }
5104
5105 uint setup_opencl_platforms_filter (char *opencl_platforms)
5106 {
5107 uint opencl_platforms_filter = 0;
5108
5109 if (opencl_platforms)
5110 {
5111 char *platforms = strdup (opencl_platforms);
5112
5113 char *next = strtok (platforms, ",");
5114
5115 do
5116 {
5117 int platform = atoi (next);
5118
5119 if (platform < 1 || platform > 32)
5120 {
5121 log_error ("ERROR: invalid OpenCL platform %u specified", platform);
5122
5123 exit (-1);
5124 }
5125
5126 opencl_platforms_filter |= 1 << (platform - 1);
5127
5128 } while ((next = strtok (NULL, ",")) != NULL);
5129
5130 free (platforms);
5131 }
5132 else
5133 {
5134 opencl_platforms_filter = -1;
5135 }
5136
5137 return opencl_platforms_filter;
5138 }
5139
5140 u32 setup_devices_filter (char *opencl_devices)
5141 {
5142 u32 devices_filter = 0;
5143
5144 if (opencl_devices)
5145 {
5146 char *devices = strdup (opencl_devices);
5147
5148 char *next = strtok (devices, ",");
5149
5150 do
5151 {
5152 int device_id = atoi (next);
5153
5154 if (device_id < 1 || device_id > 32)
5155 {
5156 log_error ("ERROR: invalid device_id %u specified", device_id);
5157
5158 exit (-1);
5159 }
5160
5161 devices_filter |= 1 << (device_id - 1);
5162
5163 } while ((next = strtok (NULL, ",")) != NULL);
5164
5165 free (devices);
5166 }
5167 else
5168 {
5169 devices_filter = -1;
5170 }
5171
5172 return devices_filter;
5173 }
5174
5175 cl_device_type setup_device_types_filter (char *opencl_device_types)
5176 {
5177 cl_device_type device_types_filter = 0;
5178
5179 if (opencl_device_types)
5180 {
5181 char *device_types = strdup (opencl_device_types);
5182
5183 char *next = strtok (device_types, ",");
5184
5185 do
5186 {
5187 int device_type = atoi (next);
5188
5189 if (device_type < 1 || device_type > 3)
5190 {
5191 log_error ("ERROR: invalid device_type %u specified", device_type);
5192
5193 exit (-1);
5194 }
5195
5196 device_types_filter |= 1 << device_type;
5197
5198 } while ((next = strtok (NULL, ",")) != NULL);
5199
5200 free (device_types);
5201 }
5202 else
5203 {
5204 // Do not use CPU by default, this often reduces GPU performance because
5205 // the CPU is too busy to handle GPU synchronization
5206
5207 device_types_filter = CL_DEVICE_TYPE_ALL & ~CL_DEVICE_TYPE_CPU;
5208 }
5209
5210 return device_types_filter;
5211 }
5212
5213 u32 get_random_num (const u32 min, const u32 max)
5214 {
5215 if (min == max) return (min);
5216
5217 return ((rand () % (max - min)) + min);
5218 }
5219
5220 u32 mydivc32 (const u32 dividend, const u32 divisor)
5221 {
5222 u32 quotient = dividend / divisor;
5223
5224 if (dividend % divisor) quotient++;
5225
5226 return quotient;
5227 }
5228
5229 u64 mydivc64 (const u64 dividend, const u64 divisor)
5230 {
5231 u64 quotient = dividend / divisor;
5232
5233 if (dividend % divisor) quotient++;
5234
5235 return quotient;
5236 }
5237
5238 void format_timer_display (struct tm *tm, char *buf, size_t len)
5239 {
5240 const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" };
5241 const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" };
5242
5243 if (tm->tm_year - 70)
5244 {
5245 char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0];
5246 char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5247
5248 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2);
5249 }
5250 else if (tm->tm_yday)
5251 {
5252 char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1];
5253 char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5254
5255 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2);
5256 }
5257 else if (tm->tm_hour)
5258 {
5259 char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2];
5260 char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5261
5262 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2);
5263 }
5264 else if (tm->tm_min)
5265 {
5266 char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3];
5267 char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5268
5269 snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2);
5270 }
5271 else
5272 {
5273 char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4];
5274
5275 snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1);
5276 }
5277 }
5278
5279 void format_speed_display (float val, char *buf, size_t len)
5280 {
5281 if (val <= 0)
5282 {
5283 buf[0] = '0';
5284 buf[1] = ' ';
5285 buf[2] = 0;
5286
5287 return;
5288 }
5289
5290 char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' };
5291
5292 uint level = 0;
5293
5294 while (val > 99999)
5295 {
5296 val /= 1000;
5297
5298 level++;
5299 }
5300
5301 /* generate output */
5302
5303 if (level == 0)
5304 {
5305 snprintf (buf, len - 1, "%.0f ", val);
5306 }
5307 else
5308 {
5309 snprintf (buf, len - 1, "%.1f %c", val, units[level]);
5310 }
5311 }
5312
5313 void lowercase (u8 *buf, int len)
5314 {
5315 for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]);
5316 }
5317
5318 void uppercase (u8 *buf, int len)
5319 {
5320 for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]);
5321 }
5322
5323 int fgetl (FILE *fp, char *line_buf)
5324 {
5325 int line_len = 0;
5326
5327 while (!feof (fp))
5328 {
5329 const int c = fgetc (fp);
5330
5331 if (c == EOF) break;
5332
5333 line_buf[line_len] = (char) c;
5334
5335 line_len++;
5336
5337 if (line_len == BUFSIZ) line_len--;
5338
5339 if (c == '\n') break;
5340 }
5341
5342 if (line_len == 0) return 0;
5343
5344 if (line_buf[line_len - 1] == '\n')
5345 {
5346 line_len--;
5347
5348 line_buf[line_len] = 0;
5349 }
5350
5351 if (line_len == 0) return 0;
5352
5353 if (line_buf[line_len - 1] == '\r')
5354 {
5355 line_len--;
5356
5357 line_buf[line_len] = 0;
5358 }
5359
5360 return (line_len);
5361 }
5362
5363 int in_superchop (char *buf)
5364 {
5365 int len = strlen (buf);
5366
5367 while (len)
5368 {
5369 if (buf[len - 1] == '\n')
5370 {
5371 len--;
5372
5373 continue;
5374 }
5375
5376 if (buf[len - 1] == '\r')
5377 {
5378 len--;
5379
5380 continue;
5381 }
5382
5383 break;
5384 }
5385
5386 buf[len] = 0;
5387
5388 return len;
5389 }
5390
5391 char **scan_directory (const char *path)
5392 {
5393 char *tmp_path = mystrdup (path);
5394
5395 size_t tmp_path_len = strlen (tmp_path);
5396
5397 while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\')
5398 {
5399 tmp_path[tmp_path_len - 1] = 0;
5400
5401 tmp_path_len = strlen (tmp_path);
5402 }
5403
5404 char **files = NULL;
5405
5406 int num_files = 0;
5407
5408 DIR *d;
5409
5410 if ((d = opendir (tmp_path)) != NULL)
5411 {
5412 struct dirent *de;
5413
5414 while ((de = readdir (d)) != NULL)
5415 {
5416 if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue;
5417
5418 int path_size = strlen (tmp_path) + 1 + strlen (de->d_name);
5419
5420 char *path_file = (char *) mymalloc (path_size + 1);
5421
5422 snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name);
5423
5424 path_file[path_size] = 0;
5425
5426 DIR *d_test;
5427
5428 if ((d_test = opendir (path_file)) != NULL)
5429 {
5430 closedir (d_test);
5431
5432 myfree (path_file);
5433 }
5434 else
5435 {
5436 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5437
5438 num_files++;
5439
5440 files[num_files - 1] = path_file;
5441 }
5442 }
5443
5444 closedir (d);
5445 }
5446 else if (errno == ENOTDIR)
5447 {
5448 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5449
5450 num_files++;
5451
5452 files[num_files - 1] = mystrdup (path);
5453 }
5454
5455 files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *));
5456
5457 num_files++;
5458
5459 files[num_files - 1] = NULL;
5460
5461 myfree (tmp_path);
5462
5463 return (files);
5464 }
5465
5466 int count_dictionaries (char **dictionary_files)
5467 {
5468 if (dictionary_files == NULL) return 0;
5469
5470 int cnt = 0;
5471
5472 for (int d = 0; dictionary_files[d] != NULL; d++)
5473 {
5474 cnt++;
5475 }
5476
5477 return (cnt);
5478 }
5479
5480 char *stroptitype (const uint opti_type)
5481 {
5482 switch (opti_type)
5483 {
5484 case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break;
5485 case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break;
5486 case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break;
5487 case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break;
5488 case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break;
5489 case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break;
5490 case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break;
5491 case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break;
5492 case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break;
5493 case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break;
5494 case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break;
5495 case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break;
5496 case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break;
5497 case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break;
5498 }
5499
5500 return (NULL);
5501 }
5502
5503 char *strparser (const uint parser_status)
5504 {
5505 switch (parser_status)
5506 {
5507 case PARSER_OK: return ((char *) PA_000); break;
5508 case PARSER_COMMENT: return ((char *) PA_001); break;
5509 case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break;
5510 case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break;
5511 case PARSER_HASH_LENGTH: return ((char *) PA_004); break;
5512 case PARSER_HASH_VALUE: return ((char *) PA_005); break;
5513 case PARSER_SALT_LENGTH: return ((char *) PA_006); break;
5514 case PARSER_SALT_VALUE: return ((char *) PA_007); break;
5515 case PARSER_SALT_ITERATION: return ((char *) PA_008); break;
5516 case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break;
5517 case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break;
5518 case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break;
5519 case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break;
5520 case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break;
5521 case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break;
5522 case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break;
5523 case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break;
5524 }
5525
5526 return ((char *) PA_255);
5527 }
5528
5529 char *strhashtype (const uint hash_mode)
5530 {
5531 switch (hash_mode)
5532 {
5533 case 0: return ((char *) HT_00000); break;
5534 case 10: return ((char *) HT_00010); break;
5535 case 11: return ((char *) HT_00011); break;
5536 case 12: return ((char *) HT_00012); break;
5537 case 20: return ((char *) HT_00020); break;
5538 case 21: return ((char *) HT_00021); break;
5539 case 22: return ((char *) HT_00022); break;
5540 case 23: return ((char *) HT_00023); break;
5541 case 30: return ((char *) HT_00030); break;
5542 case 40: return ((char *) HT_00040); break;
5543 case 50: return ((char *) HT_00050); break;
5544 case 60: return ((char *) HT_00060); break;
5545 case 100: return ((char *) HT_00100); break;
5546 case 101: return ((char *) HT_00101); break;
5547 case 110: return ((char *) HT_00110); break;
5548 case 111: return ((char *) HT_00111); break;
5549 case 112: return ((char *) HT_00112); break;
5550 case 120: return ((char *) HT_00120); break;
5551 case 121: return ((char *) HT_00121); break;
5552 case 122: return ((char *) HT_00122); break;
5553 case 124: return ((char *) HT_00124); break;
5554 case 130: return ((char *) HT_00130); break;
5555 case 131: return ((char *) HT_00131); break;
5556 case 132: return ((char *) HT_00132); break;
5557 case 133: return ((char *) HT_00133); break;
5558 case 140: return ((char *) HT_00140); break;
5559 case 141: return ((char *) HT_00141); break;
5560 case 150: return ((char *) HT_00150); break;
5561 case 160: return ((char *) HT_00160); break;
5562 case 190: return ((char *) HT_00190); break;
5563 case 200: return ((char *) HT_00200); break;
5564 case 300: return ((char *) HT_00300); break;
5565 case 400: return ((char *) HT_00400); break;
5566 case 500: return ((char *) HT_00500); break;
5567 case 501: return ((char *) HT_00501); break;
5568 case 900: return ((char *) HT_00900); break;
5569 case 910: return ((char *) HT_00910); break;
5570 case 1000: return ((char *) HT_01000); break;
5571 case 1100: return ((char *) HT_01100); break;
5572 case 1400: return ((char *) HT_01400); break;
5573 case 1410: return ((char *) HT_01410); break;
5574 case 1420: return ((char *) HT_01420); break;
5575 case 1421: return ((char *) HT_01421); break;
5576 case 1430: return ((char *) HT_01430); break;
5577 case 1440: return ((char *) HT_01440); break;
5578 case 1441: return ((char *) HT_01441); break;
5579 case 1450: return ((char *) HT_01450); break;
5580 case 1460: return ((char *) HT_01460); break;
5581 case 1500: return ((char *) HT_01500); break;
5582 case 1600: return ((char *) HT_01600); break;
5583 case 1700: return ((char *) HT_01700); break;
5584 case 1710: return ((char *) HT_01710); break;
5585 case 1711: return ((char *) HT_01711); break;
5586 case 1720: return ((char *) HT_01720); break;
5587 case 1722: return ((char *) HT_01722); break;
5588 case 1730: return ((char *) HT_01730); break;
5589 case 1731: return ((char *) HT_01731); break;
5590 case 1740: return ((char *) HT_01740); break;
5591 case 1750: return ((char *) HT_01750); break;
5592 case 1760: return ((char *) HT_01760); break;
5593 case 1800: return ((char *) HT_01800); break;
5594 case 2100: return ((char *) HT_02100); break;
5595 case 2400: return ((char *) HT_02400); break;
5596 case 2410: return ((char *) HT_02410); break;
5597 case 2500: return ((char *) HT_02500); break;
5598 case 2600: return ((char *) HT_02600); break;
5599 case 2611: return ((char *) HT_02611); break;
5600 case 2612: return ((char *) HT_02612); break;
5601 case 2711: return ((char *) HT_02711); break;
5602 case 2811: return ((char *) HT_02811); break;
5603 case 3000: return ((char *) HT_03000); break;
5604 case 3100: return ((char *) HT_03100); break;
5605 case 3200: return ((char *) HT_03200); break;
5606 case 3710: return ((char *) HT_03710); break;
5607 case 3711: return ((char *) HT_03711); break;
5608 case 3800: return ((char *) HT_03800); break;
5609 case 4300: return ((char *) HT_04300); break;
5610 case 4400: return ((char *) HT_04400); break;
5611 case 4500: return ((char *) HT_04500); break;
5612 case 4700: return ((char *) HT_04700); break;
5613 case 4800: return ((char *) HT_04800); break;
5614 case 4900: return ((char *) HT_04900); break;
5615 case 5000: return ((char *) HT_05000); break;
5616 case 5100: return ((char *) HT_05100); break;
5617 case 5200: return ((char *) HT_05200); break;
5618 case 5300: return ((char *) HT_05300); break;
5619 case 5400: return ((char *) HT_05400); break;
5620 case 5500: return ((char *) HT_05500); break;
5621 case 5600: return ((char *) HT_05600); break;
5622 case 5700: return ((char *) HT_05700); break;
5623 case 5800: return ((char *) HT_05800); break;
5624 case 6000: return ((char *) HT_06000); break;
5625 case 6100: return ((char *) HT_06100); break;
5626 case 6211: return ((char *) HT_06211); break;
5627 case 6212: return ((char *) HT_06212); break;
5628 case 6213: return ((char *) HT_06213); break;
5629 case 6221: return ((char *) HT_06221); break;
5630 case 6222: return ((char *) HT_06222); break;
5631 case 6223: return ((char *) HT_06223); break;
5632 case 6231: return ((char *) HT_06231); break;
5633 case 6232: return ((char *) HT_06232); break;
5634 case 6233: return ((char *) HT_06233); break;
5635 case 6241: return ((char *) HT_06241); break;
5636 case 6242: return ((char *) HT_06242); break;
5637 case 6243: return ((char *) HT_06243); break;
5638 case 6300: return ((char *) HT_06300); break;
5639 case 6400: return ((char *) HT_06400); break;
5640 case 6500: return ((char *) HT_06500); break;
5641 case 6600: return ((char *) HT_06600); break;
5642 case 6700: return ((char *) HT_06700); break;
5643 case 6800: return ((char *) HT_06800); break;
5644 case 6900: return ((char *) HT_06900); break;
5645 case 7100: return ((char *) HT_07100); break;
5646 case 7200: return ((char *) HT_07200); break;
5647 case 7300: return ((char *) HT_07300); break;
5648 case 7400: return ((char *) HT_07400); break;
5649 case 7500: return ((char *) HT_07500); break;
5650 case 7600: return ((char *) HT_07600); break;
5651 case 7700: return ((char *) HT_07700); break;
5652 case 7800: return ((char *) HT_07800); break;
5653 case 7900: return ((char *) HT_07900); break;
5654 case 8000: return ((char *) HT_08000); break;
5655 case 8100: return ((char *) HT_08100); break;
5656 case 8200: return ((char *) HT_08200); break;
5657 case 8300: return ((char *) HT_08300); break;
5658 case 8400: return ((char *) HT_08400); break;
5659 case 8500: return ((char *) HT_08500); break;
5660 case 8600: return ((char *) HT_08600); break;
5661 case 8700: return ((char *) HT_08700); break;
5662 case 8800: return ((char *) HT_08800); break;
5663 case 8900: return ((char *) HT_08900); break;
5664 case 9000: return ((char *) HT_09000); break;
5665 case 9100: return ((char *) HT_09100); break;
5666 case 9200: return ((char *) HT_09200); break;
5667 case 9300: return ((char *) HT_09300); break;
5668 case 9400: return ((char *) HT_09400); break;
5669 case 9500: return ((char *) HT_09500); break;
5670 case 9600: return ((char *) HT_09600); break;
5671 case 9700: return ((char *) HT_09700); break;
5672 case 9710: return ((char *) HT_09710); break;
5673 case 9720: return ((char *) HT_09720); break;
5674 case 9800: return ((char *) HT_09800); break;
5675 case 9810: return ((char *) HT_09810); break;
5676 case 9820: return ((char *) HT_09820); break;
5677 case 9900: return ((char *) HT_09900); break;
5678 case 10000: return ((char *) HT_10000); break;
5679 case 10100: return ((char *) HT_10100); break;
5680 case 10200: return ((char *) HT_10200); break;
5681 case 10300: return ((char *) HT_10300); break;
5682 case 10400: return ((char *) HT_10400); break;
5683 case 10410: return ((char *) HT_10410); break;
5684 case 10420: return ((char *) HT_10420); break;
5685 case 10500: return ((char *) HT_10500); break;
5686 case 10600: return ((char *) HT_10600); break;
5687 case 10700: return ((char *) HT_10700); break;
5688 case 10800: return ((char *) HT_10800); break;
5689 case 10900: return ((char *) HT_10900); break;
5690 case 11000: return ((char *) HT_11000); break;
5691 case 11100: return ((char *) HT_11100); break;
5692 case 11200: return ((char *) HT_11200); break;
5693 case 11300: return ((char *) HT_11300); break;
5694 case 11400: return ((char *) HT_11400); break;
5695 case 11500: return ((char *) HT_11500); break;
5696 case 11600: return ((char *) HT_11600); break;
5697 case 11700: return ((char *) HT_11700); break;
5698 case 11800: return ((char *) HT_11800); break;
5699 case 11900: return ((char *) HT_11900); break;
5700 case 12000: return ((char *) HT_12000); break;
5701 case 12100: return ((char *) HT_12100); break;
5702 case 12200: return ((char *) HT_12200); break;
5703 case 12300: return ((char *) HT_12300); break;
5704 case 12400: return ((char *) HT_12400); break;
5705 case 12500: return ((char *) HT_12500); break;
5706 case 12600: return ((char *) HT_12600); break;
5707 case 12700: return ((char *) HT_12700); break;
5708 case 12800: return ((char *) HT_12800); break;
5709 case 12900: return ((char *) HT_12900); break;
5710 case 13000: return ((char *) HT_13000); break;
5711 }
5712
5713 return ((char *) "Unknown");
5714 }
5715
5716 char *strstatus (const uint devices_status)
5717 {
5718 switch (devices_status)
5719 {
5720 case STATUS_INIT: return ((char *) ST_0000); break;
5721 case STATUS_STARTING: return ((char *) ST_0001); break;
5722 case STATUS_RUNNING: return ((char *) ST_0002); break;
5723 case STATUS_PAUSED: return ((char *) ST_0003); break;
5724 case STATUS_EXHAUSTED: return ((char *) ST_0004); break;
5725 case STATUS_CRACKED: return ((char *) ST_0005); break;
5726 case STATUS_ABORTED: return ((char *) ST_0006); break;
5727 case STATUS_QUIT: return ((char *) ST_0007); break;
5728 case STATUS_BYPASS: return ((char *) ST_0008); break;
5729 case STATUS_STOP_AT_CHECKPOINT: return ((char *) ST_0009); break;
5730 }
5731
5732 return ((char *) "Unknown");
5733 }
5734
5735 void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos)
5736 {
5737 uint hash_type = data.hash_type;
5738 uint hash_mode = data.hash_mode;
5739 uint salt_type = data.salt_type;
5740 uint opts_type = data.opts_type;
5741 uint opti_type = data.opti_type;
5742 uint dgst_size = data.dgst_size;
5743
5744 char *hashfile = data.hashfile;
5745
5746 uint len = 4096;
5747
5748 uint digest_buf[64];
5749
5750 u64 *digest_buf64 = (u64 *) digest_buf;
5751
5752 char *digests_buf_ptr = (char *) data.digests_buf;
5753
5754 memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size);
5755
5756 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5757 {
5758 uint tt;
5759
5760 switch (hash_type)
5761 {
5762 case HASH_TYPE_DESCRYPT:
5763 FP (digest_buf[1], digest_buf[0], tt);
5764 break;
5765
5766 case HASH_TYPE_DESRACF:
5767 digest_buf[0] = rotl32 (digest_buf[0], 29);
5768 digest_buf[1] = rotl32 (digest_buf[1], 29);
5769
5770 FP (digest_buf[1], digest_buf[0], tt);
5771 break;
5772
5773 case HASH_TYPE_LM:
5774 FP (digest_buf[1], digest_buf[0], tt);
5775 break;
5776
5777 case HASH_TYPE_NETNTLM:
5778 digest_buf[0] = rotl32 (digest_buf[0], 29);
5779 digest_buf[1] = rotl32 (digest_buf[1], 29);
5780 digest_buf[2] = rotl32 (digest_buf[2], 29);
5781 digest_buf[3] = rotl32 (digest_buf[3], 29);
5782
5783 FP (digest_buf[1], digest_buf[0], tt);
5784 FP (digest_buf[3], digest_buf[2], tt);
5785 break;
5786
5787 case HASH_TYPE_BSDICRYPT:
5788 digest_buf[0] = rotl32 (digest_buf[0], 31);
5789 digest_buf[1] = rotl32 (digest_buf[1], 31);
5790
5791 FP (digest_buf[1], digest_buf[0], tt);
5792 break;
5793 }
5794 }
5795
5796 if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
5797 {
5798 switch (hash_type)
5799 {
5800 case HASH_TYPE_MD4:
5801 digest_buf[0] += MD4M_A;
5802 digest_buf[1] += MD4M_B;
5803 digest_buf[2] += MD4M_C;
5804 digest_buf[3] += MD4M_D;
5805 break;
5806
5807 case HASH_TYPE_MD5:
5808 digest_buf[0] += MD5M_A;
5809 digest_buf[1] += MD5M_B;
5810 digest_buf[2] += MD5M_C;
5811 digest_buf[3] += MD5M_D;
5812 break;
5813
5814 case HASH_TYPE_SHA1:
5815 digest_buf[0] += SHA1M_A;
5816 digest_buf[1] += SHA1M_B;
5817 digest_buf[2] += SHA1M_C;
5818 digest_buf[3] += SHA1M_D;
5819 digest_buf[4] += SHA1M_E;
5820 break;
5821
5822 case HASH_TYPE_SHA256:
5823 digest_buf[0] += SHA256M_A;
5824 digest_buf[1] += SHA256M_B;
5825 digest_buf[2] += SHA256M_C;
5826 digest_buf[3] += SHA256M_D;
5827 digest_buf[4] += SHA256M_E;
5828 digest_buf[5] += SHA256M_F;
5829 digest_buf[6] += SHA256M_G;
5830 digest_buf[7] += SHA256M_H;
5831 break;
5832
5833 case HASH_TYPE_SHA384:
5834 digest_buf64[0] += SHA384M_A;
5835 digest_buf64[1] += SHA384M_B;
5836 digest_buf64[2] += SHA384M_C;
5837 digest_buf64[3] += SHA384M_D;
5838 digest_buf64[4] += SHA384M_E;
5839 digest_buf64[5] += SHA384M_F;
5840 digest_buf64[6] += 0;
5841 digest_buf64[7] += 0;
5842 break;
5843
5844 case HASH_TYPE_SHA512:
5845 digest_buf64[0] += SHA512M_A;
5846 digest_buf64[1] += SHA512M_B;
5847 digest_buf64[2] += SHA512M_C;
5848 digest_buf64[3] += SHA512M_D;
5849 digest_buf64[4] += SHA512M_E;
5850 digest_buf64[5] += SHA512M_F;
5851 digest_buf64[6] += SHA512M_G;
5852 digest_buf64[7] += SHA512M_H;
5853 break;
5854 }
5855 }
5856
5857 if (opts_type & OPTS_TYPE_PT_GENERATE_LE)
5858 {
5859 if (dgst_size == DGST_SIZE_4_2)
5860 {
5861 for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5862 }
5863 else if (dgst_size == DGST_SIZE_4_4)
5864 {
5865 for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5866 }
5867 else if (dgst_size == DGST_SIZE_4_5)
5868 {
5869 for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5870 }
5871 else if (dgst_size == DGST_SIZE_4_6)
5872 {
5873 for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5874 }
5875 else if (dgst_size == DGST_SIZE_4_8)
5876 {
5877 for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5878 }
5879 else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :)
5880 {
5881 if (hash_type == HASH_TYPE_WHIRLPOOL)
5882 {
5883 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5884 }
5885 else if (hash_type == HASH_TYPE_SHA384)
5886 {
5887 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5888 }
5889 else if (hash_type == HASH_TYPE_SHA512)
5890 {
5891 for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5892 }
5893 else if (hash_type == HASH_TYPE_GOST)
5894 {
5895 for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5896 }
5897 }
5898 else if (dgst_size == DGST_SIZE_4_64)
5899 {
5900 for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]);
5901 }
5902 else if (dgst_size == DGST_SIZE_8_25)
5903 {
5904 for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]);
5905 }
5906 }
5907
5908 uint isSalted = ((data.salt_type == SALT_TYPE_INTERN)
5909 | (data.salt_type == SALT_TYPE_EXTERN)
5910 | (data.salt_type == SALT_TYPE_EMBEDDED));
5911
5912 salt_t salt;
5913
5914 if (isSalted)
5915 {
5916 memset (&salt, 0, sizeof (salt_t));
5917
5918 memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t));
5919
5920 char *ptr = (char *) salt.salt_buf;
5921
5922 uint len = salt.salt_len;
5923
5924 if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT)
5925 {
5926 uint tt;
5927
5928 switch (hash_type)
5929 {
5930 case HASH_TYPE_NETNTLM:
5931
5932 salt.salt_buf[0] = rotr32 (salt.salt_buf[0], 3);
5933 salt.salt_buf[1] = rotr32 (salt.salt_buf[1], 3);
5934
5935 FP (salt.salt_buf[1], salt.salt_buf[0], tt);
5936
5937 break;
5938 }
5939 }
5940
5941 if (opts_type & OPTS_TYPE_ST_UNICODE)
5942 {
5943 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5944 {
5945 ptr[i] = ptr[j];
5946 }
5947
5948 len = len / 2;
5949 }
5950
5951 if (opts_type & OPTS_TYPE_ST_GENERATE_LE)
5952 {
5953 uint max = salt.salt_len / 4;
5954
5955 if (len % 4) max++;
5956
5957 for (uint i = 0; i < max; i++)
5958 {
5959 salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]);
5960 }
5961 }
5962
5963 if (opts_type & OPTS_TYPE_ST_HEX)
5964 {
5965 char tmp[64];
5966
5967 memset (tmp, 0, sizeof (tmp));
5968
5969 for (uint i = 0, j = 0; i < len; i += 1, j += 2)
5970 {
5971 sprintf (tmp + j, "%02x", (unsigned char) ptr[i]);
5972 }
5973
5974 len = len * 2;
5975
5976 memcpy (ptr, tmp, len);
5977 }
5978
5979 uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0;
5980
5981 memset (ptr + len, 0, memset_size);
5982
5983 salt.salt_len = len;
5984 }
5985
5986 //
5987 // some modes require special encoding
5988 //
5989
5990 uint out_buf_plain[256];
5991 uint out_buf_salt[256];
5992
5993 char tmp_buf[1024];
5994
5995 memset (out_buf_plain, 0, sizeof (out_buf_plain));
5996 memset (out_buf_salt, 0, sizeof (out_buf_salt));
5997
5998 memset (tmp_buf, 0, sizeof (tmp_buf));
5999
6000 char *ptr_plain = (char *) out_buf_plain;
6001 char *ptr_salt = (char *) out_buf_salt;
6002
6003 if (hash_mode == 22)
6004 {
6005 char username[30];
6006
6007 memset (username, 0, sizeof (username));
6008
6009 memcpy (username, salt.salt_buf, salt.salt_len - 22);
6010
6011 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
6012
6013 u16 *ptr = (u16 *) digest_buf;
6014
6015 tmp_buf[ 0] = sig[0];
6016 tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f);
6017 tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f);
6018 tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f);
6019 tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f);
6020 tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f);
6021 tmp_buf[ 6] = sig[1];
6022 tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f);
6023 tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f);
6024 tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f);
6025 tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f);
6026 tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f);
6027 tmp_buf[12] = sig[2];
6028 tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f);
6029 tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f);
6030 tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f);
6031 tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f);
6032 tmp_buf[17] = sig[3];
6033 tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f);
6034 tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f);
6035 tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f);
6036 tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f);
6037 tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f);
6038 tmp_buf[23] = sig[4];
6039 tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f);
6040 tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f);
6041 tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f);
6042 tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f);
6043 tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f);
6044 tmp_buf[29] = sig[5];
6045
6046 snprintf (out_buf, len-1, "%s:%s",
6047 tmp_buf,
6048 username);
6049 }
6050 else if (hash_mode == 23)
6051 {
6052 // do not show the \nskyper\n part in output
6053
6054 char *salt_buf_ptr = (char *) salt.salt_buf;
6055
6056 salt_buf_ptr[salt.salt_len - 8] = 0;
6057
6058 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s",
6059 digest_buf[0],
6060 digest_buf[1],
6061 digest_buf[2],
6062 digest_buf[3],
6063 salt_buf_ptr);
6064 }
6065 else if (hash_mode == 101)
6066 {
6067 // the encoder is a bit too 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 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6074
6075 memcpy (tmp_buf, digest_buf, 20);
6076
6077 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6078
6079 snprintf (out_buf, len-1, "{SHA}%s", ptr_plain);
6080 }
6081 else if (hash_mode == 111)
6082 {
6083 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6084
6085 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6086 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6087 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6088 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6089 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6090
6091 memcpy (tmp_buf, digest_buf, 20);
6092 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
6093
6094 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20 + salt.salt_len, (u8 *) ptr_plain);
6095
6096 snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain);
6097 }
6098 else if (hash_mode == 122)
6099 {
6100 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x",
6101 (char *) salt.salt_buf,
6102 digest_buf[0],
6103 digest_buf[1],
6104 digest_buf[2],
6105 digest_buf[3],
6106 digest_buf[4]);
6107 }
6108 else if (hash_mode == 124)
6109 {
6110 snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x",
6111 (char *) salt.salt_buf,
6112 digest_buf[0],
6113 digest_buf[1],
6114 digest_buf[2],
6115 digest_buf[3],
6116 digest_buf[4]);
6117 }
6118 else if (hash_mode == 131)
6119 {
6120 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6121 (char *) salt.salt_buf,
6122 0, 0, 0, 0, 0,
6123 digest_buf[0],
6124 digest_buf[1],
6125 digest_buf[2],
6126 digest_buf[3],
6127 digest_buf[4]);
6128 }
6129 else if (hash_mode == 132)
6130 {
6131 snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x",
6132 (char *) salt.salt_buf,
6133 digest_buf[0],
6134 digest_buf[1],
6135 digest_buf[2],
6136 digest_buf[3],
6137 digest_buf[4]);
6138 }
6139 else if (hash_mode == 133)
6140 {
6141 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6142
6143 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6144 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6145 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6146 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6147 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6148
6149 memcpy (tmp_buf, digest_buf, 20);
6150
6151 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6152
6153 snprintf (out_buf, len-1, "%s", ptr_plain);
6154 }
6155 else if (hash_mode == 141)
6156 {
6157 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6158
6159 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6160
6161 memset (tmp_buf, 0, sizeof (tmp_buf));
6162
6163 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6164
6165 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6166 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6167 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6168 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6169 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6170
6171 memcpy (tmp_buf, digest_buf, 20);
6172
6173 base64_encode (int_to_base64, (const u8 *) tmp_buf, 20, (u8 *) ptr_plain);
6174
6175 ptr_plain[27] = 0;
6176
6177 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain);
6178 }
6179 else if (hash_mode == 400)
6180 {
6181 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6182
6183 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6184 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6185 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6186 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6187
6188 phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6189
6190 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
6191 }
6192 else if (hash_mode == 500)
6193 {
6194 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6195
6196 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6197 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6198 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6199 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6200
6201 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6202
6203 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6204 {
6205 snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6206 }
6207 else
6208 {
6209 snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6210 }
6211 }
6212 else if (hash_mode == 501)
6213 {
6214 uint digest_idx = salt.digests_offset + digest_pos;
6215
6216 hashinfo_t **hashinfo_ptr = data.hash_info;
6217 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
6218
6219 snprintf (out_buf, len-1, "%s", hash_buf);
6220 }
6221 else if (hash_mode == 1421)
6222 {
6223 u8 *salt_ptr = (u8 *) salt.salt_buf;
6224
6225 snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x",
6226 salt_ptr[0],
6227 salt_ptr[1],
6228 salt_ptr[2],
6229 salt_ptr[3],
6230 salt_ptr[4],
6231 salt_ptr[5],
6232 digest_buf[0],
6233 digest_buf[1],
6234 digest_buf[2],
6235 digest_buf[3],
6236 digest_buf[4],
6237 digest_buf[5],
6238 digest_buf[6],
6239 digest_buf[7]);
6240 }
6241 else if (hash_mode == 1441)
6242 {
6243 memcpy (tmp_buf, salt.salt_buf, salt.salt_len);
6244
6245 base64_encode (int_to_base64, (const u8 *) tmp_buf, salt.salt_len, (u8 *) ptr_salt);
6246
6247 memset (tmp_buf, 0, sizeof (tmp_buf));
6248
6249 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6250
6251 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6252 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6253 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6254 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6255 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6256 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6257 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6258 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6259
6260 memcpy (tmp_buf, digest_buf, 32);
6261
6262 base64_encode (int_to_base64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6263
6264 ptr_plain[43] = 0;
6265
6266 snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain);
6267 }
6268 else if (hash_mode == 1500)
6269 {
6270 out_buf[0] = salt.salt_sign[0] & 0xff;
6271 out_buf[1] = salt.salt_sign[1] & 0xff;
6272 //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269
6273 //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f);
6274 //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
6275
6276 memset (tmp_buf, 0, sizeof (tmp_buf));
6277
6278 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6279
6280 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6281 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6282
6283 memcpy (tmp_buf, digest_buf, 8);
6284
6285 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
6286
6287 snprintf (out_buf + 2, len-1-2, "%s", ptr_plain);
6288
6289 out_buf[13] = 0;
6290 }
6291 else if (hash_mode == 1600)
6292 {
6293 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6294
6295 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6296 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6297 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6298 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6299
6300 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6301
6302 if (salt.salt_iter == ROUNDS_MD5CRYPT)
6303 {
6304 snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6305 }
6306 else
6307 {
6308 snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6309 }
6310 }
6311 else if (hash_mode == 1711)
6312 {
6313 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6314
6315 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6316 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6317 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6318 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6319 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6320 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6321 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6322 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6323
6324 memcpy (tmp_buf, digest_buf, 64);
6325 memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len);
6326
6327 base64_encode (int_to_base64, (const u8 *) tmp_buf, 64 + salt.salt_len, (u8 *) ptr_plain);
6328
6329 snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain);
6330 }
6331 else if (hash_mode == 1722)
6332 {
6333 uint *ptr = digest_buf;
6334
6335 snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6336 (unsigned char *) salt.salt_buf,
6337 ptr[ 1], ptr[ 0],
6338 ptr[ 3], ptr[ 2],
6339 ptr[ 5], ptr[ 4],
6340 ptr[ 7], ptr[ 6],
6341 ptr[ 9], ptr[ 8],
6342 ptr[11], ptr[10],
6343 ptr[13], ptr[12],
6344 ptr[15], ptr[14]);
6345 }
6346 else if (hash_mode == 1731)
6347 {
6348 uint *ptr = digest_buf;
6349
6350 snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
6351 (unsigned char *) salt.salt_buf,
6352 ptr[ 1], ptr[ 0],
6353 ptr[ 3], ptr[ 2],
6354 ptr[ 5], ptr[ 4],
6355 ptr[ 7], ptr[ 6],
6356 ptr[ 9], ptr[ 8],
6357 ptr[11], ptr[10],
6358 ptr[13], ptr[12],
6359 ptr[15], ptr[14]);
6360 }
6361 else if (hash_mode == 1800)
6362 {
6363 // temp workaround
6364
6365 digest_buf64[0] = byte_swap_64 (digest_buf64[0]);
6366 digest_buf64[1] = byte_swap_64 (digest_buf64[1]);
6367 digest_buf64[2] = byte_swap_64 (digest_buf64[2]);
6368 digest_buf64[3] = byte_swap_64 (digest_buf64[3]);
6369 digest_buf64[4] = byte_swap_64 (digest_buf64[4]);
6370 digest_buf64[5] = byte_swap_64 (digest_buf64[5]);
6371 digest_buf64[6] = byte_swap_64 (digest_buf64[6]);
6372 digest_buf64[7] = byte_swap_64 (digest_buf64[7]);
6373
6374 sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6375
6376 if (salt.salt_iter == ROUNDS_SHA512CRYPT)
6377 {
6378 snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6379 }
6380 else
6381 {
6382 snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6383 }
6384 }
6385 else if (hash_mode == 2100)
6386 {
6387 uint pos = 0;
6388
6389 snprintf (out_buf + pos, len-1, "%s%i#",
6390 SIGNATURE_DCC2,
6391 salt.salt_iter + 1);
6392
6393 uint signature_len = strlen (out_buf);
6394
6395 pos += signature_len;
6396 len -= signature_len;
6397
6398 char *salt_ptr = (char *) salt.salt_buf;
6399
6400 for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]);
6401
6402 snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x",
6403 byte_swap_32 (digest_buf[0]),
6404 byte_swap_32 (digest_buf[1]),
6405 byte_swap_32 (digest_buf[2]),
6406 byte_swap_32 (digest_buf[3]));
6407 }
6408 else if ((hash_mode == 2400) || (hash_mode == 2410))
6409 {
6410 memcpy (tmp_buf, digest_buf, 16);
6411
6412 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6413
6414 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6415 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6416 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6417 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6418
6419 out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f);
6420 out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f);
6421 out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f);
6422 out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f);
6423
6424 out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f);
6425 out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f);
6426 out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f);
6427 out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f);
6428
6429 out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f);
6430 out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f);
6431 out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f);
6432 out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f);
6433
6434 out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f);
6435 out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f);
6436 out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f);
6437 out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f);
6438
6439 out_buf[16] = 0;
6440 }
6441 else if (hash_mode == 2500)
6442 {
6443 wpa_t *wpas = (wpa_t *) data.esalts_buf;
6444
6445 wpa_t *wpa = &wpas[salt_pos];
6446
6447 uint pke[25];
6448
6449 char *pke_ptr = (char *) pke;
6450
6451 for (uint i = 0; i < 25; i++)
6452 {
6453 pke[i] = byte_swap_32 (wpa->pke[i]);
6454 }
6455
6456 unsigned char mac1[6];
6457 unsigned char mac2[6];
6458
6459 memcpy (mac1, pke_ptr + 23, 6);
6460 memcpy (mac2, pke_ptr + 29, 6);
6461
6462 snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x",
6463 (char *) salt.salt_buf,
6464 mac1[0],
6465 mac1[1],
6466 mac1[2],
6467 mac1[3],
6468 mac1[4],
6469 mac1[5],
6470 mac2[0],
6471 mac2[1],
6472 mac2[2],
6473 mac2[3],
6474 mac2[4],
6475 mac2[5]);
6476 }
6477 else if (hash_mode == 4400)
6478 {
6479 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
6480 byte_swap_32 (digest_buf[0]),
6481 byte_swap_32 (digest_buf[1]),
6482 byte_swap_32 (digest_buf[2]),
6483 byte_swap_32 (digest_buf[3]));
6484 }
6485 else if (hash_mode == 4700)
6486 {
6487 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6488 byte_swap_32 (digest_buf[0]),
6489 byte_swap_32 (digest_buf[1]),
6490 byte_swap_32 (digest_buf[2]),
6491 byte_swap_32 (digest_buf[3]),
6492 byte_swap_32 (digest_buf[4]));
6493 }
6494 else if (hash_mode == 4800)
6495 {
6496 u8 chap_id_byte = (u8) salt.salt_buf[4];
6497
6498 snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x",
6499 digest_buf[0],
6500 digest_buf[1],
6501 digest_buf[2],
6502 digest_buf[3],
6503 byte_swap_32 (salt.salt_buf[0]),
6504 byte_swap_32 (salt.salt_buf[1]),
6505 byte_swap_32 (salt.salt_buf[2]),
6506 byte_swap_32 (salt.salt_buf[3]),
6507 chap_id_byte);
6508 }
6509 else if (hash_mode == 4900)
6510 {
6511 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6512 byte_swap_32 (digest_buf[0]),
6513 byte_swap_32 (digest_buf[1]),
6514 byte_swap_32 (digest_buf[2]),
6515 byte_swap_32 (digest_buf[3]),
6516 byte_swap_32 (digest_buf[4]));
6517 }
6518 else if (hash_mode == 5100)
6519 {
6520 snprintf (out_buf, len-1, "%08x%08x",
6521 digest_buf[0],
6522 digest_buf[1]);
6523 }
6524 else if (hash_mode == 5200)
6525 {
6526 snprintf (out_buf, len-1, "%s", hashfile);
6527 }
6528 else if (hash_mode == 5300)
6529 {
6530 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6531
6532 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6533
6534 int buf_len = len -1;
6535
6536 // msg_buf
6537
6538 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6539
6540 for (uint i = 0; i < ikepsk_msg_len; i++)
6541 {
6542 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6543 {
6544 snprintf (out_buf, buf_len, ":");
6545
6546 buf_len--;
6547 out_buf++;
6548 }
6549
6550 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6551
6552 buf_len -= 8;
6553 out_buf += 8;
6554 }
6555
6556 // nr_buf
6557
6558 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6559
6560 for (uint i = 0; i < ikepsk_nr_len; i++)
6561 {
6562 if ((i == 0) || (i == 5))
6563 {
6564 snprintf (out_buf, buf_len, ":");
6565
6566 buf_len--;
6567 out_buf++;
6568 }
6569
6570 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6571
6572 buf_len -= 8;
6573 out_buf += 8;
6574 }
6575
6576 // digest_buf
6577
6578 for (uint i = 0; i < 4; i++)
6579 {
6580 if (i == 0)
6581 {
6582 snprintf (out_buf, buf_len, ":");
6583
6584 buf_len--;
6585 out_buf++;
6586 }
6587
6588 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6589
6590 buf_len -= 8;
6591 out_buf += 8;
6592 }
6593 }
6594 else if (hash_mode == 5400)
6595 {
6596 ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf;
6597
6598 ikepsk_t *ikepsk = &ikepsks[salt_pos];
6599
6600 int buf_len = len -1;
6601
6602 // msg_buf
6603
6604 uint ikepsk_msg_len = ikepsk->msg_len / 4;
6605
6606 for (uint i = 0; i < ikepsk_msg_len; i++)
6607 {
6608 if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108))
6609 {
6610 snprintf (out_buf, buf_len, ":");
6611
6612 buf_len--;
6613 out_buf++;
6614 }
6615
6616 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i]));
6617
6618 buf_len -= 8;
6619 out_buf += 8;
6620 }
6621
6622 // nr_buf
6623
6624 uint ikepsk_nr_len = ikepsk->nr_len / 4;
6625
6626 for (uint i = 0; i < ikepsk_nr_len; i++)
6627 {
6628 if ((i == 0) || (i == 5))
6629 {
6630 snprintf (out_buf, buf_len, ":");
6631
6632 buf_len--;
6633 out_buf++;
6634 }
6635
6636 snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i]));
6637
6638 buf_len -= 8;
6639 out_buf += 8;
6640 }
6641
6642 // digest_buf
6643
6644 for (uint i = 0; i < 5; i++)
6645 {
6646 if (i == 0)
6647 {
6648 snprintf (out_buf, buf_len, ":");
6649
6650 buf_len--;
6651 out_buf++;
6652 }
6653
6654 snprintf (out_buf, buf_len, "%08x", digest_buf[i]);
6655
6656 buf_len -= 8;
6657 out_buf += 8;
6658 }
6659 }
6660 else if (hash_mode == 5500)
6661 {
6662 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6663
6664 netntlm_t *netntlm = &netntlms[salt_pos];
6665
6666 char user_buf[64];
6667 char domain_buf[64];
6668 char srvchall_buf[1024];
6669 char clichall_buf[1024];
6670
6671 memset (user_buf, 0, sizeof (user_buf));
6672 memset (domain_buf, 0, sizeof (domain_buf));
6673 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6674 memset (clichall_buf, 0, sizeof (clichall_buf));
6675
6676 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6677 {
6678 char *ptr = (char *) netntlm->userdomain_buf;
6679
6680 user_buf[i] = ptr[j];
6681 }
6682
6683 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6684 {
6685 char *ptr = (char *) netntlm->userdomain_buf;
6686
6687 domain_buf[i] = ptr[netntlm->user_len + j];
6688 }
6689
6690 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6691 {
6692 u8 *ptr = (u8 *) netntlm->chall_buf;
6693
6694 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6695 }
6696
6697 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6698 {
6699 u8 *ptr = (u8 *) netntlm->chall_buf;
6700
6701 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6702 }
6703
6704 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s",
6705 user_buf,
6706 domain_buf,
6707 srvchall_buf,
6708 digest_buf[0],
6709 digest_buf[1],
6710 digest_buf[2],
6711 digest_buf[3],
6712 byte_swap_32 (salt.salt_buf_pc[0]),
6713 byte_swap_32 (salt.salt_buf_pc[1]),
6714 clichall_buf);
6715 }
6716 else if (hash_mode == 5600)
6717 {
6718 netntlm_t *netntlms = (netntlm_t *) data.esalts_buf;
6719
6720 netntlm_t *netntlm = &netntlms[salt_pos];
6721
6722 char user_buf[64];
6723 char domain_buf[64];
6724 char srvchall_buf[1024];
6725 char clichall_buf[1024];
6726
6727 memset (user_buf, 0, sizeof (user_buf));
6728 memset (domain_buf, 0, sizeof (domain_buf));
6729 memset (srvchall_buf, 0, sizeof (srvchall_buf));
6730 memset (clichall_buf, 0, sizeof (clichall_buf));
6731
6732 for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2)
6733 {
6734 char *ptr = (char *) netntlm->userdomain_buf;
6735
6736 user_buf[i] = ptr[j];
6737 }
6738
6739 for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2)
6740 {
6741 char *ptr = (char *) netntlm->userdomain_buf;
6742
6743 domain_buf[i] = ptr[netntlm->user_len + j];
6744 }
6745
6746 for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2)
6747 {
6748 u8 *ptr = (u8 *) netntlm->chall_buf;
6749
6750 sprintf (srvchall_buf + j, "%02x", ptr[i]);
6751 }
6752
6753 for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2)
6754 {
6755 u8 *ptr = (u8 *) netntlm->chall_buf;
6756
6757 sprintf (clichall_buf + j, "%02x", ptr[netntlm->srvchall_len + i]);
6758 }
6759
6760 snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s",
6761 user_buf,
6762 domain_buf,
6763 srvchall_buf,
6764 digest_buf[0],
6765 digest_buf[1],
6766 digest_buf[2],
6767 digest_buf[3],
6768 clichall_buf);
6769 }
6770 else if (hash_mode == 5700)
6771 {
6772 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6773
6774 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6775 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6776 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6777 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6778 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6779 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6780 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6781 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6782
6783 memcpy (tmp_buf, digest_buf, 32);
6784
6785 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 32, (u8 *) ptr_plain);
6786
6787 ptr_plain[43] = 0;
6788
6789 snprintf (out_buf, len-1, "%s", ptr_plain);
6790 }
6791 else if (hash_mode == 5800)
6792 {
6793 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6794 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6795 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6796 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6797 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6798
6799 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
6800 digest_buf[0],
6801 digest_buf[1],
6802 digest_buf[2],
6803 digest_buf[3],
6804 digest_buf[4]);
6805 }
6806 else if ((hash_mode >= 6200) && (hash_mode <= 6299))
6807 {
6808 snprintf (out_buf, len-1, "%s", hashfile);
6809 }
6810 else if (hash_mode == 6300)
6811 {
6812 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6813
6814 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6815 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6816 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6817 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6818
6819 md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6820
6821 snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6822 }
6823 else if (hash_mode == 6400)
6824 {
6825 sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6826
6827 snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6828 }
6829 else if (hash_mode == 6500)
6830 {
6831 sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
6832
6833 snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6834 }
6835 else if (hash_mode == 6600)
6836 {
6837 agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf;
6838
6839 agilekey_t *agilekey = &agilekeys[salt_pos];
6840
6841 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
6842 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
6843
6844 uint buf_len = len - 1;
6845
6846 uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]);
6847 buf_len -= 22;
6848
6849 for (uint i = 0, j = off; i < 1040; i++, j += 2)
6850 {
6851 snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]);
6852
6853 buf_len -= 2;
6854 }
6855 }
6856 else if (hash_mode == 6700)
6857 {
6858 sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6859
6860 snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain);
6861 }
6862 else if (hash_mode == 6800)
6863 {
6864 snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf);
6865 }
6866 else if (hash_mode == 7100)
6867 {
6868 uint *ptr = digest_buf;
6869
6870 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6871
6872 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6873
6874 uint esalt[16];
6875
6876 esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
6877 esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
6878 esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
6879 esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
6880 esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
6881 esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
6882 esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
6883 esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
6884
6885 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",
6886 SIGNATURE_SHA512OSX,
6887 salt.salt_iter + 1,
6888 esalt[ 0], esalt[ 1],
6889 esalt[ 2], esalt[ 3],
6890 esalt[ 4], esalt[ 5],
6891 esalt[ 6], esalt[ 7],
6892 ptr [ 1], ptr [ 0],
6893 ptr [ 3], ptr [ 2],
6894 ptr [ 5], ptr [ 4],
6895 ptr [ 7], ptr [ 6],
6896 ptr [ 9], ptr [ 8],
6897 ptr [11], ptr [10],
6898 ptr [13], ptr [12],
6899 ptr [15], ptr [14]);
6900 }
6901 else if (hash_mode == 7200)
6902 {
6903 uint *ptr = digest_buf;
6904
6905 pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf;
6906
6907 pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos];
6908
6909 uint len_used = 0;
6910
6911 snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1);
6912
6913 len_used = strlen (out_buf);
6914
6915 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf;
6916
6917 for (uint i = 0; i < salt.salt_len; i++, len_used += 2)
6918 {
6919 snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]);
6920 }
6921
6922 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",
6923 ptr [ 1], ptr [ 0],
6924 ptr [ 3], ptr [ 2],
6925 ptr [ 5], ptr [ 4],
6926 ptr [ 7], ptr [ 6],
6927 ptr [ 9], ptr [ 8],
6928 ptr [11], ptr [10],
6929 ptr [13], ptr [12],
6930 ptr [15], ptr [14]);
6931 }
6932 else if (hash_mode == 7300)
6933 {
6934 rakp_t *rakps = (rakp_t *) data.esalts_buf;
6935
6936 rakp_t *rakp = &rakps[salt_pos];
6937
6938 for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8)
6939 {
6940 sprintf (out_buf + j, "%08x", rakp->salt_buf[i]);
6941 }
6942
6943 snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x",
6944 digest_buf[0],
6945 digest_buf[1],
6946 digest_buf[2],
6947 digest_buf[3],
6948 digest_buf[4]);
6949 }
6950 else if (hash_mode == 7400)
6951 {
6952 // the encoder is a bit too intelligent, it expects the input data in the wrong BOM
6953
6954 digest_buf[0] = byte_swap_32 (digest_buf[0]);
6955 digest_buf[1] = byte_swap_32 (digest_buf[1]);
6956 digest_buf[2] = byte_swap_32 (digest_buf[2]);
6957 digest_buf[3] = byte_swap_32 (digest_buf[3]);
6958 digest_buf[4] = byte_swap_32 (digest_buf[4]);
6959 digest_buf[5] = byte_swap_32 (digest_buf[5]);
6960 digest_buf[6] = byte_swap_32 (digest_buf[6]);
6961 digest_buf[7] = byte_swap_32 (digest_buf[7]);
6962
6963 sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain);
6964
6965 if (salt.salt_iter == ROUNDS_SHA256CRYPT)
6966 {
6967 snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain);
6968 }
6969 else
6970 {
6971 snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain);
6972 }
6973 }
6974 else if (hash_mode == 7500)
6975 {
6976 krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf;
6977
6978 krb5pa_t *krb5pa = &krb5pas[salt_pos];
6979
6980 u8 *ptr_timestamp = (u8 *) krb5pa->timestamp;
6981 u8 *ptr_checksum = (u8 *) krb5pa->checksum;
6982
6983 char data[128];
6984
6985 char *ptr_data = data;
6986
6987 for (uint i = 0; i < 36; i++, ptr_data += 2)
6988 {
6989 sprintf (ptr_data, "%02x", ptr_timestamp[i]);
6990 }
6991
6992 for (uint i = 0; i < 16; i++, ptr_data += 2)
6993 {
6994 sprintf (ptr_data, "%02x", ptr_checksum[i]);
6995 }
6996
6997 *ptr_data = 0;
6998
6999 snprintf (out_buf, len-1, "%s$%s$%s$%s$%s",
7000 SIGNATURE_KRB5PA,
7001 (char *) krb5pa->user,
7002 (char *) krb5pa->realm,
7003 (char *) krb5pa->salt,
7004 data);
7005 }
7006 else if (hash_mode == 7700)
7007 {
7008 snprintf (out_buf, len-1, "%s$%08X%08X",
7009 (char *) salt.salt_buf,
7010 digest_buf[0],
7011 digest_buf[1]);
7012 }
7013 else if (hash_mode == 7800)
7014 {
7015 snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X",
7016 (char *) salt.salt_buf,
7017 digest_buf[0],
7018 digest_buf[1],
7019 digest_buf[2],
7020 digest_buf[3],
7021 digest_buf[4]);
7022 }
7023 else if (hash_mode == 7900)
7024 {
7025 drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain);
7026
7027 // ugly hack start
7028
7029 char *tmp = (char *) salt.salt_buf_pc;
7030
7031 ptr_plain[42] = tmp[0];
7032
7033 // ugly hack end
7034
7035 ptr_plain[43] = 0;
7036
7037 snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain);
7038 }
7039 else if (hash_mode == 8000)
7040 {
7041 snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x",
7042 (unsigned char *) salt.salt_buf,
7043 digest_buf[0],
7044 digest_buf[1],
7045 digest_buf[2],
7046 digest_buf[3],
7047 digest_buf[4],
7048 digest_buf[5],
7049 digest_buf[6],
7050 digest_buf[7]);
7051 }
7052 else if (hash_mode == 8100)
7053 {
7054 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7055 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7056
7057 snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x",
7058 (unsigned char *) salt.salt_buf,
7059 digest_buf[0],
7060 digest_buf[1],
7061 digest_buf[2],
7062 digest_buf[3],
7063 digest_buf[4]);
7064 }
7065 else if (hash_mode == 8200)
7066 {
7067 cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf;
7068
7069 cloudkey_t *cloudkey = &cloudkeys[salt_pos];
7070
7071 char data_buf[4096];
7072
7073 for (int i = 0, j = 0; i < 512; i += 1, j += 8)
7074 {
7075 sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]);
7076 }
7077
7078 data_buf[cloudkey->data_len * 2] = 0;
7079
7080 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7081 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7082 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7083 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7084 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7085 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7086 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7087 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7088
7089 salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]);
7090 salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]);
7091 salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]);
7092 salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]);
7093
7094 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s",
7095 digest_buf[0],
7096 digest_buf[1],
7097 digest_buf[2],
7098 digest_buf[3],
7099 digest_buf[4],
7100 digest_buf[5],
7101 digest_buf[6],
7102 digest_buf[7],
7103 salt.salt_buf[0],
7104 salt.salt_buf[1],
7105 salt.salt_buf[2],
7106 salt.salt_buf[3],
7107 salt.salt_iter + 1,
7108 data_buf);
7109 }
7110 else if (hash_mode == 8300)
7111 {
7112 char digest_buf_c[34] = { 0 };
7113
7114 base32_encode (int_to_itoa32, (const u8 *) digest_buf, 20, (u8 *) digest_buf_c);
7115
7116 digest_buf_c[32] = 0;
7117
7118 // domain
7119
7120 const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack
7121
7122 char domain_buf_c[33] = { 0 };
7123
7124 memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len);
7125
7126 for (uint i = 0; i < salt_pc_len; i++)
7127 {
7128 const char next = domain_buf_c[i];
7129
7130 domain_buf_c[i] = '.';
7131
7132 i += next;
7133 }
7134
7135 domain_buf_c[salt_pc_len] = 0;
7136
7137 // final
7138
7139 snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter);
7140 }
7141 else if (hash_mode == 8500)
7142 {
7143 snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]);
7144 }
7145 else if (hash_mode == 2612)
7146 {
7147 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7148 SIGNATURE_PHPS,
7149 (char *) salt.salt_buf,
7150 digest_buf[0],
7151 digest_buf[1],
7152 digest_buf[2],
7153 digest_buf[3]);
7154 }
7155 else if (hash_mode == 3711)
7156 {
7157 char *salt_ptr = (char *) salt.salt_buf;
7158
7159 salt_ptr[salt.salt_len - 1] = 0;
7160
7161 snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x",
7162 SIGNATURE_MEDIAWIKI_B,
7163 salt_ptr,
7164 digest_buf[0],
7165 digest_buf[1],
7166 digest_buf[2],
7167 digest_buf[3]);
7168 }
7169 else if (hash_mode == 8800)
7170 {
7171 androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf;
7172
7173 androidfde_t *androidfde = &androidfdes[salt_pos];
7174
7175 char tmp[3073];
7176
7177 for (uint i = 0, j = 0; i < 384; i += 1, j += 8)
7178 {
7179 sprintf (tmp + j, "%08x", androidfde->data[i]);
7180 }
7181
7182 tmp[3072] = 0;
7183
7184 snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s",
7185 SIGNATURE_ANDROIDFDE,
7186 byte_swap_32 (salt.salt_buf[0]),
7187 byte_swap_32 (salt.salt_buf[1]),
7188 byte_swap_32 (salt.salt_buf[2]),
7189 byte_swap_32 (salt.salt_buf[3]),
7190 byte_swap_32 (digest_buf[0]),
7191 byte_swap_32 (digest_buf[1]),
7192 byte_swap_32 (digest_buf[2]),
7193 byte_swap_32 (digest_buf[3]),
7194 tmp);
7195 }
7196 else if (hash_mode == 8900)
7197 {
7198 uint N = salt.scrypt_N;
7199 uint r = salt.scrypt_r;
7200 uint p = salt.scrypt_p;
7201
7202 char base64_salt[32];
7203
7204 memset (base64_salt, 0, 32);
7205
7206 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) base64_salt);
7207
7208 memset (tmp_buf, 0, 46);
7209
7210 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7211 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7212 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7213 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7214 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7215 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7216 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7217 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7218 digest_buf[8] = 0; // needed for base64_encode ()
7219
7220 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7221
7222 snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s",
7223 SIGNATURE_SCRYPT,
7224 N,
7225 r,
7226 p,
7227 base64_salt,
7228 tmp_buf);
7229 }
7230 else if (hash_mode == 9000)
7231 {
7232 snprintf (out_buf, len-1, "%s", hashfile);
7233 }
7234 else if (hash_mode == 9200)
7235 {
7236 // salt
7237
7238 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7239
7240 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7241
7242 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7243
7244 // hash
7245
7246 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7247 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7248 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7249 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7250 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7251 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7252 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7253 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7254 digest_buf[8] = 0; // needed for base64_encode ()
7255
7256 char tmp_buf[64];
7257 memset (tmp_buf, 0, sizeof (tmp_buf));
7258
7259 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7260 tmp_buf[43] = 0; // cut it here
7261
7262 // output
7263
7264 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf);
7265 }
7266 else if (hash_mode == 9300)
7267 {
7268 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7269 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7270 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7271 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7272 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7273 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7274 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7275 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7276 digest_buf[8] = 0; // needed for base64_encode ()
7277
7278 char tmp_buf[64];
7279 memset (tmp_buf, 0, sizeof (tmp_buf));
7280
7281 base64_encode (int_to_itoa64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7282 tmp_buf[43] = 0; // cut it here
7283
7284 unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf;
7285
7286 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf);
7287 }
7288 else if (hash_mode == 9400)
7289 {
7290 office2007_t *office2007s = (office2007_t *) data.esalts_buf;
7291
7292 office2007_t *office2007 = &office2007s[salt_pos];
7293
7294 snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7295 SIGNATURE_OFFICE2007,
7296 2007,
7297 20,
7298 office2007->keySize,
7299 16,
7300 salt.salt_buf[0],
7301 salt.salt_buf[1],
7302 salt.salt_buf[2],
7303 salt.salt_buf[3],
7304 office2007->encryptedVerifier[0],
7305 office2007->encryptedVerifier[1],
7306 office2007->encryptedVerifier[2],
7307 office2007->encryptedVerifier[3],
7308 office2007->encryptedVerifierHash[0],
7309 office2007->encryptedVerifierHash[1],
7310 office2007->encryptedVerifierHash[2],
7311 office2007->encryptedVerifierHash[3],
7312 office2007->encryptedVerifierHash[4]);
7313 }
7314 else if (hash_mode == 9500)
7315 {
7316 office2010_t *office2010s = (office2010_t *) data.esalts_buf;
7317
7318 office2010_t *office2010 = &office2010s[salt_pos];
7319
7320 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,
7321
7322 salt.salt_buf[0],
7323 salt.salt_buf[1],
7324 salt.salt_buf[2],
7325 salt.salt_buf[3],
7326 office2010->encryptedVerifier[0],
7327 office2010->encryptedVerifier[1],
7328 office2010->encryptedVerifier[2],
7329 office2010->encryptedVerifier[3],
7330 office2010->encryptedVerifierHash[0],
7331 office2010->encryptedVerifierHash[1],
7332 office2010->encryptedVerifierHash[2],
7333 office2010->encryptedVerifierHash[3],
7334 office2010->encryptedVerifierHash[4],
7335 office2010->encryptedVerifierHash[5],
7336 office2010->encryptedVerifierHash[6],
7337 office2010->encryptedVerifierHash[7]);
7338 }
7339 else if (hash_mode == 9600)
7340 {
7341 office2013_t *office2013s = (office2013_t *) data.esalts_buf;
7342
7343 office2013_t *office2013 = &office2013s[salt_pos];
7344
7345 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,
7346
7347 salt.salt_buf[0],
7348 salt.salt_buf[1],
7349 salt.salt_buf[2],
7350 salt.salt_buf[3],
7351 office2013->encryptedVerifier[0],
7352 office2013->encryptedVerifier[1],
7353 office2013->encryptedVerifier[2],
7354 office2013->encryptedVerifier[3],
7355 office2013->encryptedVerifierHash[0],
7356 office2013->encryptedVerifierHash[1],
7357 office2013->encryptedVerifierHash[2],
7358 office2013->encryptedVerifierHash[3],
7359 office2013->encryptedVerifierHash[4],
7360 office2013->encryptedVerifierHash[5],
7361 office2013->encryptedVerifierHash[6],
7362 office2013->encryptedVerifierHash[7]);
7363 }
7364 else if (hash_mode == 9700)
7365 {
7366 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7367
7368 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7369
7370 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7371 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7372 byte_swap_32 (salt.salt_buf[0]),
7373 byte_swap_32 (salt.salt_buf[1]),
7374 byte_swap_32 (salt.salt_buf[2]),
7375 byte_swap_32 (salt.salt_buf[3]),
7376 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7377 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7378 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7379 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7380 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7381 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7382 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7383 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7384 }
7385 else if (hash_mode == 9710)
7386 {
7387 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7388
7389 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7390
7391 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x",
7392 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7393 byte_swap_32 (salt.salt_buf[0]),
7394 byte_swap_32 (salt.salt_buf[1]),
7395 byte_swap_32 (salt.salt_buf[2]),
7396 byte_swap_32 (salt.salt_buf[3]),
7397 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7398 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7399 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7400 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7401 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7402 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7403 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7404 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]));
7405 }
7406 else if (hash_mode == 9720)
7407 {
7408 oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf;
7409
7410 oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos];
7411
7412 u8 *rc4key = (u8 *) oldoffice01->rc4key;
7413
7414 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7415 (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1,
7416 byte_swap_32 (salt.salt_buf[0]),
7417 byte_swap_32 (salt.salt_buf[1]),
7418 byte_swap_32 (salt.salt_buf[2]),
7419 byte_swap_32 (salt.salt_buf[3]),
7420 byte_swap_32 (oldoffice01->encryptedVerifier[0]),
7421 byte_swap_32 (oldoffice01->encryptedVerifier[1]),
7422 byte_swap_32 (oldoffice01->encryptedVerifier[2]),
7423 byte_swap_32 (oldoffice01->encryptedVerifier[3]),
7424 byte_swap_32 (oldoffice01->encryptedVerifierHash[0]),
7425 byte_swap_32 (oldoffice01->encryptedVerifierHash[1]),
7426 byte_swap_32 (oldoffice01->encryptedVerifierHash[2]),
7427 byte_swap_32 (oldoffice01->encryptedVerifierHash[3]),
7428 rc4key[0],
7429 rc4key[1],
7430 rc4key[2],
7431 rc4key[3],
7432 rc4key[4]);
7433 }
7434 else if (hash_mode == 9800)
7435 {
7436 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7437
7438 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7439
7440 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7441 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7442 salt.salt_buf[0],
7443 salt.salt_buf[1],
7444 salt.salt_buf[2],
7445 salt.salt_buf[3],
7446 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7447 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7448 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7449 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7450 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7451 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7452 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7453 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7454 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7455 }
7456 else if (hash_mode == 9810)
7457 {
7458 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7459
7460 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7461
7462 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x",
7463 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7464 salt.salt_buf[0],
7465 salt.salt_buf[1],
7466 salt.salt_buf[2],
7467 salt.salt_buf[3],
7468 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7469 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7470 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7471 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7472 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7473 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7474 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7475 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7476 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]));
7477 }
7478 else if (hash_mode == 9820)
7479 {
7480 oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf;
7481
7482 oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos];
7483
7484 u8 *rc4key = (u8 *) oldoffice34->rc4key;
7485
7486 snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x",
7487 (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4,
7488 salt.salt_buf[0],
7489 salt.salt_buf[1],
7490 salt.salt_buf[2],
7491 salt.salt_buf[3],
7492 byte_swap_32 (oldoffice34->encryptedVerifier[0]),
7493 byte_swap_32 (oldoffice34->encryptedVerifier[1]),
7494 byte_swap_32 (oldoffice34->encryptedVerifier[2]),
7495 byte_swap_32 (oldoffice34->encryptedVerifier[3]),
7496 byte_swap_32 (oldoffice34->encryptedVerifierHash[0]),
7497 byte_swap_32 (oldoffice34->encryptedVerifierHash[1]),
7498 byte_swap_32 (oldoffice34->encryptedVerifierHash[2]),
7499 byte_swap_32 (oldoffice34->encryptedVerifierHash[3]),
7500 byte_swap_32 (oldoffice34->encryptedVerifierHash[4]),
7501 rc4key[0],
7502 rc4key[1],
7503 rc4key[2],
7504 rc4key[3],
7505 rc4key[4]);
7506 }
7507 else if (hash_mode == 10000)
7508 {
7509 // salt
7510
7511 pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf;
7512
7513 pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos];
7514
7515 unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf;
7516
7517 // hash
7518
7519 digest_buf[0] = byte_swap_32 (digest_buf[0]);
7520 digest_buf[1] = byte_swap_32 (digest_buf[1]);
7521 digest_buf[2] = byte_swap_32 (digest_buf[2]);
7522 digest_buf[3] = byte_swap_32 (digest_buf[3]);
7523 digest_buf[4] = byte_swap_32 (digest_buf[4]);
7524 digest_buf[5] = byte_swap_32 (digest_buf[5]);
7525 digest_buf[6] = byte_swap_32 (digest_buf[6]);
7526 digest_buf[7] = byte_swap_32 (digest_buf[7]);
7527 digest_buf[8] = 0; // needed for base64_encode ()
7528
7529 char tmp_buf[64];
7530 memset (tmp_buf, 0, sizeof (tmp_buf));
7531
7532 base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) tmp_buf);
7533
7534 // output
7535
7536 snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf);
7537 }
7538 else if (hash_mode == 10100)
7539 {
7540 snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x",
7541 digest_buf[0],
7542 digest_buf[1],
7543 2,
7544 4,
7545 byte_swap_32 (salt.salt_buf[0]),
7546 byte_swap_32 (salt.salt_buf[1]),
7547 byte_swap_32 (salt.salt_buf[2]),
7548 byte_swap_32 (salt.salt_buf[3]));
7549 }
7550 else if (hash_mode == 10200)
7551 {
7552 cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf;
7553
7554 cram_md5_t *cram_md5 = &cram_md5s[salt_pos];
7555
7556 // challenge
7557
7558 char challenge[100];
7559
7560 memset (challenge, 0, sizeof (challenge));
7561
7562 base64_encode (int_to_base64, (const u8 *) salt.salt_buf, salt.salt_len, (u8 *) challenge);
7563
7564 // response
7565
7566 char tmp_buf[100];
7567
7568 uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x",
7569 (char *) cram_md5->user,
7570 digest_buf[0],
7571 digest_buf[1],
7572 digest_buf[2],
7573 digest_buf[3]);
7574
7575 char response[100];
7576
7577 memset (response, 0, sizeof (response));
7578
7579 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) response);
7580
7581 snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response);
7582 }
7583 else if (hash_mode == 10300)
7584 {
7585 char tmp_buf[100];
7586
7587 memset (tmp_buf, 0, sizeof (tmp_buf));
7588
7589 memcpy (tmp_buf + 0, digest_buf, 20);
7590 memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len);
7591
7592 uint tmp_len = 20 + salt.salt_len;
7593
7594 // base64 encode it
7595
7596 char base64_encoded[100];
7597
7598 memset (base64_encoded, 0, sizeof (base64_encoded));
7599
7600 base64_encode (int_to_base64, (const u8 *) tmp_buf, tmp_len, (u8 *) base64_encoded);
7601
7602 snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded);
7603 }
7604 else if (hash_mode == 10400)
7605 {
7606 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7607
7608 pdf_t *pdf = &pdfs[salt_pos];
7609
7610 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",
7611
7612 pdf->V,
7613 pdf->R,
7614 40,
7615 pdf->P,
7616 pdf->enc_md,
7617 pdf->id_len,
7618 byte_swap_32 (pdf->id_buf[0]),
7619 byte_swap_32 (pdf->id_buf[1]),
7620 byte_swap_32 (pdf->id_buf[2]),
7621 byte_swap_32 (pdf->id_buf[3]),
7622 pdf->u_len,
7623 byte_swap_32 (pdf->u_buf[0]),
7624 byte_swap_32 (pdf->u_buf[1]),
7625 byte_swap_32 (pdf->u_buf[2]),
7626 byte_swap_32 (pdf->u_buf[3]),
7627 byte_swap_32 (pdf->u_buf[4]),
7628 byte_swap_32 (pdf->u_buf[5]),
7629 byte_swap_32 (pdf->u_buf[6]),
7630 byte_swap_32 (pdf->u_buf[7]),
7631 pdf->o_len,
7632 byte_swap_32 (pdf->o_buf[0]),
7633 byte_swap_32 (pdf->o_buf[1]),
7634 byte_swap_32 (pdf->o_buf[2]),
7635 byte_swap_32 (pdf->o_buf[3]),
7636 byte_swap_32 (pdf->o_buf[4]),
7637 byte_swap_32 (pdf->o_buf[5]),
7638 byte_swap_32 (pdf->o_buf[6]),
7639 byte_swap_32 (pdf->o_buf[7])
7640 );
7641 }
7642 else if (hash_mode == 10410)
7643 {
7644 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7645
7646 pdf_t *pdf = &pdfs[salt_pos];
7647
7648 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",
7649
7650 pdf->V,
7651 pdf->R,
7652 40,
7653 pdf->P,
7654 pdf->enc_md,
7655 pdf->id_len,
7656 byte_swap_32 (pdf->id_buf[0]),
7657 byte_swap_32 (pdf->id_buf[1]),
7658 byte_swap_32 (pdf->id_buf[2]),
7659 byte_swap_32 (pdf->id_buf[3]),
7660 pdf->u_len,
7661 byte_swap_32 (pdf->u_buf[0]),
7662 byte_swap_32 (pdf->u_buf[1]),
7663 byte_swap_32 (pdf->u_buf[2]),
7664 byte_swap_32 (pdf->u_buf[3]),
7665 byte_swap_32 (pdf->u_buf[4]),
7666 byte_swap_32 (pdf->u_buf[5]),
7667 byte_swap_32 (pdf->u_buf[6]),
7668 byte_swap_32 (pdf->u_buf[7]),
7669 pdf->o_len,
7670 byte_swap_32 (pdf->o_buf[0]),
7671 byte_swap_32 (pdf->o_buf[1]),
7672 byte_swap_32 (pdf->o_buf[2]),
7673 byte_swap_32 (pdf->o_buf[3]),
7674 byte_swap_32 (pdf->o_buf[4]),
7675 byte_swap_32 (pdf->o_buf[5]),
7676 byte_swap_32 (pdf->o_buf[6]),
7677 byte_swap_32 (pdf->o_buf[7])
7678 );
7679 }
7680 else if (hash_mode == 10420)
7681 {
7682 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7683
7684 pdf_t *pdf = &pdfs[salt_pos];
7685
7686 u8 *rc4key = (u8 *) pdf->rc4key;
7687
7688 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",
7689
7690 pdf->V,
7691 pdf->R,
7692 40,
7693 pdf->P,
7694 pdf->enc_md,
7695 pdf->id_len,
7696 byte_swap_32 (pdf->id_buf[0]),
7697 byte_swap_32 (pdf->id_buf[1]),
7698 byte_swap_32 (pdf->id_buf[2]),
7699 byte_swap_32 (pdf->id_buf[3]),
7700 pdf->u_len,
7701 byte_swap_32 (pdf->u_buf[0]),
7702 byte_swap_32 (pdf->u_buf[1]),
7703 byte_swap_32 (pdf->u_buf[2]),
7704 byte_swap_32 (pdf->u_buf[3]),
7705 byte_swap_32 (pdf->u_buf[4]),
7706 byte_swap_32 (pdf->u_buf[5]),
7707 byte_swap_32 (pdf->u_buf[6]),
7708 byte_swap_32 (pdf->u_buf[7]),
7709 pdf->o_len,
7710 byte_swap_32 (pdf->o_buf[0]),
7711 byte_swap_32 (pdf->o_buf[1]),
7712 byte_swap_32 (pdf->o_buf[2]),
7713 byte_swap_32 (pdf->o_buf[3]),
7714 byte_swap_32 (pdf->o_buf[4]),
7715 byte_swap_32 (pdf->o_buf[5]),
7716 byte_swap_32 (pdf->o_buf[6]),
7717 byte_swap_32 (pdf->o_buf[7]),
7718 rc4key[0],
7719 rc4key[1],
7720 rc4key[2],
7721 rc4key[3],
7722 rc4key[4]
7723 );
7724 }
7725 else if (hash_mode == 10500)
7726 {
7727 pdf_t *pdfs = (pdf_t *) data.esalts_buf;
7728
7729 pdf_t *pdf = &pdfs[salt_pos];
7730
7731 if (pdf->id_len == 32)
7732 {
7733 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",
7734
7735 pdf->V,
7736 pdf->R,
7737 128,
7738 pdf->P,
7739 pdf->enc_md,
7740 pdf->id_len,
7741 byte_swap_32 (pdf->id_buf[0]),
7742 byte_swap_32 (pdf->id_buf[1]),
7743 byte_swap_32 (pdf->id_buf[2]),
7744 byte_swap_32 (pdf->id_buf[3]),
7745 byte_swap_32 (pdf->id_buf[4]),
7746 byte_swap_32 (pdf->id_buf[5]),
7747 byte_swap_32 (pdf->id_buf[6]),
7748 byte_swap_32 (pdf->id_buf[7]),
7749 pdf->u_len,
7750 byte_swap_32 (pdf->u_buf[0]),
7751 byte_swap_32 (pdf->u_buf[1]),
7752 byte_swap_32 (pdf->u_buf[2]),
7753 byte_swap_32 (pdf->u_buf[3]),
7754 byte_swap_32 (pdf->u_buf[4]),
7755 byte_swap_32 (pdf->u_buf[5]),
7756 byte_swap_32 (pdf->u_buf[6]),
7757 byte_swap_32 (pdf->u_buf[7]),
7758 pdf->o_len,
7759 byte_swap_32 (pdf->o_buf[0]),
7760 byte_swap_32 (pdf->o_buf[1]),
7761 byte_swap_32 (pdf->o_buf[2]),
7762 byte_swap_32 (pdf->o_buf[3]),
7763 byte_swap_32 (pdf->o_buf[4]),
7764 byte_swap_32 (pdf->o_buf[5]),
7765 byte_swap_32 (pdf->o_buf[6]),
7766 byte_swap_32 (pdf->o_buf[7])
7767 );
7768 }
7769 else
7770 {
7771 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",
7772
7773 pdf->V,
7774 pdf->R,
7775 128,
7776 pdf->P,
7777 pdf->enc_md,
7778 pdf->id_len,
7779 byte_swap_32 (pdf->id_buf[0]),
7780 byte_swap_32 (pdf->id_buf[1]),
7781 byte_swap_32 (pdf->id_buf[2]),
7782 byte_swap_32 (pdf->id_buf[3]),
7783 pdf->u_len,
7784 byte_swap_32 (pdf->u_buf[0]),
7785 byte_swap_32 (pdf->u_buf[1]),
7786 byte_swap_32 (pdf->u_buf[2]),
7787 byte_swap_32 (pdf->u_buf[3]),
7788 byte_swap_32 (pdf->u_buf[4]),
7789 byte_swap_32 (pdf->u_buf[5]),
7790 byte_swap_32 (pdf->u_buf[6]),
7791 byte_swap_32 (pdf->u_buf[7]),
7792 pdf->o_len,
7793 byte_swap_32 (pdf->o_buf[0]),
7794 byte_swap_32 (pdf->o_buf[1]),
7795 byte_swap_32 (pdf->o_buf[2]),
7796 byte_swap_32 (pdf->o_buf[3]),
7797 byte_swap_32 (pdf->o_buf[4]),
7798 byte_swap_32 (pdf->o_buf[5]),
7799 byte_swap_32 (pdf->o_buf[6]),
7800 byte_swap_32 (pdf->o_buf[7])
7801 );
7802 }
7803 }
7804 else if (hash_mode == 10600)
7805 {
7806 uint digest_idx = salt.digests_offset + digest_pos;
7807
7808 hashinfo_t **hashinfo_ptr = data.hash_info;
7809 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7810
7811 snprintf (out_buf, len-1, "%s", hash_buf);
7812 }
7813 else if (hash_mode == 10700)
7814 {
7815 uint digest_idx = salt.digests_offset + digest_pos;
7816
7817 hashinfo_t **hashinfo_ptr = data.hash_info;
7818 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7819
7820 snprintf (out_buf, len-1, "%s", hash_buf);
7821 }
7822 else if (hash_mode == 10900)
7823 {
7824 uint digest_idx = salt.digests_offset + digest_pos;
7825
7826 hashinfo_t **hashinfo_ptr = data.hash_info;
7827 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7828
7829 snprintf (out_buf, len-1, "%s", hash_buf);
7830 }
7831 else if (hash_mode == 11100)
7832 {
7833 u32 salt_challenge = salt.salt_buf[0];
7834
7835 salt_challenge = byte_swap_32 (salt_challenge);
7836
7837 unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1);
7838
7839 snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x",
7840 SIGNATURE_POSTGRESQL_AUTH,
7841 user_name,
7842 salt_challenge,
7843 digest_buf[0],
7844 digest_buf[1],
7845 digest_buf[2],
7846 digest_buf[3]);
7847 }
7848 else if (hash_mode == 11200)
7849 {
7850 snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x",
7851 SIGNATURE_MYSQL_AUTH,
7852 (unsigned char *) salt.salt_buf,
7853 digest_buf[0],
7854 digest_buf[1],
7855 digest_buf[2],
7856 digest_buf[3],
7857 digest_buf[4]);
7858 }
7859 else if (hash_mode == 11300)
7860 {
7861 bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf;
7862
7863 bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos];
7864
7865 const uint cry_master_len = bitcoin_wallet->cry_master_len;
7866 const uint ckey_len = bitcoin_wallet->ckey_len;
7867 const uint public_key_len = bitcoin_wallet->public_key_len;
7868
7869 char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1);
7870 char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1);
7871 char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1);
7872
7873 for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2)
7874 {
7875 const u8 *ptr = (const u8 *) bitcoin_wallet->cry_master_buf;
7876
7877 sprintf (cry_master_buf + j, "%02x", ptr[i]);
7878 }
7879
7880 for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2)
7881 {
7882 const u8 *ptr = (const u8 *) bitcoin_wallet->ckey_buf;
7883
7884 sprintf (ckey_buf + j, "%02x", ptr[i]);
7885 }
7886
7887 for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2)
7888 {
7889 const u8 *ptr = (const u8 *) bitcoin_wallet->public_key_buf;
7890
7891 sprintf (public_key_buf + j, "%02x", ptr[i]);
7892 }
7893
7894 snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s",
7895 SIGNATURE_BITCOIN_WALLET,
7896 cry_master_len * 2,
7897 cry_master_buf,
7898 salt.salt_len,
7899 (unsigned char *) salt.salt_buf,
7900 salt.salt_iter + 1,
7901 ckey_len * 2,
7902 ckey_buf,
7903 public_key_len * 2,
7904 public_key_buf
7905 );
7906
7907 free (cry_master_buf);
7908 free (ckey_buf);
7909 free (public_key_buf);
7910 }
7911 else if (hash_mode == 11400)
7912 {
7913 uint digest_idx = salt.digests_offset + digest_pos;
7914
7915 hashinfo_t **hashinfo_ptr = data.hash_info;
7916 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7917
7918 snprintf (out_buf, len-1, "%s", hash_buf);
7919 }
7920 else if (hash_mode == 11600)
7921 {
7922 seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf;
7923
7924 seven_zip_t *seven_zip = &seven_zips[salt_pos];
7925
7926 const uint data_len = seven_zip->data_len;
7927
7928 char *data_buf = (char *) mymalloc ((data_len * 2) + 1);
7929
7930 for (uint i = 0, j = 0; i < data_len; i += 1, j += 2)
7931 {
7932 const u8 *ptr = (const u8 *) seven_zip->data_buf;
7933
7934 sprintf (data_buf + j, "%02x", ptr[i]);
7935 }
7936
7937 snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s",
7938 SIGNATURE_SEVEN_ZIP,
7939 0,
7940 salt.salt_sign[0],
7941 0,
7942 (char *) seven_zip->salt_buf,
7943 seven_zip->iv_len,
7944 seven_zip->iv_buf[0],
7945 seven_zip->iv_buf[1],
7946 seven_zip->iv_buf[2],
7947 seven_zip->iv_buf[3],
7948 seven_zip->crc,
7949 seven_zip->data_len,
7950 seven_zip->unpack_size,
7951 data_buf);
7952
7953 free (data_buf);
7954 }
7955 else if (hash_mode == 11700)
7956 {
7957 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
7958 digest_buf[0],
7959 digest_buf[1],
7960 digest_buf[2],
7961 digest_buf[3],
7962 digest_buf[4],
7963 digest_buf[5],
7964 digest_buf[6],
7965 digest_buf[7]);
7966 }
7967 else if (hash_mode == 11800)
7968 {
7969 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
7970 digest_buf[ 0],
7971 digest_buf[ 1],
7972 digest_buf[ 2],
7973 digest_buf[ 3],
7974 digest_buf[ 4],
7975 digest_buf[ 5],
7976 digest_buf[ 6],
7977 digest_buf[ 7],
7978 digest_buf[ 8],
7979 digest_buf[ 9],
7980 digest_buf[10],
7981 digest_buf[11],
7982 digest_buf[12],
7983 digest_buf[13],
7984 digest_buf[14],
7985 digest_buf[15]);
7986 }
7987 else if (hash_mode == 11900)
7988 {
7989 uint digest_idx = salt.digests_offset + digest_pos;
7990
7991 hashinfo_t **hashinfo_ptr = data.hash_info;
7992 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
7993
7994 snprintf (out_buf, len-1, "%s", hash_buf);
7995 }
7996 else if (hash_mode == 12000)
7997 {
7998 uint digest_idx = salt.digests_offset + digest_pos;
7999
8000 hashinfo_t **hashinfo_ptr = data.hash_info;
8001 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8002
8003 snprintf (out_buf, len-1, "%s", hash_buf);
8004 }
8005 else if (hash_mode == 12100)
8006 {
8007 uint digest_idx = salt.digests_offset + digest_pos;
8008
8009 hashinfo_t **hashinfo_ptr = data.hash_info;
8010 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8011
8012 snprintf (out_buf, len-1, "%s", hash_buf);
8013 }
8014 else if (hash_mode == 12200)
8015 {
8016 uint *ptr_digest = digest_buf;
8017 uint *ptr_salt = salt.salt_buf;
8018
8019 snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x",
8020 SIGNATURE_ECRYPTFS,
8021 ptr_salt[0],
8022 ptr_salt[1],
8023 ptr_digest[0],
8024 ptr_digest[1]);
8025 }
8026 else if (hash_mode == 12300)
8027 {
8028 uint *ptr_digest = digest_buf;
8029 uint *ptr_salt = salt.salt_buf;
8030
8031 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",
8032 ptr_digest[ 0], ptr_digest[ 1],
8033 ptr_digest[ 2], ptr_digest[ 3],
8034 ptr_digest[ 4], ptr_digest[ 5],
8035 ptr_digest[ 6], ptr_digest[ 7],
8036 ptr_digest[ 8], ptr_digest[ 9],
8037 ptr_digest[10], ptr_digest[11],
8038 ptr_digest[12], ptr_digest[13],
8039 ptr_digest[14], ptr_digest[15],
8040 ptr_salt[0],
8041 ptr_salt[1],
8042 ptr_salt[2],
8043 ptr_salt[3]);
8044 }
8045 else if (hash_mode == 12400)
8046 {
8047 // encode iteration count
8048
8049 char salt_iter[5];
8050
8051 salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f);
8052 salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f);
8053 salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f);
8054 salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f);
8055 salt_iter[4] = 0;
8056
8057 // encode salt
8058
8059 ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f);
8060 ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f);
8061 ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f);
8062 ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f);
8063 ptr_salt[4] = 0;
8064
8065 // encode digest
8066
8067 memset (tmp_buf, 0, sizeof (tmp_buf));
8068
8069 digest_buf[0] = byte_swap_32 (digest_buf[0]);
8070 digest_buf[1] = byte_swap_32 (digest_buf[1]);
8071
8072 memcpy (tmp_buf, digest_buf, 8);
8073
8074 base64_encode (int_to_itoa64, (const u8 *) tmp_buf, 8, (u8 *) ptr_plain);
8075
8076 ptr_plain[11] = 0;
8077
8078 // fill the resulting buffer
8079
8080 snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain);
8081 }
8082 else if (hash_mode == 12500)
8083 {
8084 snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x",
8085 SIGNATURE_RAR3,
8086 byte_swap_32 (salt.salt_buf[0]),
8087 byte_swap_32 (salt.salt_buf[1]),
8088 salt.salt_buf[2],
8089 salt.salt_buf[3],
8090 salt.salt_buf[4],
8091 salt.salt_buf[5]);
8092 }
8093 else if (hash_mode == 12600)
8094 {
8095 snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8096 digest_buf[0] + salt.salt_buf_pc[0],
8097 digest_buf[1] + salt.salt_buf_pc[1],
8098 digest_buf[2] + salt.salt_buf_pc[2],
8099 digest_buf[3] + salt.salt_buf_pc[3],
8100 digest_buf[4] + salt.salt_buf_pc[4],
8101 digest_buf[5] + salt.salt_buf_pc[5],
8102 digest_buf[6] + salt.salt_buf_pc[6],
8103 digest_buf[7] + salt.salt_buf_pc[7]);
8104 }
8105 else if (hash_mode == 12700)
8106 {
8107 uint digest_idx = salt.digests_offset + digest_pos;
8108
8109 hashinfo_t **hashinfo_ptr = data.hash_info;
8110 char *hash_buf = hashinfo_ptr[digest_idx]->orighash;
8111
8112 snprintf (out_buf, len-1, "%s", hash_buf);
8113 }
8114 else if (hash_mode == 12800)
8115 {
8116 const u8 *ptr = (const u8 *) salt.salt_buf;
8117
8118 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",
8119 SIGNATURE_MS_DRSR,
8120 ptr[0],
8121 ptr[1],
8122 ptr[2],
8123 ptr[3],
8124 ptr[4],
8125 ptr[5],
8126 ptr[6],
8127 ptr[7],
8128 ptr[8],
8129 ptr[9],
8130 salt.salt_iter + 1,
8131 byte_swap_32 (digest_buf[0]),
8132 byte_swap_32 (digest_buf[1]),
8133 byte_swap_32 (digest_buf[2]),
8134 byte_swap_32 (digest_buf[3]),
8135 byte_swap_32 (digest_buf[4]),
8136 byte_swap_32 (digest_buf[5]),
8137 byte_swap_32 (digest_buf[6]),
8138 byte_swap_32 (digest_buf[7])
8139 );
8140 }
8141 else if (hash_mode == 12900)
8142 {
8143 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",
8144 salt.salt_buf[ 4],
8145 salt.salt_buf[ 5],
8146 salt.salt_buf[ 6],
8147 salt.salt_buf[ 7],
8148 salt.salt_buf[ 8],
8149 salt.salt_buf[ 9],
8150 salt.salt_buf[10],
8151 salt.salt_buf[11],
8152 byte_swap_32 (digest_buf[0]),
8153 byte_swap_32 (digest_buf[1]),
8154 byte_swap_32 (digest_buf[2]),
8155 byte_swap_32 (digest_buf[3]),
8156 byte_swap_32 (digest_buf[4]),
8157 byte_swap_32 (digest_buf[5]),
8158 byte_swap_32 (digest_buf[6]),
8159 byte_swap_32 (digest_buf[7]),
8160 salt.salt_buf[ 0],
8161 salt.salt_buf[ 1],
8162 salt.salt_buf[ 2],
8163 salt.salt_buf[ 3]
8164 );
8165 }
8166 else if (hash_mode == 13000)
8167 {
8168 rar5_t *rar5s = (rar5_t *) data.esalts_buf;
8169
8170 rar5_t *rar5 = &rar5s[salt_pos];
8171
8172 snprintf (out_buf, len-1, "$rar5$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x$8$%08x%08x",
8173 salt.salt_buf[0],
8174 salt.salt_buf[1],
8175 salt.salt_buf[2],
8176 salt.salt_buf[3],
8177 salt.salt_sign[0],
8178 rar5->iv[0],
8179 rar5->iv[1],
8180 rar5->iv[2],
8181 rar5->iv[3],
8182 byte_swap_32 (digest_buf[0]),
8183 byte_swap_32 (digest_buf[1])
8184 );
8185 }
8186 else
8187 {
8188 if (hash_type == HASH_TYPE_MD4)
8189 {
8190 snprintf (out_buf, 255, "%08x%08x%08x%08x",
8191 digest_buf[0],
8192 digest_buf[1],
8193 digest_buf[2],
8194 digest_buf[3]);
8195 }
8196 else if (hash_type == HASH_TYPE_MD5)
8197 {
8198 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8199 digest_buf[0],
8200 digest_buf[1],
8201 digest_buf[2],
8202 digest_buf[3]);
8203 }
8204 else if (hash_type == HASH_TYPE_SHA1)
8205 {
8206 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x",
8207 digest_buf[0],
8208 digest_buf[1],
8209 digest_buf[2],
8210 digest_buf[3],
8211 digest_buf[4]);
8212 }
8213 else if (hash_type == HASH_TYPE_SHA256)
8214 {
8215 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8216 digest_buf[0],
8217 digest_buf[1],
8218 digest_buf[2],
8219 digest_buf[3],
8220 digest_buf[4],
8221 digest_buf[5],
8222 digest_buf[6],
8223 digest_buf[7]);
8224 }
8225 else if (hash_type == HASH_TYPE_SHA384)
8226 {
8227 uint *ptr = digest_buf;
8228
8229 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8230 ptr[ 1], ptr[ 0],
8231 ptr[ 3], ptr[ 2],
8232 ptr[ 5], ptr[ 4],
8233 ptr[ 7], ptr[ 6],
8234 ptr[ 9], ptr[ 8],
8235 ptr[11], ptr[10]);
8236 }
8237 else if (hash_type == HASH_TYPE_SHA512)
8238 {
8239 uint *ptr = digest_buf;
8240
8241 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8242 ptr[ 1], ptr[ 0],
8243 ptr[ 3], ptr[ 2],
8244 ptr[ 5], ptr[ 4],
8245 ptr[ 7], ptr[ 6],
8246 ptr[ 9], ptr[ 8],
8247 ptr[11], ptr[10],
8248 ptr[13], ptr[12],
8249 ptr[15], ptr[14]);
8250 }
8251 else if (hash_type == HASH_TYPE_LM)
8252 {
8253 snprintf (out_buf, len-1, "%08x%08x",
8254 digest_buf[0],
8255 digest_buf[1]);
8256 }
8257 else if (hash_type == HASH_TYPE_ORACLEH)
8258 {
8259 snprintf (out_buf, len-1, "%08X%08X",
8260 digest_buf[0],
8261 digest_buf[1]);
8262 }
8263 else if (hash_type == HASH_TYPE_BCRYPT)
8264 {
8265 base64_encode (int_to_bf64, (const u8 *) salt.salt_buf, 16, (u8 *) tmp_buf + 0);
8266 base64_encode (int_to_bf64, (const u8 *) digest_buf, 23, (u8 *) tmp_buf + 22);
8267
8268 tmp_buf[22 + 31] = 0; // base64_encode wants to pad
8269
8270 snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf);
8271 }
8272 else if (hash_type == HASH_TYPE_KECCAK)
8273 {
8274 uint *ptr = digest_buf;
8275
8276 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",
8277 ptr[ 1], ptr[ 0],
8278 ptr[ 3], ptr[ 2],
8279 ptr[ 5], ptr[ 4],
8280 ptr[ 7], ptr[ 6],
8281 ptr[ 9], ptr[ 8],
8282 ptr[11], ptr[10],
8283 ptr[13], ptr[12],
8284 ptr[15], ptr[14],
8285 ptr[17], ptr[16],
8286 ptr[19], ptr[18],
8287 ptr[21], ptr[20],
8288 ptr[23], ptr[22],
8289 ptr[25], ptr[24],
8290 ptr[27], ptr[26],
8291 ptr[29], ptr[28],
8292 ptr[31], ptr[30],
8293 ptr[33], ptr[32],
8294 ptr[35], ptr[34],
8295 ptr[37], ptr[36],
8296 ptr[39], ptr[38],
8297 ptr[41], ptr[30],
8298 ptr[43], ptr[42],
8299 ptr[45], ptr[44],
8300 ptr[47], ptr[46],
8301 ptr[49], ptr[48]
8302 );
8303
8304 out_buf[salt.keccak_mdlen * 2] = 0;
8305 }
8306 else if (hash_type == HASH_TYPE_RIPEMD160)
8307 {
8308 snprintf (out_buf, 255, "%08x%08x%08x%08x%08x",
8309 digest_buf[0],
8310 digest_buf[1],
8311 digest_buf[2],
8312 digest_buf[3],
8313 digest_buf[4]);
8314 }
8315 else if (hash_type == HASH_TYPE_WHIRLPOOL)
8316 {
8317 digest_buf[ 0] = digest_buf[ 0];
8318 digest_buf[ 1] = digest_buf[ 1];
8319 digest_buf[ 2] = digest_buf[ 2];
8320 digest_buf[ 3] = digest_buf[ 3];
8321 digest_buf[ 4] = digest_buf[ 4];
8322 digest_buf[ 5] = digest_buf[ 5];
8323 digest_buf[ 6] = digest_buf[ 6];
8324 digest_buf[ 7] = digest_buf[ 7];
8325 digest_buf[ 8] = digest_buf[ 8];
8326 digest_buf[ 9] = digest_buf[ 9];
8327 digest_buf[10] = digest_buf[10];
8328 digest_buf[11] = digest_buf[11];
8329 digest_buf[12] = digest_buf[12];
8330 digest_buf[13] = digest_buf[13];
8331 digest_buf[14] = digest_buf[14];
8332 digest_buf[15] = digest_buf[15];
8333
8334 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
8335 digest_buf[ 0],
8336 digest_buf[ 1],
8337 digest_buf[ 2],
8338 digest_buf[ 3],
8339 digest_buf[ 4],
8340 digest_buf[ 5],
8341 digest_buf[ 6],
8342 digest_buf[ 7],
8343 digest_buf[ 8],
8344 digest_buf[ 9],
8345 digest_buf[10],
8346 digest_buf[11],
8347 digest_buf[12],
8348 digest_buf[13],
8349 digest_buf[14],
8350 digest_buf[15]);
8351 }
8352 else if (hash_type == HASH_TYPE_GOST)
8353 {
8354 snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x",
8355 digest_buf[0],
8356 digest_buf[1],
8357 digest_buf[2],
8358 digest_buf[3],
8359 digest_buf[4],
8360 digest_buf[5],
8361 digest_buf[6],
8362 digest_buf[7]);
8363 }
8364 else if (hash_type == HASH_TYPE_MYSQL)
8365 {
8366 snprintf (out_buf, len-1, "%08x%08x",
8367 digest_buf[0],
8368 digest_buf[1]);
8369 }
8370 else if (hash_type == HASH_TYPE_LOTUS5)
8371 {
8372 snprintf (out_buf, len-1, "%08x%08x%08x%08x",
8373 digest_buf[0],
8374 digest_buf[1],
8375 digest_buf[2],
8376 digest_buf[3]);
8377 }
8378 else if (hash_type == HASH_TYPE_LOTUS6)
8379 {
8380 digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]);
8381 digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]);
8382 digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]);
8383 digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]);
8384
8385 char buf[16];
8386
8387 memcpy (buf + 0, salt.salt_buf, 5);
8388 memcpy (buf + 5, digest_buf, 9);
8389
8390 buf[3] -= -4;
8391
8392 base64_encode (int_to_lotus64, (const u8 *) buf, 14, (u8 *) tmp_buf);
8393
8394 tmp_buf[18] = salt.salt_buf_pc[7];
8395 tmp_buf[19] = 0;
8396
8397 snprintf (out_buf, len-1, "(G%s)", tmp_buf);
8398 }
8399 else if (hash_type == HASH_TYPE_LOTUS8)
8400 {
8401 char buf[52];
8402
8403 memset (buf, 0, sizeof (buf));
8404
8405 // salt
8406
8407 memcpy (buf + 0, salt.salt_buf, 16);
8408
8409 buf[3] -= -4;
8410
8411 // iteration
8412
8413 snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1);
8414
8415 // chars
8416
8417 buf[26] = salt.salt_buf_pc[0];
8418 buf[27] = salt.salt_buf_pc[1];
8419
8420 // digest
8421
8422 memcpy (buf + 28, digest_buf, 8);
8423
8424 base64_encode (int_to_lotus64, (const u8 *) buf, 36, (u8 *) tmp_buf);
8425
8426 tmp_buf[49] = 0;
8427
8428 snprintf (out_buf, len-1, "(H%s)", tmp_buf);
8429 }
8430 else if (hash_type == HASH_TYPE_CRC32)
8431 {
8432 snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0]));
8433 }
8434 }
8435
8436 if (salt_type == SALT_TYPE_INTERN)
8437 {
8438 size_t pos = strlen (out_buf);
8439
8440 out_buf[pos] = data.separator;
8441
8442 char *ptr = (char *) salt.salt_buf;
8443
8444 memcpy (out_buf + pos + 1, ptr, salt.salt_len);
8445
8446 out_buf[pos + 1 + salt.salt_len] = 0;
8447 }
8448 }
8449
8450 void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
8451 {
8452 memset (hccap, 0, sizeof (hccap_t));
8453
8454 salt_t *salt = &data.salts_buf[salt_pos];
8455
8456 memcpy (hccap->essid, salt->salt_buf, salt->salt_len);
8457
8458 wpa_t *wpas = (wpa_t *) data.esalts_buf;
8459 wpa_t *wpa = &wpas[salt_pos];
8460
8461 hccap->keyver = wpa->keyver;
8462
8463 hccap->eapol_size = wpa->eapol_size;
8464
8465 if (wpa->keyver != 1)
8466 {
8467 uint eapol_tmp[64];
8468
8469 for (uint i = 0; i < 64; i++)
8470 {
8471 eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]);
8472 }
8473
8474 memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size);
8475 }
8476 else
8477 {
8478 memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size);
8479 }
8480
8481 uint pke_tmp[25];
8482
8483 for (int i = 5; i < 25; i++)
8484 {
8485 pke_tmp[i] = byte_swap_32 (wpa->pke[i]);
8486 }
8487
8488 char *pke_ptr = (char *) pke_tmp;
8489
8490 memcpy (hccap->mac1, pke_ptr + 23, 6);
8491 memcpy (hccap->mac2, pke_ptr + 29, 6);
8492 memcpy (hccap->nonce1, pke_ptr + 67, 32);
8493 memcpy (hccap->nonce2, pke_ptr + 35, 32);
8494
8495 char *digests_buf_ptr = (char *) data.digests_buf;
8496
8497 uint dgst_size = data.dgst_size;
8498
8499 uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size));
8500
8501 if (wpa->keyver != 1)
8502 {
8503 uint digest_tmp[4];
8504
8505 digest_tmp[0] = byte_swap_32 (digest_ptr[0]);
8506 digest_tmp[1] = byte_swap_32 (digest_ptr[1]);
8507 digest_tmp[2] = byte_swap_32 (digest_ptr[2]);
8508 digest_tmp[3] = byte_swap_32 (digest_ptr[3]);
8509
8510 memcpy (hccap->keymic, digest_tmp, 16);
8511 }
8512 else
8513 {
8514 memcpy (hccap->keymic, digest_ptr, 16);
8515 }
8516 }
8517
8518 void SuspendThreads ()
8519 {
8520 if (data.devices_status == STATUS_RUNNING)
8521 {
8522 hc_timer_set (&data.timer_paused);
8523
8524 data.devices_status = STATUS_PAUSED;
8525
8526 log_info ("Paused");
8527 }
8528 }
8529
8530 void ResumeThreads ()
8531 {
8532 if (data.devices_status == STATUS_PAUSED)
8533 {
8534 float ms_paused;
8535
8536 hc_timer_get (data.timer_paused, ms_paused);
8537
8538 data.ms_paused += ms_paused;
8539
8540 data.devices_status = STATUS_RUNNING;
8541
8542 log_info ("Resumed");
8543 }
8544 }
8545
8546 void bypass ()
8547 {
8548 if (data.devices_status != STATUS_RUNNING) return;
8549
8550 data.devices_status = STATUS_BYPASS;
8551
8552 log_info ("Next dictionary / mask in queue selected, bypassing current one");
8553 }
8554
8555 void stop_at_checkpoint ()
8556 {
8557 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8558 {
8559 if (data.devices_status != STATUS_RUNNING) return;
8560 }
8561
8562 // this feature only makes sense if --restore-disable was not specified
8563
8564 if (data.restore_disable == 1)
8565 {
8566 log_info ("WARNING: this feature is disabled when --restore-disable was specified");
8567
8568 return;
8569 }
8570
8571 // check if monitoring of Restore Point updates should be enabled or disabled
8572
8573 if (data.devices_status != STATUS_STOP_AT_CHECKPOINT)
8574 {
8575 data.devices_status = STATUS_STOP_AT_CHECKPOINT;
8576
8577 // save the current restore point value
8578
8579 data.checkpoint_cur_words = get_lowest_words_done ();
8580
8581 log_info ("Checkpoint enabled: will quit at next Restore Point update");
8582 }
8583 else
8584 {
8585 data.devices_status = STATUS_RUNNING;
8586
8587 // reset the global value for checkpoint checks
8588
8589 data.checkpoint_cur_words = 0;
8590
8591 log_info ("Checkpoint disabled: Restore Point updates will no longer be monitored");
8592 }
8593 }
8594
8595 void myabort ()
8596 {
8597 if (data.devices_status == STATUS_INIT) return;
8598 if (data.devices_status == STATUS_STARTING) return;
8599
8600 data.devices_status = STATUS_ABORTED;
8601 }
8602
8603 void myquit ()
8604 {
8605 if (data.devices_status == STATUS_INIT) return;
8606 if (data.devices_status == STATUS_STARTING) return;
8607
8608 data.devices_status = STATUS_QUIT;
8609 }
8610
8611 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
8612 {
8613 FILE *fp;
8614
8615 if ((fp = fopen (kernel_file, "rb")) != NULL)
8616 {
8617 struct stat st;
8618
8619 memset (&st, 0, sizeof (st));
8620
8621 stat (kernel_file, &st);
8622
8623 u8 *buf = (u8 *) mymalloc (st.st_size + 1);
8624
8625 size_t num_read = fread (buf, sizeof (u8), st.st_size, fp);
8626
8627 if (num_read != (size_t) st.st_size)
8628 {
8629 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8630
8631 exit (-1);
8632 }
8633
8634 fclose (fp);
8635
8636 buf[st.st_size] = 0;
8637
8638 for (int i = 0; i < num_devices; i++)
8639 {
8640 kernel_lengths[i] = (size_t) st.st_size;
8641
8642 kernel_sources[i] = buf;
8643 }
8644 }
8645 else
8646 {
8647 log_error ("ERROR: %s: %s", kernel_file, strerror (errno));
8648
8649 exit (-1);
8650 }
8651
8652 return;
8653 }
8654
8655 void writeProgramBin (char *dst, u8 *binary, size_t binary_size)
8656 {
8657 FILE *fp = fopen (dst, "wb");
8658
8659 fwrite (binary, sizeof (u8), binary_size, fp);
8660
8661 fflush (fp);
8662 fclose (fp);
8663 }
8664
8665 /**
8666 * restore
8667 */
8668
8669 restore_data_t *init_restore (int argc, char **argv)
8670 {
8671 restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t));
8672
8673 if (data.restore_disable == 0)
8674 {
8675 FILE *fp = fopen (data.eff_restore_file, "rb");
8676
8677 if (fp)
8678 {
8679 size_t nread = fread (rd, sizeof (restore_data_t), 1, fp);
8680
8681 if (nread != 1)
8682 {
8683 log_error ("ERROR: cannot read %s", data.eff_restore_file);
8684
8685 exit (-1);
8686 }
8687
8688 fclose (fp);
8689
8690 if (rd->pid)
8691 {
8692 char pidbin[BUFSIZ];
8693
8694 int pidbin_len;
8695
8696 #ifdef _POSIX
8697 memset (pidbin, 0, sizeof (pidbin));
8698
8699 snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid);
8700
8701 FILE *fd = fopen (pidbin, "rb");
8702
8703 if (fd)
8704 {
8705 pidbin_len = fread (pidbin, 1, BUFSIZ, fd);
8706
8707 pidbin[pidbin_len] = 0;
8708
8709 fclose (fd);
8710
8711 char *argv0_r = strrchr (argv[0], '/');
8712
8713 char *pidbin_r = strrchr (pidbin, '/');
8714
8715 if (argv0_r == NULL) argv0_r = argv[0];
8716
8717 if (pidbin_r == NULL) pidbin_r = pidbin;
8718
8719 if (strcmp (argv0_r, pidbin_r) == 0)
8720 {
8721 log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid);
8722
8723 exit (-1);
8724 }
8725 }
8726
8727 #elif _WIN
8728 HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid);
8729
8730 char pidbin2[BUFSIZ];
8731
8732 int pidbin2_len;
8733
8734 memset (pidbin2, 0, sizeof (pidbin2));
8735
8736 pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ);
8737 pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ);
8738
8739 pidbin[pidbin_len] = 0;
8740 pidbin2[pidbin2_len] = 0;
8741
8742 if (pidbin2_len)
8743 {
8744 if (strcmp (pidbin, pidbin2) == 0)
8745 {
8746 log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid);
8747
8748 exit (-1);
8749 }
8750 }
8751 #endif
8752 }
8753
8754 if (rd->version_bin < RESTORE_MIN)
8755 {
8756 log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file);
8757
8758 exit (-1);
8759 }
8760 }
8761 }
8762
8763 memset (rd, 0, sizeof (restore_data_t));
8764
8765 rd->version_bin = VERSION_BIN;
8766
8767 #ifdef _POSIX
8768 rd->pid = getpid ();
8769 #elif _WIN
8770 rd->pid = GetCurrentProcessId ();
8771 #endif
8772
8773 if (getcwd (rd->cwd, 255) == NULL)
8774 {
8775 myfree (rd);
8776
8777 return (NULL);
8778 }
8779
8780 rd->argc = argc;
8781 rd->argv = argv;
8782
8783 return (rd);
8784 }
8785
8786 void read_restore (const char *eff_restore_file, restore_data_t *rd)
8787 {
8788 FILE *fp = fopen (eff_restore_file, "rb");
8789
8790 if (fp == NULL)
8791 {
8792 log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno));
8793
8794 exit (-1);
8795 }
8796
8797 if (fread (rd, sizeof (restore_data_t), 1, fp) != 1)
8798 {
8799 log_error ("ERROR: cannot read %s", eff_restore_file);
8800
8801 exit (-1);
8802 }
8803
8804 rd->argv = (char **) mycalloc (rd->argc, sizeof (char *));
8805
8806 for (uint i = 0; i < rd->argc; i++)
8807 {
8808 char buf[BUFSIZ];
8809
8810 if (fgets (buf, BUFSIZ - 1, fp) == NULL)
8811 {
8812 log_error ("ERROR: cannot read %s", eff_restore_file);
8813
8814 exit (-1);
8815 }
8816
8817 size_t len = strlen (buf);
8818
8819 if (len) buf[len - 1] = 0;
8820
8821 rd->argv[i] = mystrdup (buf);
8822 }
8823
8824 fclose (fp);
8825
8826 char new_cwd[256];
8827
8828 char *nwd = getcwd (new_cwd, sizeof (new_cwd));
8829
8830 if (nwd == NULL)
8831 {
8832 log_error ("Restore file is corrupted");
8833 }
8834
8835 if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0)
8836 {
8837 if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL)
8838 {
8839 log_error ("ERROR: could not determine current user path: %s", strerror (errno));
8840
8841 exit (-1);
8842 }
8843
8844 log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd);
8845 }
8846
8847
8848 if (chdir (rd->cwd))
8849 {
8850 log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno));
8851
8852 exit (-1);
8853 }
8854 }
8855
8856 u64 get_lowest_words_done ()
8857 {
8858 u64 words_cur = -1;
8859
8860 for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
8861 {
8862 hc_device_param_t *device_param = &data.devices_param[device_id];
8863
8864 if (device_param->skipped) continue;
8865
8866 const u64 words_done = device_param->words_done;
8867
8868 if (words_done < words_cur) words_cur = words_done;
8869 }
8870
8871 // It's possible that a device's workload isn't finished right after a restore-case.
8872 // In that case, this function would return 0 and overwrite the real restore point
8873 // There's also data.words_cur which is set to rd->words_cur but it changes while
8874 // the attack is running therefore we should stick to rd->words_cur.
8875 // Note that -s influences rd->words_cur we should keep a close look on that.
8876
8877 if (words_cur < data.rd->words_cur) words_cur = data.rd->words_cur;
8878
8879 return words_cur;
8880 }
8881
8882 void write_restore (const char *new_restore_file, restore_data_t *rd)
8883 {
8884 u64 words_cur = get_lowest_words_done ();
8885
8886 rd->words_cur = words_cur;
8887
8888 FILE *fp = fopen (new_restore_file, "wb");
8889
8890 if (fp == NULL)
8891 {
8892 log_error ("ERROR: %s: %s", new_restore_file, strerror (errno));
8893
8894 exit (-1);
8895 }
8896
8897 if (setvbuf (fp, NULL, _IONBF, 0))
8898 {
8899 log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno));
8900
8901 exit (-1);
8902 }
8903
8904 fwrite (rd, sizeof (restore_data_t), 1, fp);
8905
8906 for (uint i = 0; i < rd->argc; i++)
8907 {
8908 fprintf (fp, "%s", rd->argv[i]);
8909 fputc ('\n', fp);
8910 }
8911
8912 fflush (fp);
8913
8914 fsync (fileno (fp));
8915
8916 fclose (fp);
8917 }
8918
8919 void cycle_restore ()
8920 {
8921 const char *eff_restore_file = data.eff_restore_file;
8922 const char *new_restore_file = data.new_restore_file;
8923
8924 restore_data_t *rd = data.rd;
8925
8926 write_restore (new_restore_file, rd);
8927
8928 struct stat st;
8929
8930 memset (&st, 0, sizeof(st));
8931
8932 if (stat (eff_restore_file, &st) == 0)
8933 {
8934 if (unlink (eff_restore_file))
8935 {
8936 log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno));
8937 }
8938 }
8939
8940 if (rename (new_restore_file, eff_restore_file))
8941 {
8942 log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno));
8943 }
8944 }
8945
8946 void check_checkpoint ()
8947 {
8948 // if (data.restore_disable == 1) break; (this is already implied by previous checks)
8949
8950 u64 words_cur = get_lowest_words_done ();
8951
8952 if (words_cur != data.checkpoint_cur_words)
8953 {
8954 myabort ();
8955 }
8956 }
8957
8958 /**
8959 * adjustments
8960 */
8961
8962 uint set_kernel_accel (uint hash_mode)
8963 {
8964 switch (hash_mode)
8965 {
8966 case 0: return GET_ACCEL (0);
8967 case 10: return GET_ACCEL (10);
8968 case 11: return GET_ACCEL (11);
8969 case 12: return GET_ACCEL (12);
8970 case 20: return GET_ACCEL (20);
8971 case 21: return GET_ACCEL (21);
8972 case 22: return GET_ACCEL (22);
8973 case 23: return GET_ACCEL (23);
8974 case 30: return GET_ACCEL (30);
8975 case 40: return GET_ACCEL (40);
8976 case 50: return GET_ACCEL (50);
8977 case 60: return GET_ACCEL (60);
8978 case 100: return GET_ACCEL (100);
8979 case 101: return GET_ACCEL (101);
8980 case 110: return GET_ACCEL (110);
8981 case 111: return GET_ACCEL (111);
8982 case 112: return GET_ACCEL (112);
8983 case 120: return GET_ACCEL (120);
8984 case 121: return GET_ACCEL (121);
8985 case 122: return GET_ACCEL (122);
8986 case 124: return GET_ACCEL (124);
8987 case 130: return GET_ACCEL (130);
8988 case 131: return GET_ACCEL (131);
8989 case 132: return GET_ACCEL (132);
8990 case 133: return GET_ACCEL (133);
8991 case 140: return GET_ACCEL (140);
8992 case 141: return GET_ACCEL (141);
8993 case 150: return GET_ACCEL (150);
8994 case 160: return GET_ACCEL (160);
8995 case 190: return GET_ACCEL (190);
8996 case 200: return GET_ACCEL (200);
8997 case 300: return GET_ACCEL (300);
8998 case 400: return GET_ACCEL (400);
8999 case 500: return GET_ACCEL (500);
9000 case 501: return GET_ACCEL (501);
9001 case 900: return GET_ACCEL (900);
9002 case 910: return GET_ACCEL (910);
9003 case 1000: return GET_ACCEL (1000);
9004 case 1100: return GET_ACCEL (1100);
9005 case 1400: return GET_ACCEL (1400);
9006 case 1410: return GET_ACCEL (1410);
9007 case 1420: return GET_ACCEL (1420);
9008 case 1421: return GET_ACCEL (1421);
9009 case 1430: return GET_ACCEL (1430);
9010 case 1440: return GET_ACCEL (1440);
9011 case 1441: return GET_ACCEL (1441);
9012 case 1450: return GET_ACCEL (1450);
9013 case 1460: return GET_ACCEL (1460);
9014 case 1500: return GET_ACCEL (1500);
9015 case 1600: return GET_ACCEL (1600);
9016 case 1700: return GET_ACCEL (1700);
9017 case 1710: return GET_ACCEL (1710);
9018 case 1711: return GET_ACCEL (1711);
9019 case 1720: return GET_ACCEL (1720);
9020 case 1722: return GET_ACCEL (1722);
9021 case 1730: return GET_ACCEL (1730);
9022 case 1731: return GET_ACCEL (1731);
9023 case 1740: return GET_ACCEL (1740);
9024 case 1750: return GET_ACCEL (1750);
9025 case 1760: return GET_ACCEL (1760);
9026 case 1800: return GET_ACCEL (1800);
9027 case 2100: return GET_ACCEL (2100);
9028 case 2400: return GET_ACCEL (2400);
9029 case 2410: return GET_ACCEL (2410);
9030 case 2500: return GET_ACCEL (2500);
9031 case 2600: return GET_ACCEL (2600);
9032 case 2611: return GET_ACCEL (2611);
9033 case 2612: return GET_ACCEL (2612);
9034 case 2711: return GET_ACCEL (2711);
9035 case 2811: return GET_ACCEL (2811);
9036 case 3000: return GET_ACCEL (3000);
9037 case 3100: return GET_ACCEL (3100);
9038 case 3200: return GET_ACCEL (3200);
9039 case 3710: return GET_ACCEL (3710);
9040 case 3711: return GET_ACCEL (3711);
9041 case 3800: return GET_ACCEL (3800);
9042 case 4300: return GET_ACCEL (4300);
9043 case 4400: return GET_ACCEL (4400);
9044 case 4500: return GET_ACCEL (4500);
9045 case 4700: return GET_ACCEL (4700);
9046 case 4800: return GET_ACCEL (4800);
9047 case 4900: return GET_ACCEL (4900);
9048 case 5000: return GET_ACCEL (5000);
9049 case 5100: return GET_ACCEL (5100);
9050 case 5200: return GET_ACCEL (5200);
9051 case 5300: return GET_ACCEL (5300);
9052 case 5400: return GET_ACCEL (5400);
9053 case 5500: return GET_ACCEL (5500);
9054 case 5600: return GET_ACCEL (5600);
9055 case 5700: return GET_ACCEL (5700);
9056 case 5800: return GET_ACCEL (5800);
9057 case 6000: return GET_ACCEL (6000);
9058 case 6100: return GET_ACCEL (6100);
9059 case 6211: return GET_ACCEL (6211);
9060 case 6212: return GET_ACCEL (6212);
9061 case 6213: return GET_ACCEL (6213);
9062 case 6221: return GET_ACCEL (6221);
9063 case 6222: return GET_ACCEL (6222);
9064 case 6223: return GET_ACCEL (6223);
9065 case 6231: return GET_ACCEL (6231);
9066 case 6232: return GET_ACCEL (6232);
9067 case 6233: return GET_ACCEL (6233);
9068 case 6241: return GET_ACCEL (6241);
9069 case 6242: return GET_ACCEL (6242);
9070 case 6243: return GET_ACCEL (6243);
9071 case 6300: return GET_ACCEL (6300);
9072 case 6400: return GET_ACCEL (6400);
9073 case 6500: return GET_ACCEL (6500);
9074 case 6600: return GET_ACCEL (6600);
9075 case 6700: return GET_ACCEL (6700);
9076 case 6800: return GET_ACCEL (6800);
9077 case 6900: return GET_ACCEL (6900);
9078 case 7100: return GET_ACCEL (7100);
9079 case 7200: return GET_ACCEL (7200);
9080 case 7300: return GET_ACCEL (7300);
9081 case 7400: return GET_ACCEL (7400);
9082 case 7500: return GET_ACCEL (7500);
9083 case 7600: return GET_ACCEL (7600);
9084 case 7700: return GET_ACCEL (7700);
9085 case 7800: return GET_ACCEL (7800);
9086 case 7900: return GET_ACCEL (7900);
9087 case 8000: return GET_ACCEL (8000);
9088 case 8100: return GET_ACCEL (8100);
9089 case 8200: return GET_ACCEL (8200);
9090 case 8300: return GET_ACCEL (8300);
9091 case 8400: return GET_ACCEL (8400);
9092 case 8500: return GET_ACCEL (8500);
9093 case 8600: return GET_ACCEL (8600);
9094 case 8700: return GET_ACCEL (8700);
9095 case 8800: return GET_ACCEL (8800);
9096 case 8900: return GET_ACCEL (8900);
9097 case 9000: return GET_ACCEL (9000);
9098 case 9100: return GET_ACCEL (9100);
9099 case 9200: return GET_ACCEL (9200);
9100 case 9300: return GET_ACCEL (9300);
9101 case 9400: return GET_ACCEL (9400);
9102 case 9500: return GET_ACCEL (9500);
9103 case 9600: return GET_ACCEL (9600);
9104 case 9700: return GET_ACCEL (9700);
9105 case 9710: return GET_ACCEL (9710);
9106 case 9720: return GET_ACCEL (9720);
9107 case 9800: return GET_ACCEL (9800);
9108 case 9810: return GET_ACCEL (9810);
9109 case 9820: return GET_ACCEL (9820);
9110 case 9900: return GET_ACCEL (9900);
9111 case 10000: return GET_ACCEL (10000);
9112 case 10100: return GET_ACCEL (10100);
9113 case 10200: return GET_ACCEL (10200);
9114 case 10300: return GET_ACCEL (10300);
9115 case 10400: return GET_ACCEL (10400);
9116 case 10410: return GET_ACCEL (10410);
9117 case 10420: return GET_ACCEL (10420);
9118 case 10500: return GET_ACCEL (10500);
9119 case 10600: return GET_ACCEL (10600);
9120 case 10700: return GET_ACCEL (10700);
9121 case 10800: return GET_ACCEL (10800);
9122 case 10900: return GET_ACCEL (10900);
9123 case 11000: return GET_ACCEL (11000);
9124 case 11100: return GET_ACCEL (11100);
9125 case 11200: return GET_ACCEL (11200);
9126 case 11300: return GET_ACCEL (11300);
9127 case 11400: return GET_ACCEL (11400);
9128 case 11500: return GET_ACCEL (11500);
9129 case 11600: return GET_ACCEL (11600);
9130 case 11700: return GET_ACCEL (11700);
9131 case 11800: return GET_ACCEL (11800);
9132 case 11900: return GET_ACCEL (11900);
9133 case 12000: return GET_ACCEL (12000);
9134 case 12100: return GET_ACCEL (12100);
9135 case 12200: return GET_ACCEL (12200);
9136 case 12300: return GET_ACCEL (12300);
9137 case 12400: return GET_ACCEL (12400);
9138 case 12500: return GET_ACCEL (12500);
9139 case 12600: return GET_ACCEL (12600);
9140 case 12700: return GET_ACCEL (12700);
9141 case 12800: return GET_ACCEL (12800);
9142 case 12900: return GET_ACCEL (12900);
9143 case 13000: return GET_ACCEL (13000);
9144 }
9145
9146 return 0;
9147 }
9148
9149 uint set_kernel_loops (uint hash_mode)
9150 {
9151 switch (hash_mode)
9152 {
9153 case 0: return GET_LOOPS (0);
9154 case 10: return GET_LOOPS (10);
9155 case 11: return GET_LOOPS (11);
9156 case 12: return GET_LOOPS (12);
9157 case 20: return GET_LOOPS (20);
9158 case 21: return GET_LOOPS (21);
9159 case 22: return GET_LOOPS (22);
9160 case 23: return GET_LOOPS (23);
9161 case 30: return GET_LOOPS (30);
9162 case 40: return GET_LOOPS (40);
9163 case 50: return GET_LOOPS (50);
9164 case 60: return GET_LOOPS (60);
9165 case 100: return GET_LOOPS (100);
9166 case 101: return GET_LOOPS (101);
9167 case 110: return GET_LOOPS (110);
9168 case 111: return GET_LOOPS (111);
9169 case 112: return GET_LOOPS (112);
9170 case 120: return GET_LOOPS (120);
9171 case 121: return GET_LOOPS (121);
9172 case 122: return GET_LOOPS (122);
9173 case 124: return GET_LOOPS (124);
9174 case 130: return GET_LOOPS (130);
9175 case 131: return GET_LOOPS (131);
9176 case 132: return GET_LOOPS (132);
9177 case 133: return GET_LOOPS (133);
9178 case 140: return GET_LOOPS (140);
9179 case 141: return GET_LOOPS (141);
9180 case 150: return GET_LOOPS (150);
9181 case 160: return GET_LOOPS (160);
9182 case 190: return GET_LOOPS (190);
9183 case 200: return GET_LOOPS (200);
9184 case 300: return GET_LOOPS (300);
9185 case 400: return GET_LOOPS (400);
9186 case 500: return GET_LOOPS (500);
9187 case 501: return GET_LOOPS (501);
9188 case 900: return GET_LOOPS (900);
9189 case 910: return GET_LOOPS (910);
9190 case 1000: return GET_LOOPS (1000);
9191 case 1100: return GET_LOOPS (1100);
9192 case 1400: return GET_LOOPS (1400);
9193 case 1410: return GET_LOOPS (1410);
9194 case 1420: return GET_LOOPS (1420);
9195 case 1421: return GET_LOOPS (1421);
9196 case 1430: return GET_LOOPS (1430);
9197 case 1440: return GET_LOOPS (1440);
9198 case 1441: return GET_LOOPS (1441);
9199 case 1450: return GET_LOOPS (1450);
9200 case 1460: return GET_LOOPS (1460);
9201 case 1500: return GET_LOOPS (1500);
9202 case 1600: return GET_LOOPS (1600);
9203 case 1700: return GET_LOOPS (1700);
9204 case 1710: return GET_LOOPS (1710);
9205 case 1711: return GET_LOOPS (1711);
9206 case 1720: return GET_LOOPS (1720);
9207 case 1722: return GET_LOOPS (1722);
9208 case 1730: return GET_LOOPS (1730);
9209 case 1731: return GET_LOOPS (1731);
9210 case 1740: return GET_LOOPS (1740);
9211 case 1750: return GET_LOOPS (1750);
9212 case 1760: return GET_LOOPS (1760);
9213 case 1800: return GET_LOOPS (1800);
9214 case 2100: return GET_LOOPS (2100);
9215 case 2400: return GET_LOOPS (2400);
9216 case 2410: return GET_LOOPS (2410);
9217 case 2500: return GET_LOOPS (2500);
9218 case 2600: return GET_LOOPS (2600);
9219 case 2611: return GET_LOOPS (2611);
9220 case 2612: return GET_LOOPS (2612);
9221 case 2711: return GET_LOOPS (2711);
9222 case 2811: return GET_LOOPS (2811);
9223 case 3000: return GET_LOOPS (3000);
9224 case 3100: return GET_LOOPS (3100);
9225 case 3200: return GET_LOOPS (3200);
9226 case 3710: return GET_LOOPS (3710);
9227 case 3711: return GET_LOOPS (3711);
9228 case 3800: return GET_LOOPS (3800);
9229 case 4300: return GET_LOOPS (4300);
9230 case 4400: return GET_LOOPS (4400);
9231 case 4500: return GET_LOOPS (4500);
9232 case 4700: return GET_LOOPS (4700);
9233 case 4800: return GET_LOOPS (4800);
9234 case 4900: return GET_LOOPS (4900);
9235 case 5000: return GET_LOOPS (5000);
9236 case 5100: return GET_LOOPS (5100);
9237 case 5200: return GET_LOOPS (5200);
9238 case 5300: return GET_LOOPS (5300);
9239 case 5400: return GET_LOOPS (5400);
9240 case 5500: return GET_LOOPS (5500);
9241 case 5600: return GET_LOOPS (5600);
9242 case 5700: return GET_LOOPS (5700);
9243 case 5800: return GET_LOOPS (5800);
9244 case 6000: return GET_LOOPS (6000);
9245 case 6100: return GET_LOOPS (6100);
9246 case 6211: return GET_LOOPS (6211);
9247 case 6212: return GET_LOOPS (6212);
9248 case 6213: return GET_LOOPS (6213);
9249 case 6221: return GET_LOOPS (6221);
9250 case 6222: return GET_LOOPS (6222);
9251 case 6223: return GET_LOOPS (6223);
9252 case 6231: return GET_LOOPS (6231);
9253 case 6232: return GET_LOOPS (6232);
9254 case 6233: return GET_LOOPS (6233);
9255 case 6241: return GET_LOOPS (6241);
9256 case 6242: return GET_LOOPS (6242);
9257 case 6243: return GET_LOOPS (6243);
9258 case 6300: return GET_LOOPS (6300);
9259 case 6400: return GET_LOOPS (6400);
9260 case 6500: return GET_LOOPS (6500);
9261 case 6600: return GET_LOOPS (6600);
9262 case 6700: return GET_LOOPS (6700);
9263 case 6800: return GET_LOOPS (6800);
9264 case 6900: return GET_LOOPS (6900);
9265 case 7100: return GET_LOOPS (7100);
9266 case 7200: return GET_LOOPS (7200);
9267 case 7300: return GET_LOOPS (7300);
9268 case 7400: return GET_LOOPS (7400);
9269 case 7500: return GET_LOOPS (7500);
9270 case 7600: return GET_LOOPS (7600);
9271 case 7700: return GET_LOOPS (7700);
9272 case 7800: return GET_LOOPS (7800);
9273 case 7900: return GET_LOOPS (7900);
9274 case 8000: return GET_LOOPS (8000);
9275 case 8100: return GET_LOOPS (8100);
9276 case 8200: return GET_LOOPS (8200);
9277 case 8300: return GET_LOOPS (8300);
9278 case 8400: return GET_LOOPS (8400);
9279 case 8500: return GET_LOOPS (8500);
9280 case 8600: return GET_LOOPS (8600);
9281 case 8700: return GET_LOOPS (8700);
9282 case 8800: return GET_LOOPS (8800);
9283 case 8900: return GET_LOOPS (8900);
9284 case 9000: return GET_LOOPS (9000);
9285 case 9100: return GET_LOOPS (9100);
9286 case 9200: return GET_LOOPS (9200);
9287 case 9300: return GET_LOOPS (9300);
9288 case 9400: return GET_LOOPS (9400);
9289 case 9500: return GET_LOOPS (9500);
9290 case 9600: return GET_LOOPS (9600);
9291 case 9700: return GET_LOOPS (9700);
9292 case 9710: return GET_LOOPS (9710);
9293 case 9720: return GET_LOOPS (9720);
9294 case 9800: return GET_LOOPS (9800);
9295 case 9810: return GET_LOOPS (9810);
9296 case 9820: return GET_LOOPS (9820);
9297 case 9900: return GET_LOOPS (9900);
9298 case 10000: return GET_LOOPS (10000);
9299 case 10100: return GET_LOOPS (10100);
9300 case 10200: return GET_LOOPS (10200);
9301 case 10300: return GET_LOOPS (10300);
9302 case 10400: return GET_LOOPS (10400);
9303 case 10410: return GET_LOOPS (10410);
9304 case 10420: return GET_LOOPS (10420);
9305 case 10500: return GET_LOOPS (10500);
9306 case 10600: return GET_LOOPS (10600);
9307 case 10700: return GET_LOOPS (10700);
9308 case 10800: return GET_LOOPS (10800);
9309 case 10900: return GET_LOOPS (10900);
9310 case 11000: return GET_LOOPS (11000);
9311 case 11100: return GET_LOOPS (11100);
9312 case 11200: return GET_LOOPS (11200);
9313 case 11300: return GET_LOOPS (11300);
9314 case 11400: return GET_LOOPS (11400);
9315 case 11500: return GET_LOOPS (11500);
9316 case 11600: return GET_LOOPS (11600);
9317 case 11700: return GET_LOOPS (11700);
9318 case 11800: return GET_LOOPS (11800);
9319 case 11900: return GET_LOOPS (11900);
9320 case 12000: return GET_LOOPS (12000);
9321 case 12100: return GET_LOOPS (12100);
9322 case 12200: return GET_LOOPS (12200);
9323 case 12300: return GET_LOOPS (12300);
9324 case 12400: return GET_LOOPS (12400);
9325 case 12500: return GET_LOOPS (12500);
9326 case 12600: return GET_LOOPS (12600);
9327 case 12700: return GET_LOOPS (12700);
9328 case 12800: return GET_LOOPS (12800);
9329 case 12900: return GET_LOOPS (12900);
9330 case 13000: return GET_LOOPS (13000);
9331 }
9332
9333 return 0;
9334 }
9335
9336 /**
9337 * parser
9338 */
9339
9340 uint parse_and_store_salt (char *out, char *in, uint salt_len)
9341 {
9342 u8 tmp[256];
9343
9344 if (salt_len > sizeof (tmp))
9345 {
9346 return UINT_MAX;
9347 }
9348
9349 memset (tmp, 0, sizeof (tmp));
9350 memcpy (tmp, in, salt_len);
9351
9352 if (data.opts_type & OPTS_TYPE_ST_HEX)
9353 {
9354 if ((salt_len % 2) == 0)
9355 {
9356 u32 new_salt_len = salt_len / 2;
9357
9358 for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2)
9359 {
9360 u8 p0 = tmp[j + 0];
9361 u8 p1 = tmp[j + 1];
9362
9363 tmp[i] = hex_convert (p1) << 0;
9364 tmp[i] |= hex_convert (p0) << 4;
9365 }
9366
9367 salt_len = new_salt_len;
9368 }
9369 else
9370 {
9371 return UINT_MAX;
9372 }
9373 }
9374 else if (data.opts_type & OPTS_TYPE_ST_BASE64)
9375 {
9376 salt_len = base64_decode (base64_to_int, (const u8 *) in, salt_len, (u8 *) tmp);
9377 }
9378
9379 memset (tmp + salt_len, 0, sizeof (tmp) - salt_len);
9380
9381 if (data.opts_type & OPTS_TYPE_ST_UNICODE)
9382 {
9383 if (salt_len < 20)
9384 {
9385 u32 *tmp_uint = (u32 *) tmp;
9386
9387 tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF);
9388 tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF);
9389 tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF);
9390 tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF);
9391 tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF);
9392 tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF);
9393 tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF);
9394 tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF);
9395 tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF);
9396 tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF);
9397
9398 salt_len = salt_len * 2;
9399 }
9400 else
9401 {
9402 return UINT_MAX;
9403 }
9404 }
9405
9406 if (data.opts_type & OPTS_TYPE_ST_LOWER)
9407 {
9408 lowercase (tmp, salt_len);
9409 }
9410
9411 if (data.opts_type & OPTS_TYPE_ST_UPPER)
9412 {
9413 uppercase (tmp, salt_len);
9414 }
9415
9416 u32 len = salt_len;
9417
9418 if (data.opts_type & OPTS_TYPE_ST_ADD80)
9419 {
9420 tmp[len++] = 0x80;
9421 }
9422
9423 if (data.opts_type & OPTS_TYPE_ST_ADD01)
9424 {
9425 tmp[len++] = 0x01;
9426 }
9427
9428 if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE)
9429 {
9430 u32 *tmp_uint = (uint *) tmp;
9431
9432 u32 max = len / 4;
9433
9434 if (len % 4) max++;
9435
9436 for (u32 i = 0; i < max; i++)
9437 {
9438 tmp_uint[i] = byte_swap_32 (tmp_uint[i]);
9439 }
9440
9441 // Important: we may need to increase the length of memcpy since
9442 // we don't want to "loose" some swapped bytes (could happen if
9443 // they do not perfectly fit in the 4-byte blocks)
9444 // Memcpy does always copy the bytes in the BE order, but since
9445 // we swapped them, some important bytes could be in positions
9446 // we normally skip with the original len
9447
9448 if (len % 4) len += 4 - (len % 4);
9449 }
9450
9451 memcpy (out, tmp, len);
9452
9453 return (salt_len);
9454 }
9455
9456 int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9457 {
9458 if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH);
9459
9460 if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED);
9461
9462 u32 *digest = (u32 *) hash_buf->digest;
9463
9464 salt_t *salt = hash_buf->salt;
9465
9466 memcpy ((char *) salt->salt_sign, input_buf, 6);
9467
9468 char *iter_pos = input_buf + 4;
9469
9470 salt->salt_iter = 1 << atoi (iter_pos);
9471
9472 char *salt_pos = strchr (iter_pos, '$');
9473
9474 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9475
9476 salt_pos++;
9477
9478 uint salt_len = 16;
9479
9480 salt->salt_len = salt_len;
9481
9482 u8 tmp_buf[100];
9483
9484 memset (tmp_buf, 0, sizeof (tmp_buf));
9485
9486 base64_decode (bf64_to_int, (const u8 *) salt_pos, 22, tmp_buf);
9487
9488 char *salt_buf_ptr = (char *) salt->salt_buf;
9489
9490 memcpy (salt_buf_ptr, tmp_buf, 16);
9491
9492 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
9493 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
9494 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
9495 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
9496
9497 char *hash_pos = salt_pos + 22;
9498
9499 memset (tmp_buf, 0, sizeof (tmp_buf));
9500
9501 base64_decode (bf64_to_int, (const u8 *) hash_pos, 31, tmp_buf);
9502
9503 memcpy (digest, tmp_buf, 24);
9504
9505 digest[0] = byte_swap_32 (digest[0]);
9506 digest[1] = byte_swap_32 (digest[1]);
9507 digest[2] = byte_swap_32 (digest[2]);
9508 digest[3] = byte_swap_32 (digest[3]);
9509 digest[4] = byte_swap_32 (digest[4]);
9510 digest[5] = byte_swap_32 (digest[5]);
9511
9512 digest[5] &= ~0xff; // its just 23 not 24 !
9513
9514 return (PARSER_OK);
9515 }
9516
9517 int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9518 {
9519 if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH);
9520
9521 u32 *digest = (u32 *) hash_buf->digest;
9522
9523 u8 tmp_buf[100];
9524
9525 memset (tmp_buf, 0, sizeof (tmp_buf));
9526
9527 base64_decode (itoa64_to_int, (const u8 *) input_buf, 43, tmp_buf);
9528
9529 memcpy (digest, tmp_buf, 32);
9530
9531 digest[0] = byte_swap_32 (digest[0]);
9532 digest[1] = byte_swap_32 (digest[1]);
9533 digest[2] = byte_swap_32 (digest[2]);
9534 digest[3] = byte_swap_32 (digest[3]);
9535 digest[4] = byte_swap_32 (digest[4]);
9536 digest[5] = byte_swap_32 (digest[5]);
9537 digest[6] = byte_swap_32 (digest[6]);
9538 digest[7] = byte_swap_32 (digest[7]);
9539
9540 digest[0] -= SHA256M_A;
9541 digest[1] -= SHA256M_B;
9542 digest[2] -= SHA256M_C;
9543 digest[3] -= SHA256M_D;
9544 digest[4] -= SHA256M_E;
9545 digest[5] -= SHA256M_F;
9546 digest[6] -= SHA256M_G;
9547 digest[7] -= SHA256M_H;
9548
9549 return (PARSER_OK);
9550 }
9551
9552 int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9553 {
9554 if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH);
9555
9556 u32 *digest = (u32 *) hash_buf->digest;
9557
9558 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9559 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9560
9561 digest[0] = byte_swap_32 (digest[0]);
9562 digest[1] = byte_swap_32 (digest[1]);
9563
9564 uint tt;
9565
9566 IP (digest[0], digest[1], tt);
9567
9568 digest[0] = digest[0];
9569 digest[1] = digest[1];
9570 digest[2] = 0;
9571 digest[3] = 0;
9572
9573 return (PARSER_OK);
9574 }
9575
9576 int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9577 {
9578 if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH);
9579
9580 u32 *digest = (u32 *) hash_buf->digest;
9581
9582 salt_t *salt = hash_buf->salt;
9583
9584 char *hash_pos = input_buf + 8;
9585
9586 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
9587 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
9588 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
9589 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
9590 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
9591
9592 digest[0] -= SHA1M_A;
9593 digest[1] -= SHA1M_B;
9594 digest[2] -= SHA1M_C;
9595 digest[3] -= SHA1M_D;
9596 digest[4] -= SHA1M_E;
9597
9598 uint salt_len = 8;
9599
9600 char *salt_buf_ptr = (char *) salt->salt_buf;
9601
9602 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9603
9604 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9605
9606 salt->salt_len = salt_len;
9607
9608 return (PARSER_OK);
9609 }
9610
9611 int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9612 {
9613 if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH);
9614
9615 u64 *digest = (u64 *) hash_buf->digest;
9616
9617 salt_t *salt = hash_buf->salt;
9618
9619 char *hash_pos = input_buf + 8;
9620
9621 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
9622 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
9623 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
9624 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
9625 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
9626 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
9627 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
9628 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
9629
9630 digest[0] -= SHA512M_A;
9631 digest[1] -= SHA512M_B;
9632 digest[2] -= SHA512M_C;
9633 digest[3] -= SHA512M_D;
9634 digest[4] -= SHA512M_E;
9635 digest[5] -= SHA512M_F;
9636 digest[6] -= SHA512M_G;
9637 digest[7] -= SHA512M_H;
9638
9639 uint salt_len = 8;
9640
9641 char *salt_buf_ptr = (char *) salt->salt_buf;
9642
9643 salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len);
9644
9645 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9646
9647 salt->salt_len = salt_len;
9648
9649 return (PARSER_OK);
9650 }
9651
9652 int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9653 {
9654 if (data.opts_type & OPTS_TYPE_ST_HEX)
9655 {
9656 if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH);
9657 }
9658 else
9659 {
9660 if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH);
9661 }
9662
9663 u32 *digest = (u32 *) hash_buf->digest;
9664
9665 salt_t *salt = hash_buf->salt;
9666
9667 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9668 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9669 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9670 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9671
9672 digest[0] = byte_swap_32 (digest[0]);
9673 digest[1] = byte_swap_32 (digest[1]);
9674 digest[2] = byte_swap_32 (digest[2]);
9675 digest[3] = byte_swap_32 (digest[3]);
9676
9677 digest[0] -= MD5M_A;
9678 digest[1] -= MD5M_B;
9679 digest[2] -= MD5M_C;
9680 digest[3] -= MD5M_D;
9681
9682 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9683
9684 uint salt_len = input_len - 32 - 1;
9685
9686 char *salt_buf = input_buf + 32 + 1;
9687
9688 char *salt_buf_ptr = (char *) salt->salt_buf;
9689
9690 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9691
9692 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9693
9694 salt->salt_len = salt_len;
9695
9696 return (PARSER_OK);
9697 }
9698
9699 int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9700 {
9701 if (data.opts_type & OPTS_TYPE_ST_HEX)
9702 {
9703 if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH);
9704 }
9705 else
9706 {
9707 if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH);
9708 }
9709
9710 // unscramble
9711
9712 char clean_input_buf[32];
9713
9714 char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' };
9715 int pos[6] = { 0, 6, 12, 17, 23, 29 };
9716
9717 for (int i = 0, j = 0, k = 0; i < 30; i++)
9718 {
9719 if (i == pos[j])
9720 {
9721 if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED);
9722
9723 j++;
9724 }
9725 else
9726 {
9727 clean_input_buf[k] = input_buf[i];
9728
9729 k++;
9730 }
9731 }
9732
9733 // base64 decode
9734
9735 u32 *digest = (u32 *) hash_buf->digest;
9736
9737 salt_t *salt = hash_buf->salt;
9738
9739 u32 a, b, c, d, e, f;
9740
9741 a = base64_to_int (clean_input_buf[ 0] & 0x7f);
9742 b = base64_to_int (clean_input_buf[ 1] & 0x7f);
9743 c = base64_to_int (clean_input_buf[ 2] & 0x7f);
9744 d = base64_to_int (clean_input_buf[ 3] & 0x7f);
9745 e = base64_to_int (clean_input_buf[ 4] & 0x7f);
9746 f = base64_to_int (clean_input_buf[ 5] & 0x7f);
9747
9748 digest[0] = (((a << 12) | (b << 6) | (c)) << 16)
9749 | (((d << 12) | (e << 6) | (f)) << 0);
9750
9751 a = base64_to_int (clean_input_buf[ 6] & 0x7f);
9752 b = base64_to_int (clean_input_buf[ 7] & 0x7f);
9753 c = base64_to_int (clean_input_buf[ 8] & 0x7f);
9754 d = base64_to_int (clean_input_buf[ 9] & 0x7f);
9755 e = base64_to_int (clean_input_buf[10] & 0x7f);
9756 f = base64_to_int (clean_input_buf[11] & 0x7f);
9757
9758 digest[1] = (((a << 12) | (b << 6) | (c)) << 16)
9759 | (((d << 12) | (e << 6) | (f)) << 0);
9760
9761 a = base64_to_int (clean_input_buf[12] & 0x7f);
9762 b = base64_to_int (clean_input_buf[13] & 0x7f);
9763 c = base64_to_int (clean_input_buf[14] & 0x7f);
9764 d = base64_to_int (clean_input_buf[15] & 0x7f);
9765 e = base64_to_int (clean_input_buf[16] & 0x7f);
9766 f = base64_to_int (clean_input_buf[17] & 0x7f);
9767
9768 digest[2] = (((a << 12) | (b << 6) | (c)) << 16)
9769 | (((d << 12) | (e << 6) | (f)) << 0);
9770
9771 a = base64_to_int (clean_input_buf[18] & 0x7f);
9772 b = base64_to_int (clean_input_buf[19] & 0x7f);
9773 c = base64_to_int (clean_input_buf[20] & 0x7f);
9774 d = base64_to_int (clean_input_buf[21] & 0x7f);
9775 e = base64_to_int (clean_input_buf[22] & 0x7f);
9776 f = base64_to_int (clean_input_buf[23] & 0x7f);
9777
9778 digest[3] = (((a << 12) | (b << 6) | (c)) << 16)
9779 | (((d << 12) | (e << 6) | (f)) << 0);
9780
9781 digest[0] = byte_swap_32 (digest[0]);
9782 digest[1] = byte_swap_32 (digest[1]);
9783 digest[2] = byte_swap_32 (digest[2]);
9784 digest[3] = byte_swap_32 (digest[3]);
9785
9786 digest[0] -= MD5M_A;
9787 digest[1] -= MD5M_B;
9788 digest[2] -= MD5M_C;
9789 digest[3] -= MD5M_D;
9790
9791 if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED);
9792
9793 uint salt_len = input_len - 30 - 1;
9794
9795 char *salt_buf = input_buf + 30 + 1;
9796
9797 char *salt_buf_ptr = (char *) salt->salt_buf;
9798
9799 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9800
9801 // max. salt length: salt_buf[32] => 32 - 22 (":Administration Tools:") = 10
9802 if (salt_len > 10) return (PARSER_SALT_LENGTH);
9803
9804 salt->salt_len = salt_len;
9805
9806 memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22);
9807
9808 salt->salt_len += 22;
9809
9810 return (PARSER_OK);
9811 }
9812
9813 int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9814 {
9815 if (data.opts_type & OPTS_TYPE_ST_HEX)
9816 {
9817 if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH);
9818 }
9819 else
9820 {
9821 if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH);
9822 }
9823
9824 u32 *digest = (u32 *) hash_buf->digest;
9825
9826 salt_t *salt = hash_buf->salt;
9827
9828 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
9829 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
9830 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
9831 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
9832 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
9833
9834 digest[0] -= SHA1M_A;
9835 digest[1] -= SHA1M_B;
9836 digest[2] -= SHA1M_C;
9837 digest[3] -= SHA1M_D;
9838 digest[4] -= SHA1M_E;
9839
9840 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
9841
9842 uint salt_len = input_len - 40 - 1;
9843
9844 char *salt_buf = input_buf + 40 + 1;
9845
9846 char *salt_buf_ptr = (char *) salt->salt_buf;
9847
9848 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
9849
9850 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9851
9852 salt->salt_len = salt_len;
9853
9854 return (PARSER_OK);
9855 }
9856
9857 int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9858 {
9859 if (data.opts_type & OPTS_TYPE_ST_HEX)
9860 {
9861 if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH);
9862 }
9863 else
9864 {
9865 if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH);
9866 }
9867
9868 if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
9869
9870 char *iter_pos = input_buf + 6;
9871
9872 salt_t *salt = hash_buf->salt;
9873
9874 uint iter = atoi (iter_pos);
9875
9876 if (iter < 1)
9877 {
9878 iter = ROUNDS_DCC2;
9879 }
9880
9881 salt->salt_iter = iter - 1;
9882
9883 char *salt_pos = strchr (iter_pos, '#');
9884
9885 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9886
9887 salt_pos++;
9888
9889 char *digest_pos = strchr (salt_pos, '#');
9890
9891 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
9892
9893 digest_pos++;
9894
9895 uint salt_len = digest_pos - salt_pos - 1;
9896
9897 u32 *digest = (u32 *) hash_buf->digest;
9898
9899 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
9900 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
9901 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
9902 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
9903
9904 char *salt_buf_ptr = (char *) salt->salt_buf;
9905
9906 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
9907
9908 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
9909
9910 salt->salt_len = salt_len;
9911
9912 return (PARSER_OK);
9913 }
9914
9915 int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
9916 {
9917 u32 *digest = (u32 *) hash_buf->digest;
9918
9919 salt_t *salt = hash_buf->salt;
9920
9921 wpa_t *wpa = (wpa_t *) hash_buf->esalt;
9922
9923 hccap_t in;
9924
9925 memcpy (&in, input_buf, input_len);
9926
9927 if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE);
9928
9929 memcpy (digest, in.keymic, 16);
9930
9931 /*
9932 http://www.one-net.eu/jsw/j_sec/m_ptype.html
9933 The phrase "Pairwise key expansion"
9934 Access Point Address (referred to as Authenticator Address AA)
9935 Supplicant Address (referred to as Supplicant Address SA)
9936 Access Point Nonce (referred to as Authenticator Anonce)
9937 Wireless Device Nonce (referred to as Supplicant Nonce Snonce)
9938 */
9939
9940 uint salt_len = strlen (in.essid);
9941
9942 memcpy (salt->salt_buf, in.essid, salt_len);
9943
9944 salt->salt_len = salt_len;
9945
9946 salt->salt_iter = ROUNDS_WPA2 - 1;
9947
9948 unsigned char *pke_ptr = (unsigned char *) wpa->pke;
9949
9950 memcpy (pke_ptr, "Pairwise key expansion", 23);
9951
9952 if (memcmp (in.mac1, in.mac2, 6) < 0)
9953 {
9954 memcpy (pke_ptr + 23, in.mac1, 6);
9955 memcpy (pke_ptr + 29, in.mac2, 6);
9956 }
9957 else
9958 {
9959 memcpy (pke_ptr + 23, in.mac2, 6);
9960 memcpy (pke_ptr + 29, in.mac1, 6);
9961 }
9962
9963 if (memcmp (in.nonce1, in.nonce2, 32) < 0)
9964 {
9965 memcpy (pke_ptr + 35, in.nonce1, 32);
9966 memcpy (pke_ptr + 67, in.nonce2, 32);
9967 }
9968 else
9969 {
9970 memcpy (pke_ptr + 35, in.nonce2, 32);
9971 memcpy (pke_ptr + 67, in.nonce1, 32);
9972 }
9973
9974 for (int i = 0; i < 25; i++)
9975 {
9976 wpa->pke[i] = byte_swap_32 (wpa->pke[i]);
9977 }
9978
9979 wpa->keyver = in.keyver;
9980
9981 if (wpa->keyver > 255)
9982 {
9983 log_info ("ATTENTION!");
9984 log_info (" The WPA/WPA2 key version in your .hccap file is invalid!");
9985 log_info (" This could be due to a recent aircrack-ng bug.");
9986 log_info (" The key version was automatically reset to a reasonable value.");
9987 log_info ("");
9988
9989 wpa->keyver &= 0xff;
9990 }
9991
9992 wpa->eapol_size = in.eapol_size;
9993
9994 unsigned char *eapol_ptr = (unsigned char *) wpa->eapol;
9995
9996 memcpy (eapol_ptr, in.eapol, wpa->eapol_size);
9997
9998 memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size);
9999
10000 eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80;
10001
10002 if (wpa->keyver == 1)
10003 {
10004 // nothing to do
10005 }
10006 else
10007 {
10008 digest[0] = byte_swap_32 (digest[0]);
10009 digest[1] = byte_swap_32 (digest[1]);
10010 digest[2] = byte_swap_32 (digest[2]);
10011 digest[3] = byte_swap_32 (digest[3]);
10012
10013 for (int i = 0; i < 64; i++)
10014 {
10015 wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]);
10016 }
10017 }
10018
10019 salt->salt_buf[10] = digest[1];
10020 salt->salt_buf[11] = digest[2];
10021
10022 return (PARSER_OK);
10023 }
10024
10025 int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10026 {
10027 u32 *digest = (u32 *) hash_buf->digest;
10028
10029 salt_t *salt = hash_buf->salt;
10030
10031 if (input_len == 0)
10032 {
10033 log_error ("Password Safe v2 container not specified");
10034
10035 exit (-1);
10036 }
10037
10038 FILE *fp = fopen (input_buf, "rb");
10039
10040 if (fp == NULL)
10041 {
10042 log_error ("%s: %s", input_buf, strerror (errno));
10043
10044 exit (-1);
10045 }
10046
10047 typedef struct
10048 {
10049 u32 random[2];
10050 u32 hash[5];
10051 u32 salt[5]; // unused, but makes better valid check
10052 u32 iv[2]; // unused, but makes better valid check
10053
10054 } psafe2_hdr;
10055
10056 psafe2_hdr buf;
10057
10058 int n = fread (&buf, sizeof (psafe2_hdr), 1, fp);
10059
10060 fclose (fp);
10061
10062 if (n != 1) return (PARSER_PSAFE2_FILE_SIZE);
10063
10064 salt->salt_buf[0] = buf.random[0];
10065 salt->salt_buf[1] = buf.random[1];
10066
10067 salt->salt_len = 8;
10068 salt->salt_iter = 1000;
10069
10070 digest[0] = byte_swap_32 (buf.hash[0]);
10071 digest[1] = byte_swap_32 (buf.hash[1]);
10072 digest[2] = byte_swap_32 (buf.hash[2]);
10073 digest[3] = byte_swap_32 (buf.hash[3]);
10074 digest[4] = byte_swap_32 (buf.hash[4]);
10075
10076 return (PARSER_OK);
10077 }
10078
10079 int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10080 {
10081 u32 *digest = (u32 *) hash_buf->digest;
10082
10083 salt_t *salt = hash_buf->salt;
10084
10085 if (input_len == 0)
10086 {
10087 log_error (".psafe3 not specified");
10088
10089 exit (-1);
10090 }
10091
10092 FILE *fp = fopen (input_buf, "rb");
10093
10094 if (fp == NULL)
10095 {
10096 log_error ("%s: %s", input_buf, strerror (errno));
10097
10098 exit (-1);
10099 }
10100
10101 psafe3_t in;
10102
10103 int n = fread (&in, sizeof (psafe3_t), 1, fp);
10104
10105 fclose (fp);
10106
10107 data.hashfile = input_buf; // we will need this in case it gets cracked
10108
10109 if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED);
10110
10111 if (n != 1) return (PARSER_PSAFE3_FILE_SIZE);
10112
10113 salt->salt_iter = in.iterations + 1;
10114
10115 salt->salt_buf[0] = in.salt_buf[0];
10116 salt->salt_buf[1] = in.salt_buf[1];
10117 salt->salt_buf[2] = in.salt_buf[2];
10118 salt->salt_buf[3] = in.salt_buf[3];
10119 salt->salt_buf[4] = in.salt_buf[4];
10120 salt->salt_buf[5] = in.salt_buf[5];
10121 salt->salt_buf[6] = in.salt_buf[6];
10122 salt->salt_buf[7] = in.salt_buf[7];
10123
10124 salt->salt_len = 32;
10125
10126 digest[0] = in.hash_buf[0];
10127 digest[1] = in.hash_buf[1];
10128 digest[2] = in.hash_buf[2];
10129 digest[3] = in.hash_buf[3];
10130 digest[4] = in.hash_buf[4];
10131 digest[5] = in.hash_buf[5];
10132 digest[6] = in.hash_buf[6];
10133 digest[7] = in.hash_buf[7];
10134
10135 digest[0] = byte_swap_32 (digest[0]);
10136 digest[1] = byte_swap_32 (digest[1]);
10137 digest[2] = byte_swap_32 (digest[2]);
10138 digest[3] = byte_swap_32 (digest[3]);
10139 digest[4] = byte_swap_32 (digest[4]);
10140 digest[5] = byte_swap_32 (digest[5]);
10141 digest[6] = byte_swap_32 (digest[6]);
10142 digest[7] = byte_swap_32 (digest[7]);
10143
10144 return (PARSER_OK);
10145 }
10146
10147 int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10148 {
10149 if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH);
10150
10151 if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED);
10152
10153 u32 *digest = (u32 *) hash_buf->digest;
10154
10155 salt_t *salt = hash_buf->salt;
10156
10157 char *iter_pos = input_buf + 3;
10158
10159 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
10160
10161 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
10162
10163 memcpy ((char *) salt->salt_sign, input_buf, 4);
10164
10165 salt->salt_iter = salt_iter;
10166
10167 char *salt_pos = iter_pos + 1;
10168
10169 uint salt_len = 8;
10170
10171 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10172
10173 salt->salt_len = salt_len;
10174
10175 char *hash_pos = salt_pos + salt_len;
10176
10177 phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10178
10179 return (PARSER_OK);
10180 }
10181
10182 int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10183 {
10184 if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
10185
10186 u32 *digest = (u32 *) hash_buf->digest;
10187
10188 salt_t *salt = hash_buf->salt;
10189
10190 char *salt_pos = input_buf + 3;
10191
10192 uint iterations_len = 0;
10193
10194 if (memcmp (salt_pos, "rounds=", 7) == 0)
10195 {
10196 salt_pos += 7;
10197
10198 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10199
10200 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10201 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10202
10203 salt_pos[0] = 0x0;
10204
10205 salt->salt_iter = atoi (salt_pos - iterations_len);
10206
10207 salt_pos += 1;
10208
10209 iterations_len += 8;
10210 }
10211 else
10212 {
10213 salt->salt_iter = ROUNDS_MD5CRYPT;
10214 }
10215
10216 if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH);
10217
10218 char *hash_pos = strchr (salt_pos, '$');
10219
10220 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10221
10222 uint salt_len = hash_pos - salt_pos;
10223
10224 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10225
10226 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10227
10228 salt->salt_len = salt_len;
10229
10230 hash_pos++;
10231
10232 uint hash_len = input_len - 3 - iterations_len - salt_len - 1;
10233
10234 if (hash_len != 22) return (PARSER_HASH_LENGTH);
10235
10236 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10237
10238 return (PARSER_OK);
10239 }
10240
10241 int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10242 {
10243 if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
10244
10245 u32 *digest = (u32 *) hash_buf->digest;
10246
10247 salt_t *salt = hash_buf->salt;
10248
10249 char *salt_pos = input_buf + 6;
10250
10251 uint iterations_len = 0;
10252
10253 if (memcmp (salt_pos, "rounds=", 7) == 0)
10254 {
10255 salt_pos += 7;
10256
10257 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
10258
10259 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
10260 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
10261
10262 salt_pos[0] = 0x0;
10263
10264 salt->salt_iter = atoi (salt_pos - iterations_len);
10265
10266 salt_pos += 1;
10267
10268 iterations_len += 8;
10269 }
10270 else
10271 {
10272 salt->salt_iter = ROUNDS_MD5CRYPT;
10273 }
10274
10275 if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
10276
10277 char *hash_pos = strchr (salt_pos, '$');
10278
10279 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10280
10281 uint salt_len = hash_pos - salt_pos;
10282
10283 if (salt_len > 8) return (PARSER_SALT_LENGTH);
10284
10285 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
10286
10287 salt->salt_len = salt_len;
10288
10289 hash_pos++;
10290
10291 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
10292
10293 return (PARSER_OK);
10294 }
10295
10296 int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10297 {
10298 if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH);
10299
10300 if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
10301
10302 u32 *digest = (u32 *) hash_buf->digest;
10303
10304 salt_t *salt = hash_buf->salt;
10305
10306 char *salt_pos = input_buf + 14;
10307
10308 char *hash_pos = strchr (salt_pos, '*');
10309
10310 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10311
10312 hash_pos++;
10313
10314 uint salt_len = hash_pos - salt_pos - 1;
10315
10316 char *salt_buf_ptr = (char *) salt->salt_buf;
10317
10318 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
10319
10320 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10321
10322 salt->salt_len = salt_len;
10323
10324 u8 tmp_buf[100];
10325
10326 memset (tmp_buf, 0, sizeof (tmp_buf));
10327
10328 base64_decode (base64_to_int, (const u8 *) hash_pos, 27, tmp_buf);
10329
10330 memcpy (digest, tmp_buf, 20);
10331
10332 digest[0] = byte_swap_32 (digest[0]);
10333 digest[1] = byte_swap_32 (digest[1]);
10334 digest[2] = byte_swap_32 (digest[2]);
10335 digest[3] = byte_swap_32 (digest[3]);
10336 digest[4] = byte_swap_32 (digest[4]);
10337
10338 digest[0] -= SHA1M_A;
10339 digest[1] -= SHA1M_B;
10340 digest[2] -= SHA1M_C;
10341 digest[3] -= SHA1M_D;
10342 digest[4] -= SHA1M_E;
10343
10344 return (PARSER_OK);
10345 }
10346
10347 int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10348 {
10349 if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH);
10350
10351 unsigned char c12 = itoa64_to_int (input_buf[12]);
10352
10353 if (c12 & 3) return (PARSER_HASH_VALUE);
10354
10355 u32 *digest = (u32 *) hash_buf->digest;
10356
10357 salt_t *salt = hash_buf->salt;
10358
10359 // for ascii_digest
10360 salt->salt_sign[0] = input_buf[0];
10361 salt->salt_sign[1] = input_buf[1];
10362
10363 salt->salt_buf[0] = itoa64_to_int (input_buf[0])
10364 | itoa64_to_int (input_buf[1]) << 6;
10365
10366 salt->salt_len = 2;
10367
10368 u8 tmp_buf[100];
10369
10370 memset (tmp_buf, 0, sizeof (tmp_buf));
10371
10372 base64_decode (itoa64_to_int, (const u8 *) input_buf + 2, 11, tmp_buf);
10373
10374 memcpy (digest, tmp_buf, 8);
10375
10376 uint tt;
10377
10378 IP (digest[0], digest[1], tt);
10379
10380 digest[2] = 0;
10381 digest[3] = 0;
10382
10383 return (PARSER_OK);
10384 }
10385
10386 int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10387 {
10388 if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH);
10389
10390 u32 *digest = (u32 *) hash_buf->digest;
10391
10392 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10393 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10394 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10395 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10396
10397 digest[0] = byte_swap_32 (digest[0]);
10398 digest[1] = byte_swap_32 (digest[1]);
10399 digest[2] = byte_swap_32 (digest[2]);
10400 digest[3] = byte_swap_32 (digest[3]);
10401
10402 digest[0] -= MD4M_A;
10403 digest[1] -= MD4M_B;
10404 digest[2] -= MD4M_C;
10405 digest[3] -= MD4M_D;
10406
10407 return (PARSER_OK);
10408 }
10409
10410 int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10411 {
10412 if (data.opts_type & OPTS_TYPE_ST_HEX)
10413 {
10414 if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH);
10415 }
10416 else
10417 {
10418 if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH);
10419 }
10420
10421 u32 *digest = (u32 *) hash_buf->digest;
10422
10423 salt_t *salt = hash_buf->salt;
10424
10425 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10426 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10427 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10428 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10429
10430 digest[0] = byte_swap_32 (digest[0]);
10431 digest[1] = byte_swap_32 (digest[1]);
10432 digest[2] = byte_swap_32 (digest[2]);
10433 digest[3] = byte_swap_32 (digest[3]);
10434
10435 digest[0] -= MD4M_A;
10436 digest[1] -= MD4M_B;
10437 digest[2] -= MD4M_C;
10438 digest[3] -= MD4M_D;
10439
10440 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10441
10442 uint salt_len = input_len - 32 - 1;
10443
10444 char *salt_buf = input_buf + 32 + 1;
10445
10446 char *salt_buf_ptr = (char *) salt->salt_buf;
10447
10448 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10449
10450 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10451
10452 salt->salt_len = salt_len;
10453
10454 return (PARSER_OK);
10455 }
10456
10457 int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10458 {
10459 if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH);
10460
10461 u32 *digest = (u32 *) hash_buf->digest;
10462
10463 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10464 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10465 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10466 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10467
10468 digest[0] = byte_swap_32 (digest[0]);
10469 digest[1] = byte_swap_32 (digest[1]);
10470 digest[2] = byte_swap_32 (digest[2]);
10471 digest[3] = byte_swap_32 (digest[3]);
10472
10473 digest[0] -= MD5M_A;
10474 digest[1] -= MD5M_B;
10475 digest[2] -= MD5M_C;
10476 digest[3] -= MD5M_D;
10477
10478 return (PARSER_OK);
10479 }
10480
10481 int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10482 {
10483 if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH);
10484
10485 u32 *digest = (u32 *) hash_buf->digest;
10486
10487 digest[0] = hex_to_u32 ((const u8 *) &input_buf[0]);
10488 digest[1] = hex_to_u32 ((const u8 *) &input_buf[8]);
10489 digest[2] = 0;
10490 digest[3] = 0;
10491
10492 digest[0] = byte_swap_32 (digest[0]);
10493 digest[1] = byte_swap_32 (digest[1]);
10494
10495 return (PARSER_OK);
10496 }
10497
10498 int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10499 {
10500 if (data.opts_type & OPTS_TYPE_ST_HEX)
10501 {
10502 if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH);
10503 }
10504 else
10505 {
10506 if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH);
10507 }
10508
10509 u32 *digest = (u32 *) hash_buf->digest;
10510
10511 salt_t *salt = hash_buf->salt;
10512
10513 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
10514 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
10515 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
10516 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
10517
10518 digest[0] = byte_swap_32 (digest[0]);
10519 digest[1] = byte_swap_32 (digest[1]);
10520 digest[2] = byte_swap_32 (digest[2]);
10521 digest[3] = byte_swap_32 (digest[3]);
10522
10523 digest[0] -= MD5M_A;
10524 digest[1] -= MD5M_B;
10525 digest[2] -= MD5M_C;
10526 digest[3] -= MD5M_D;
10527
10528 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10529
10530 uint salt_len = input_len - 32 - 1;
10531
10532 char *salt_buf = input_buf + 32 + 1;
10533
10534 char *salt_buf_ptr = (char *) salt->salt_buf;
10535
10536 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10537
10538 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10539
10540 salt->salt_len = salt_len;
10541
10542 return (PARSER_OK);
10543 }
10544
10545 int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10546 {
10547 if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH);
10548
10549 u32 *digest = (u32 *) hash_buf->digest;
10550
10551 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10552 | itoa64_to_int (input_buf[ 1]) << 6
10553 | itoa64_to_int (input_buf[ 2]) << 12
10554 | itoa64_to_int (input_buf[ 3]) << 18;
10555 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10556 | itoa64_to_int (input_buf[ 5]) << 6
10557 | itoa64_to_int (input_buf[ 6]) << 12
10558 | itoa64_to_int (input_buf[ 7]) << 18;
10559 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10560 | itoa64_to_int (input_buf[ 9]) << 6
10561 | itoa64_to_int (input_buf[10]) << 12
10562 | itoa64_to_int (input_buf[11]) << 18;
10563 digest[3] = itoa64_to_int (input_buf[12]) << 0
10564 | itoa64_to_int (input_buf[13]) << 6
10565 | itoa64_to_int (input_buf[14]) << 12
10566 | itoa64_to_int (input_buf[15]) << 18;
10567
10568 digest[0] -= MD5M_A;
10569 digest[1] -= MD5M_B;
10570 digest[2] -= MD5M_C;
10571 digest[3] -= MD5M_D;
10572
10573 digest[0] &= 0x00ffffff;
10574 digest[1] &= 0x00ffffff;
10575 digest[2] &= 0x00ffffff;
10576 digest[3] &= 0x00ffffff;
10577
10578 return (PARSER_OK);
10579 }
10580
10581 int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10582 {
10583 if (data.opts_type & OPTS_TYPE_ST_HEX)
10584 {
10585 if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH);
10586 }
10587 else
10588 {
10589 if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH);
10590 }
10591
10592 u32 *digest = (u32 *) hash_buf->digest;
10593
10594 salt_t *salt = hash_buf->salt;
10595
10596 digest[0] = itoa64_to_int (input_buf[ 0]) << 0
10597 | itoa64_to_int (input_buf[ 1]) << 6
10598 | itoa64_to_int (input_buf[ 2]) << 12
10599 | itoa64_to_int (input_buf[ 3]) << 18;
10600 digest[1] = itoa64_to_int (input_buf[ 4]) << 0
10601 | itoa64_to_int (input_buf[ 5]) << 6
10602 | itoa64_to_int (input_buf[ 6]) << 12
10603 | itoa64_to_int (input_buf[ 7]) << 18;
10604 digest[2] = itoa64_to_int (input_buf[ 8]) << 0
10605 | itoa64_to_int (input_buf[ 9]) << 6
10606 | itoa64_to_int (input_buf[10]) << 12
10607 | itoa64_to_int (input_buf[11]) << 18;
10608 digest[3] = itoa64_to_int (input_buf[12]) << 0
10609 | itoa64_to_int (input_buf[13]) << 6
10610 | itoa64_to_int (input_buf[14]) << 12
10611 | itoa64_to_int (input_buf[15]) << 18;
10612
10613 digest[0] -= MD5M_A;
10614 digest[1] -= MD5M_B;
10615 digest[2] -= MD5M_C;
10616 digest[3] -= MD5M_D;
10617
10618 digest[0] &= 0x00ffffff;
10619 digest[1] &= 0x00ffffff;
10620 digest[2] &= 0x00ffffff;
10621 digest[3] &= 0x00ffffff;
10622
10623 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
10624
10625 uint salt_len = input_len - 16 - 1;
10626
10627 char *salt_buf = input_buf + 16 + 1;
10628
10629 char *salt_buf_ptr = (char *) salt->salt_buf;
10630
10631 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
10632
10633 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10634
10635 salt->salt_len = salt_len;
10636
10637 return (PARSER_OK);
10638 }
10639
10640 void transform_netntlmv1_key (const u8 *nthash, u8 *key)
10641 {
10642 key[0] = (nthash[0] >> 0);
10643 key[1] = (nthash[0] << 7) | (nthash[1] >> 1);
10644 key[2] = (nthash[1] << 6) | (nthash[2] >> 2);
10645 key[3] = (nthash[2] << 5) | (nthash[3] >> 3);
10646 key[4] = (nthash[3] << 4) | (nthash[4] >> 4);
10647 key[5] = (nthash[4] << 3) | (nthash[5] >> 5);
10648 key[6] = (nthash[5] << 2) | (nthash[6] >> 6);
10649 key[7] = (nthash[6] << 1);
10650
10651 key[0] |= 0x01;
10652 key[1] |= 0x01;
10653 key[2] |= 0x01;
10654 key[3] |= 0x01;
10655 key[4] |= 0x01;
10656 key[5] |= 0x01;
10657 key[6] |= 0x01;
10658 key[7] |= 0x01;
10659 }
10660
10661 int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10662 {
10663 if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH);
10664
10665 u32 *digest = (u32 *) hash_buf->digest;
10666
10667 salt_t *salt = hash_buf->salt;
10668
10669 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10670
10671 /**
10672 * parse line
10673 */
10674
10675 char *user_pos = input_buf;
10676
10677 char *unused_pos = strchr (user_pos, ':');
10678
10679 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10680
10681 uint user_len = unused_pos - user_pos;
10682
10683 if (user_len > 60) return (PARSER_SALT_LENGTH);
10684
10685 unused_pos++;
10686
10687 char *domain_pos = strchr (unused_pos, ':');
10688
10689 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10690
10691 uint unused_len = domain_pos - unused_pos;
10692
10693 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10694
10695 domain_pos++;
10696
10697 char *srvchall_pos = strchr (domain_pos, ':');
10698
10699 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10700
10701 uint domain_len = srvchall_pos - domain_pos;
10702
10703 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10704
10705 srvchall_pos++;
10706
10707 char *hash_pos = strchr (srvchall_pos, ':');
10708
10709 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10710
10711 uint srvchall_len = hash_pos - srvchall_pos;
10712
10713 // if (srvchall_len != 0) return (PARSER_SALT_LENGTH);
10714
10715 hash_pos++;
10716
10717 char *clichall_pos = strchr (hash_pos, ':');
10718
10719 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10720
10721 uint hash_len = clichall_pos - hash_pos;
10722
10723 if (hash_len != 48) return (PARSER_HASH_LENGTH);
10724
10725 clichall_pos++;
10726
10727 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10728
10729 if (clichall_len != 16) return (PARSER_SALT_LENGTH);
10730
10731 /**
10732 * store some data for later use
10733 */
10734
10735 netntlm->user_len = user_len * 2;
10736 netntlm->domain_len = domain_len * 2;
10737 netntlm->srvchall_len = srvchall_len / 2;
10738 netntlm->clichall_len = clichall_len / 2;
10739
10740 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10741 char *chall_ptr = (char *) netntlm->chall_buf;
10742
10743 /**
10744 * handle username and domainname
10745 */
10746
10747 for (uint i = 0; i < user_len; i++)
10748 {
10749 *userdomain_ptr++ = user_pos[i];
10750 *userdomain_ptr++ = 0;
10751 }
10752
10753 for (uint i = 0; i < domain_len; i++)
10754 {
10755 *userdomain_ptr++ = domain_pos[i];
10756 *userdomain_ptr++ = 0;
10757 }
10758
10759 /**
10760 * handle server challenge encoding
10761 */
10762
10763 for (uint i = 0; i < srvchall_len; i += 2)
10764 {
10765 const char p0 = srvchall_pos[i + 0];
10766 const char p1 = srvchall_pos[i + 1];
10767
10768 *chall_ptr++ = hex_convert (p1) << 0
10769 | hex_convert (p0) << 4;
10770 }
10771
10772 /**
10773 * handle client challenge encoding
10774 */
10775
10776 for (uint i = 0; i < clichall_len; i += 2)
10777 {
10778 const char p0 = clichall_pos[i + 0];
10779 const char p1 = clichall_pos[i + 1];
10780
10781 *chall_ptr++ = hex_convert (p1) << 0
10782 | hex_convert (p0) << 4;
10783 }
10784
10785 /**
10786 * store data
10787 */
10788
10789 char *salt_buf_ptr = (char *) salt->salt_buf;
10790
10791 uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len);
10792
10793 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
10794
10795 salt->salt_len = salt_len;
10796
10797 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
10798 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
10799 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
10800 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
10801
10802 digest[0] = byte_swap_32 (digest[0]);
10803 digest[1] = byte_swap_32 (digest[1]);
10804 digest[2] = byte_swap_32 (digest[2]);
10805 digest[3] = byte_swap_32 (digest[3]);
10806
10807 /* special case, last 8 byte do not need to be checked since they are brute-forced next */
10808
10809 uint digest_tmp[2];
10810
10811 digest_tmp[0] = hex_to_u32 ((const u8 *) &hash_pos[32]);
10812 digest_tmp[1] = hex_to_u32 ((const u8 *) &hash_pos[40]);
10813
10814 digest_tmp[0] = byte_swap_32 (digest_tmp[0]);
10815 digest_tmp[1] = byte_swap_32 (digest_tmp[1]);
10816
10817 /* special case 2: ESS */
10818
10819 if (srvchall_len == 48)
10820 {
10821 if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0))
10822 {
10823 uint w[16];
10824
10825 w[ 0] = netntlm->chall_buf[6];
10826 w[ 1] = netntlm->chall_buf[7];
10827 w[ 2] = netntlm->chall_buf[0];
10828 w[ 3] = netntlm->chall_buf[1];
10829 w[ 4] = 0x80;
10830 w[ 5] = 0;
10831 w[ 6] = 0;
10832 w[ 7] = 0;
10833 w[ 8] = 0;
10834 w[ 9] = 0;
10835 w[10] = 0;
10836 w[11] = 0;
10837 w[12] = 0;
10838 w[13] = 0;
10839 w[14] = 16 * 8;
10840 w[15] = 0;
10841
10842 uint dgst[4];
10843
10844 dgst[0] = MAGIC_A;
10845 dgst[1] = MAGIC_B;
10846 dgst[2] = MAGIC_C;
10847 dgst[3] = MAGIC_D;
10848
10849 md5_64 (w, dgst);
10850
10851 salt->salt_buf[0] = dgst[0];
10852 salt->salt_buf[1] = dgst[1];
10853 }
10854 }
10855
10856 /* precompute netntlmv1 exploit start */
10857
10858 for (uint i = 0; i < 0x10000; i++)
10859 {
10860 uint key_md4[2] = { i, 0 };
10861 uint key_des[2] = { 0, 0 };
10862
10863 transform_netntlmv1_key ((u8 *) key_md4, (u8 *) key_des);
10864
10865 uint Kc[16];
10866 uint Kd[16];
10867
10868 _des_keysetup (key_des, Kc, Kd, c_skb);
10869
10870 uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] };
10871
10872 _des_encrypt (data3, Kc, Kd, c_SPtrans);
10873
10874 if (data3[0] != digest_tmp[0]) continue;
10875 if (data3[1] != digest_tmp[1]) continue;
10876
10877 salt->salt_buf[2] = i;
10878
10879 salt->salt_len = 24;
10880
10881 break;
10882 }
10883
10884 salt->salt_buf_pc[0] = digest_tmp[0];
10885 salt->salt_buf_pc[1] = digest_tmp[1];
10886
10887 /* precompute netntlmv1 exploit stop */
10888
10889 u32 tt;
10890
10891 IP (digest[0], digest[1], tt);
10892 IP (digest[2], digest[3], tt);
10893
10894 digest[0] = rotr32 (digest[0], 29);
10895 digest[1] = rotr32 (digest[1], 29);
10896 digest[2] = rotr32 (digest[2], 29);
10897 digest[3] = rotr32 (digest[3], 29);
10898
10899 IP (salt->salt_buf[0], salt->salt_buf[1], tt);
10900
10901 salt->salt_buf[0] = rotl32 (salt->salt_buf[0], 3);
10902 salt->salt_buf[1] = rotl32 (salt->salt_buf[1], 3);
10903
10904 return (PARSER_OK);
10905 }
10906
10907 int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
10908 {
10909 if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH);
10910
10911 u32 *digest = (u32 *) hash_buf->digest;
10912
10913 salt_t *salt = hash_buf->salt;
10914
10915 netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt;
10916
10917 /**
10918 * parse line
10919 */
10920
10921 char *user_pos = input_buf;
10922
10923 char *unused_pos = strchr (user_pos, ':');
10924
10925 if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10926
10927 uint user_len = unused_pos - user_pos;
10928
10929 if (user_len > 60) return (PARSER_SALT_LENGTH);
10930
10931 unused_pos++;
10932
10933 char *domain_pos = strchr (unused_pos, ':');
10934
10935 if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10936
10937 uint unused_len = domain_pos - unused_pos;
10938
10939 if (unused_len != 0) return (PARSER_SALT_LENGTH);
10940
10941 domain_pos++;
10942
10943 char *srvchall_pos = strchr (domain_pos, ':');
10944
10945 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10946
10947 uint domain_len = srvchall_pos - domain_pos;
10948
10949 if (domain_len > 45) return (PARSER_SALT_LENGTH);
10950
10951 srvchall_pos++;
10952
10953 char *hash_pos = strchr (srvchall_pos, ':');
10954
10955 if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10956
10957 uint srvchall_len = hash_pos - srvchall_pos;
10958
10959 if (srvchall_len != 16) return (PARSER_SALT_LENGTH);
10960
10961 hash_pos++;
10962
10963 char *clichall_pos = strchr (hash_pos, ':');
10964
10965 if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
10966
10967 uint hash_len = clichall_pos - hash_pos;
10968
10969 if (hash_len != 32) return (PARSER_HASH_LENGTH);
10970
10971 clichall_pos++;
10972
10973 uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1;
10974
10975 if (clichall_len > 1024) return (PARSER_SALT_LENGTH);
10976
10977 if (clichall_len % 2) return (PARSER_SALT_VALUE);
10978
10979 /**
10980 * store some data for later use
10981 */
10982
10983 netntlm->user_len = user_len * 2;
10984 netntlm->domain_len = domain_len * 2;
10985 netntlm->srvchall_len = srvchall_len / 2;
10986 netntlm->clichall_len = clichall_len / 2;
10987
10988 char *userdomain_ptr = (char *) netntlm->userdomain_buf;
10989 char *chall_ptr = (char *) netntlm->chall_buf;
10990
10991 /**
10992 * handle username and domainname
10993 */
10994
10995 for (uint i = 0; i < user_len; i++)
10996 {
10997 *userdomain_ptr++ = toupper (user_pos[i]);
10998 *userdomain_ptr++ = 0;
10999 }
11000
11001 for (uint i = 0; i < domain_len; i++)
11002 {
11003 *userdomain_ptr++ = domain_pos[i];
11004 *userdomain_ptr++ = 0;
11005 }
11006
11007 *userdomain_ptr++ = 0x80;
11008
11009 /**
11010 * handle server challenge encoding
11011 */
11012
11013 for (uint i = 0; i < srvchall_len; i += 2)
11014 {
11015 const char p0 = srvchall_pos[i + 0];
11016 const char p1 = srvchall_pos[i + 1];
11017
11018 *chall_ptr++ = hex_convert (p1) << 0
11019 | hex_convert (p0) << 4;
11020 }
11021
11022 /**
11023 * handle client challenge encoding
11024 */
11025
11026 for (uint i = 0; i < clichall_len; i += 2)
11027 {
11028 const char p0 = clichall_pos[i + 0];
11029 const char p1 = clichall_pos[i + 1];
11030
11031 *chall_ptr++ = hex_convert (p1) << 0
11032 | hex_convert (p0) << 4;
11033 }
11034
11035 *chall_ptr++ = 0x80;
11036
11037 /**
11038 * handle hash itself
11039 */
11040
11041 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11042 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11043 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11044 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11045
11046 digest[0] = byte_swap_32 (digest[0]);
11047 digest[1] = byte_swap_32 (digest[1]);
11048 digest[2] = byte_swap_32 (digest[2]);
11049 digest[3] = byte_swap_32 (digest[3]);
11050
11051 /**
11052 * reuse challange data as salt_buf, its the buffer that is most likely unique
11053 */
11054
11055 salt->salt_buf[0] = 0;
11056 salt->salt_buf[1] = 0;
11057 salt->salt_buf[2] = 0;
11058 salt->salt_buf[3] = 0;
11059 salt->salt_buf[4] = 0;
11060 salt->salt_buf[5] = 0;
11061 salt->salt_buf[6] = 0;
11062 salt->salt_buf[7] = 0;
11063
11064 uint *uptr;
11065
11066 uptr = (uint *) netntlm->userdomain_buf;
11067
11068 for (uint i = 0; i < 16; i += 16)
11069 {
11070 md5_64 (uptr, salt->salt_buf);
11071 }
11072
11073 uptr = (uint *) netntlm->chall_buf;
11074
11075 for (uint i = 0; i < 256; i += 16)
11076 {
11077 md5_64 (uptr, salt->salt_buf);
11078 }
11079
11080 salt->salt_len = 16;
11081
11082 return (PARSER_OK);
11083 }
11084
11085 int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11086 {
11087 if (data.opts_type & OPTS_TYPE_ST_HEX)
11088 {
11089 if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH);
11090 }
11091 else
11092 {
11093 if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH);
11094 }
11095
11096 u32 *digest = (u32 *) hash_buf->digest;
11097
11098 salt_t *salt = hash_buf->salt;
11099
11100 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11101 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11102 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11103 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11104
11105 digest[0] = byte_swap_32 (digest[0]);
11106 digest[1] = byte_swap_32 (digest[1]);
11107 digest[2] = byte_swap_32 (digest[2]);
11108 digest[3] = byte_swap_32 (digest[3]);
11109
11110 digest[0] -= MD5M_A;
11111 digest[1] -= MD5M_B;
11112 digest[2] -= MD5M_C;
11113 digest[3] -= MD5M_D;
11114
11115 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11116
11117 uint salt_len = input_len - 32 - 1;
11118
11119 char *salt_buf = input_buf + 32 + 1;
11120
11121 char *salt_buf_ptr = (char *) salt->salt_buf;
11122
11123 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11124
11125 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11126
11127 salt->salt_len = salt_len;
11128
11129 return (PARSER_OK);
11130 }
11131
11132 int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11133 {
11134 if (data.opts_type & OPTS_TYPE_ST_HEX)
11135 {
11136 if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH);
11137 }
11138 else
11139 {
11140 if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH);
11141 }
11142
11143 u32 *digest = (u32 *) hash_buf->digest;
11144
11145 salt_t *salt = hash_buf->salt;
11146
11147 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11148 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11149 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11150 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11151
11152 digest[0] = byte_swap_32 (digest[0]);
11153 digest[1] = byte_swap_32 (digest[1]);
11154 digest[2] = byte_swap_32 (digest[2]);
11155 digest[3] = byte_swap_32 (digest[3]);
11156
11157 digest[0] -= MD5M_A;
11158 digest[1] -= MD5M_B;
11159 digest[2] -= MD5M_C;
11160 digest[3] -= MD5M_D;
11161
11162 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11163
11164 uint salt_len = input_len - 32 - 1;
11165
11166 char *salt_buf = input_buf + 32 + 1;
11167
11168 char *salt_buf_ptr = (char *) salt->salt_buf;
11169
11170 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11171
11172 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11173
11174 salt->salt_len = salt_len;
11175
11176 return (PARSER_OK);
11177 }
11178
11179 int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11180 {
11181 if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH);
11182
11183 u32 *digest = (u32 *) hash_buf->digest;
11184
11185 salt_t *salt = hash_buf->salt;
11186
11187 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11188 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11189 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11190 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11191
11192 digest[0] = byte_swap_32 (digest[0]);
11193 digest[1] = byte_swap_32 (digest[1]);
11194 digest[2] = byte_swap_32 (digest[2]);
11195 digest[3] = byte_swap_32 (digest[3]);
11196
11197 digest[0] -= MD5M_A;
11198 digest[1] -= MD5M_B;
11199 digest[2] -= MD5M_C;
11200 digest[3] -= MD5M_D;
11201
11202 /**
11203 * This is a virtual salt. While the algorithm is basically not salted
11204 * we can exploit the salt buffer to set the 0x80 and the w[14] value.
11205 * This way we can save a special md5md5 kernel and reuse the one from vbull.
11206 */
11207
11208 char *salt_buf_ptr = (char *) salt->salt_buf;
11209
11210 uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0);
11211
11212 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11213
11214 salt->salt_len = salt_len;
11215
11216 return (PARSER_OK);
11217 }
11218
11219 int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11220 {
11221 if (data.opts_type & OPTS_TYPE_ST_HEX)
11222 {
11223 if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH);
11224 }
11225 else
11226 {
11227 if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH);
11228 }
11229
11230 u32 *digest = (u32 *) hash_buf->digest;
11231
11232 salt_t *salt = hash_buf->salt;
11233
11234 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11235 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11236 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11237 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11238
11239 digest[0] = byte_swap_32 (digest[0]);
11240 digest[1] = byte_swap_32 (digest[1]);
11241 digest[2] = byte_swap_32 (digest[2]);
11242 digest[3] = byte_swap_32 (digest[3]);
11243
11244 digest[0] -= MD5M_A;
11245 digest[1] -= MD5M_B;
11246 digest[2] -= MD5M_C;
11247 digest[3] -= MD5M_D;
11248
11249 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11250
11251 uint salt_len = input_len - 32 - 1;
11252
11253 char *salt_buf = input_buf + 32 + 1;
11254
11255 char *salt_buf_ptr = (char *) salt->salt_buf;
11256
11257 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11258
11259 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11260
11261 salt->salt_len = salt_len;
11262
11263 return (PARSER_OK);
11264 }
11265
11266 int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11267 {
11268 if (data.opts_type & OPTS_TYPE_ST_HEX)
11269 {
11270 if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH);
11271 }
11272 else
11273 {
11274 if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH);
11275 }
11276
11277 u32 *digest = (u32 *) hash_buf->digest;
11278
11279 salt_t *salt = hash_buf->salt;
11280
11281 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11282 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11283 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11284 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11285
11286 digest[0] = byte_swap_32 (digest[0]);
11287 digest[1] = byte_swap_32 (digest[1]);
11288 digest[2] = byte_swap_32 (digest[2]);
11289 digest[3] = byte_swap_32 (digest[3]);
11290
11291 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11292
11293 uint salt_len = input_len - 32 - 1;
11294
11295 char *salt_buf = input_buf + 32 + 1;
11296
11297 char *salt_buf_ptr = (char *) salt->salt_buf;
11298
11299 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11300
11301 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11302
11303 salt->salt_len = salt_len;
11304
11305 return (PARSER_OK);
11306 }
11307
11308 int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11309 {
11310 if (data.opts_type & OPTS_TYPE_ST_HEX)
11311 {
11312 if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH);
11313 }
11314 else
11315 {
11316 if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH);
11317 }
11318
11319 u32 *digest = (u32 *) hash_buf->digest;
11320
11321 salt_t *salt = hash_buf->salt;
11322
11323 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11324 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11325 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11326 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11327
11328 digest[0] = byte_swap_32 (digest[0]);
11329 digest[1] = byte_swap_32 (digest[1]);
11330 digest[2] = byte_swap_32 (digest[2]);
11331 digest[3] = byte_swap_32 (digest[3]);
11332
11333 digest[0] -= MD4M_A;
11334 digest[1] -= MD4M_B;
11335 digest[2] -= MD4M_C;
11336 digest[3] -= MD4M_D;
11337
11338 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11339
11340 uint salt_len = input_len - 32 - 1;
11341
11342 char *salt_buf = input_buf + 32 + 1;
11343
11344 char *salt_buf_ptr = (char *) salt->salt_buf;
11345
11346 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11347
11348 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11349
11350 salt->salt_len = salt_len;
11351
11352 return (PARSER_OK);
11353 }
11354
11355 int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11356 {
11357 if (data.opts_type & OPTS_TYPE_ST_HEX)
11358 {
11359 if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH);
11360 }
11361 else
11362 {
11363 if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH);
11364 }
11365
11366 u32 *digest = (u32 *) hash_buf->digest;
11367
11368 salt_t *salt = hash_buf->salt;
11369
11370 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11371 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11372 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11373 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11374
11375 digest[0] = byte_swap_32 (digest[0]);
11376 digest[1] = byte_swap_32 (digest[1]);
11377 digest[2] = byte_swap_32 (digest[2]);
11378 digest[3] = byte_swap_32 (digest[3]);
11379
11380 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11381
11382 uint salt_len = input_len - 32 - 1;
11383
11384 char *salt_buf = input_buf + 32 + 1;
11385
11386 uint salt_pc_block[16];
11387
11388 memset (salt_pc_block, 0, sizeof (salt_pc_block));
11389
11390 char *salt_pc_block_ptr = (char *) salt_pc_block;
11391
11392 salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len);
11393
11394 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11395
11396 salt_pc_block_ptr[salt_len] = (unsigned char) 0x80;
11397
11398 salt_pc_block[14] = salt_len * 8;
11399
11400 uint salt_pc_digest[4];
11401
11402 salt_pc_digest[0] = MAGIC_A;
11403 salt_pc_digest[1] = MAGIC_B;
11404 salt_pc_digest[2] = MAGIC_C;
11405 salt_pc_digest[3] = MAGIC_D;
11406
11407 md5_64 (salt_pc_block, salt_pc_digest);
11408
11409 salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]);
11410 salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]);
11411 salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]);
11412 salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]);
11413
11414 u8 *salt_buf_ptr = (u8 *) salt->salt_buf;
11415
11416 memcpy (salt_buf_ptr, salt_buf, salt_len);
11417
11418 u8 *salt_buf_pc_ptr = (u8 *) salt->salt_buf_pc;
11419
11420 bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0);
11421 bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8);
11422 bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16);
11423 bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24);
11424
11425 salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct
11426
11427 return (PARSER_OK);
11428 }
11429
11430 int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11431 {
11432 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11433
11434 u32 *digest = (u32 *) hash_buf->digest;
11435
11436 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11437 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11438 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11439 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11440 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11441
11442 digest[0] -= SHA1M_A;
11443 digest[1] -= SHA1M_B;
11444 digest[2] -= SHA1M_C;
11445 digest[3] -= SHA1M_D;
11446 digest[4] -= SHA1M_E;
11447
11448 return (PARSER_OK);
11449 }
11450
11451 int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11452 {
11453 if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH);
11454
11455 u32 *digest = (u32 *) hash_buf->digest;
11456
11457 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11458 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11459 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11460 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11461 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11462
11463 return (PARSER_OK);
11464 }
11465
11466 int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11467 {
11468 if (data.opts_type & OPTS_TYPE_ST_HEX)
11469 {
11470 if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH);
11471 }
11472 else
11473 {
11474 if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH);
11475 }
11476
11477 u32 *digest = (u32 *) hash_buf->digest;
11478
11479 salt_t *salt = hash_buf->salt;
11480
11481 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11482 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11483 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11484 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11485 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11486
11487 digest[0] -= SHA1M_A;
11488 digest[1] -= SHA1M_B;
11489 digest[2] -= SHA1M_C;
11490 digest[3] -= SHA1M_D;
11491 digest[4] -= SHA1M_E;
11492
11493 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11494
11495 uint salt_len = input_len - 40 - 1;
11496
11497 char *salt_buf = input_buf + 40 + 1;
11498
11499 char *salt_buf_ptr = (char *) salt->salt_buf;
11500
11501 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11502
11503 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11504
11505 salt->salt_len = salt_len;
11506
11507 return (PARSER_OK);
11508 }
11509
11510 int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11511 {
11512 if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH);
11513
11514 if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
11515
11516 u32 *digest = (u32 *) hash_buf->digest;
11517
11518 u8 tmp_buf[100];
11519
11520 memset (tmp_buf, 0, sizeof (tmp_buf));
11521
11522 base64_decode (base64_to_int, (const u8 *) input_buf + 5, input_len - 5, tmp_buf);
11523
11524 memcpy (digest, tmp_buf, 20);
11525
11526 digest[0] = byte_swap_32 (digest[0]);
11527 digest[1] = byte_swap_32 (digest[1]);
11528 digest[2] = byte_swap_32 (digest[2]);
11529 digest[3] = byte_swap_32 (digest[3]);
11530 digest[4] = byte_swap_32 (digest[4]);
11531
11532 digest[0] -= SHA1M_A;
11533 digest[1] -= SHA1M_B;
11534 digest[2] -= SHA1M_C;
11535 digest[3] -= SHA1M_D;
11536 digest[4] -= SHA1M_E;
11537
11538 return (PARSER_OK);
11539 }
11540
11541 int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11542 {
11543 if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH);
11544
11545 if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11546
11547 u32 *digest = (u32 *) hash_buf->digest;
11548
11549 salt_t *salt = hash_buf->salt;
11550
11551 u8 tmp_buf[100];
11552
11553 memset (tmp_buf, 0, sizeof (tmp_buf));
11554
11555 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 6, input_len - 6, tmp_buf);
11556
11557 memcpy (digest, tmp_buf, 20);
11558
11559 salt->salt_len = tmp_len - 20;
11560
11561 memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len);
11562
11563 if (data.opts_type & OPTS_TYPE_ST_ADD80)
11564 {
11565 char *ptr = (char *) salt->salt_buf;
11566
11567 ptr[salt->salt_len] = 0x80;
11568 }
11569
11570 digest[0] = byte_swap_32 (digest[0]);
11571 digest[1] = byte_swap_32 (digest[1]);
11572 digest[2] = byte_swap_32 (digest[2]);
11573 digest[3] = byte_swap_32 (digest[3]);
11574 digest[4] = byte_swap_32 (digest[4]);
11575
11576 digest[0] -= SHA1M_A;
11577 digest[1] -= SHA1M_B;
11578 digest[2] -= SHA1M_C;
11579 digest[3] -= SHA1M_D;
11580 digest[4] -= SHA1M_E;
11581
11582 return (PARSER_OK);
11583 }
11584
11585 int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11586 {
11587 if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH);
11588
11589 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11590
11591 u32 *digest = (u32 *) hash_buf->digest;
11592
11593 salt_t *salt = hash_buf->salt;
11594
11595 char *salt_buf = input_buf + 6;
11596
11597 uint salt_len = 8;
11598
11599 char *salt_buf_ptr = (char *) salt->salt_buf;
11600
11601 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11602
11603 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11604
11605 salt->salt_len = salt_len;
11606
11607 char *hash_pos = input_buf + 6 + 8 + 40;
11608
11609 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11610 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11611 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11612 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11613 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11614
11615 digest[0] -= SHA1M_A;
11616 digest[1] -= SHA1M_B;
11617 digest[2] -= SHA1M_C;
11618 digest[3] -= SHA1M_D;
11619 digest[4] -= SHA1M_E;
11620
11621 return (PARSER_OK);
11622 }
11623
11624 int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11625 {
11626 if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH);
11627
11628 if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11629
11630 u32 *digest = (u32 *) hash_buf->digest;
11631
11632 salt_t *salt = hash_buf->salt;
11633
11634 char *salt_buf = input_buf + 6;
11635
11636 uint salt_len = 8;
11637
11638 char *salt_buf_ptr = (char *) salt->salt_buf;
11639
11640 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11641
11642 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11643
11644 salt->salt_len = salt_len;
11645
11646 char *hash_pos = input_buf + 6 + 8;
11647
11648 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11649 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11650 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
11651 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
11652 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
11653
11654 digest[0] -= SHA1M_A;
11655 digest[1] -= SHA1M_B;
11656 digest[2] -= SHA1M_C;
11657 digest[3] -= SHA1M_D;
11658 digest[4] -= SHA1M_E;
11659
11660 return (PARSER_OK);
11661 }
11662
11663 int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11664 {
11665 if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH);
11666
11667 if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
11668
11669 u64 *digest = (u64 *) hash_buf->digest;
11670
11671 salt_t *salt = hash_buf->salt;
11672
11673 char *salt_buf = input_buf + 6;
11674
11675 uint salt_len = 8;
11676
11677 char *salt_buf_ptr = (char *) salt->salt_buf;
11678
11679 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11680
11681 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11682
11683 salt->salt_len = salt_len;
11684
11685 char *hash_pos = input_buf + 6 + 8;
11686
11687 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
11688 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
11689 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
11690 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
11691 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
11692 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
11693 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
11694 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
11695
11696 digest[0] -= SHA512M_A;
11697 digest[1] -= SHA512M_B;
11698 digest[2] -= SHA512M_C;
11699 digest[3] -= SHA512M_D;
11700 digest[4] -= SHA512M_E;
11701 digest[5] -= SHA512M_F;
11702 digest[6] -= SHA512M_G;
11703 digest[7] -= SHA512M_H;
11704
11705 return (PARSER_OK);
11706 }
11707
11708 int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11709 {
11710 if (data.opts_type & OPTS_TYPE_ST_HEX)
11711 {
11712 if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH);
11713 }
11714 else
11715 {
11716 if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH);
11717 }
11718
11719 u32 *digest = (u32 *) hash_buf->digest;
11720
11721 salt_t *salt = hash_buf->salt;
11722
11723 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11724 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11725 digest[2] = 0;
11726 digest[3] = 0;
11727
11728 digest[0] = byte_swap_32 (digest[0]);
11729 digest[1] = byte_swap_32 (digest[1]);
11730
11731 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11732
11733 uint salt_len = input_len - 16 - 1;
11734
11735 char *salt_buf = input_buf + 16 + 1;
11736
11737 char *salt_buf_ptr = (char *) salt->salt_buf;
11738
11739 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11740
11741 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11742
11743 salt->salt_len = salt_len;
11744
11745 return (PARSER_OK);
11746 }
11747
11748 int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11749 {
11750 if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH);
11751
11752 u32 *digest = (u32 *) hash_buf->digest;
11753
11754 salt_t *salt = hash_buf->salt;
11755
11756 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11757 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11758 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11759 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11760 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11761
11762 digest[0] -= SHA1M_A;
11763 digest[1] -= SHA1M_B;
11764 digest[2] -= SHA1M_C;
11765 digest[3] -= SHA1M_D;
11766 digest[4] -= SHA1M_E;
11767
11768 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11769
11770 uint salt_len = input_len - 40 - 1;
11771
11772 char *salt_buf = input_buf + 40 + 1;
11773
11774 char *salt_buf_ptr = (char *) salt->salt_buf;
11775
11776 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11777
11778 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11779
11780 salt->salt_len = salt_len;
11781
11782 return (PARSER_OK);
11783 }
11784
11785 int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11786 {
11787 if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH);
11788
11789 u32 *digest = (u32 *) hash_buf->digest;
11790
11791 salt_t *salt = hash_buf->salt;
11792
11793 char *hash_pos = input_buf;
11794
11795 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
11796 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
11797 digest[ 2] = hex_to_u32 ((const u8 *) &hash_pos[ 16]);
11798 digest[ 3] = hex_to_u32 ((const u8 *) &hash_pos[ 24]);
11799 digest[ 4] = hex_to_u32 ((const u8 *) &hash_pos[ 32]);
11800 digest[ 5] = hex_to_u32 ((const u8 *) &hash_pos[ 40]);
11801 digest[ 6] = hex_to_u32 ((const u8 *) &hash_pos[ 48]);
11802 digest[ 7] = hex_to_u32 ((const u8 *) &hash_pos[ 56]);
11803 digest[ 8] = hex_to_u32 ((const u8 *) &hash_pos[ 64]);
11804 digest[ 9] = hex_to_u32 ((const u8 *) &hash_pos[ 72]);
11805 digest[10] = hex_to_u32 ((const u8 *) &hash_pos[ 80]);
11806 digest[11] = hex_to_u32 ((const u8 *) &hash_pos[ 88]);
11807 digest[12] = hex_to_u32 ((const u8 *) &hash_pos[ 96]);
11808 digest[13] = hex_to_u32 ((const u8 *) &hash_pos[104]);
11809 digest[14] = hex_to_u32 ((const u8 *) &hash_pos[112]);
11810 digest[15] = hex_to_u32 ((const u8 *) &hash_pos[120]);
11811
11812 char *salt_pos = input_buf + 128;
11813
11814 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
11815 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
11816 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
11817 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
11818
11819 salt->salt_iter = ROUNDS_ORACLET - 1;
11820 salt->salt_len = 16;
11821
11822 return (PARSER_OK);
11823 }
11824
11825 int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11826 {
11827 if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH);
11828
11829 u32 *digest = (u32 *) hash_buf->digest;
11830
11831 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11832 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11833 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11834 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11835 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11836 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11837 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11838 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11839
11840 digest[0] -= SHA256M_A;
11841 digest[1] -= SHA256M_B;
11842 digest[2] -= SHA256M_C;
11843 digest[3] -= SHA256M_D;
11844 digest[4] -= SHA256M_E;
11845 digest[5] -= SHA256M_F;
11846 digest[6] -= SHA256M_G;
11847 digest[7] -= SHA256M_H;
11848
11849 return (PARSER_OK);
11850 }
11851
11852 int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11853 {
11854 if (data.opts_type & OPTS_TYPE_ST_HEX)
11855 {
11856 if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH);
11857 }
11858 else
11859 {
11860 if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH);
11861 }
11862
11863 u32 *digest = (u32 *) hash_buf->digest;
11864
11865 salt_t *salt = hash_buf->salt;
11866
11867 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
11868 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
11869 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
11870 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
11871 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
11872 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
11873 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
11874 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
11875
11876 digest[0] -= SHA256M_A;
11877 digest[1] -= SHA256M_B;
11878 digest[2] -= SHA256M_C;
11879 digest[3] -= SHA256M_D;
11880 digest[4] -= SHA256M_E;
11881 digest[5] -= SHA256M_F;
11882 digest[6] -= SHA256M_G;
11883 digest[7] -= SHA256M_H;
11884
11885 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11886
11887 uint salt_len = input_len - 64 - 1;
11888
11889 char *salt_buf = input_buf + 64 + 1;
11890
11891 char *salt_buf_ptr = (char *) salt->salt_buf;
11892
11893 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11894
11895 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
11896
11897 salt->salt_len = salt_len;
11898
11899 return (PARSER_OK);
11900 }
11901
11902 int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11903 {
11904 if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH);
11905
11906 u64 *digest = (u64 *) hash_buf->digest;
11907
11908 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11909 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11910 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11911 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11912 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11913 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11914 digest[6] = 0;
11915 digest[7] = 0;
11916
11917 digest[0] -= SHA384M_A;
11918 digest[1] -= SHA384M_B;
11919 digest[2] -= SHA384M_C;
11920 digest[3] -= SHA384M_D;
11921 digest[4] -= SHA384M_E;
11922 digest[5] -= SHA384M_F;
11923 digest[6] -= 0;
11924 digest[7] -= 0;
11925
11926 return (PARSER_OK);
11927 }
11928
11929 int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11930 {
11931 if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH);
11932
11933 u64 *digest = (u64 *) hash_buf->digest;
11934
11935 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11936 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11937 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11938 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11939 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11940 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11941 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11942 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11943
11944 digest[0] -= SHA512M_A;
11945 digest[1] -= SHA512M_B;
11946 digest[2] -= SHA512M_C;
11947 digest[3] -= SHA512M_D;
11948 digest[4] -= SHA512M_E;
11949 digest[5] -= SHA512M_F;
11950 digest[6] -= SHA512M_G;
11951 digest[7] -= SHA512M_H;
11952
11953 return (PARSER_OK);
11954 }
11955
11956 int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
11957 {
11958 if (data.opts_type & OPTS_TYPE_ST_HEX)
11959 {
11960 if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH);
11961 }
11962 else
11963 {
11964 if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH);
11965 }
11966
11967 u64 *digest = (u64 *) hash_buf->digest;
11968
11969 salt_t *salt = hash_buf->salt;
11970
11971 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
11972 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
11973 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
11974 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
11975 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
11976 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
11977 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
11978 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
11979
11980 digest[0] -= SHA512M_A;
11981 digest[1] -= SHA512M_B;
11982 digest[2] -= SHA512M_C;
11983 digest[3] -= SHA512M_D;
11984 digest[4] -= SHA512M_E;
11985 digest[5] -= SHA512M_F;
11986 digest[6] -= SHA512M_G;
11987 digest[7] -= SHA512M_H;
11988
11989 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
11990
11991 uint salt_len = input_len - 128 - 1;
11992
11993 char *salt_buf = input_buf + 128 + 1;
11994
11995 char *salt_buf_ptr = (char *) salt->salt_buf;
11996
11997 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
11998
11999 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12000
12001 salt->salt_len = salt_len;
12002
12003 return (PARSER_OK);
12004 }
12005
12006 int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12007 {
12008 if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12009
12010 u64 *digest = (u64 *) hash_buf->digest;
12011
12012 salt_t *salt = hash_buf->salt;
12013
12014 char *salt_pos = input_buf + 3;
12015
12016 uint iterations_len = 0;
12017
12018 if (memcmp (salt_pos, "rounds=", 7) == 0)
12019 {
12020 salt_pos += 7;
12021
12022 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12023
12024 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12025 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12026
12027 salt_pos[0] = 0x0;
12028
12029 salt->salt_iter = atoi (salt_pos - iterations_len);
12030
12031 salt_pos += 1;
12032
12033 iterations_len += 8;
12034 }
12035 else
12036 {
12037 salt->salt_iter = ROUNDS_SHA512CRYPT;
12038 }
12039
12040 if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12041
12042 char *hash_pos = strchr (salt_pos, '$');
12043
12044 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12045
12046 uint salt_len = hash_pos - salt_pos;
12047
12048 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12049
12050 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12051
12052 salt->salt_len = salt_len;
12053
12054 hash_pos++;
12055
12056 sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12057
12058 return (PARSER_OK);
12059 }
12060
12061 int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12062 {
12063 if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH);
12064
12065 if (input_len % 16) return (PARSER_GLOBAL_LENGTH);
12066
12067 u64 *digest = (u64 *) hash_buf->digest;
12068
12069 salt_t *salt = hash_buf->salt;
12070
12071 uint keccak_mdlen = input_len / 2;
12072
12073 for (uint i = 0; i < keccak_mdlen / 8; i++)
12074 {
12075 digest[i] = hex_to_u64 ((const u8 *) &input_buf[i * 16]);
12076
12077 digest[i] = byte_swap_64 (digest[i]);
12078 }
12079
12080 salt->keccak_mdlen = keccak_mdlen;
12081
12082 return (PARSER_OK);
12083 }
12084
12085 int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12086 {
12087 if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH);
12088
12089 u32 *digest = (u32 *) hash_buf->digest;
12090
12091 salt_t *salt = hash_buf->salt;
12092
12093 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12094
12095 /**
12096 * Parse that strange long line
12097 */
12098
12099 char *in_off[9];
12100
12101 size_t in_len[9];
12102
12103 in_off[0] = strtok (input_buf, ":");
12104
12105 in_len[0] = strlen (in_off[0]);
12106
12107 size_t i;
12108
12109 for (i = 1; i < 9; i++)
12110 {
12111 in_off[i] = strtok (NULL, ":");
12112
12113 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12114
12115 in_len[i] = strlen (in_off[i]);
12116 }
12117
12118 char *ptr;
12119
12120 ptr = (char *) ikepsk->msg_buf;
12121
12122 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12123 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12124 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12125 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12126 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12127 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12128
12129 *ptr = 0x80;
12130
12131 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12132
12133 ptr = (char *) ikepsk->nr_buf;
12134
12135 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12136 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12137
12138 *ptr = 0x80;
12139
12140 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12141
12142 /**
12143 * Store to database
12144 */
12145
12146 ptr = in_off[8];
12147
12148 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12149 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12150 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12151 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12152
12153 digest[0] = byte_swap_32 (digest[0]);
12154 digest[1] = byte_swap_32 (digest[1]);
12155 digest[2] = byte_swap_32 (digest[2]);
12156 digest[3] = byte_swap_32 (digest[3]);
12157
12158 salt->salt_len = 32;
12159
12160 salt->salt_buf[0] = ikepsk->nr_buf[0];
12161 salt->salt_buf[1] = ikepsk->nr_buf[1];
12162 salt->salt_buf[2] = ikepsk->nr_buf[2];
12163 salt->salt_buf[3] = ikepsk->nr_buf[3];
12164 salt->salt_buf[4] = ikepsk->nr_buf[4];
12165 salt->salt_buf[5] = ikepsk->nr_buf[5];
12166 salt->salt_buf[6] = ikepsk->nr_buf[6];
12167 salt->salt_buf[7] = ikepsk->nr_buf[7];
12168
12169 return (PARSER_OK);
12170 }
12171
12172 int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12173 {
12174 if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH);
12175
12176 u32 *digest = (u32 *) hash_buf->digest;
12177
12178 salt_t *salt = hash_buf->salt;
12179
12180 ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt;
12181
12182 /**
12183 * Parse that strange long line
12184 */
12185
12186 char *in_off[9];
12187
12188 size_t in_len[9];
12189
12190 in_off[0] = strtok (input_buf, ":");
12191
12192 in_len[0] = strlen (in_off[0]);
12193
12194 size_t i;
12195
12196 for (i = 1; i < 9; i++)
12197 {
12198 in_off[i] = strtok (NULL, ":");
12199
12200 if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12201
12202 in_len[i] = strlen (in_off[i]);
12203 }
12204
12205 char *ptr;
12206
12207 ptr = (char *) ikepsk->msg_buf;
12208
12209 for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[0] + i);
12210 for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[1] + i);
12211 for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[2] + i);
12212 for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[3] + i);
12213 for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[4] + i);
12214 for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[5] + i);
12215
12216 *ptr = 0x80;
12217
12218 ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2;
12219
12220 ptr = (char *) ikepsk->nr_buf;
12221
12222 for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[6] + i);
12223 for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_u8 ((const u8 *) in_off[7] + i);
12224
12225 *ptr = 0x80;
12226
12227 ikepsk->nr_len = (in_len[6] + in_len[7]) / 2;
12228
12229 /**
12230 * Store to database
12231 */
12232
12233 ptr = in_off[8];
12234
12235 digest[0] = hex_to_u32 ((const u8 *) &ptr[ 0]);
12236 digest[1] = hex_to_u32 ((const u8 *) &ptr[ 8]);
12237 digest[2] = hex_to_u32 ((const u8 *) &ptr[16]);
12238 digest[3] = hex_to_u32 ((const u8 *) &ptr[24]);
12239 digest[4] = hex_to_u32 ((const u8 *) &ptr[32]);
12240
12241 salt->salt_len = 32;
12242
12243 salt->salt_buf[0] = ikepsk->nr_buf[0];
12244 salt->salt_buf[1] = ikepsk->nr_buf[1];
12245 salt->salt_buf[2] = ikepsk->nr_buf[2];
12246 salt->salt_buf[3] = ikepsk->nr_buf[3];
12247 salt->salt_buf[4] = ikepsk->nr_buf[4];
12248 salt->salt_buf[5] = ikepsk->nr_buf[5];
12249 salt->salt_buf[6] = ikepsk->nr_buf[6];
12250 salt->salt_buf[7] = ikepsk->nr_buf[7];
12251
12252 return (PARSER_OK);
12253 }
12254
12255 int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12256 {
12257 if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH);
12258
12259 u32 *digest = (u32 *) hash_buf->digest;
12260
12261 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12262 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12263 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12264 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12265 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12266
12267 digest[0] = byte_swap_32 (digest[0]);
12268 digest[1] = byte_swap_32 (digest[1]);
12269 digest[2] = byte_swap_32 (digest[2]);
12270 digest[3] = byte_swap_32 (digest[3]);
12271 digest[4] = byte_swap_32 (digest[4]);
12272
12273 return (PARSER_OK);
12274 }
12275
12276 int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12277 {
12278 if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH);
12279
12280 u32 *digest = (u32 *) hash_buf->digest;
12281
12282 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12283 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12284 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
12285 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
12286 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
12287 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
12288 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
12289 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
12290 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
12291 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
12292 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
12293 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
12294 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
12295 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
12296 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
12297 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
12298
12299 return (PARSER_OK);
12300 }
12301
12302 int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12303 {
12304 if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH);
12305
12306 u32 *digest = (u32 *) hash_buf->digest;
12307
12308 salt_t *salt = hash_buf->salt;
12309
12310 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12311 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12312 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12313 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12314 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12315
12316 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
12317
12318 uint salt_len = input_len - 40 - 1;
12319
12320 char *salt_buf = input_buf + 40 + 1;
12321
12322 char *salt_buf_ptr = (char *) salt->salt_buf;
12323
12324 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
12325
12326 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12327
12328 salt->salt_len = salt_len;
12329
12330 salt->salt_iter = ROUNDS_ANDROIDPIN - 1;
12331
12332 return (PARSER_OK);
12333 }
12334
12335 int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf)
12336 {
12337 u32 *digest = (u32 *) hash_buf->digest;
12338
12339 salt_t *salt = hash_buf->salt;
12340
12341 tc_t *tc = (tc_t *) hash_buf->esalt;
12342
12343 if (input_len == 0)
12344 {
12345 log_error ("TrueCrypt container not specified");
12346
12347 exit (-1);
12348 }
12349
12350 FILE *fp = fopen (input_buf, "rb");
12351
12352 if (fp == NULL)
12353 {
12354 log_error ("%s: %s", input_buf, strerror (errno));
12355
12356 exit (-1);
12357 }
12358
12359 char buf[512];
12360
12361 int n = fread (buf, 1, sizeof (buf), fp);
12362
12363 fclose (fp);
12364
12365 if (n != 512) return (PARSER_TC_FILE_SIZE);
12366
12367 memcpy (tc->salt_buf, buf, 64);
12368
12369 memcpy (tc->data_buf, buf + 64, 512 - 64);
12370
12371 salt->salt_buf[0] = tc->salt_buf[0];
12372
12373 salt->salt_len = 4;
12374
12375 salt->salt_iter = 1000 - 1;
12376
12377 digest[0] = tc->data_buf[0];
12378
12379 return (PARSER_OK);
12380 }
12381
12382 int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf)
12383 {
12384 u32 *digest = (u32 *) hash_buf->digest;
12385
12386 salt_t *salt = hash_buf->salt;
12387
12388 tc_t *tc = (tc_t *) hash_buf->esalt;
12389
12390 if (input_len == 0)
12391 {
12392 log_error ("TrueCrypt container not specified");
12393
12394 exit (-1);
12395 }
12396
12397 FILE *fp = fopen (input_buf, "rb");
12398
12399 if (fp == NULL)
12400 {
12401 log_error ("%s: %s", input_buf, strerror (errno));
12402
12403 exit (-1);
12404 }
12405
12406 char buf[512];
12407
12408 int n = fread (buf, 1, sizeof (buf), fp);
12409
12410 fclose (fp);
12411
12412 if (n != 512) return (PARSER_TC_FILE_SIZE);
12413
12414 memcpy (tc->salt_buf, buf, 64);
12415
12416 memcpy (tc->data_buf, buf + 64, 512 - 64);
12417
12418 salt->salt_buf[0] = tc->salt_buf[0];
12419
12420 salt->salt_len = 4;
12421
12422 salt->salt_iter = 2000 - 1;
12423
12424 digest[0] = tc->data_buf[0];
12425
12426 return (PARSER_OK);
12427 }
12428
12429 int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12430 {
12431 if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH);
12432
12433 if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
12434
12435 u32 *digest = (u32 *) hash_buf->digest;
12436
12437 salt_t *salt = hash_buf->salt;
12438
12439 char *salt_pos = input_buf + 6;
12440
12441 char *hash_pos = strchr (salt_pos, '$');
12442
12443 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12444
12445 uint salt_len = hash_pos - salt_pos;
12446
12447 if (salt_len < 8) return (PARSER_SALT_LENGTH);
12448
12449 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12450
12451 salt->salt_len = salt_len;
12452
12453 salt->salt_iter = 1000;
12454
12455 hash_pos++;
12456
12457 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12458
12459 return (PARSER_OK);
12460 }
12461
12462 int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12463 {
12464 if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH);
12465
12466 if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
12467
12468 u32 *digest = (u32 *) hash_buf->digest;
12469
12470 salt_t *salt = hash_buf->salt;
12471
12472 char *iter_pos = input_buf + 7;
12473
12474 char *salt_pos = strchr (iter_pos, '$');
12475
12476 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12477
12478 salt_pos++;
12479
12480 char *hash_pos = strchr (salt_pos, '$');
12481
12482 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12483
12484 uint salt_len = hash_pos - salt_pos;
12485
12486 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12487
12488 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12489
12490 salt->salt_len = salt_len;
12491
12492 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12493
12494 salt->salt_sign[0] = atoi (salt_iter);
12495
12496 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12497
12498 hash_pos++;
12499
12500 sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12501
12502 digest[0] = byte_swap_32 (digest[0]);
12503 digest[1] = byte_swap_32 (digest[1]);
12504 digest[2] = byte_swap_32 (digest[2]);
12505 digest[3] = byte_swap_32 (digest[3]);
12506 digest[4] = byte_swap_32 (digest[4]);
12507
12508 return (PARSER_OK);
12509 }
12510
12511 int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12512 {
12513 if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH);
12514
12515 if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12516
12517 u32 *digest = (u32 *) hash_buf->digest;
12518
12519 salt_t *salt = hash_buf->salt;
12520
12521 char *iter_pos = input_buf + 9;
12522
12523 char *salt_pos = strchr (iter_pos, '$');
12524
12525 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12526
12527 salt_pos++;
12528
12529 char *hash_pos = strchr (salt_pos, '$');
12530
12531 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12532
12533 uint salt_len = hash_pos - salt_pos;
12534
12535 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12536
12537 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12538
12539 salt->salt_len = salt_len;
12540
12541 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12542
12543 salt->salt_sign[0] = atoi (salt_iter);
12544
12545 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12546
12547 hash_pos++;
12548
12549 sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12550
12551 digest[0] = byte_swap_32 (digest[0]);
12552 digest[1] = byte_swap_32 (digest[1]);
12553 digest[2] = byte_swap_32 (digest[2]);
12554 digest[3] = byte_swap_32 (digest[3]);
12555 digest[4] = byte_swap_32 (digest[4]);
12556 digest[5] = byte_swap_32 (digest[5]);
12557 digest[6] = byte_swap_32 (digest[6]);
12558 digest[7] = byte_swap_32 (digest[7]);
12559
12560 return (PARSER_OK);
12561 }
12562
12563 int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12564 {
12565 if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH);
12566
12567 if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
12568
12569 u64 *digest = (u64 *) hash_buf->digest;
12570
12571 salt_t *salt = hash_buf->salt;
12572
12573 char *iter_pos = input_buf + 9;
12574
12575 char *salt_pos = strchr (iter_pos, '$');
12576
12577 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12578
12579 salt_pos++;
12580
12581 char *hash_pos = strchr (salt_pos, '$');
12582
12583 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12584
12585 uint salt_len = hash_pos - salt_pos;
12586
12587 if (salt_len < 16) return (PARSER_SALT_LENGTH);
12588
12589 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12590
12591 salt->salt_len = salt_len;
12592
12593 char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 };
12594
12595 salt->salt_sign[0] = atoi (salt_iter);
12596
12597 salt->salt_iter = (1 << atoi (salt_iter)) - 1;
12598
12599 hash_pos++;
12600
12601 sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12602
12603 digest[0] = byte_swap_64 (digest[0]);
12604 digest[1] = byte_swap_64 (digest[1]);
12605 digest[2] = byte_swap_64 (digest[2]);
12606 digest[3] = byte_swap_64 (digest[3]);
12607 digest[4] = byte_swap_64 (digest[4]);
12608 digest[5] = byte_swap_64 (digest[5]);
12609 digest[6] = byte_swap_64 (digest[6]);
12610 digest[7] = byte_swap_64 (digest[7]);
12611
12612 return (PARSER_OK);
12613 }
12614
12615 int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12616 {
12617 if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH);
12618
12619 u32 *digest = (u32 *) hash_buf->digest;
12620
12621 salt_t *salt = hash_buf->salt;
12622
12623 agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt;
12624
12625 /**
12626 * parse line
12627 */
12628
12629 char *iterations_pos = input_buf;
12630
12631 char *saltbuf_pos = strchr (iterations_pos, ':');
12632
12633 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12634
12635 uint iterations_len = saltbuf_pos - iterations_pos;
12636
12637 if (iterations_len > 6) return (PARSER_SALT_LENGTH);
12638
12639 saltbuf_pos++;
12640
12641 char *cipherbuf_pos = strchr (saltbuf_pos, ':');
12642
12643 if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12644
12645 uint saltbuf_len = cipherbuf_pos - saltbuf_pos;
12646
12647 if (saltbuf_len != 16) return (PARSER_SALT_LENGTH);
12648
12649 uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1;
12650
12651 if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH);
12652
12653 cipherbuf_pos++;
12654
12655 /**
12656 * pbkdf2 iterations
12657 */
12658
12659 salt->salt_iter = atoi (iterations_pos) - 1;
12660
12661 /**
12662 * handle salt encoding
12663 */
12664
12665 char *saltbuf_ptr = (char *) salt->salt_buf;
12666
12667 for (uint i = 0; i < saltbuf_len; i += 2)
12668 {
12669 const char p0 = saltbuf_pos[i + 0];
12670 const char p1 = saltbuf_pos[i + 1];
12671
12672 *saltbuf_ptr++ = hex_convert (p1) << 0
12673 | hex_convert (p0) << 4;
12674 }
12675
12676 salt->salt_len = saltbuf_len / 2;
12677
12678 /**
12679 * handle cipher encoding
12680 */
12681
12682 uint *tmp = (uint *) mymalloc (32);
12683
12684 char *cipherbuf_ptr = (char *) tmp;
12685
12686 for (uint i = 2016; i < cipherbuf_len; i += 2)
12687 {
12688 const char p0 = cipherbuf_pos[i + 0];
12689 const char p1 = cipherbuf_pos[i + 1];
12690
12691 *cipherbuf_ptr++ = hex_convert (p1) << 0
12692 | hex_convert (p0) << 4;
12693 }
12694
12695 // iv is stored at salt_buf 4 (length 16)
12696 // data is stored at salt_buf 8 (length 16)
12697
12698 salt->salt_buf[ 4] = byte_swap_32 (tmp[0]);
12699 salt->salt_buf[ 5] = byte_swap_32 (tmp[1]);
12700 salt->salt_buf[ 6] = byte_swap_32 (tmp[2]);
12701 salt->salt_buf[ 7] = byte_swap_32 (tmp[3]);
12702
12703 salt->salt_buf[ 8] = byte_swap_32 (tmp[4]);
12704 salt->salt_buf[ 9] = byte_swap_32 (tmp[5]);
12705 salt->salt_buf[10] = byte_swap_32 (tmp[6]);
12706 salt->salt_buf[11] = byte_swap_32 (tmp[7]);
12707
12708 free (tmp);
12709
12710 for (uint i = 0, j = 0; i < 1040; i += 1, j += 2)
12711 {
12712 const char p0 = cipherbuf_pos[j + 0];
12713 const char p1 = cipherbuf_pos[j + 1];
12714
12715 agilekey->cipher[i] = hex_convert (p1) << 0
12716 | hex_convert (p0) << 4;
12717 }
12718
12719 /**
12720 * digest buf
12721 */
12722
12723 digest[0] = 0x10101010;
12724 digest[1] = 0x10101010;
12725 digest[2] = 0x10101010;
12726 digest[3] = 0x10101010;
12727
12728 return (PARSER_OK);
12729 }
12730
12731 int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12732 {
12733 if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH);
12734
12735 u32 *digest = (u32 *) hash_buf->digest;
12736
12737 salt_t *salt = hash_buf->salt;
12738
12739 char *hashbuf_pos = input_buf;
12740
12741 char *iterations_pos = strchr (hashbuf_pos, ':');
12742
12743 if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12744
12745 uint hash_len = iterations_pos - hashbuf_pos;
12746
12747 if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH);
12748
12749 iterations_pos++;
12750
12751 char *saltbuf_pos = strchr (iterations_pos, ':');
12752
12753 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12754
12755 uint iterations_len = saltbuf_pos - iterations_pos;
12756
12757 saltbuf_pos++;
12758
12759 uint salt_len = input_len - hash_len - 1 - iterations_len - 1;
12760
12761 if (salt_len > 32) return (PARSER_SALT_LENGTH);
12762
12763 char *salt_buf_ptr = (char *) salt->salt_buf;
12764
12765 salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len);
12766
12767 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12768
12769 salt->salt_len = salt_len;
12770
12771 salt->salt_iter = atoi (iterations_pos) - 1;
12772
12773 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
12774 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
12775 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
12776 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
12777
12778 return (PARSER_OK);
12779 }
12780
12781 int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12782 {
12783 if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH);
12784
12785 u32 *digest = (u32 *) hash_buf->digest;
12786
12787 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
12788 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
12789 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
12790 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
12791 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
12792 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
12793 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
12794 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
12795
12796 digest[0] = byte_swap_32 (digest[0]);
12797 digest[1] = byte_swap_32 (digest[1]);
12798 digest[2] = byte_swap_32 (digest[2]);
12799 digest[3] = byte_swap_32 (digest[3]);
12800 digest[4] = byte_swap_32 (digest[4]);
12801 digest[5] = byte_swap_32 (digest[5]);
12802 digest[6] = byte_swap_32 (digest[6]);
12803 digest[7] = byte_swap_32 (digest[7]);
12804
12805 return (PARSER_OK);
12806 }
12807
12808 int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12809 {
12810 if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
12811
12812 u32 *digest = (u32 *) hash_buf->digest;
12813
12814 salt_t *salt = hash_buf->salt;
12815
12816 char *salt_pos = input_buf + 3;
12817
12818 uint iterations_len = 0;
12819
12820 if (memcmp (salt_pos, "rounds=", 7) == 0)
12821 {
12822 salt_pos += 7;
12823
12824 for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue;
12825
12826 if (iterations_len == 0 ) return (PARSER_SALT_ITERATION);
12827 if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED);
12828
12829 salt_pos[0] = 0x0;
12830
12831 salt->salt_iter = atoi (salt_pos - iterations_len);
12832
12833 salt_pos += 1;
12834
12835 iterations_len += 8;
12836 }
12837 else
12838 {
12839 salt->salt_iter = ROUNDS_SHA256CRYPT;
12840 }
12841
12842 if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH);
12843
12844 char *hash_pos = strchr (salt_pos, '$');
12845
12846 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12847
12848 uint salt_len = hash_pos - salt_pos;
12849
12850 if (salt_len > 16) return (PARSER_SALT_LENGTH);
12851
12852 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
12853
12854 salt->salt_len = salt_len;
12855
12856 hash_pos++;
12857
12858 sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
12859
12860 return (PARSER_OK);
12861 }
12862
12863 int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12864 {
12865 uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128);
12866
12867 if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12868
12869 if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
12870
12871 u64 *digest = (u64 *) hash_buf->digest;
12872
12873 salt_t *salt = hash_buf->salt;
12874
12875 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
12876
12877 char *iter_pos = input_buf + 4;
12878
12879 char *salt_pos = strchr (iter_pos, '$');
12880
12881 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12882
12883 salt_pos++;
12884
12885 char *hash_pos = strchr (salt_pos, '$');
12886
12887 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12888
12889 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
12890
12891 hash_pos++;
12892
12893 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
12894 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
12895 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
12896 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
12897 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
12898 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
12899 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
12900 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
12901
12902 uint salt_len = hash_pos - salt_pos - 1;
12903
12904 if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH);
12905
12906 salt->salt_len = salt_len / 2;
12907
12908 pbkdf2_sha512->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
12909 pbkdf2_sha512->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
12910 pbkdf2_sha512->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
12911 pbkdf2_sha512->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
12912 pbkdf2_sha512->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
12913 pbkdf2_sha512->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
12914 pbkdf2_sha512->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
12915 pbkdf2_sha512->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
12916
12917 pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]);
12918 pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]);
12919 pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]);
12920 pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]);
12921 pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]);
12922 pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]);
12923 pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]);
12924 pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]);
12925 pbkdf2_sha512->salt_buf[8] = 0x01000000;
12926 pbkdf2_sha512->salt_buf[9] = 0x80;
12927
12928 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
12929
12930 salt->salt_iter = atoi (iter_pos) - 1;
12931
12932 return (PARSER_OK);
12933 }
12934
12935 int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12936 {
12937 if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH);
12938
12939 if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
12940
12941 u32 *digest = (u32 *) hash_buf->digest;
12942
12943 salt_t *salt = hash_buf->salt;
12944
12945 char *salt_pos = input_buf + 14;
12946
12947 char *hash_pos = strchr (salt_pos, '*');
12948
12949 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
12950
12951 hash_pos++;
12952
12953 uint salt_len = hash_pos - salt_pos - 1;
12954
12955 char *salt_buf_ptr = (char *) salt->salt_buf;
12956
12957 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
12958
12959 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
12960
12961 salt->salt_len = salt_len;
12962
12963 u8 tmp_buf[100];
12964
12965 memset (tmp_buf, 0, sizeof (tmp_buf));
12966
12967 base64_decode (base64_to_int, (const u8 *) hash_pos, 43, tmp_buf);
12968
12969 memcpy (digest, tmp_buf, 32);
12970
12971 digest[0] = byte_swap_32 (digest[0]);
12972 digest[1] = byte_swap_32 (digest[1]);
12973 digest[2] = byte_swap_32 (digest[2]);
12974 digest[3] = byte_swap_32 (digest[3]);
12975 digest[4] = byte_swap_32 (digest[4]);
12976 digest[5] = byte_swap_32 (digest[5]);
12977 digest[6] = byte_swap_32 (digest[6]);
12978 digest[7] = byte_swap_32 (digest[7]);
12979
12980 digest[0] -= SHA256M_A;
12981 digest[1] -= SHA256M_B;
12982 digest[2] -= SHA256M_C;
12983 digest[3] -= SHA256M_D;
12984 digest[4] -= SHA256M_E;
12985 digest[5] -= SHA256M_F;
12986 digest[6] -= SHA256M_G;
12987 digest[7] -= SHA256M_H;
12988
12989 return (PARSER_OK);
12990 }
12991
12992 int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
12993 {
12994 uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128);
12995
12996 if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH);
12997
12998 if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED);
12999
13000 u64 *digest = (u64 *) hash_buf->digest;
13001
13002 salt_t *salt = hash_buf->salt;
13003
13004 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
13005
13006 char *iter_pos = input_buf + 19;
13007
13008 char *salt_pos = strchr (iter_pos, '.');
13009
13010 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13011
13012 salt_pos++;
13013
13014 char *hash_pos = strchr (salt_pos, '.');
13015
13016 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13017
13018 if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH);
13019
13020 hash_pos++;
13021
13022 digest[0] = hex_to_u64 ((const u8 *) &hash_pos[ 0]);
13023 digest[1] = hex_to_u64 ((const u8 *) &hash_pos[ 16]);
13024 digest[2] = hex_to_u64 ((const u8 *) &hash_pos[ 32]);
13025 digest[3] = hex_to_u64 ((const u8 *) &hash_pos[ 48]);
13026 digest[4] = hex_to_u64 ((const u8 *) &hash_pos[ 64]);
13027 digest[5] = hex_to_u64 ((const u8 *) &hash_pos[ 80]);
13028 digest[6] = hex_to_u64 ((const u8 *) &hash_pos[ 96]);
13029 digest[7] = hex_to_u64 ((const u8 *) &hash_pos[112]);
13030
13031 uint salt_len = hash_pos - salt_pos - 1;
13032
13033 salt_len /= 2;
13034
13035 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
13036
13037 uint i;
13038
13039 for (i = 0; i < salt_len; i++)
13040 {
13041 salt_buf_ptr[i] = hex_to_u8 ((const u8 *) &salt_pos[i * 2]);
13042 }
13043
13044 salt_buf_ptr[salt_len + 3] = 0x01;
13045 salt_buf_ptr[salt_len + 4] = 0x80;
13046
13047 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
13048
13049 salt->salt_len = salt_len;
13050
13051 salt->salt_iter = atoi (iter_pos) - 1;
13052
13053 return (PARSER_OK);
13054 }
13055
13056 int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13057 {
13058 if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH);
13059
13060 if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
13061
13062 u64 *digest = (u64 *) hash_buf->digest;
13063
13064 salt_t *salt = hash_buf->salt;
13065
13066 u8 tmp_buf[120];
13067
13068 memset (tmp_buf, 0, sizeof (tmp_buf));
13069
13070 int tmp_len = base64_decode (base64_to_int, (const u8 *) input_buf + 9, input_len - 9, tmp_buf);
13071
13072 memcpy (digest, tmp_buf, 64);
13073
13074 digest[0] = byte_swap_64 (digest[0]);
13075 digest[1] = byte_swap_64 (digest[1]);
13076 digest[2] = byte_swap_64 (digest[2]);
13077 digest[3] = byte_swap_64 (digest[3]);
13078 digest[4] = byte_swap_64 (digest[4]);
13079 digest[5] = byte_swap_64 (digest[5]);
13080 digest[6] = byte_swap_64 (digest[6]);
13081 digest[7] = byte_swap_64 (digest[7]);
13082
13083 digest[0] -= SHA512M_A;
13084 digest[1] -= SHA512M_B;
13085 digest[2] -= SHA512M_C;
13086 digest[3] -= SHA512M_D;
13087 digest[4] -= SHA512M_E;
13088 digest[5] -= SHA512M_F;
13089 digest[6] -= SHA512M_G;
13090 digest[7] -= SHA512M_H;
13091
13092 salt->salt_len = tmp_len - 64;
13093
13094 memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len);
13095
13096 if (data.opts_type & OPTS_TYPE_ST_ADD80)
13097 {
13098 char *ptr = (char *) salt->salt_buf;
13099
13100 ptr[salt->salt_len] = 0x80;
13101 }
13102
13103 return (PARSER_OK);
13104 }
13105
13106 int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13107 {
13108 if (data.opts_type & OPTS_TYPE_ST_HEX)
13109 {
13110 if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH);
13111 }
13112 else
13113 {
13114 if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH);
13115 }
13116
13117 u32 *digest = (u32 *) hash_buf->digest;
13118
13119 salt_t *salt = hash_buf->salt;
13120
13121 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13122 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13123 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13124 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13125
13126 digest[0] = byte_swap_32 (digest[0]);
13127 digest[1] = byte_swap_32 (digest[1]);
13128 digest[2] = byte_swap_32 (digest[2]);
13129 digest[3] = byte_swap_32 (digest[3]);
13130
13131 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13132
13133 uint salt_len = input_len - 32 - 1;
13134
13135 char *salt_buf = input_buf + 32 + 1;
13136
13137 char *salt_buf_ptr = (char *) salt->salt_buf;
13138
13139 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13140
13141 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13142
13143 salt->salt_len = salt_len;
13144
13145 return (PARSER_OK);
13146 }
13147
13148 int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13149 {
13150 if (data.opts_type & OPTS_TYPE_ST_HEX)
13151 {
13152 if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH);
13153 }
13154 else
13155 {
13156 if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH);
13157 }
13158
13159 u32 *digest = (u32 *) hash_buf->digest;
13160
13161 salt_t *salt = hash_buf->salt;
13162
13163 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13164 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13165 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13166 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13167 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13168
13169 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13170
13171 uint salt_len = input_len - 40 - 1;
13172
13173 char *salt_buf = input_buf + 40 + 1;
13174
13175 char *salt_buf_ptr = (char *) salt->salt_buf;
13176
13177 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13178
13179 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13180
13181 salt->salt_len = salt_len;
13182
13183 return (PARSER_OK);
13184 }
13185
13186 int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13187 {
13188 if (data.opts_type & OPTS_TYPE_ST_HEX)
13189 {
13190 if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH);
13191 }
13192 else
13193 {
13194 if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH);
13195 }
13196
13197 u32 *digest = (u32 *) hash_buf->digest;
13198
13199 salt_t *salt = hash_buf->salt;
13200
13201 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13202 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13203 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13204 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13205 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
13206 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
13207 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
13208 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
13209
13210 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13211
13212 uint salt_len = input_len - 64 - 1;
13213
13214 char *salt_buf = input_buf + 64 + 1;
13215
13216 char *salt_buf_ptr = (char *) salt->salt_buf;
13217
13218 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13219
13220 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13221
13222 salt->salt_len = salt_len;
13223
13224 return (PARSER_OK);
13225 }
13226
13227 int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13228 {
13229 if (data.opts_type & OPTS_TYPE_ST_HEX)
13230 {
13231 if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH);
13232 }
13233 else
13234 {
13235 if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH);
13236 }
13237
13238 u64 *digest = (u64 *) hash_buf->digest;
13239
13240 salt_t *salt = hash_buf->salt;
13241
13242 digest[0] = hex_to_u64 ((const u8 *) &input_buf[ 0]);
13243 digest[1] = hex_to_u64 ((const u8 *) &input_buf[ 16]);
13244 digest[2] = hex_to_u64 ((const u8 *) &input_buf[ 32]);
13245 digest[3] = hex_to_u64 ((const u8 *) &input_buf[ 48]);
13246 digest[4] = hex_to_u64 ((const u8 *) &input_buf[ 64]);
13247 digest[5] = hex_to_u64 ((const u8 *) &input_buf[ 80]);
13248 digest[6] = hex_to_u64 ((const u8 *) &input_buf[ 96]);
13249 digest[7] = hex_to_u64 ((const u8 *) &input_buf[112]);
13250
13251 if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13252
13253 uint salt_len = input_len - 128 - 1;
13254
13255 char *salt_buf = input_buf + 128 + 1;
13256
13257 char *salt_buf_ptr = (char *) salt->salt_buf;
13258
13259 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13260
13261 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13262
13263 salt->salt_len = salt_len;
13264
13265 return (PARSER_OK);
13266 }
13267
13268 int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13269 {
13270 if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH);
13271
13272 if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
13273
13274 u32 *digest = (u32 *) hash_buf->digest;
13275
13276 salt_t *salt = hash_buf->salt;
13277
13278 krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt;
13279
13280 /**
13281 * parse line
13282 */
13283
13284 char *user_pos = input_buf + 10 + 1;
13285
13286 char *realm_pos = strchr (user_pos, '$');
13287
13288 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13289
13290 uint user_len = realm_pos - user_pos;
13291
13292 if (user_len >= 64) return (PARSER_SALT_LENGTH);
13293
13294 realm_pos++;
13295
13296 char *salt_pos = strchr (realm_pos, '$');
13297
13298 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13299
13300 uint realm_len = salt_pos - realm_pos;
13301
13302 if (realm_len >= 64) return (PARSER_SALT_LENGTH);
13303
13304 salt_pos++;
13305
13306 char *data_pos = strchr (salt_pos, '$');
13307
13308 if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13309
13310 uint salt_len = data_pos - salt_pos;
13311
13312 if (salt_len >= 128) return (PARSER_SALT_LENGTH);
13313
13314 data_pos++;
13315
13316 uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1;
13317
13318 if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH);
13319
13320 /**
13321 * copy data
13322 */
13323
13324 memcpy (krb5pa->user, user_pos, user_len);
13325 memcpy (krb5pa->realm, realm_pos, realm_len);
13326 memcpy (krb5pa->salt, salt_pos, salt_len);
13327
13328 char *timestamp_ptr = (char *) krb5pa->timestamp;
13329
13330 for (uint i = 0; i < (36 * 2); i += 2)
13331 {
13332 const char p0 = data_pos[i + 0];
13333 const char p1 = data_pos[i + 1];
13334
13335 *timestamp_ptr++ = hex_convert (p1) << 0
13336 | hex_convert (p0) << 4;
13337 }
13338
13339 char *checksum_ptr = (char *) krb5pa->checksum;
13340
13341 for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2)
13342 {
13343 const char p0 = data_pos[i + 0];
13344 const char p1 = data_pos[i + 1];
13345
13346 *checksum_ptr++ = hex_convert (p1) << 0
13347 | hex_convert (p0) << 4;
13348 }
13349
13350 /**
13351 * copy some data to generic buffers to make sorting happy
13352 */
13353
13354 salt->salt_buf[0] = krb5pa->timestamp[0];
13355 salt->salt_buf[1] = krb5pa->timestamp[1];
13356 salt->salt_buf[2] = krb5pa->timestamp[2];
13357 salt->salt_buf[3] = krb5pa->timestamp[3];
13358 salt->salt_buf[4] = krb5pa->timestamp[4];
13359 salt->salt_buf[5] = krb5pa->timestamp[5];
13360 salt->salt_buf[6] = krb5pa->timestamp[6];
13361 salt->salt_buf[7] = krb5pa->timestamp[7];
13362 salt->salt_buf[8] = krb5pa->timestamp[8];
13363
13364 salt->salt_len = 36;
13365
13366 digest[0] = krb5pa->checksum[0];
13367 digest[1] = krb5pa->checksum[1];
13368 digest[2] = krb5pa->checksum[2];
13369 digest[3] = krb5pa->checksum[3];
13370
13371 return (PARSER_OK);
13372 }
13373
13374 int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13375 {
13376 if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH);
13377
13378 u32 *digest = (u32 *) hash_buf->digest;
13379
13380 salt_t *salt = hash_buf->salt;
13381
13382 /**
13383 * parse line
13384 */
13385
13386 char *salt_pos = input_buf;
13387
13388 char *hash_pos = strchr (salt_pos, '$');
13389
13390 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13391
13392 uint salt_len = hash_pos - salt_pos;
13393
13394 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13395
13396 hash_pos++;
13397
13398 uint hash_len = input_len - 1 - salt_len;
13399
13400 if (hash_len != 16) return (PARSER_HASH_LENGTH);
13401
13402 /**
13403 * valid some data
13404 */
13405
13406 uint user_len = 0;
13407
13408 for (uint i = 0; i < salt_len; i++)
13409 {
13410 if (salt_pos[i] == ' ') continue;
13411
13412 user_len++;
13413 }
13414
13415 // SAP user names cannot be longer than 12 characters
13416 if (user_len > 12) return (PARSER_SALT_LENGTH);
13417
13418 // SAP user name cannot start with ! or ?
13419 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13420
13421 /**
13422 * copy data
13423 */
13424
13425 char *salt_buf_ptr = (char *) salt->salt_buf;
13426
13427 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13428
13429 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13430
13431 salt->salt_len = salt_len;
13432
13433 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
13434 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
13435 digest[2] = 0;
13436 digest[3] = 0;
13437
13438 digest[0] = byte_swap_32 (digest[0]);
13439 digest[1] = byte_swap_32 (digest[1]);
13440
13441 return (PARSER_OK);
13442 }
13443
13444 int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13445 {
13446 if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH);
13447
13448 u32 *digest = (u32 *) hash_buf->digest;
13449
13450 salt_t *salt = hash_buf->salt;
13451
13452 /**
13453 * parse line
13454 */
13455
13456 char *salt_pos = input_buf;
13457
13458 char *hash_pos = strchr (salt_pos, '$');
13459
13460 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13461
13462 uint salt_len = hash_pos - salt_pos;
13463
13464 if (salt_len >= 40) return (PARSER_SALT_LENGTH);
13465
13466 hash_pos++;
13467
13468 uint hash_len = input_len - 1 - salt_len;
13469
13470 if (hash_len != 40) return (PARSER_HASH_LENGTH);
13471
13472 /**
13473 * valid some data
13474 */
13475
13476 uint user_len = 0;
13477
13478 for (uint i = 0; i < salt_len; i++)
13479 {
13480 if (salt_pos[i] == ' ') continue;
13481
13482 user_len++;
13483 }
13484
13485 // SAP user names cannot be longer than 12 characters
13486 // this is kinda buggy. if the username is in utf the length can be up to length 12*3
13487 // so far nobody complained so we stay with this because it helps in optimization
13488 // final string can have a max size of 32 (password) + (10 * 5) = lengthMagicArray + 12 (max salt) + 1 (the 0x80)
13489
13490 if (user_len > 12) return (PARSER_SALT_LENGTH);
13491
13492 // SAP user name cannot start with ! or ?
13493 if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE);
13494
13495 /**
13496 * copy data
13497 */
13498
13499 char *salt_buf_ptr = (char *) salt->salt_buf;
13500
13501 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
13502
13503 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13504
13505 salt->salt_len = salt_len;
13506
13507 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13508 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13509 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13510 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13511 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13512
13513 return (PARSER_OK);
13514 }
13515
13516 int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13517 {
13518 if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH);
13519
13520 if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
13521
13522 u64 *digest = (u64 *) hash_buf->digest;
13523
13524 salt_t *salt = hash_buf->salt;
13525
13526 char *iter_pos = input_buf + 3;
13527
13528 uint salt_iter = 1 << itoa64_to_int (iter_pos[0]);
13529
13530 if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION);
13531
13532 memcpy ((char *) salt->salt_sign, input_buf, 4);
13533
13534 salt->salt_iter = salt_iter;
13535
13536 char *salt_pos = iter_pos + 1;
13537
13538 uint salt_len = 8;
13539
13540 memcpy ((char *) salt->salt_buf, salt_pos, salt_len);
13541
13542 salt->salt_len = salt_len;
13543
13544 char *hash_pos = salt_pos + salt_len;
13545
13546 drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
13547
13548 // ugly hack start
13549
13550 char *tmp = (char *) salt->salt_buf_pc;
13551
13552 tmp[0] = hash_pos[42];
13553
13554 // ugly hack end
13555
13556 digest[ 0] = byte_swap_64 (digest[ 0]);
13557 digest[ 1] = byte_swap_64 (digest[ 1]);
13558 digest[ 2] = byte_swap_64 (digest[ 2]);
13559 digest[ 3] = byte_swap_64 (digest[ 3]);
13560 digest[ 4] = 0;
13561 digest[ 5] = 0;
13562 digest[ 6] = 0;
13563 digest[ 7] = 0;
13564
13565 return (PARSER_OK);
13566 }
13567
13568 int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13569 {
13570 if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH);
13571
13572 if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
13573
13574 u32 *digest = (u32 *) hash_buf->digest;
13575
13576 salt_t *salt = hash_buf->salt;
13577
13578 char *salt_buf = input_buf + 6;
13579
13580 uint salt_len = 16;
13581
13582 char *salt_buf_ptr = (char *) salt->salt_buf;
13583
13584 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
13585
13586 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13587
13588 salt->salt_len = salt_len;
13589
13590 char *hash_pos = input_buf + 6 + 16;
13591
13592 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13593 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13594 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13595 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13596 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13597 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
13598 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
13599 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
13600
13601 return (PARSER_OK);
13602 }
13603
13604 int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13605 {
13606 if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH);
13607
13608 u32 *digest = (u32 *) hash_buf->digest;
13609
13610 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13611 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13612 digest[2] = 0;
13613 digest[3] = 0;
13614
13615 return (PARSER_OK);
13616 }
13617
13618 int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13619 {
13620 if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH);
13621
13622 u32 *digest = (u32 *) hash_buf->digest;
13623
13624 salt_t *salt = hash_buf->salt;
13625
13626 rakp_t *rakp = (rakp_t *) hash_buf->esalt;
13627
13628 char *saltbuf_pos = input_buf;
13629
13630 char *hashbuf_pos = strchr (saltbuf_pos, ':');
13631
13632 if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13633
13634 uint saltbuf_len = hashbuf_pos - saltbuf_pos;
13635
13636 if (saltbuf_len < 64) return (PARSER_SALT_LENGTH);
13637 if (saltbuf_len > 512) return (PARSER_SALT_LENGTH);
13638
13639 if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex
13640
13641 hashbuf_pos++;
13642
13643 uint hashbuf_len = input_len - saltbuf_len - 1;
13644
13645 if (hashbuf_len != 40) return (PARSER_HASH_LENGTH);
13646
13647 char *salt_ptr = (char *) saltbuf_pos;
13648 char *rakp_ptr = (char *) rakp->salt_buf;
13649
13650 uint i;
13651 uint j;
13652
13653 for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1)
13654 {
13655 rakp_ptr[j] = hex_to_u8 ((const u8 *) &salt_ptr[i]);
13656 }
13657
13658 rakp_ptr[j] = 0x80;
13659
13660 rakp->salt_len = j;
13661
13662 for (i = 0; i < 64; i++)
13663 {
13664 rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]);
13665 }
13666
13667 salt->salt_buf[0] = rakp->salt_buf[0];
13668 salt->salt_buf[1] = rakp->salt_buf[1];
13669 salt->salt_buf[2] = rakp->salt_buf[2];
13670 salt->salt_buf[3] = rakp->salt_buf[3];
13671 salt->salt_buf[4] = rakp->salt_buf[4];
13672 salt->salt_buf[5] = rakp->salt_buf[5];
13673 salt->salt_buf[6] = rakp->salt_buf[6];
13674 salt->salt_buf[7] = rakp->salt_buf[7];
13675
13676 salt->salt_len = 32; // muss min. 32 haben
13677
13678 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13679 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13680 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13681 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13682 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13683
13684 return (PARSER_OK);
13685 }
13686
13687 int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13688 {
13689 if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH);
13690
13691 u32 *digest = (u32 *) hash_buf->digest;
13692
13693 salt_t *salt = hash_buf->salt;
13694
13695 if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
13696
13697 char *salt_pos = input_buf + 1;
13698
13699 memcpy (salt->salt_buf, salt_pos, 8);
13700
13701 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
13702 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
13703
13704 salt->salt_len = 8;
13705
13706 char *hash_pos = salt_pos + 8;
13707
13708 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
13709 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
13710 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
13711 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
13712 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
13713
13714 digest[0] -= SHA1M_A;
13715 digest[1] -= SHA1M_B;
13716 digest[2] -= SHA1M_C;
13717 digest[3] -= SHA1M_D;
13718 digest[4] -= SHA1M_E;
13719
13720 return (PARSER_OK);
13721 }
13722
13723 int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13724 {
13725 if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH);
13726
13727 u32 *digest = (u32 *) hash_buf->digest;
13728
13729 salt_t *salt = hash_buf->salt;
13730
13731 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
13732 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
13733 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
13734 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
13735
13736 digest[0] = byte_swap_32 (digest[0]);
13737 digest[1] = byte_swap_32 (digest[1]);
13738 digest[2] = byte_swap_32 (digest[2]);
13739 digest[3] = byte_swap_32 (digest[3]);
13740
13741 digest[0] -= MD5M_A;
13742 digest[1] -= MD5M_B;
13743 digest[2] -= MD5M_C;
13744 digest[3] -= MD5M_D;
13745
13746 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13747
13748 char *salt_buf_ptr = input_buf + 32 + 1;
13749
13750 u32 *salt_buf = salt->salt_buf;
13751
13752 salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 0]);
13753 salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf_ptr[ 8]);
13754 salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf_ptr[16]);
13755 salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf_ptr[24]);
13756
13757 salt_buf[0] = byte_swap_32 (salt_buf[0]);
13758 salt_buf[1] = byte_swap_32 (salt_buf[1]);
13759 salt_buf[2] = byte_swap_32 (salt_buf[2]);
13760 salt_buf[3] = byte_swap_32 (salt_buf[3]);
13761
13762 salt->salt_len = 16 + 1;
13763
13764 if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
13765
13766 char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1;
13767
13768 salt_buf[4] = hex_to_u8 ((const u8 *) &idbyte_buf_ptr[0]) & 0xff;
13769
13770 return (PARSER_OK);
13771 }
13772
13773 int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13774 {
13775 if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH);
13776
13777 u32 *digest = (u32 *) hash_buf->digest;
13778
13779 salt_t *salt = hash_buf->salt;
13780
13781 cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt;
13782
13783 /**
13784 * parse line
13785 */
13786
13787 char *hashbuf_pos = input_buf;
13788
13789 char *saltbuf_pos = strchr (hashbuf_pos, ':');
13790
13791 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13792
13793 const uint hashbuf_len = saltbuf_pos - hashbuf_pos;
13794
13795 if (hashbuf_len != 64) return (PARSER_HASH_LENGTH);
13796
13797 saltbuf_pos++;
13798
13799 char *iteration_pos = strchr (saltbuf_pos, ':');
13800
13801 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13802
13803 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13804
13805 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
13806
13807 iteration_pos++;
13808
13809 char *databuf_pos = strchr (iteration_pos, ':');
13810
13811 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13812
13813 const uint iteration_len = databuf_pos - iteration_pos;
13814
13815 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13816 if (iteration_len > 8) return (PARSER_SALT_ITERATION);
13817
13818 const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1;
13819
13820 if (databuf_len < 1) return (PARSER_SALT_LENGTH);
13821 if (databuf_len > 2048) return (PARSER_SALT_LENGTH);
13822
13823 databuf_pos++;
13824
13825 // digest
13826
13827 digest[0] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 0]);
13828 digest[1] = hex_to_u32 ((const u8 *) &hashbuf_pos[ 8]);
13829 digest[2] = hex_to_u32 ((const u8 *) &hashbuf_pos[16]);
13830 digest[3] = hex_to_u32 ((const u8 *) &hashbuf_pos[24]);
13831 digest[4] = hex_to_u32 ((const u8 *) &hashbuf_pos[32]);
13832 digest[5] = hex_to_u32 ((const u8 *) &hashbuf_pos[40]);
13833 digest[6] = hex_to_u32 ((const u8 *) &hashbuf_pos[48]);
13834 digest[7] = hex_to_u32 ((const u8 *) &hashbuf_pos[56]);
13835
13836 // salt
13837
13838 char *saltbuf_ptr = (char *) salt->salt_buf;
13839
13840 for (uint i = 0; i < saltbuf_len; i += 2)
13841 {
13842 const char p0 = saltbuf_pos[i + 0];
13843 const char p1 = saltbuf_pos[i + 1];
13844
13845 *saltbuf_ptr++ = hex_convert (p1) << 0
13846 | hex_convert (p0) << 4;
13847 }
13848
13849 salt->salt_buf[4] = 0x01000000;
13850 salt->salt_buf[5] = 0x80;
13851
13852 salt->salt_len = saltbuf_len / 2;
13853
13854 // iteration
13855
13856 salt->salt_iter = atoi (iteration_pos) - 1;
13857
13858 // data
13859
13860 char *databuf_ptr = (char *) cloudkey->data_buf;
13861
13862 for (uint i = 0; i < databuf_len; i += 2)
13863 {
13864 const char p0 = databuf_pos[i + 0];
13865 const char p1 = databuf_pos[i + 1];
13866
13867 *databuf_ptr++ = hex_convert (p1) << 0
13868 | hex_convert (p0) << 4;
13869 }
13870
13871 *databuf_ptr++ = 0x80;
13872
13873 for (uint i = 0; i < 512; i++)
13874 {
13875 cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]);
13876 }
13877
13878 cloudkey->data_len = databuf_len / 2;
13879
13880 return (PARSER_OK);
13881 }
13882
13883 int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
13884 {
13885 if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH);
13886
13887 u32 *digest = (u32 *) hash_buf->digest;
13888
13889 salt_t *salt = hash_buf->salt;
13890
13891 /**
13892 * parse line
13893 */
13894
13895 char *hashbuf_pos = input_buf;
13896
13897 char *domainbuf_pos = strchr (hashbuf_pos, ':');
13898
13899 if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13900
13901 const uint hashbuf_len = domainbuf_pos - hashbuf_pos;
13902
13903 if (hashbuf_len != 32) return (PARSER_HASH_LENGTH);
13904
13905 domainbuf_pos++;
13906
13907 if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE);
13908
13909 char *saltbuf_pos = strchr (domainbuf_pos, ':');
13910
13911 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13912
13913 const uint domainbuf_len = saltbuf_pos - domainbuf_pos;
13914
13915 if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH);
13916
13917 saltbuf_pos++;
13918
13919 char *iteration_pos = strchr (saltbuf_pos, ':');
13920
13921 if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
13922
13923 const uint saltbuf_len = iteration_pos - saltbuf_pos;
13924
13925 if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length
13926
13927 if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH);
13928
13929 iteration_pos++;
13930
13931 const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1;
13932
13933 if (iteration_len < 1) return (PARSER_SALT_ITERATION);
13934 if (iteration_len > 5) return (PARSER_SALT_ITERATION);
13935
13936 // ok, the plan for this algorithm is the following:
13937 // we have 2 salts here, the domain-name and a random salt
13938 // while both are used in the initial transformation,
13939 // only the random salt is used in the following iterations
13940 // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[])
13941 // and one that includes only the real salt (stored into salt_buf[]).
13942 // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len
13943
13944 u8 tmp_buf[100];
13945
13946 memset (tmp_buf, 0, sizeof (tmp_buf));
13947
13948 base32_decode (itoa32_to_int, (const u8 *) hashbuf_pos, 32, tmp_buf);
13949
13950 memcpy (digest, tmp_buf, 20);
13951
13952 digest[0] = byte_swap_32 (digest[0]);
13953 digest[1] = byte_swap_32 (digest[1]);
13954 digest[2] = byte_swap_32 (digest[2]);
13955 digest[3] = byte_swap_32 (digest[3]);
13956 digest[4] = byte_swap_32 (digest[4]);
13957
13958 // domain
13959
13960 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
13961
13962 memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len);
13963
13964 char *len_ptr = NULL;
13965
13966 for (uint i = 0; i < domainbuf_len; i++)
13967 {
13968 if (salt_buf_pc_ptr[i] == '.')
13969 {
13970 len_ptr = &salt_buf_pc_ptr[i];
13971
13972 *len_ptr = 0;
13973 }
13974 else
13975 {
13976 *len_ptr += 1;
13977 }
13978 }
13979
13980 salt->salt_buf_pc[7] = domainbuf_len;
13981
13982 // "real" salt
13983
13984 char *salt_buf_ptr = (char *) salt->salt_buf;
13985
13986 const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len);
13987
13988 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
13989
13990 salt->salt_len = salt_len;
13991
13992 // iteration
13993
13994 salt->salt_iter = atoi (iteration_pos);
13995
13996 return (PARSER_OK);
13997 }
13998
13999 int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14000 {
14001 if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH);
14002
14003 u32 *digest = (u32 *) hash_buf->digest;
14004
14005 salt_t *salt = hash_buf->salt;
14006
14007 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14008 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14009 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14010 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14011 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
14012
14013 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
14014
14015 uint salt_len = input_len - 40 - 1;
14016
14017 char *salt_buf = input_buf + 40 + 1;
14018
14019 char *salt_buf_ptr = (char *) salt->salt_buf;
14020
14021 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14022
14023 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14024
14025 salt->salt_len = salt_len;
14026
14027 return (PARSER_OK);
14028 }
14029
14030 int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14031 {
14032 const u8 ascii_to_ebcdic[] =
14033 {
14034 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
14035 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
14036 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
14037 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
14038 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
14039 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d,
14040 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
14041 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07,
14042 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
14043 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
14044 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
14045 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
14046 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e,
14047 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
14048 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
14049 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
14050 };
14051
14052 if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH);
14053
14054 if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14055
14056 u32 *digest = (u32 *) hash_buf->digest;
14057
14058 salt_t *salt = hash_buf->salt;
14059
14060 char *salt_pos = input_buf + 6 + 1;
14061
14062 char *digest_pos = strchr (salt_pos, '*');
14063
14064 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14065
14066 uint salt_len = digest_pos - salt_pos;
14067
14068 if (salt_len > 8) return (PARSER_SALT_LENGTH);
14069
14070 uint hash_len = input_len - 1 - salt_len - 1 - 6;
14071
14072 if (hash_len != 16) return (PARSER_HASH_LENGTH);
14073
14074 digest_pos++;
14075
14076 char *salt_buf_ptr = (char *) salt->salt_buf;
14077 char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc;
14078
14079 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
14080
14081 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14082
14083 salt->salt_len = salt_len;
14084
14085 for (uint i = 0; i < salt_len; i++)
14086 {
14087 salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]];
14088 }
14089 for (uint i = salt_len; i < 8; i++)
14090 {
14091 salt_buf_pc_ptr[i] = 0x40;
14092 }
14093
14094 uint tt;
14095
14096 IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt);
14097
14098 salt->salt_buf_pc[0] = rotl32 (salt->salt_buf_pc[0], 3u);
14099 salt->salt_buf_pc[1] = rotl32 (salt->salt_buf_pc[1], 3u);
14100
14101 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
14102 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
14103
14104 digest[0] = byte_swap_32 (digest[0]);
14105 digest[1] = byte_swap_32 (digest[1]);
14106
14107 IP (digest[0], digest[1], tt);
14108
14109 digest[0] = rotr32 (digest[0], 29);
14110 digest[1] = rotr32 (digest[1], 29);
14111 digest[2] = 0;
14112 digest[3] = 0;
14113
14114 return (PARSER_OK);
14115 }
14116
14117 int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14118 {
14119 if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH);
14120
14121 u32 *digest = (u32 *) hash_buf->digest;
14122
14123 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14124 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14125 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14126 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14127
14128 digest[0] = byte_swap_32 (digest[0]);
14129 digest[1] = byte_swap_32 (digest[1]);
14130 digest[2] = byte_swap_32 (digest[2]);
14131 digest[3] = byte_swap_32 (digest[3]);
14132
14133 return (PARSER_OK);
14134 }
14135
14136 int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14137 {
14138 if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH);
14139
14140 if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14141
14142 u32 *digest = (u32 *) hash_buf->digest;
14143
14144 salt_t *salt = hash_buf->salt;
14145
14146 u8 tmp_buf[120];
14147
14148 memset (tmp_buf, 0, sizeof (tmp_buf));
14149
14150 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14151
14152 tmp_buf[3] += -4; // dont ask!
14153
14154 memcpy (salt->salt_buf, tmp_buf, 5);
14155
14156 salt->salt_len = 5;
14157
14158 memcpy (digest, tmp_buf + 5, 9);
14159
14160 // yes, only 9 byte are needed to crack, but 10 to display
14161
14162 salt->salt_buf_pc[7] = input_buf[20];
14163
14164 return (PARSER_OK);
14165 }
14166
14167 int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14168 {
14169 if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH);
14170
14171 if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED);
14172
14173 u32 *digest = (u32 *) hash_buf->digest;
14174
14175 salt_t *salt = hash_buf->salt;
14176
14177 u8 tmp_buf[120];
14178
14179 memset (tmp_buf, 0, sizeof (tmp_buf));
14180
14181 base64_decode (lotus64_to_int, (const u8 *) input_buf + 2, input_len - 3, tmp_buf);
14182
14183 tmp_buf[3] += -4; // dont ask!
14184
14185 // salt
14186
14187 memcpy (salt->salt_buf, tmp_buf, 16);
14188
14189 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)
14190
14191 // iteration
14192
14193 char tmp_iter_buf[11];
14194
14195 memcpy (tmp_iter_buf, tmp_buf + 16, 10);
14196
14197 tmp_iter_buf[10] = 0;
14198
14199 salt->salt_iter = atoi (tmp_iter_buf);
14200
14201 if (salt->salt_iter < 1) // well, the limit hopefully is much higher
14202 {
14203 return (PARSER_SALT_ITERATION);
14204 }
14205
14206 salt->salt_iter--; // first round in init
14207
14208 // 2 additional bytes for display only
14209
14210 salt->salt_buf_pc[0] = tmp_buf[26];
14211 salt->salt_buf_pc[1] = tmp_buf[27];
14212
14213 // digest
14214
14215 memcpy (digest, tmp_buf + 28, 8);
14216
14217 digest[0] = byte_swap_32 (digest[0]);
14218 digest[1] = byte_swap_32 (digest[1]);
14219 digest[2] = 0;
14220 digest[3] = 0;
14221
14222 return (PARSER_OK);
14223 }
14224
14225 int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14226 {
14227 if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH);
14228
14229 u32 *digest = (u32 *) hash_buf->digest;
14230
14231 salt_t *salt = hash_buf->salt;
14232
14233 char *salt_buf_pos = input_buf;
14234
14235 char *hash_buf_pos = salt_buf_pos + 6;
14236
14237 digest[0] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 0]);
14238 digest[1] = hex_to_u32 ((const u8 *) &hash_buf_pos[ 8]);
14239 digest[2] = hex_to_u32 ((const u8 *) &hash_buf_pos[16]);
14240 digest[3] = hex_to_u32 ((const u8 *) &hash_buf_pos[24]);
14241 digest[4] = hex_to_u32 ((const u8 *) &hash_buf_pos[32]);
14242 digest[5] = hex_to_u32 ((const u8 *) &hash_buf_pos[40]);
14243 digest[6] = hex_to_u32 ((const u8 *) &hash_buf_pos[48]);
14244 digest[7] = hex_to_u32 ((const u8 *) &hash_buf_pos[56]);
14245
14246 digest[0] -= SHA256M_A;
14247 digest[1] -= SHA256M_B;
14248 digest[2] -= SHA256M_C;
14249 digest[3] -= SHA256M_D;
14250 digest[4] -= SHA256M_E;
14251 digest[5] -= SHA256M_F;
14252 digest[6] -= SHA256M_G;
14253 digest[7] -= SHA256M_H;
14254
14255 char *salt_buf_ptr = (char *) salt->salt_buf;
14256
14257 const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6);
14258
14259 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14260
14261 salt->salt_len = salt_len;
14262
14263 return (PARSER_OK);
14264 }
14265
14266 int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14267 {
14268 if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH);
14269
14270 u32 *digest = (u32 *) hash_buf->digest;
14271
14272 if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14273
14274 salt_t *salt = hash_buf->salt;
14275
14276 char *salt_buf = input_buf + 6;
14277
14278 char *digest_buf = strchr (salt_buf, '$');
14279
14280 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14281
14282 uint salt_len = digest_buf - salt_buf;
14283
14284 digest_buf++; // skip the '$' symbol
14285
14286 char *salt_buf_ptr = (char *) salt->salt_buf;
14287
14288 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14289
14290 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14291
14292 salt->salt_len = salt_len;
14293
14294 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14295 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14296 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14297 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14298
14299 digest[0] = byte_swap_32 (digest[0]);
14300 digest[1] = byte_swap_32 (digest[1]);
14301 digest[2] = byte_swap_32 (digest[2]);
14302 digest[3] = byte_swap_32 (digest[3]);
14303
14304 digest[0] -= MD5M_A;
14305 digest[1] -= MD5M_B;
14306 digest[2] -= MD5M_C;
14307 digest[3] -= MD5M_D;
14308
14309 return (PARSER_OK);
14310 }
14311
14312 int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14313 {
14314 if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH);
14315
14316 if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14317
14318 u32 *digest = (u32 *) hash_buf->digest;
14319
14320 salt_t *salt = hash_buf->salt;
14321
14322 char *salt_buf = input_buf + 3;
14323
14324 char *digest_buf = strchr (salt_buf, '$');
14325
14326 if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14327
14328 uint salt_len = digest_buf - salt_buf;
14329
14330 digest_buf++; // skip the '$' symbol
14331
14332 char *salt_buf_ptr = (char *) salt->salt_buf;
14333
14334 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14335
14336 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14337
14338 salt_buf_ptr[salt_len] = 0x2d;
14339
14340 salt->salt_len = salt_len + 1;
14341
14342 digest[0] = hex_to_u32 ((const u8 *) &digest_buf[ 0]);
14343 digest[1] = hex_to_u32 ((const u8 *) &digest_buf[ 8]);
14344 digest[2] = hex_to_u32 ((const u8 *) &digest_buf[16]);
14345 digest[3] = hex_to_u32 ((const u8 *) &digest_buf[24]);
14346
14347 digest[0] = byte_swap_32 (digest[0]);
14348 digest[1] = byte_swap_32 (digest[1]);
14349 digest[2] = byte_swap_32 (digest[2]);
14350 digest[3] = byte_swap_32 (digest[3]);
14351
14352 digest[0] -= MD5M_A;
14353 digest[1] -= MD5M_B;
14354 digest[2] -= MD5M_C;
14355 digest[3] -= MD5M_D;
14356
14357 return (PARSER_OK);
14358 }
14359
14360 int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14361 {
14362 if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH);
14363
14364 u32 *digest = (u32 *) hash_buf->digest;
14365
14366 u8 tmp_buf[100];
14367
14368 memset (tmp_buf, 0, sizeof (tmp_buf));
14369
14370 base64_decode (base64_to_int, (const u8 *) input_buf, input_len, tmp_buf);
14371
14372 memcpy (digest, tmp_buf, 20);
14373
14374 digest[0] = byte_swap_32 (digest[0]);
14375 digest[1] = byte_swap_32 (digest[1]);
14376 digest[2] = byte_swap_32 (digest[2]);
14377 digest[3] = byte_swap_32 (digest[3]);
14378 digest[4] = byte_swap_32 (digest[4]);
14379
14380 digest[0] -= SHA1M_A;
14381 digest[1] -= SHA1M_B;
14382 digest[2] -= SHA1M_C;
14383 digest[3] -= SHA1M_D;
14384 digest[4] -= SHA1M_E;
14385
14386 return (PARSER_OK);
14387 }
14388
14389 int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14390 {
14391 if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH);
14392
14393 u32 *digest = (u32 *) hash_buf->digest;
14394
14395 salt_t *salt = hash_buf->salt;
14396
14397 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
14398 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
14399 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
14400 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
14401
14402 digest[0] = byte_swap_32 (digest[0]);
14403 digest[1] = byte_swap_32 (digest[1]);
14404 digest[2] = byte_swap_32 (digest[2]);
14405 digest[3] = byte_swap_32 (digest[3]);
14406
14407 digest[0] -= MD5M_A;
14408 digest[1] -= MD5M_B;
14409 digest[2] -= MD5M_C;
14410 digest[3] -= MD5M_D;
14411
14412 if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14413
14414 uint salt_len = input_len - 32 - 1;
14415
14416 char *salt_buf = input_buf + 32 + 1;
14417
14418 char *salt_buf_ptr = (char *) salt->salt_buf;
14419
14420 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
14421
14422 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
14423
14424 /*
14425 * add static "salt" part
14426 */
14427
14428 memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8);
14429
14430 salt_len += 8;
14431
14432 salt->salt_len = salt_len;
14433
14434 return (PARSER_OK);
14435 }
14436
14437 int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14438 {
14439 if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH);
14440
14441 if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
14442
14443 u32 *digest = (u32 *) hash_buf->digest;
14444
14445 salt_t *salt = hash_buf->salt;
14446
14447 androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt;
14448
14449 /**
14450 * parse line
14451 */
14452
14453 char *saltlen_pos = input_buf + 1 + 3 + 1;
14454
14455 char *saltbuf_pos = strchr (saltlen_pos, '$');
14456
14457 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14458
14459 uint saltlen_len = saltbuf_pos - saltlen_pos;
14460
14461 if (saltlen_len != 2) return (PARSER_SALT_LENGTH);
14462
14463 saltbuf_pos++;
14464
14465 char *keylen_pos = strchr (saltbuf_pos, '$');
14466
14467 if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14468
14469 uint saltbuf_len = keylen_pos - saltbuf_pos;
14470
14471 if (saltbuf_len != 32) return (PARSER_SALT_LENGTH);
14472
14473 keylen_pos++;
14474
14475 char *keybuf_pos = strchr (keylen_pos, '$');
14476
14477 if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14478
14479 uint keylen_len = keybuf_pos - keylen_pos;
14480
14481 if (keylen_len != 2) return (PARSER_SALT_LENGTH);
14482
14483 keybuf_pos++;
14484
14485 char *databuf_pos = strchr (keybuf_pos, '$');
14486
14487 if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14488
14489 uint keybuf_len = databuf_pos - keybuf_pos;
14490
14491 if (keybuf_len != 32) return (PARSER_SALT_LENGTH);
14492
14493 databuf_pos++;
14494
14495 uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1;
14496
14497 if (data_len != 3072) return (PARSER_SALT_LENGTH);
14498
14499 /**
14500 * copy data
14501 */
14502
14503 digest[0] = hex_to_u32 ((const u8 *) &keybuf_pos[ 0]);
14504 digest[1] = hex_to_u32 ((const u8 *) &keybuf_pos[ 8]);
14505 digest[2] = hex_to_u32 ((const u8 *) &keybuf_pos[16]);
14506 digest[3] = hex_to_u32 ((const u8 *) &keybuf_pos[24]);
14507
14508 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 0]);
14509 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &saltbuf_pos[ 8]);
14510 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &saltbuf_pos[16]);
14511 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &saltbuf_pos[24]);
14512
14513 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
14514 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
14515 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
14516 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
14517
14518 salt->salt_len = 16;
14519 salt->salt_iter = ROUNDS_ANDROIDFDE - 1;
14520
14521 for (uint i = 0, j = 0; i < 3072; i += 8, j += 1)
14522 {
14523 androidfde->data[j] = hex_to_u32 ((const u8 *) &databuf_pos[i]);
14524 }
14525
14526 return (PARSER_OK);
14527 }
14528
14529 int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14530 {
14531 if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH);
14532
14533 if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
14534
14535 u32 *digest = (u32 *) hash_buf->digest;
14536
14537 salt_t *salt = hash_buf->salt;
14538
14539 /**
14540 * parse line
14541 */
14542
14543 // first is the N salt parameter
14544
14545 char *N_pos = input_buf + 6;
14546
14547 if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED);
14548
14549 N_pos++;
14550
14551 salt->scrypt_N = atoi (N_pos);
14552
14553 // r
14554
14555 char *r_pos = strchr (N_pos, ':');
14556
14557 if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14558
14559 r_pos++;
14560
14561 salt->scrypt_r = atoi (r_pos);
14562
14563 // p
14564
14565 char *p_pos = strchr (r_pos, ':');
14566
14567 if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14568
14569 p_pos++;
14570
14571 salt->scrypt_p = atoi (p_pos);
14572
14573 // salt
14574
14575 char *saltbuf_pos = strchr (p_pos, ':');
14576
14577 if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14578
14579 saltbuf_pos++;
14580
14581 char *hash_pos = strchr (saltbuf_pos, ':');
14582
14583 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14584
14585 hash_pos++;
14586
14587 // base64 decode
14588
14589 u8 tmp_buf[33];
14590
14591 memset (tmp_buf, 0, sizeof (tmp_buf));
14592
14593 int tmp_len = base64_decode (base64_to_int, (const u8 *) saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf);
14594
14595 char *salt_buf_ptr = (char *) salt->salt_buf;
14596
14597 memcpy (salt_buf_ptr, tmp_buf, tmp_len);
14598
14599 salt->salt_len = tmp_len;
14600 salt->salt_iter = 1;
14601
14602 // digest - base64 decode
14603
14604 memset (tmp_buf, 0, sizeof (tmp_buf));
14605
14606 tmp_len = input_len - (hash_pos - input_buf);
14607
14608 if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH);
14609
14610 base64_decode (base64_to_int, (const u8 *) hash_pos, tmp_len, tmp_buf);
14611
14612 memcpy (digest, tmp_buf, 32);
14613
14614 return (PARSER_OK);
14615 }
14616
14617 int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14618 {
14619 if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH);
14620
14621 u32 *digest = (u32 *) hash_buf->digest;
14622
14623 salt_t *salt = hash_buf->salt;
14624
14625 /**
14626 * parse line
14627 */
14628
14629 char decrypted[76]; // iv + hash
14630
14631 juniper_decrypt_hash (input_buf, decrypted);
14632
14633 char *md5crypt_hash = decrypted + 12;
14634
14635 if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE);
14636
14637 salt->salt_iter = ROUNDS_MD5CRYPT;
14638
14639 char *salt_pos = md5crypt_hash + 3;
14640
14641 char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8
14642
14643 salt->salt_len = hash_pos - salt_pos; // should be 8
14644
14645 memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len);
14646
14647 hash_pos++;
14648
14649 md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos);
14650
14651 return (PARSER_OK);
14652 }
14653
14654 int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14655 {
14656 if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH);
14657
14658 if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14659
14660 u32 *digest = (u32 *) hash_buf->digest;
14661
14662 salt_t *salt = hash_buf->salt;
14663
14664 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
14665
14666 /**
14667 * parse line
14668 */
14669
14670 // first is *raw* salt
14671
14672 char *salt_pos = input_buf + 3;
14673
14674 char *hash_pos = strchr (salt_pos, '$');
14675
14676 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14677
14678 uint salt_len = hash_pos - salt_pos;
14679
14680 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14681
14682 hash_pos++;
14683
14684 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
14685
14686 memcpy (salt_buf_ptr, salt_pos, 14);
14687
14688 salt_buf_ptr[17] = 0x01;
14689 salt_buf_ptr[18] = 0x80;
14690
14691 // add some stuff to normal salt to make sorted happy
14692
14693 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
14694 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
14695 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
14696 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
14697
14698 salt->salt_len = salt_len;
14699 salt->salt_iter = ROUNDS_CISCO8 - 1;
14700
14701 // base64 decode hash
14702
14703 u8 tmp_buf[100];
14704
14705 memset (tmp_buf, 0, sizeof (tmp_buf));
14706
14707 uint hash_len = input_len - 3 - salt_len - 1;
14708
14709 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14710
14711 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14712
14713 memcpy (digest, tmp_buf, 32);
14714
14715 digest[0] = byte_swap_32 (digest[0]);
14716 digest[1] = byte_swap_32 (digest[1]);
14717 digest[2] = byte_swap_32 (digest[2]);
14718 digest[3] = byte_swap_32 (digest[3]);
14719 digest[4] = byte_swap_32 (digest[4]);
14720 digest[5] = byte_swap_32 (digest[5]);
14721 digest[6] = byte_swap_32 (digest[6]);
14722 digest[7] = byte_swap_32 (digest[7]);
14723
14724 return (PARSER_OK);
14725 }
14726
14727 int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14728 {
14729 if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH);
14730
14731 if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED);
14732
14733 u32 *digest = (u32 *) hash_buf->digest;
14734
14735 salt_t *salt = hash_buf->salt;
14736
14737 /**
14738 * parse line
14739 */
14740
14741 // first is *raw* salt
14742
14743 char *salt_pos = input_buf + 3;
14744
14745 char *hash_pos = strchr (salt_pos, '$');
14746
14747 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14748
14749 uint salt_len = hash_pos - salt_pos;
14750
14751 if (salt_len != 14) return (PARSER_SALT_LENGTH);
14752
14753 salt->salt_len = salt_len;
14754 hash_pos++;
14755
14756 char *salt_buf_ptr = (char *) salt->salt_buf;
14757
14758 memcpy (salt_buf_ptr, salt_pos, salt_len);
14759 salt_buf_ptr[salt_len] = 0;
14760
14761 // base64 decode hash
14762
14763 u8 tmp_buf[100];
14764
14765 memset (tmp_buf, 0, sizeof (tmp_buf));
14766
14767 uint hash_len = input_len - 3 - salt_len - 1;
14768
14769 int tmp_len = base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
14770
14771 if (tmp_len != 32) return (PARSER_HASH_LENGTH);
14772
14773 memcpy (digest, tmp_buf, 32);
14774
14775 // fixed:
14776 salt->scrypt_N = 16384;
14777 salt->scrypt_r = 1;
14778 salt->scrypt_p = 1;
14779 salt->salt_iter = 1;
14780
14781 return (PARSER_OK);
14782 }
14783
14784 int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14785 {
14786 if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH);
14787
14788 if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14789
14790 u32 *digest = (u32 *) hash_buf->digest;
14791
14792 salt_t *salt = hash_buf->salt;
14793
14794 office2007_t *office2007 = (office2007_t *) hash_buf->esalt;
14795
14796 /**
14797 * parse line
14798 */
14799
14800 char *version_pos = input_buf + 8 + 1;
14801
14802 char *verifierHashSize_pos = strchr (version_pos, '*');
14803
14804 if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14805
14806 u32 version_len = verifierHashSize_pos - version_pos;
14807
14808 if (version_len != 4) return (PARSER_SALT_LENGTH);
14809
14810 verifierHashSize_pos++;
14811
14812 char *keySize_pos = strchr (verifierHashSize_pos, '*');
14813
14814 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14815
14816 u32 verifierHashSize_len = keySize_pos - verifierHashSize_pos;
14817
14818 if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH);
14819
14820 keySize_pos++;
14821
14822 char *saltSize_pos = strchr (keySize_pos, '*');
14823
14824 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14825
14826 u32 keySize_len = saltSize_pos - keySize_pos;
14827
14828 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14829
14830 saltSize_pos++;
14831
14832 char *osalt_pos = strchr (saltSize_pos, '*');
14833
14834 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14835
14836 u32 saltSize_len = osalt_pos - saltSize_pos;
14837
14838 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14839
14840 osalt_pos++;
14841
14842 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14843
14844 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14845
14846 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14847
14848 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14849
14850 encryptedVerifier_pos++;
14851
14852 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14853
14854 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14855
14856 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14857
14858 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14859
14860 encryptedVerifierHash_pos++;
14861
14862 u32 encryptedVerifierHash_len = input_len - 8 - 1 - version_len - 1 - verifierHashSize_len - 1 - keySize_len - 1 - saltSize_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
14863
14864 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
14865
14866 const uint version = atoi (version_pos);
14867
14868 if (version != 2007) return (PARSER_SALT_VALUE);
14869
14870 const uint verifierHashSize = atoi (verifierHashSize_pos);
14871
14872 if (verifierHashSize != 20) return (PARSER_SALT_VALUE);
14873
14874 const uint keySize = atoi (keySize_pos);
14875
14876 if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE);
14877
14878 office2007->keySize = keySize;
14879
14880 const uint saltSize = atoi (saltSize_pos);
14881
14882 if (saltSize != 16) return (PARSER_SALT_VALUE);
14883
14884 /**
14885 * salt
14886 */
14887
14888 salt->salt_len = 16;
14889 salt->salt_iter = ROUNDS_OFFICE2007;
14890
14891 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
14892 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
14893 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
14894 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
14895
14896 /**
14897 * esalt
14898 */
14899
14900 office2007->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
14901 office2007->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
14902 office2007->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
14903 office2007->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
14904
14905 office2007->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
14906 office2007->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
14907 office2007->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
14908 office2007->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
14909 office2007->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
14910
14911 /**
14912 * digest
14913 */
14914
14915 digest[0] = office2007->encryptedVerifierHash[0];
14916 digest[1] = office2007->encryptedVerifierHash[1];
14917 digest[2] = office2007->encryptedVerifierHash[2];
14918 digest[3] = office2007->encryptedVerifierHash[3];
14919
14920 return (PARSER_OK);
14921 }
14922
14923 int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
14924 {
14925 if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH);
14926
14927 if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
14928
14929 u32 *digest = (u32 *) hash_buf->digest;
14930
14931 salt_t *salt = hash_buf->salt;
14932
14933 office2010_t *office2010 = (office2010_t *) hash_buf->esalt;
14934
14935 /**
14936 * parse line
14937 */
14938
14939 char *version_pos = input_buf + 8 + 1;
14940
14941 char *spinCount_pos = strchr (version_pos, '*');
14942
14943 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14944
14945 u32 version_len = spinCount_pos - version_pos;
14946
14947 if (version_len != 4) return (PARSER_SALT_LENGTH);
14948
14949 spinCount_pos++;
14950
14951 char *keySize_pos = strchr (spinCount_pos, '*');
14952
14953 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14954
14955 u32 spinCount_len = keySize_pos - spinCount_pos;
14956
14957 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
14958
14959 keySize_pos++;
14960
14961 char *saltSize_pos = strchr (keySize_pos, '*');
14962
14963 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14964
14965 u32 keySize_len = saltSize_pos - keySize_pos;
14966
14967 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
14968
14969 saltSize_pos++;
14970
14971 char *osalt_pos = strchr (saltSize_pos, '*');
14972
14973 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14974
14975 u32 saltSize_len = osalt_pos - saltSize_pos;
14976
14977 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
14978
14979 osalt_pos++;
14980
14981 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
14982
14983 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14984
14985 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
14986
14987 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
14988
14989 encryptedVerifier_pos++;
14990
14991 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
14992
14993 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
14994
14995 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
14996
14997 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
14998
14999 encryptedVerifierHash_pos++;
15000
15001 u32 encryptedVerifierHash_len = input_len - 8 - 1 - version_len - 1 - spinCount_len - 1 - keySize_len - 1 - saltSize_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15002
15003 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15004
15005 const uint version = atoi (version_pos);
15006
15007 if (version != 2010) return (PARSER_SALT_VALUE);
15008
15009 const uint spinCount = atoi (spinCount_pos);
15010
15011 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15012
15013 const uint keySize = atoi (keySize_pos);
15014
15015 if (keySize != 128) return (PARSER_SALT_VALUE);
15016
15017 const uint saltSize = atoi (saltSize_pos);
15018
15019 if (saltSize != 16) return (PARSER_SALT_VALUE);
15020
15021 /**
15022 * salt
15023 */
15024
15025 salt->salt_len = 16;
15026 salt->salt_iter = spinCount;
15027
15028 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15029 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15030 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15031 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15032
15033 /**
15034 * esalt
15035 */
15036
15037 office2010->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15038 office2010->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15039 office2010->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15040 office2010->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15041
15042 office2010->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15043 office2010->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15044 office2010->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15045 office2010->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15046 office2010->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15047 office2010->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15048 office2010->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15049 office2010->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15050
15051 /**
15052 * digest
15053 */
15054
15055 digest[0] = office2010->encryptedVerifierHash[0];
15056 digest[1] = office2010->encryptedVerifierHash[1];
15057 digest[2] = office2010->encryptedVerifierHash[2];
15058 digest[3] = office2010->encryptedVerifierHash[3];
15059
15060 return (PARSER_OK);
15061 }
15062
15063 int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15064 {
15065 if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH);
15066
15067 if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED);
15068
15069 u32 *digest = (u32 *) hash_buf->digest;
15070
15071 salt_t *salt = hash_buf->salt;
15072
15073 office2013_t *office2013 = (office2013_t *) hash_buf->esalt;
15074
15075 /**
15076 * parse line
15077 */
15078
15079 char *version_pos = input_buf + 8 + 1;
15080
15081 char *spinCount_pos = strchr (version_pos, '*');
15082
15083 if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15084
15085 u32 version_len = spinCount_pos - version_pos;
15086
15087 if (version_len != 4) return (PARSER_SALT_LENGTH);
15088
15089 spinCount_pos++;
15090
15091 char *keySize_pos = strchr (spinCount_pos, '*');
15092
15093 if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15094
15095 u32 spinCount_len = keySize_pos - spinCount_pos;
15096
15097 if (spinCount_len != 6) return (PARSER_SALT_LENGTH);
15098
15099 keySize_pos++;
15100
15101 char *saltSize_pos = strchr (keySize_pos, '*');
15102
15103 if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15104
15105 u32 keySize_len = saltSize_pos - keySize_pos;
15106
15107 if (keySize_len != 3) return (PARSER_SALT_LENGTH);
15108
15109 saltSize_pos++;
15110
15111 char *osalt_pos = strchr (saltSize_pos, '*');
15112
15113 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15114
15115 u32 saltSize_len = osalt_pos - saltSize_pos;
15116
15117 if (saltSize_len != 2) return (PARSER_SALT_LENGTH);
15118
15119 osalt_pos++;
15120
15121 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15122
15123 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15124
15125 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15126
15127 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15128
15129 encryptedVerifier_pos++;
15130
15131 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15132
15133 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15134
15135 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15136
15137 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15138
15139 encryptedVerifierHash_pos++;
15140
15141 u32 encryptedVerifierHash_len = input_len - 8 - 1 - version_len - 1 - spinCount_len - 1 - keySize_len - 1 - saltSize_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15142
15143 if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH);
15144
15145 const uint version = atoi (version_pos);
15146
15147 if (version != 2013) return (PARSER_SALT_VALUE);
15148
15149 const uint spinCount = atoi (spinCount_pos);
15150
15151 if (spinCount != 100000) return (PARSER_SALT_VALUE);
15152
15153 const uint keySize = atoi (keySize_pos);
15154
15155 if (keySize != 256) return (PARSER_SALT_VALUE);
15156
15157 const uint saltSize = atoi (saltSize_pos);
15158
15159 if (saltSize != 16) return (PARSER_SALT_VALUE);
15160
15161 /**
15162 * salt
15163 */
15164
15165 salt->salt_len = 16;
15166 salt->salt_iter = spinCount;
15167
15168 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15169 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15170 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15171 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15172
15173 /**
15174 * esalt
15175 */
15176
15177 office2013->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15178 office2013->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15179 office2013->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15180 office2013->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15181
15182 office2013->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15183 office2013->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15184 office2013->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15185 office2013->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15186 office2013->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15187 office2013->encryptedVerifierHash[5] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[40]);
15188 office2013->encryptedVerifierHash[6] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[48]);
15189 office2013->encryptedVerifierHash[7] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[56]);
15190
15191 /**
15192 * digest
15193 */
15194
15195 digest[0] = office2013->encryptedVerifierHash[0];
15196 digest[1] = office2013->encryptedVerifierHash[1];
15197 digest[2] = office2013->encryptedVerifierHash[2];
15198 digest[3] = office2013->encryptedVerifierHash[3];
15199
15200 return (PARSER_OK);
15201 }
15202
15203 int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15204 {
15205 if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH);
15206
15207 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15208
15209 u32 *digest = (u32 *) hash_buf->digest;
15210
15211 salt_t *salt = hash_buf->salt;
15212
15213 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15214
15215 /**
15216 * parse line
15217 */
15218
15219 char *version_pos = input_buf + 11;
15220
15221 char *osalt_pos = strchr (version_pos, '*');
15222
15223 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15224
15225 u32 version_len = osalt_pos - version_pos;
15226
15227 if (version_len != 1) return (PARSER_SALT_LENGTH);
15228
15229 osalt_pos++;
15230
15231 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15232
15233 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15234
15235 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15236
15237 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15238
15239 encryptedVerifier_pos++;
15240
15241 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15242
15243 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15244
15245 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15246
15247 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15248
15249 encryptedVerifierHash_pos++;
15250
15251 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15252
15253 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15254
15255 const uint version = *version_pos - 0x30;
15256
15257 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15258
15259 /**
15260 * esalt
15261 */
15262
15263 oldoffice01->version = version;
15264
15265 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15266 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15267 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15268 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15269
15270 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15271 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15272 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15273 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15274
15275 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15276 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15277 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15278 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15279
15280 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15281 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15282 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15283 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15284
15285 /**
15286 * salt
15287 */
15288
15289 salt->salt_len = 16;
15290
15291 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15292 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15293 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15294 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15295
15296 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15297 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15298 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15299 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15300
15301 // this is a workaround as office produces multiple documents with the same salt
15302
15303 salt->salt_len += 32;
15304
15305 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15306 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15307 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15308 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15309 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15310 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15311 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15312 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15313
15314 /**
15315 * digest
15316 */
15317
15318 digest[0] = oldoffice01->encryptedVerifierHash[0];
15319 digest[1] = oldoffice01->encryptedVerifierHash[1];
15320 digest[2] = oldoffice01->encryptedVerifierHash[2];
15321 digest[3] = oldoffice01->encryptedVerifierHash[3];
15322
15323 return (PARSER_OK);
15324 }
15325
15326 int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15327 {
15328 return oldoffice01_parse_hash (input_buf, input_len, hash_buf);
15329 }
15330
15331 int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15332 {
15333 if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH);
15334
15335 if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15336
15337 u32 *digest = (u32 *) hash_buf->digest;
15338
15339 salt_t *salt = hash_buf->salt;
15340
15341 oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt;
15342
15343 /**
15344 * parse line
15345 */
15346
15347 char *version_pos = input_buf + 11;
15348
15349 char *osalt_pos = strchr (version_pos, '*');
15350
15351 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15352
15353 u32 version_len = osalt_pos - version_pos;
15354
15355 if (version_len != 1) return (PARSER_SALT_LENGTH);
15356
15357 osalt_pos++;
15358
15359 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15360
15361 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15362
15363 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15364
15365 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15366
15367 encryptedVerifier_pos++;
15368
15369 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15370
15371 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15372
15373 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15374
15375 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15376
15377 encryptedVerifierHash_pos++;
15378
15379 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15380
15381 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15382
15383 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15384
15385 if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH);
15386
15387 rc4key_pos++;
15388
15389 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15390
15391 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15392
15393 const uint version = *version_pos - 0x30;
15394
15395 if (version != 0 && version != 1) return (PARSER_SALT_VALUE);
15396
15397 /**
15398 * esalt
15399 */
15400
15401 oldoffice01->version = version;
15402
15403 oldoffice01->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15404 oldoffice01->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15405 oldoffice01->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15406 oldoffice01->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15407
15408 oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]);
15409 oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]);
15410 oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]);
15411 oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]);
15412
15413 oldoffice01->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15414 oldoffice01->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15415 oldoffice01->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15416 oldoffice01->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15417
15418 oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]);
15419 oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]);
15420 oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]);
15421 oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]);
15422
15423 oldoffice01->rc4key[1] = 0;
15424 oldoffice01->rc4key[0] = 0;
15425
15426 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15427 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15428 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15429 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15430 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15431 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15432 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15433 oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15434 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15435 oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15436
15437 oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]);
15438 oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]);
15439
15440 /**
15441 * salt
15442 */
15443
15444 salt->salt_len = 16;
15445
15446 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15447 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15448 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15449 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15450
15451 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15452 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15453 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15454 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15455
15456 // this is a workaround as office produces multiple documents with the same salt
15457
15458 salt->salt_len += 32;
15459
15460 salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0];
15461 salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1];
15462 salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2];
15463 salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3];
15464 salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0];
15465 salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1];
15466 salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2];
15467 salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3];
15468
15469 /**
15470 * digest
15471 */
15472
15473 digest[0] = oldoffice01->rc4key[0];
15474 digest[1] = oldoffice01->rc4key[1];
15475 digest[2] = 0;
15476 digest[3] = 0;
15477
15478 return (PARSER_OK);
15479 }
15480
15481 int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15482 {
15483 if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH);
15484
15485 if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED);
15486
15487 u32 *digest = (u32 *) hash_buf->digest;
15488
15489 salt_t *salt = hash_buf->salt;
15490
15491 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15492
15493 /**
15494 * parse line
15495 */
15496
15497 char *version_pos = input_buf + 11;
15498
15499 char *osalt_pos = strchr (version_pos, '*');
15500
15501 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15502
15503 u32 version_len = osalt_pos - version_pos;
15504
15505 if (version_len != 1) return (PARSER_SALT_LENGTH);
15506
15507 osalt_pos++;
15508
15509 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15510
15511 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15512
15513 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15514
15515 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15516
15517 encryptedVerifier_pos++;
15518
15519 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15520
15521 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15522
15523 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15524
15525 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15526
15527 encryptedVerifierHash_pos++;
15528
15529 u32 encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1;
15530
15531 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15532
15533 const uint version = *version_pos - 0x30;
15534
15535 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15536
15537 /**
15538 * esalt
15539 */
15540
15541 oldoffice34->version = version;
15542
15543 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15544 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15545 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15546 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15547
15548 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15549 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15550 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15551 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15552
15553 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15554 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15555 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15556 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15557 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15558
15559 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15560 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15561 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15562 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15563 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15564
15565 /**
15566 * salt
15567 */
15568
15569 salt->salt_len = 16;
15570
15571 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15572 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15573 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15574 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15575
15576 // this is a workaround as office produces multiple documents with the same salt
15577
15578 salt->salt_len += 32;
15579
15580 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15581 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15582 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15583 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15584 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15585 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15586 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15587 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15588
15589 /**
15590 * digest
15591 */
15592
15593 digest[0] = oldoffice34->encryptedVerifierHash[0];
15594 digest[1] = oldoffice34->encryptedVerifierHash[1];
15595 digest[2] = oldoffice34->encryptedVerifierHash[2];
15596 digest[3] = oldoffice34->encryptedVerifierHash[3];
15597
15598 return (PARSER_OK);
15599 }
15600
15601 int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15602 {
15603 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15604
15605 return oldoffice34_parse_hash (input_buf, input_len, hash_buf);
15606 }
15607
15608 int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15609 {
15610 if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH);
15611
15612 if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
15613
15614 u32 *digest = (u32 *) hash_buf->digest;
15615
15616 salt_t *salt = hash_buf->salt;
15617
15618 oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt;
15619
15620 /**
15621 * parse line
15622 */
15623
15624 char *version_pos = input_buf + 11;
15625
15626 char *osalt_pos = strchr (version_pos, '*');
15627
15628 if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15629
15630 u32 version_len = osalt_pos - version_pos;
15631
15632 if (version_len != 1) return (PARSER_SALT_LENGTH);
15633
15634 osalt_pos++;
15635
15636 char *encryptedVerifier_pos = strchr (osalt_pos, '*');
15637
15638 if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15639
15640 u32 osalt_len = encryptedVerifier_pos - osalt_pos;
15641
15642 if (osalt_len != 32) return (PARSER_SALT_LENGTH);
15643
15644 encryptedVerifier_pos++;
15645
15646 char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*');
15647
15648 if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15649
15650 u32 encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos;
15651
15652 if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH);
15653
15654 encryptedVerifierHash_pos++;
15655
15656 char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':');
15657
15658 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15659
15660 u32 encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos;
15661
15662 if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH);
15663
15664 rc4key_pos++;
15665
15666 u32 rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1;
15667
15668 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
15669
15670 const uint version = *version_pos - 0x30;
15671
15672 if (version != 3 && version != 4) return (PARSER_SALT_VALUE);
15673
15674 /**
15675 * esalt
15676 */
15677
15678 oldoffice34->version = version;
15679
15680 oldoffice34->encryptedVerifier[0] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 0]);
15681 oldoffice34->encryptedVerifier[1] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[ 8]);
15682 oldoffice34->encryptedVerifier[2] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[16]);
15683 oldoffice34->encryptedVerifier[3] = hex_to_u32 ((const u8 *) &encryptedVerifier_pos[24]);
15684
15685 oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]);
15686 oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]);
15687 oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]);
15688 oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]);
15689
15690 oldoffice34->encryptedVerifierHash[0] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 0]);
15691 oldoffice34->encryptedVerifierHash[1] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[ 8]);
15692 oldoffice34->encryptedVerifierHash[2] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[16]);
15693 oldoffice34->encryptedVerifierHash[3] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[24]);
15694 oldoffice34->encryptedVerifierHash[4] = hex_to_u32 ((const u8 *) &encryptedVerifierHash_pos[32]);
15695
15696 oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]);
15697 oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]);
15698 oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]);
15699 oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]);
15700 oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]);
15701
15702 oldoffice34->rc4key[1] = 0;
15703 oldoffice34->rc4key[0] = 0;
15704
15705 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
15706 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
15707 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
15708 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
15709 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
15710 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
15711 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
15712 oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
15713 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
15714 oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
15715
15716 oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]);
15717 oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]);
15718
15719 /**
15720 * salt
15721 */
15722
15723 salt->salt_len = 16;
15724
15725 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &osalt_pos[ 0]);
15726 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &osalt_pos[ 8]);
15727 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &osalt_pos[16]);
15728 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &osalt_pos[24]);
15729
15730 // this is a workaround as office produces multiple documents with the same salt
15731
15732 salt->salt_len += 32;
15733
15734 salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0];
15735 salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1];
15736 salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2];
15737 salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3];
15738 salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0];
15739 salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1];
15740 salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2];
15741 salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3];
15742
15743 /**
15744 * digest
15745 */
15746
15747 digest[0] = oldoffice34->rc4key[0];
15748 digest[1] = oldoffice34->rc4key[1];
15749 digest[2] = 0;
15750 digest[3] = 0;
15751
15752 return (PARSER_OK);
15753 }
15754
15755 int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15756 {
15757 if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH);
15758
15759 u32 *digest = (u32 *) hash_buf->digest;
15760
15761 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15762 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15763 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
15764 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
15765
15766 digest[0] = byte_swap_32 (digest[0]);
15767 digest[1] = byte_swap_32 (digest[1]);
15768 digest[2] = byte_swap_32 (digest[2]);
15769 digest[3] = byte_swap_32 (digest[3]);
15770
15771 return (PARSER_OK);
15772 }
15773
15774 int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15775 {
15776 if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH);
15777
15778 if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
15779
15780 u32 *digest = (u32 *) hash_buf->digest;
15781
15782 salt_t *salt = hash_buf->salt;
15783
15784 char *signature_pos = input_buf;
15785
15786 char *salt_pos = strchr (signature_pos, '$');
15787
15788 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15789
15790 u32 signature_len = salt_pos - signature_pos;
15791
15792 if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED);
15793
15794 salt_pos++;
15795
15796 char *hash_pos = strchr (salt_pos, '$');
15797
15798 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15799
15800 u32 salt_len = hash_pos - salt_pos;
15801
15802 if (salt_len > 32) return (PARSER_SALT_LENGTH);
15803
15804 hash_pos++;
15805
15806 u32 hash_len = input_len - signature_len - 1 - salt_len - 1;
15807
15808 if (hash_len != 40) return (PARSER_SALT_LENGTH);
15809
15810 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
15811 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
15812 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
15813 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
15814 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
15815
15816 digest[0] -= SHA1M_A;
15817 digest[1] -= SHA1M_B;
15818 digest[2] -= SHA1M_C;
15819 digest[3] -= SHA1M_D;
15820 digest[4] -= SHA1M_E;
15821
15822 char *salt_buf_ptr = (char *) salt->salt_buf;
15823
15824 memcpy (salt_buf_ptr, salt_pos, salt_len);
15825
15826 salt->salt_len = salt_len;
15827
15828 return (PARSER_OK);
15829 }
15830
15831 int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15832 {
15833 if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH);
15834
15835 if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED);
15836
15837 u32 *digest = (u32 *) hash_buf->digest;
15838
15839 salt_t *salt = hash_buf->salt;
15840
15841 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
15842
15843 /**
15844 * parse line
15845 */
15846
15847 char *iter_pos = input_buf + 14;
15848
15849 const int iter = atoi (iter_pos);
15850
15851 if (iter < 1) return (PARSER_SALT_ITERATION);
15852
15853 salt->salt_iter = iter - 1;
15854
15855 char *salt_pos = strchr (iter_pos, '$');
15856
15857 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15858
15859 salt_pos++;
15860
15861 char *hash_pos = strchr (salt_pos, '$');
15862
15863 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15864
15865 const uint salt_len = hash_pos - salt_pos;
15866
15867 hash_pos++;
15868
15869 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
15870
15871 memcpy (salt_buf_ptr, salt_pos, salt_len);
15872
15873 salt->salt_len = salt_len;
15874
15875 salt_buf_ptr[salt_len + 3] = 0x01;
15876 salt_buf_ptr[salt_len + 4] = 0x80;
15877
15878 // add some stuff to normal salt to make sorted happy
15879
15880 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
15881 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
15882 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
15883 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
15884 salt->salt_buf[4] = salt->salt_iter;
15885
15886 // base64 decode hash
15887
15888 u8 tmp_buf[100];
15889
15890 memset (tmp_buf, 0, sizeof (tmp_buf));
15891
15892 uint hash_len = input_len - (hash_pos - input_buf);
15893
15894 if (hash_len != 44) return (PARSER_HASH_LENGTH);
15895
15896 base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
15897
15898 memcpy (digest, tmp_buf, 32);
15899
15900 digest[0] = byte_swap_32 (digest[0]);
15901 digest[1] = byte_swap_32 (digest[1]);
15902 digest[2] = byte_swap_32 (digest[2]);
15903 digest[3] = byte_swap_32 (digest[3]);
15904 digest[4] = byte_swap_32 (digest[4]);
15905 digest[5] = byte_swap_32 (digest[5]);
15906 digest[6] = byte_swap_32 (digest[6]);
15907 digest[7] = byte_swap_32 (digest[7]);
15908
15909 return (PARSER_OK);
15910 }
15911
15912 int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15913 {
15914 if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH);
15915
15916 u32 *digest = (u32 *) hash_buf->digest;
15917
15918 salt_t *salt = hash_buf->salt;
15919
15920 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
15921 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
15922 digest[2] = 0;
15923 digest[3] = 0;
15924
15925 digest[0] = byte_swap_32 (digest[0]);
15926 digest[1] = byte_swap_32 (digest[1]);
15927
15928 if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15929 if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15930 if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
15931
15932 char iter_c = input_buf[17];
15933 char iter_d = input_buf[19];
15934
15935 // atm only defaults, let's see if there's more request
15936 if (iter_c != '2') return (PARSER_SALT_ITERATION);
15937 if (iter_d != '4') return (PARSER_SALT_ITERATION);
15938
15939 char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1;
15940
15941 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
15942 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
15943 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
15944 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
15945
15946 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
15947 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
15948 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
15949 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
15950
15951 salt->salt_len = 16;
15952
15953 return (PARSER_OK);
15954 }
15955
15956 int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
15957 {
15958 if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH);
15959
15960 if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
15961
15962 u32 *digest = (u32 *) hash_buf->digest;
15963
15964 cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt;
15965
15966 salt_t *salt = hash_buf->salt;
15967
15968 char *salt_pos = input_buf + 10;
15969
15970 char *hash_pos = strchr (salt_pos, '$');
15971
15972 uint salt_len = hash_pos - salt_pos;
15973
15974 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
15975
15976 hash_pos++;
15977
15978 uint hash_len = input_len - 10 - salt_len - 1;
15979
15980 // base64 decode salt
15981
15982 u8 tmp_buf[100];
15983
15984 memset (tmp_buf, 0, sizeof (tmp_buf));
15985
15986 salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf);
15987
15988 if (salt_len > 55) return (PARSER_SALT_LENGTH);
15989
15990 tmp_buf[salt_len] = 0x80;
15991
15992 memcpy (&salt->salt_buf, tmp_buf, salt_len + 1);
15993
15994 salt->salt_len = salt_len;
15995
15996 // base64 decode salt
15997
15998 memset (tmp_buf, 0, sizeof (tmp_buf));
15999
16000 hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf);
16001
16002 uint user_len = hash_len - 32;
16003
16004 const u8 *tmp_hash = tmp_buf + user_len;
16005
16006 user_len--; // skip the trailing space
16007
16008 digest[0] = hex_to_u32 (&tmp_hash[ 0]);
16009 digest[1] = hex_to_u32 (&tmp_hash[ 8]);
16010 digest[2] = hex_to_u32 (&tmp_hash[16]);
16011 digest[3] = hex_to_u32 (&tmp_hash[24]);
16012
16013 digest[0] = byte_swap_32 (digest[0]);
16014 digest[1] = byte_swap_32 (digest[1]);
16015 digest[2] = byte_swap_32 (digest[2]);
16016 digest[3] = byte_swap_32 (digest[3]);
16017
16018 // store username for host only (output hash if cracked)
16019
16020 memset (cram_md5->user, 0, sizeof (cram_md5->user));
16021 memcpy (cram_md5->user, tmp_buf, user_len);
16022
16023 return (PARSER_OK);
16024 }
16025
16026 int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16027 {
16028 if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH);
16029
16030 if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
16031
16032 u32 *digest = (u32 *) hash_buf->digest;
16033
16034 salt_t *salt = hash_buf->salt;
16035
16036 char *iter_pos = input_buf + 10;
16037
16038 u32 iter = atoi (iter_pos);
16039
16040 if (iter < 1)
16041 {
16042 return (PARSER_SALT_ITERATION);
16043 }
16044
16045 iter--; // first iteration is special
16046
16047 salt->salt_iter = iter;
16048
16049 char *base64_pos = strchr (iter_pos, '}');
16050
16051 if (base64_pos == NULL)
16052 {
16053 return (PARSER_SIGNATURE_UNMATCHED);
16054 }
16055
16056 base64_pos++;
16057
16058 // base64 decode salt
16059
16060 u32 base64_len = input_len - (base64_pos - input_buf);
16061
16062 u8 tmp_buf[100];
16063
16064 memset (tmp_buf, 0, sizeof (tmp_buf));
16065
16066 u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf);
16067
16068 if (decoded_len < 24)
16069 {
16070 return (PARSER_SALT_LENGTH);
16071 }
16072
16073 // copy the salt
16074
16075 uint salt_len = decoded_len - 20;
16076
16077 if (salt_len < 4) return (PARSER_SALT_LENGTH);
16078 if (salt_len > 16) return (PARSER_SALT_LENGTH);
16079
16080 memcpy (&salt->salt_buf, tmp_buf + 20, salt_len);
16081
16082 salt->salt_len = salt_len;
16083
16084 // set digest
16085
16086 u32 *digest_ptr = (u32*) tmp_buf;
16087
16088 digest[0] = byte_swap_32 (digest_ptr[0]);
16089 digest[1] = byte_swap_32 (digest_ptr[1]);
16090 digest[2] = byte_swap_32 (digest_ptr[2]);
16091 digest[3] = byte_swap_32 (digest_ptr[3]);
16092 digest[4] = byte_swap_32 (digest_ptr[4]);
16093
16094 return (PARSER_OK);
16095 }
16096
16097 int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16098 {
16099 if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH);
16100
16101 u32 *digest = (u32 *) hash_buf->digest;
16102
16103 salt_t *salt = hash_buf->salt;
16104
16105 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
16106 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
16107 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
16108 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
16109 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
16110
16111 if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
16112
16113 uint salt_len = input_len - 40 - 1;
16114
16115 char *salt_buf = input_buf + 40 + 1;
16116
16117 char *salt_buf_ptr = (char *) salt->salt_buf;
16118
16119 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
16120
16121 if (salt_len != 32) return (PARSER_SALT_LENGTH);
16122
16123 salt->salt_len = salt_len;
16124
16125 return (PARSER_OK);
16126 }
16127
16128 int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16129 {
16130 if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH);
16131
16132 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16133
16134 u32 *digest = (u32 *) hash_buf->digest;
16135
16136 salt_t *salt = hash_buf->salt;
16137
16138 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16139
16140 /**
16141 * parse line
16142 */
16143
16144 char *V_pos = input_buf + 5;
16145
16146 char *R_pos = strchr (V_pos, '*');
16147
16148 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16149
16150 u32 V_len = R_pos - V_pos;
16151
16152 R_pos++;
16153
16154 char *bits_pos = strchr (R_pos, '*');
16155
16156 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16157
16158 u32 R_len = bits_pos - R_pos;
16159
16160 bits_pos++;
16161
16162 char *P_pos = strchr (bits_pos, '*');
16163
16164 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16165
16166 u32 bits_len = P_pos - bits_pos;
16167
16168 P_pos++;
16169
16170 char *enc_md_pos = strchr (P_pos, '*');
16171
16172 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16173
16174 u32 P_len = enc_md_pos - P_pos;
16175
16176 enc_md_pos++;
16177
16178 char *id_len_pos = strchr (enc_md_pos, '*');
16179
16180 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16181
16182 u32 enc_md_len = id_len_pos - enc_md_pos;
16183
16184 id_len_pos++;
16185
16186 char *id_buf_pos = strchr (id_len_pos, '*');
16187
16188 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16189
16190 u32 id_len_len = id_buf_pos - id_len_pos;
16191
16192 id_buf_pos++;
16193
16194 char *u_len_pos = strchr (id_buf_pos, '*');
16195
16196 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16197
16198 u32 id_buf_len = u_len_pos - id_buf_pos;
16199
16200 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16201
16202 u_len_pos++;
16203
16204 char *u_buf_pos = strchr (u_len_pos, '*');
16205
16206 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16207
16208 u32 u_len_len = u_buf_pos - u_len_pos;
16209
16210 u_buf_pos++;
16211
16212 char *o_len_pos = strchr (u_buf_pos, '*');
16213
16214 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16215
16216 u32 u_buf_len = o_len_pos - u_buf_pos;
16217
16218 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16219
16220 o_len_pos++;
16221
16222 char *o_buf_pos = strchr (o_len_pos, '*');
16223
16224 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16225
16226 u32 o_len_len = o_buf_pos - o_len_pos;
16227
16228 o_buf_pos++;
16229
16230 u32 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;
16231
16232 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16233
16234 // validate data
16235
16236 const int V = atoi (V_pos);
16237 const int R = atoi (R_pos);
16238 const int P = atoi (P_pos);
16239
16240 if (V != 1) return (PARSER_SALT_VALUE);
16241 if (R != 2) return (PARSER_SALT_VALUE);
16242
16243 const int enc_md = atoi (enc_md_pos);
16244
16245 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16246
16247 const int id_len = atoi (id_len_pos);
16248 const int u_len = atoi (u_len_pos);
16249 const int o_len = atoi (o_len_pos);
16250
16251 if (id_len != 16) return (PARSER_SALT_VALUE);
16252 if (u_len != 32) return (PARSER_SALT_VALUE);
16253 if (o_len != 32) return (PARSER_SALT_VALUE);
16254
16255 const int bits = atoi (bits_pos);
16256
16257 if (bits != 40) return (PARSER_SALT_VALUE);
16258
16259 // copy data to esalt
16260
16261 pdf->V = V;
16262 pdf->R = R;
16263 pdf->P = P;
16264
16265 pdf->enc_md = enc_md;
16266
16267 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16268 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16269 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16270 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16271 pdf->id_len = id_len;
16272
16273 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16274 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16275 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16276 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16277 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16278 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16279 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16280 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16281 pdf->u_len = u_len;
16282
16283 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16284 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16285 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16286 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16287 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16288 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16289 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16290 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16291 pdf->o_len = o_len;
16292
16293 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16294 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16295 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16296 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16297
16298 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16299 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16300 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16301 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16302 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16303 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16304 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16305 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16306
16307 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16308 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16309 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16310 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16311 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16312 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16313 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16314 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16315
16316 // we use ID for salt, maybe needs to change, we will see...
16317
16318 salt->salt_buf[0] = pdf->id_buf[0];
16319 salt->salt_buf[1] = pdf->id_buf[1];
16320 salt->salt_buf[2] = pdf->id_buf[2];
16321 salt->salt_buf[3] = pdf->id_buf[3];
16322 salt->salt_len = pdf->id_len;
16323
16324 digest[0] = pdf->u_buf[0];
16325 digest[1] = pdf->u_buf[1];
16326 digest[2] = pdf->u_buf[2];
16327 digest[3] = pdf->u_buf[3];
16328
16329 return (PARSER_OK);
16330 }
16331
16332 int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16333 {
16334 return pdf11_parse_hash (input_buf, input_len, hash_buf);
16335 }
16336
16337 int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16338 {
16339 if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH);
16340
16341 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16342
16343 u32 *digest = (u32 *) hash_buf->digest;
16344
16345 salt_t *salt = hash_buf->salt;
16346
16347 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16348
16349 /**
16350 * parse line
16351 */
16352
16353 char *V_pos = input_buf + 5;
16354
16355 char *R_pos = strchr (V_pos, '*');
16356
16357 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16358
16359 u32 V_len = R_pos - V_pos;
16360
16361 R_pos++;
16362
16363 char *bits_pos = strchr (R_pos, '*');
16364
16365 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16366
16367 u32 R_len = bits_pos - R_pos;
16368
16369 bits_pos++;
16370
16371 char *P_pos = strchr (bits_pos, '*');
16372
16373 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16374
16375 u32 bits_len = P_pos - bits_pos;
16376
16377 P_pos++;
16378
16379 char *enc_md_pos = strchr (P_pos, '*');
16380
16381 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16382
16383 u32 P_len = enc_md_pos - P_pos;
16384
16385 enc_md_pos++;
16386
16387 char *id_len_pos = strchr (enc_md_pos, '*');
16388
16389 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16390
16391 u32 enc_md_len = id_len_pos - enc_md_pos;
16392
16393 id_len_pos++;
16394
16395 char *id_buf_pos = strchr (id_len_pos, '*');
16396
16397 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16398
16399 u32 id_len_len = id_buf_pos - id_len_pos;
16400
16401 id_buf_pos++;
16402
16403 char *u_len_pos = strchr (id_buf_pos, '*');
16404
16405 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16406
16407 u32 id_buf_len = u_len_pos - id_buf_pos;
16408
16409 if (id_buf_len != 32) return (PARSER_SALT_LENGTH);
16410
16411 u_len_pos++;
16412
16413 char *u_buf_pos = strchr (u_len_pos, '*');
16414
16415 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16416
16417 u32 u_len_len = u_buf_pos - u_len_pos;
16418
16419 u_buf_pos++;
16420
16421 char *o_len_pos = strchr (u_buf_pos, '*');
16422
16423 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16424
16425 u32 u_buf_len = o_len_pos - u_buf_pos;
16426
16427 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16428
16429 o_len_pos++;
16430
16431 char *o_buf_pos = strchr (o_len_pos, '*');
16432
16433 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16434
16435 u32 o_len_len = o_buf_pos - o_len_pos;
16436
16437 o_buf_pos++;
16438
16439 char *rc4key_pos = strchr (o_buf_pos, ':');
16440
16441 if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16442
16443 u32 o_buf_len = rc4key_pos - o_buf_pos;
16444
16445 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16446
16447 rc4key_pos++;
16448
16449 u32 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;
16450
16451 if (rc4key_len != 10) return (PARSER_SALT_LENGTH);
16452
16453 // validate data
16454
16455 const int V = atoi (V_pos);
16456 const int R = atoi (R_pos);
16457 const int P = atoi (P_pos);
16458
16459 if (V != 1) return (PARSER_SALT_VALUE);
16460 if (R != 2) return (PARSER_SALT_VALUE);
16461
16462 const int enc_md = atoi (enc_md_pos);
16463
16464 if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE);
16465
16466 const int id_len = atoi (id_len_pos);
16467 const int u_len = atoi (u_len_pos);
16468 const int o_len = atoi (o_len_pos);
16469
16470 if (id_len != 16) return (PARSER_SALT_VALUE);
16471 if (u_len != 32) return (PARSER_SALT_VALUE);
16472 if (o_len != 32) return (PARSER_SALT_VALUE);
16473
16474 const int bits = atoi (bits_pos);
16475
16476 if (bits != 40) return (PARSER_SALT_VALUE);
16477
16478 // copy data to esalt
16479
16480 pdf->V = V;
16481 pdf->R = R;
16482 pdf->P = P;
16483
16484 pdf->enc_md = enc_md;
16485
16486 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16487 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16488 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16489 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16490 pdf->id_len = id_len;
16491
16492 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16493 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16494 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16495 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16496 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16497 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16498 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16499 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16500 pdf->u_len = u_len;
16501
16502 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16503 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16504 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16505 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16506 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16507 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16508 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16509 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16510 pdf->o_len = o_len;
16511
16512 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16513 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16514 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16515 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16516
16517 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16518 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16519 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16520 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16521 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16522 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16523 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16524 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16525
16526 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16527 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16528 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16529 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16530 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16531 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16532 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16533 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16534
16535 pdf->rc4key[1] = 0;
16536 pdf->rc4key[0] = 0;
16537
16538 pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28;
16539 pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24;
16540 pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20;
16541 pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16;
16542 pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12;
16543 pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8;
16544 pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4;
16545 pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0;
16546 pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28;
16547 pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24;
16548
16549 pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]);
16550 pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]);
16551
16552 // we use ID for salt, maybe needs to change, we will see...
16553
16554 salt->salt_buf[0] = pdf->id_buf[0];
16555 salt->salt_buf[1] = pdf->id_buf[1];
16556 salt->salt_buf[2] = pdf->id_buf[2];
16557 salt->salt_buf[3] = pdf->id_buf[3];
16558 salt->salt_buf[4] = pdf->u_buf[0];
16559 salt->salt_buf[5] = pdf->u_buf[1];
16560 salt->salt_buf[6] = pdf->o_buf[0];
16561 salt->salt_buf[7] = pdf->o_buf[1];
16562 salt->salt_len = pdf->id_len + 16;
16563
16564 digest[0] = pdf->rc4key[0];
16565 digest[1] = pdf->rc4key[1];
16566 digest[2] = 0;
16567 digest[3] = 0;
16568
16569 return (PARSER_OK);
16570 }
16571
16572 int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16573 {
16574 if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH);
16575
16576 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16577
16578 u32 *digest = (u32 *) hash_buf->digest;
16579
16580 salt_t *salt = hash_buf->salt;
16581
16582 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16583
16584 /**
16585 * parse line
16586 */
16587
16588 char *V_pos = input_buf + 5;
16589
16590 char *R_pos = strchr (V_pos, '*');
16591
16592 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16593
16594 u32 V_len = R_pos - V_pos;
16595
16596 R_pos++;
16597
16598 char *bits_pos = strchr (R_pos, '*');
16599
16600 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16601
16602 u32 R_len = bits_pos - R_pos;
16603
16604 bits_pos++;
16605
16606 char *P_pos = strchr (bits_pos, '*');
16607
16608 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16609
16610 u32 bits_len = P_pos - bits_pos;
16611
16612 P_pos++;
16613
16614 char *enc_md_pos = strchr (P_pos, '*');
16615
16616 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16617
16618 u32 P_len = enc_md_pos - P_pos;
16619
16620 enc_md_pos++;
16621
16622 char *id_len_pos = strchr (enc_md_pos, '*');
16623
16624 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16625
16626 u32 enc_md_len = id_len_pos - enc_md_pos;
16627
16628 id_len_pos++;
16629
16630 char *id_buf_pos = strchr (id_len_pos, '*');
16631
16632 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16633
16634 u32 id_len_len = id_buf_pos - id_len_pos;
16635
16636 id_buf_pos++;
16637
16638 char *u_len_pos = strchr (id_buf_pos, '*');
16639
16640 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16641
16642 u32 id_buf_len = u_len_pos - id_buf_pos;
16643
16644 if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH);
16645
16646 u_len_pos++;
16647
16648 char *u_buf_pos = strchr (u_len_pos, '*');
16649
16650 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16651
16652 u32 u_len_len = u_buf_pos - u_len_pos;
16653
16654 u_buf_pos++;
16655
16656 char *o_len_pos = strchr (u_buf_pos, '*');
16657
16658 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16659
16660 u32 u_buf_len = o_len_pos - u_buf_pos;
16661
16662 if (u_buf_len != 64) return (PARSER_SALT_LENGTH);
16663
16664 o_len_pos++;
16665
16666 char *o_buf_pos = strchr (o_len_pos, '*');
16667
16668 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16669
16670 u32 o_len_len = o_buf_pos - o_len_pos;
16671
16672 o_buf_pos++;
16673
16674 u32 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;
16675
16676 if (o_buf_len != 64) return (PARSER_SALT_LENGTH);
16677
16678 // validate data
16679
16680 const int V = atoi (V_pos);
16681 const int R = atoi (R_pos);
16682 const int P = atoi (P_pos);
16683
16684 int vr_ok = 0;
16685
16686 if ((V == 2) && (R == 3)) vr_ok = 1;
16687 if ((V == 4) && (R == 4)) vr_ok = 1;
16688
16689 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16690
16691 const int id_len = atoi (id_len_pos);
16692 const int u_len = atoi (u_len_pos);
16693 const int o_len = atoi (o_len_pos);
16694
16695 if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE);
16696
16697 if (u_len != 32) return (PARSER_SALT_VALUE);
16698 if (o_len != 32) return (PARSER_SALT_VALUE);
16699
16700 const int bits = atoi (bits_pos);
16701
16702 if (bits != 128) return (PARSER_SALT_VALUE);
16703
16704 int enc_md = 1;
16705
16706 if (R >= 4)
16707 {
16708 enc_md = atoi (enc_md_pos);
16709 }
16710
16711 // copy data to esalt
16712
16713 pdf->V = V;
16714 pdf->R = R;
16715 pdf->P = P;
16716
16717 pdf->enc_md = enc_md;
16718
16719 pdf->id_buf[0] = hex_to_u32 ((const u8 *) &id_buf_pos[ 0]);
16720 pdf->id_buf[1] = hex_to_u32 ((const u8 *) &id_buf_pos[ 8]);
16721 pdf->id_buf[2] = hex_to_u32 ((const u8 *) &id_buf_pos[16]);
16722 pdf->id_buf[3] = hex_to_u32 ((const u8 *) &id_buf_pos[24]);
16723
16724 if (id_len == 32)
16725 {
16726 pdf->id_buf[4] = hex_to_u32 ((const u8 *) &id_buf_pos[32]);
16727 pdf->id_buf[5] = hex_to_u32 ((const u8 *) &id_buf_pos[40]);
16728 pdf->id_buf[6] = hex_to_u32 ((const u8 *) &id_buf_pos[48]);
16729 pdf->id_buf[7] = hex_to_u32 ((const u8 *) &id_buf_pos[56]);
16730 }
16731
16732 pdf->id_len = id_len;
16733
16734 pdf->u_buf[0] = hex_to_u32 ((const u8 *) &u_buf_pos[ 0]);
16735 pdf->u_buf[1] = hex_to_u32 ((const u8 *) &u_buf_pos[ 8]);
16736 pdf->u_buf[2] = hex_to_u32 ((const u8 *) &u_buf_pos[16]);
16737 pdf->u_buf[3] = hex_to_u32 ((const u8 *) &u_buf_pos[24]);
16738 pdf->u_buf[4] = hex_to_u32 ((const u8 *) &u_buf_pos[32]);
16739 pdf->u_buf[5] = hex_to_u32 ((const u8 *) &u_buf_pos[40]);
16740 pdf->u_buf[6] = hex_to_u32 ((const u8 *) &u_buf_pos[48]);
16741 pdf->u_buf[7] = hex_to_u32 ((const u8 *) &u_buf_pos[56]);
16742 pdf->u_len = u_len;
16743
16744 pdf->o_buf[0] = hex_to_u32 ((const u8 *) &o_buf_pos[ 0]);
16745 pdf->o_buf[1] = hex_to_u32 ((const u8 *) &o_buf_pos[ 8]);
16746 pdf->o_buf[2] = hex_to_u32 ((const u8 *) &o_buf_pos[16]);
16747 pdf->o_buf[3] = hex_to_u32 ((const u8 *) &o_buf_pos[24]);
16748 pdf->o_buf[4] = hex_to_u32 ((const u8 *) &o_buf_pos[32]);
16749 pdf->o_buf[5] = hex_to_u32 ((const u8 *) &o_buf_pos[40]);
16750 pdf->o_buf[6] = hex_to_u32 ((const u8 *) &o_buf_pos[48]);
16751 pdf->o_buf[7] = hex_to_u32 ((const u8 *) &o_buf_pos[56]);
16752 pdf->o_len = o_len;
16753
16754 pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]);
16755 pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]);
16756 pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]);
16757 pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]);
16758
16759 if (id_len == 32)
16760 {
16761 pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]);
16762 pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]);
16763 pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]);
16764 pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]);
16765 }
16766
16767 pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]);
16768 pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]);
16769 pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]);
16770 pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]);
16771 pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]);
16772 pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]);
16773 pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]);
16774 pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]);
16775
16776 pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]);
16777 pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]);
16778 pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]);
16779 pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]);
16780 pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]);
16781 pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]);
16782 pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]);
16783 pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]);
16784
16785 // precompute rc4 data for later use
16786
16787 uint padding[8] =
16788 {
16789 0x5e4ebf28,
16790 0x418a754e,
16791 0x564e0064,
16792 0x0801faff,
16793 0xb6002e2e,
16794 0x803e68d0,
16795 0xfea90c2f,
16796 0x7a695364
16797 };
16798
16799 // md5
16800
16801 uint salt_pc_block[32];
16802
16803 char *salt_pc_ptr = (char *) salt_pc_block;
16804
16805 memcpy (salt_pc_ptr, padding, 32);
16806 memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len);
16807
16808 uint salt_pc_digest[4];
16809
16810 md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len);
16811
16812 pdf->rc4data[0] = salt_pc_digest[0];
16813 pdf->rc4data[1] = salt_pc_digest[1];
16814
16815 // we use ID for salt, maybe needs to change, we will see...
16816
16817 salt->salt_buf[0] = pdf->id_buf[0];
16818 salt->salt_buf[1] = pdf->id_buf[1];
16819 salt->salt_buf[2] = pdf->id_buf[2];
16820 salt->salt_buf[3] = pdf->id_buf[3];
16821 salt->salt_buf[4] = pdf->u_buf[0];
16822 salt->salt_buf[5] = pdf->u_buf[1];
16823 salt->salt_buf[6] = pdf->o_buf[0];
16824 salt->salt_buf[7] = pdf->o_buf[1];
16825 salt->salt_len = pdf->id_len + 16;
16826
16827 salt->salt_iter = ROUNDS_PDF14;
16828
16829 digest[0] = pdf->u_buf[0];
16830 digest[1] = pdf->u_buf[1];
16831 digest[2] = 0;
16832 digest[3] = 0;
16833
16834 return (PARSER_OK);
16835 }
16836
16837 int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16838 {
16839 int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf);
16840
16841 if (ret != PARSER_OK)
16842 {
16843 return ret;
16844 }
16845
16846 u32 *digest = (u32 *) hash_buf->digest;
16847
16848 salt_t *salt = hash_buf->salt;
16849
16850 digest[0] -= SHA256M_A;
16851 digest[1] -= SHA256M_B;
16852 digest[2] -= SHA256M_C;
16853 digest[3] -= SHA256M_D;
16854 digest[4] -= SHA256M_E;
16855 digest[5] -= SHA256M_F;
16856 digest[6] -= SHA256M_G;
16857 digest[7] -= SHA256M_H;
16858
16859 salt->salt_buf[2] = 0x80;
16860
16861 return (PARSER_OK);
16862 }
16863
16864 int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
16865 {
16866 if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH);
16867
16868 if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED);
16869
16870 u32 *digest = (u32 *) hash_buf->digest;
16871
16872 salt_t *salt = hash_buf->salt;
16873
16874 pdf_t *pdf = (pdf_t *) hash_buf->esalt;
16875
16876 /**
16877 * parse line
16878 */
16879
16880 char *V_pos = input_buf + 5;
16881
16882 char *R_pos = strchr (V_pos, '*');
16883
16884 if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16885
16886 u32 V_len = R_pos - V_pos;
16887
16888 R_pos++;
16889
16890 char *bits_pos = strchr (R_pos, '*');
16891
16892 if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16893
16894 u32 R_len = bits_pos - R_pos;
16895
16896 bits_pos++;
16897
16898 char *P_pos = strchr (bits_pos, '*');
16899
16900 if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16901
16902 u32 bits_len = P_pos - bits_pos;
16903
16904 P_pos++;
16905
16906 char *enc_md_pos = strchr (P_pos, '*');
16907
16908 if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16909
16910 u32 P_len = enc_md_pos - P_pos;
16911
16912 enc_md_pos++;
16913
16914 char *id_len_pos = strchr (enc_md_pos, '*');
16915
16916 if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16917
16918 u32 enc_md_len = id_len_pos - enc_md_pos;
16919
16920 id_len_pos++;
16921
16922 char *id_buf_pos = strchr (id_len_pos, '*');
16923
16924 if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16925
16926 u32 id_len_len = id_buf_pos - id_len_pos;
16927
16928 id_buf_pos++;
16929
16930 char *u_len_pos = strchr (id_buf_pos, '*');
16931
16932 if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16933
16934 u32 id_buf_len = u_len_pos - id_buf_pos;
16935
16936 u_len_pos++;
16937
16938 char *u_buf_pos = strchr (u_len_pos, '*');
16939
16940 if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16941
16942 u32 u_len_len = u_buf_pos - u_len_pos;
16943
16944 u_buf_pos++;
16945
16946 char *o_len_pos = strchr (u_buf_pos, '*');
16947
16948 if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16949
16950 u32 u_buf_len = o_len_pos - u_buf_pos;
16951
16952 o_len_pos++;
16953
16954 char *o_buf_pos = strchr (o_len_pos, '*');
16955
16956 if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
16957
16958 u32 o_len_len = o_buf_pos - o_len_pos;
16959
16960 o_buf_pos++;
16961
16962 char *last = strchr (o_buf_pos, '*');
16963
16964 if (last == NULL) last = input_buf + input_len;
16965
16966 u32 o_buf_len = last - o_buf_pos;
16967
16968 // validate data
16969
16970 const int V = atoi (V_pos);
16971 const int R = atoi (R_pos);
16972
16973 int vr_ok = 0;
16974
16975 if ((V == 5) && (R == 5)) vr_ok = 1;
16976 if ((V == 5) && (R == 6)) vr_ok = 1;
16977
16978 if (vr_ok == 0) return (PARSER_SALT_VALUE);
16979
16980 const int bits = atoi (bits_pos);
16981
16982 if (bits != 256) return (PARSER_SALT_VALUE);
16983
16984 int enc_md = atoi (enc_md_pos);
16985
16986 if (enc_md != 1) return (PARSER_SALT_VALUE);
16987
16988 const uint id_len = atoi (id_len_pos);
16989 const uint u_len = atoi (u_len_pos);
16990 const uint o_len = atoi (o_len_pos);
16991
16992 if (V_len > 6) return (PARSER_SALT_LENGTH);
16993 if (R_len > 6) return (PARSER_SALT_LENGTH);
16994 if (P_len > 6) return (PARSER_SALT_LENGTH);
16995 if (id_len_len > 6) return (PARSER_SALT_LENGTH);
16996 if (u_len_len > 6) return (PARSER_SALT_LENGTH);
16997 if (o_len_len > 6) return (PARSER_SALT_LENGTH);
16998 if (bits_len > 6) return (PARSER_SALT_LENGTH);
16999 if (enc_md_len > 6) return (PARSER_SALT_LENGTH);
17000
17001 if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE);
17002 if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE);
17003 if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE);
17004
17005 // copy data to esalt
17006
17007 if (u_len < 40) return (PARSER_SALT_VALUE);
17008
17009 for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8)
17010 {
17011 pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]);
17012 }
17013
17014 salt->salt_buf[0] = pdf->u_buf[8];
17015 salt->salt_buf[1] = pdf->u_buf[9];
17016
17017 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
17018 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
17019
17020 salt->salt_len = 8;
17021 salt->salt_iter = ROUNDS_PDF17L8;
17022
17023 digest[0] = pdf->u_buf[0];
17024 digest[1] = pdf->u_buf[1];
17025 digest[2] = pdf->u_buf[2];
17026 digest[3] = pdf->u_buf[3];
17027 digest[4] = pdf->u_buf[4];
17028 digest[5] = pdf->u_buf[5];
17029 digest[6] = pdf->u_buf[6];
17030 digest[7] = pdf->u_buf[7];
17031
17032 return (PARSER_OK);
17033 }
17034
17035 int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17036 {
17037 if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH);
17038
17039 if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
17040
17041 u32 *digest = (u32 *) hash_buf->digest;
17042
17043 salt_t *salt = hash_buf->salt;
17044
17045 pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt;
17046
17047 /**
17048 * parse line
17049 */
17050
17051 // iterations
17052
17053 char *iter_pos = input_buf + 7;
17054
17055 u32 iter = atoi (iter_pos);
17056
17057 if (iter < 1) return (PARSER_SALT_ITERATION);
17058 if (iter > 999999) return (PARSER_SALT_ITERATION);
17059
17060 // first is *raw* salt
17061
17062 char *salt_pos = strchr (iter_pos, ':');
17063
17064 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17065
17066 salt_pos++;
17067
17068 char *hash_pos = strchr (salt_pos, ':');
17069
17070 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17071
17072 u32 salt_len = hash_pos - salt_pos;
17073
17074 if (salt_len > 64) return (PARSER_SALT_LENGTH);
17075
17076 hash_pos++;
17077
17078 u32 hash_b64_len = input_len - (hash_pos - input_buf);
17079
17080 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
17081
17082 // decode salt
17083
17084 char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf;
17085
17086 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17087
17088 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17089
17090 salt_buf_ptr[salt_len + 3] = 0x01;
17091 salt_buf_ptr[salt_len + 4] = 0x80;
17092
17093 salt->salt_len = salt_len;
17094 salt->salt_iter = iter - 1;
17095
17096 // decode hash
17097
17098 u8 tmp_buf[100];
17099
17100 memset (tmp_buf, 0, sizeof (tmp_buf));
17101
17102 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
17103
17104 if (hash_len < 16) return (PARSER_HASH_LENGTH);
17105
17106 memcpy (digest, tmp_buf, 16);
17107
17108 digest[0] = byte_swap_32 (digest[0]);
17109 digest[1] = byte_swap_32 (digest[1]);
17110 digest[2] = byte_swap_32 (digest[2]);
17111 digest[3] = byte_swap_32 (digest[3]);
17112
17113 // add some stuff to normal salt to make sorted happy
17114
17115 salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0];
17116 salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1];
17117 salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2];
17118 salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3];
17119 salt->salt_buf[4] = salt->salt_iter;
17120
17121 return (PARSER_OK);
17122 }
17123
17124 int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17125 {
17126 if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH);
17127
17128 u32 *digest = (u32 *) hash_buf->digest;
17129
17130 salt_t *salt = hash_buf->salt;
17131
17132 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17133 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17134 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17135 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17136
17137 digest[0] = byte_swap_32 (digest[0]);
17138 digest[1] = byte_swap_32 (digest[1]);
17139 digest[2] = byte_swap_32 (digest[2]);
17140 digest[3] = byte_swap_32 (digest[3]);
17141
17142 if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17143
17144 uint salt_len = input_len - 32 - 1;
17145
17146 char *salt_buf = input_buf + 32 + 1;
17147
17148 char *salt_buf_ptr = (char *) salt->salt_buf;
17149
17150 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17151
17152 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17153
17154 salt->salt_len = salt_len;
17155
17156 return (PARSER_OK);
17157 }
17158
17159 int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17160 {
17161 if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH);
17162
17163 if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
17164
17165 u32 *digest = (u32 *) hash_buf->digest;
17166
17167 salt_t *salt = hash_buf->salt;
17168
17169 char *user_pos = input_buf + 10;
17170
17171 char *salt_pos = strchr (user_pos, '*');
17172
17173 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17174
17175 salt_pos++;
17176
17177 char *hash_pos = strchr (salt_pos, '*');
17178
17179 hash_pos++;
17180
17181 uint hash_len = input_len - (hash_pos - input_buf);
17182
17183 if (hash_len != 32) return (PARSER_HASH_LENGTH);
17184
17185 uint user_len = salt_pos - user_pos - 1;
17186
17187 uint salt_len = hash_pos - salt_pos - 1;
17188
17189 if (salt_len != 8) return (PARSER_SALT_LENGTH);
17190
17191 /*
17192 * store digest
17193 */
17194
17195 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17196 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17197 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17198 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17199
17200 digest[0] = byte_swap_32 (digest[0]);
17201 digest[1] = byte_swap_32 (digest[1]);
17202 digest[2] = byte_swap_32 (digest[2]);
17203 digest[3] = byte_swap_32 (digest[3]);
17204
17205 digest[0] -= MD5M_A;
17206 digest[1] -= MD5M_B;
17207 digest[2] -= MD5M_C;
17208 digest[3] -= MD5M_D;
17209
17210 /*
17211 * store salt
17212 */
17213
17214 char *salt_buf_ptr = (char *) salt->salt_buf;
17215
17216 // first 4 bytes are the "challenge"
17217
17218 salt_buf_ptr[0] = hex_to_u8 ((const u8 *) &salt_pos[0]);
17219 salt_buf_ptr[1] = hex_to_u8 ((const u8 *) &salt_pos[2]);
17220 salt_buf_ptr[2] = hex_to_u8 ((const u8 *) &salt_pos[4]);
17221 salt_buf_ptr[3] = hex_to_u8 ((const u8 *) &salt_pos[6]);
17222
17223 // append the user name
17224
17225 user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len);
17226
17227 salt->salt_len = 4 + user_len;
17228
17229 return (PARSER_OK);
17230 }
17231
17232 int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17233 {
17234 if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH);
17235
17236 if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17237
17238 u32 *digest = (u32 *) hash_buf->digest;
17239
17240 salt_t *salt = hash_buf->salt;
17241
17242 char *salt_pos = input_buf + 9;
17243
17244 char *hash_pos = strchr (salt_pos, '*');
17245
17246 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17247
17248 hash_pos++;
17249
17250 uint hash_len = input_len - (hash_pos - input_buf);
17251
17252 if (hash_len != 40) return (PARSER_HASH_LENGTH);
17253
17254 uint salt_len = hash_pos - salt_pos - 1;
17255
17256 if (salt_len != 40) return (PARSER_SALT_LENGTH);
17257
17258 /*
17259 * store digest
17260 */
17261
17262 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
17263 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
17264 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
17265 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
17266 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
17267
17268 /*
17269 * store salt
17270 */
17271
17272 char *salt_buf_ptr = (char *) salt->salt_buf;
17273
17274 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
17275
17276 salt->salt_len = salt_len;
17277
17278 return (PARSER_OK);
17279 }
17280
17281 int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17282 {
17283 if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH);
17284
17285 if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED);
17286
17287 u32 *digest = (u32 *) hash_buf->digest;
17288
17289 salt_t *salt = hash_buf->salt;
17290
17291 bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt;
17292
17293 /**
17294 * parse line
17295 */
17296
17297 char *cry_master_len_pos = input_buf + 9;
17298
17299 char *cry_master_buf_pos = strchr (cry_master_len_pos, '$');
17300
17301 if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17302
17303 u32 cry_master_len_len = cry_master_buf_pos - cry_master_len_pos;
17304
17305 cry_master_buf_pos++;
17306
17307 char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$');
17308
17309 if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17310
17311 u32 cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos;
17312
17313 cry_salt_len_pos++;
17314
17315 char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$');
17316
17317 if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17318
17319 u32 cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos;
17320
17321 cry_salt_buf_pos++;
17322
17323 char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$');
17324
17325 if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17326
17327 u32 cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos;
17328
17329 cry_rounds_pos++;
17330
17331 char *ckey_len_pos = strchr (cry_rounds_pos, '$');
17332
17333 if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17334
17335 u32 cry_rounds_len = ckey_len_pos - cry_rounds_pos;
17336
17337 ckey_len_pos++;
17338
17339 char *ckey_buf_pos = strchr (ckey_len_pos, '$');
17340
17341 if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17342
17343 u32 ckey_len_len = ckey_buf_pos - ckey_len_pos;
17344
17345 ckey_buf_pos++;
17346
17347 char *public_key_len_pos = strchr (ckey_buf_pos, '$');
17348
17349 if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17350
17351 u32 ckey_buf_len = public_key_len_pos - ckey_buf_pos;
17352
17353 public_key_len_pos++;
17354
17355 char *public_key_buf_pos = strchr (public_key_len_pos, '$');
17356
17357 if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17358
17359 u32 public_key_len_len = public_key_buf_pos - public_key_len_pos;
17360
17361 public_key_buf_pos++;
17362
17363 u32 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;
17364
17365 const uint cry_master_len = atoi (cry_master_len_pos);
17366 const uint cry_salt_len = atoi (cry_salt_len_pos);
17367 const uint ckey_len = atoi (ckey_len_pos);
17368 const uint public_key_len = atoi (public_key_len_pos);
17369
17370 if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE);
17371 if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE);
17372 if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE);
17373 if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE);
17374
17375 for (uint i = 0, j = 0; j < cry_master_len; i += 1, j += 8)
17376 {
17377 bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]);
17378
17379 bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]);
17380 }
17381
17382 for (uint i = 0, j = 0; j < ckey_len; i += 1, j += 8)
17383 {
17384 bitcoin_wallet->ckey_buf[i] = hex_to_u32 ((const u8 *) &ckey_buf_pos[j]);
17385
17386 bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]);
17387 }
17388
17389 for (uint i = 0, j = 0; j < public_key_len; i += 1, j += 8)
17390 {
17391 bitcoin_wallet->public_key_buf[i] = hex_to_u32 ((const u8 *) &public_key_buf_pos[j]);
17392
17393 bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]);
17394 }
17395
17396 bitcoin_wallet->cry_master_len = cry_master_len / 2;
17397 bitcoin_wallet->ckey_len = ckey_len / 2;
17398 bitcoin_wallet->public_key_len = public_key_len / 2;
17399
17400 /*
17401 * store digest (should be unique enought, hopefully)
17402 */
17403
17404 digest[0] = bitcoin_wallet->cry_master_buf[0];
17405 digest[1] = bitcoin_wallet->cry_master_buf[1];
17406 digest[2] = bitcoin_wallet->cry_master_buf[2];
17407 digest[3] = bitcoin_wallet->cry_master_buf[3];
17408
17409 /*
17410 * store salt
17411 */
17412
17413 if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE);
17414
17415 const uint cry_rounds = atoi (cry_rounds_pos);
17416
17417 salt->salt_iter = cry_rounds - 1;
17418
17419 char *salt_buf_ptr = (char *) salt->salt_buf;
17420
17421 const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len);
17422
17423 salt->salt_len = salt_len;
17424
17425 return (PARSER_OK);
17426 }
17427
17428 int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17429 {
17430 if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH);
17431
17432 if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
17433
17434 u32 *digest = (u32 *) hash_buf->digest;
17435
17436 salt_t *salt = hash_buf->salt;
17437
17438 sip_t *sip = (sip_t *) hash_buf->esalt;
17439
17440 // work with a temporary copy of input_buf (s.t. we can manipulate it directly)
17441
17442 char temp_input_buf[input_len + 1];
17443
17444 memset (temp_input_buf, 0, sizeof (temp_input_buf));
17445 memcpy (temp_input_buf, input_buf, input_len);
17446
17447 // URI_server:
17448
17449 char *URI_server_pos = temp_input_buf + 6;
17450
17451 char *URI_client_pos = strchr (URI_server_pos, '*');
17452
17453 if (URI_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17454
17455 URI_client_pos[0] = 0;
17456 URI_client_pos++;
17457
17458 uint URI_server_len = strlen (URI_server_pos);
17459
17460 if (URI_server_len > 512) return (PARSER_SALT_LENGTH);
17461
17462 // URI_client:
17463
17464 char *user_pos = strchr (URI_client_pos, '*');
17465
17466 if (user_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17467
17468 user_pos[0] = 0;
17469 user_pos++;
17470
17471 uint URI_client_len = strlen (URI_client_pos);
17472
17473 if (URI_client_len > 512) return (PARSER_SALT_LENGTH);
17474
17475 // user:
17476
17477 char *realm_pos = strchr (user_pos, '*');
17478
17479 if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17480
17481 realm_pos[0] = 0;
17482 realm_pos++;
17483
17484 uint user_len = strlen (user_pos);
17485
17486 if (user_len > 116) return (PARSER_SALT_LENGTH);
17487
17488 // realm:
17489
17490 char *method_pos = strchr (realm_pos, '*');
17491
17492 if (method_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17493
17494 method_pos[0] = 0;
17495 method_pos++;
17496
17497 uint realm_len = strlen (realm_pos);
17498
17499 if (realm_len > 116) return (PARSER_SALT_LENGTH);
17500
17501 // method:
17502
17503 char *URI_prefix_pos = strchr (method_pos, '*');
17504
17505 if (URI_prefix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17506
17507 URI_prefix_pos[0] = 0;
17508 URI_prefix_pos++;
17509
17510 uint method_len = strlen (method_pos);
17511
17512 if (method_len > 246) return (PARSER_SALT_LENGTH);
17513
17514 // URI_prefix:
17515
17516 char *URI_resource_pos = strchr (URI_prefix_pos, '*');
17517
17518 if (URI_resource_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17519
17520 URI_resource_pos[0] = 0;
17521 URI_resource_pos++;
17522
17523 uint URI_prefix_len = strlen (URI_prefix_pos);
17524
17525 if (URI_prefix_len > 245) return (PARSER_SALT_LENGTH);
17526
17527 // URI_resource:
17528
17529 char *URI_suffix_pos = strchr (URI_resource_pos, '*');
17530
17531 if (URI_suffix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17532
17533 URI_suffix_pos[0] = 0;
17534 URI_suffix_pos++;
17535
17536 uint URI_resource_len = strlen (URI_resource_pos);
17537
17538 if (URI_resource_len < 1) return (PARSER_SALT_LENGTH);
17539 if (URI_resource_len > 246) return (PARSER_SALT_LENGTH);
17540
17541 // URI_suffix:
17542
17543 char *nonce_pos = strchr (URI_suffix_pos, '*');
17544
17545 if (nonce_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17546
17547 nonce_pos[0] = 0;
17548 nonce_pos++;
17549
17550 uint URI_suffix_len = strlen (URI_suffix_pos);
17551
17552 if (URI_suffix_len > 245) return (PARSER_SALT_LENGTH);
17553
17554 // nonce:
17555
17556 char *nonce_client_pos = strchr (nonce_pos, '*');
17557
17558 if (nonce_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17559
17560 nonce_client_pos[0] = 0;
17561 nonce_client_pos++;
17562
17563 uint nonce_len = strlen (nonce_pos);
17564
17565 if (nonce_len < 1) return (PARSER_SALT_LENGTH);
17566 if (nonce_len > 50) return (PARSER_SALT_LENGTH);
17567
17568 // nonce_client:
17569
17570 char *nonce_count_pos = strchr (nonce_client_pos, '*');
17571
17572 if (nonce_count_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17573
17574 nonce_count_pos[0] = 0;
17575 nonce_count_pos++;
17576
17577 uint nonce_client_len = strlen (nonce_client_pos);
17578
17579 if (nonce_client_len > 50) return (PARSER_SALT_LENGTH);
17580
17581 // nonce_count:
17582
17583 char *qop_pos = strchr (nonce_count_pos, '*');
17584
17585 if (qop_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17586
17587 qop_pos[0] = 0;
17588 qop_pos++;
17589
17590 uint nonce_count_len = strlen (nonce_count_pos);
17591
17592 if (nonce_count_len > 50) return (PARSER_SALT_LENGTH);
17593
17594 // qop:
17595
17596 char *directive_pos = strchr (qop_pos, '*');
17597
17598 if (directive_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17599
17600 directive_pos[0] = 0;
17601 directive_pos++;
17602
17603 uint qop_len = strlen (qop_pos);
17604
17605 if (qop_len > 50) return (PARSER_SALT_LENGTH);
17606
17607 // directive
17608
17609 char *digest_pos = strchr (directive_pos, '*');
17610
17611 if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17612
17613 digest_pos[0] = 0;
17614 digest_pos++;
17615
17616 uint directive_len = strlen (directive_pos);
17617
17618 if (directive_len != 3) return (PARSER_SALT_LENGTH);
17619
17620 if (memcmp (directive_pos, "MD5", 3))
17621 {
17622 log_info ("ERROR: only the MD5 directive is currently supported\n");
17623
17624 return (PARSER_SIP_AUTH_DIRECTIVE);
17625 }
17626
17627 /*
17628 * first (pre-)compute: HA2 = md5 ($method . ":" . $uri)
17629 */
17630
17631 uint md5_len = 0;
17632
17633 uint md5_max_len = 4 * 64;
17634
17635 uint md5_remaining_len = md5_max_len;
17636
17637 uint tmp_md5_buf[md5_max_len / 4];
17638
17639 memset (tmp_md5_buf, 0, sizeof (tmp_md5_buf));
17640
17641 char *tmp_md5_ptr = (char *) tmp_md5_buf;
17642
17643 snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos);
17644
17645 md5_len += method_len + 1;
17646 tmp_md5_ptr += method_len + 1;
17647
17648 if (URI_prefix_len > 0)
17649 {
17650 md5_remaining_len = md5_max_len - md5_len;
17651
17652 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos);
17653
17654 md5_len += URI_prefix_len + 1;
17655 tmp_md5_ptr += URI_prefix_len + 1;
17656 }
17657
17658 md5_remaining_len = md5_max_len - md5_len;
17659
17660 snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos);
17661
17662 md5_len += URI_resource_len;
17663 tmp_md5_ptr += URI_resource_len;
17664
17665 if (URI_suffix_len > 0)
17666 {
17667 md5_remaining_len = md5_max_len - md5_len;
17668
17669 snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos);
17670
17671 md5_len += 1 + URI_suffix_len;
17672 }
17673
17674 uint tmp_digest[4];
17675
17676 md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len);
17677
17678 tmp_digest[0] = byte_swap_32 (tmp_digest[0]);
17679 tmp_digest[1] = byte_swap_32 (tmp_digest[1]);
17680 tmp_digest[2] = byte_swap_32 (tmp_digest[2]);
17681 tmp_digest[3] = byte_swap_32 (tmp_digest[3]);
17682
17683 /*
17684 * esalt
17685 */
17686
17687 char *esalt_buf_ptr = (char *) sip->esalt_buf;
17688
17689 uint esalt_len = 0;
17690
17691 uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash
17692
17693 // there are 2 possibilities for the esalt:
17694
17695 if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0))
17696 {
17697 esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32;
17698
17699 if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH);
17700
17701 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x",
17702 nonce_pos,
17703 nonce_count_pos,
17704 nonce_client_pos,
17705 qop_pos,
17706 tmp_digest[0],
17707 tmp_digest[1],
17708 tmp_digest[2],
17709 tmp_digest[3]);
17710 }
17711 else
17712 {
17713 esalt_len = 1 + nonce_len + 1 + 32;
17714
17715 if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH);
17716
17717 snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x",
17718 nonce_pos,
17719 tmp_digest[0],
17720 tmp_digest[1],
17721 tmp_digest[2],
17722 tmp_digest[3]);
17723 }
17724
17725 // add 0x80 to esalt
17726
17727 esalt_buf_ptr[esalt_len] = 0x80;
17728
17729 sip->esalt_len = esalt_len;
17730
17731 /*
17732 * actual salt
17733 */
17734
17735 char *sip_salt_ptr = (char *) sip->salt_buf;
17736
17737 uint salt_len = user_len + 1 + realm_len + 1;
17738
17739 uint max_salt_len = 119;
17740
17741 if (salt_len > max_salt_len) return (PARSER_SALT_LENGTH);
17742
17743 snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17744
17745 sip->salt_len = salt_len;
17746
17747 /*
17748 * fake salt (for sorting)
17749 */
17750
17751 char *salt_buf_ptr = (char *) salt->salt_buf;
17752
17753 max_salt_len = 55;
17754
17755 uint fake_salt_len = salt_len;
17756
17757 if (fake_salt_len > max_salt_len)
17758 {
17759 fake_salt_len = max_salt_len;
17760 }
17761
17762 snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos);
17763
17764 salt->salt_len = fake_salt_len;
17765
17766 /*
17767 * digest
17768 */
17769
17770 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]);
17771 digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]);
17772 digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]);
17773 digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]);
17774
17775 digest[0] = byte_swap_32 (digest[0]);
17776 digest[1] = byte_swap_32 (digest[1]);
17777 digest[2] = byte_swap_32 (digest[2]);
17778 digest[3] = byte_swap_32 (digest[3]);
17779
17780 return (PARSER_OK);
17781 }
17782
17783 int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17784 {
17785 if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH);
17786
17787 if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
17788
17789 u32 *digest = (u32 *) hash_buf->digest;
17790
17791 salt_t *salt = hash_buf->salt;
17792
17793 // digest
17794
17795 char *digest_pos = input_buf;
17796
17797 digest[0] = hex_to_u32 ((const u8 *) &digest_pos[0]);
17798 digest[1] = 0;
17799 digest[2] = 0;
17800 digest[3] = 0;
17801
17802 // salt
17803
17804 char *salt_buf = input_buf + 8 + 1;
17805
17806 uint salt_len = 8;
17807
17808 char *salt_buf_ptr = (char *) salt->salt_buf;
17809
17810 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
17811
17812 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
17813
17814 salt->salt_len = salt_len;
17815
17816 return (PARSER_OK);
17817 }
17818
17819 int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17820 {
17821 if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH);
17822
17823 if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
17824
17825 u32 *digest = (u32 *) hash_buf->digest;
17826
17827 salt_t *salt = hash_buf->salt;
17828
17829 seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt;
17830
17831 /**
17832 * parse line
17833 */
17834
17835 char *p_buf_pos = input_buf + 4;
17836
17837 char *NumCyclesPower_pos = strchr (p_buf_pos, '$');
17838
17839 if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17840
17841 u32 p_buf_len = NumCyclesPower_pos - p_buf_pos;
17842
17843 NumCyclesPower_pos++;
17844
17845 char *salt_len_pos = strchr (NumCyclesPower_pos, '$');
17846
17847 if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17848
17849 u32 NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos;
17850
17851 salt_len_pos++;
17852
17853 char *salt_buf_pos = strchr (salt_len_pos, '$');
17854
17855 if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17856
17857 u32 salt_len_len = salt_buf_pos - salt_len_pos;
17858
17859 salt_buf_pos++;
17860
17861 char *iv_len_pos = strchr (salt_buf_pos, '$');
17862
17863 if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17864
17865 u32 salt_buf_len = iv_len_pos - salt_buf_pos;
17866
17867 iv_len_pos++;
17868
17869 char *iv_buf_pos = strchr (iv_len_pos, '$');
17870
17871 if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17872
17873 u32 iv_len_len = iv_buf_pos - iv_len_pos;
17874
17875 iv_buf_pos++;
17876
17877 char *crc_buf_pos = strchr (iv_buf_pos, '$');
17878
17879 if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17880
17881 u32 iv_buf_len = crc_buf_pos - iv_buf_pos;
17882
17883 crc_buf_pos++;
17884
17885 char *data_len_pos = strchr (crc_buf_pos, '$');
17886
17887 if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17888
17889 u32 crc_buf_len = data_len_pos - crc_buf_pos;
17890
17891 data_len_pos++;
17892
17893 char *unpack_size_pos = strchr (data_len_pos, '$');
17894
17895 if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17896
17897 u32 data_len_len = unpack_size_pos - data_len_pos;
17898
17899 unpack_size_pos++;
17900
17901 char *data_buf_pos = strchr (unpack_size_pos, '$');
17902
17903 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
17904
17905 u32 unpack_size_len = data_buf_pos - unpack_size_pos;
17906
17907 data_buf_pos++;
17908
17909 u32 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;
17910
17911 const uint iter = atoi (NumCyclesPower_pos);
17912 const uint crc = atoi (crc_buf_pos);
17913 const uint p_buf = atoi (p_buf_pos);
17914 const uint salt_len = atoi (salt_len_pos);
17915 const uint iv_len = atoi (iv_len_pos);
17916 const uint unpack_size = atoi (unpack_size_pos);
17917 const uint data_len = atoi (data_len_pos);
17918
17919 /**
17920 * verify some data
17921 */
17922
17923 if (p_buf != 0) return (PARSER_SALT_VALUE);
17924 if (salt_len != 0) return (PARSER_SALT_VALUE);
17925
17926 if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE);
17927
17928 if (data_len > 384) return (PARSER_SALT_VALUE);
17929
17930 if (unpack_size > data_len) return (PARSER_SALT_VALUE);
17931
17932 /**
17933 * store data
17934 */
17935
17936 seven_zip->iv_buf[0] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 0]);
17937 seven_zip->iv_buf[1] = hex_to_u32 ((const u8 *) &iv_buf_pos[ 8]);
17938 seven_zip->iv_buf[2] = hex_to_u32 ((const u8 *) &iv_buf_pos[16]);
17939 seven_zip->iv_buf[3] = hex_to_u32 ((const u8 *) &iv_buf_pos[24]);
17940
17941 seven_zip->iv_len = iv_len;
17942
17943 memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest()
17944
17945 seven_zip->salt_len = 0;
17946
17947 seven_zip->crc = crc;
17948
17949 for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8)
17950 {
17951 seven_zip->data_buf[i] = hex_to_u32 ((const u8 *) &data_buf_pos[j]);
17952
17953 seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]);
17954 }
17955
17956 seven_zip->data_len = data_len;
17957
17958 seven_zip->unpack_size = unpack_size;
17959
17960 // real salt
17961
17962 salt->salt_buf[0] = seven_zip->data_buf[0];
17963 salt->salt_buf[1] = seven_zip->data_buf[1];
17964 salt->salt_buf[2] = seven_zip->data_buf[2];
17965 salt->salt_buf[3] = seven_zip->data_buf[3];
17966
17967 salt->salt_len = 16;
17968
17969 salt->salt_sign[0] = iter;
17970
17971 salt->salt_iter = 1 << iter;
17972
17973 /**
17974 * digest
17975 */
17976
17977 digest[0] = crc;
17978 digest[1] = 0;
17979 digest[2] = 0;
17980 digest[3] = 0;
17981
17982 return (PARSER_OK);
17983 }
17984
17985 int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
17986 {
17987 if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH);
17988
17989 u32 *digest = (u32 *) hash_buf->digest;
17990
17991 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
17992 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
17993 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
17994 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
17995 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
17996 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
17997 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
17998 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
17999
18000 digest[0] = byte_swap_32 (digest[0]);
18001 digest[1] = byte_swap_32 (digest[1]);
18002 digest[2] = byte_swap_32 (digest[2]);
18003 digest[3] = byte_swap_32 (digest[3]);
18004 digest[4] = byte_swap_32 (digest[4]);
18005 digest[5] = byte_swap_32 (digest[5]);
18006 digest[6] = byte_swap_32 (digest[6]);
18007 digest[7] = byte_swap_32 (digest[7]);
18008
18009 return (PARSER_OK);
18010 }
18011
18012 int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18013 {
18014 if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH);
18015
18016 u32 *digest = (u32 *) hash_buf->digest;
18017
18018 digest[ 0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18019 digest[ 1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18020 digest[ 2] = hex_to_u32 ((const u8 *) &input_buf[ 16]);
18021 digest[ 3] = hex_to_u32 ((const u8 *) &input_buf[ 24]);
18022 digest[ 4] = hex_to_u32 ((const u8 *) &input_buf[ 32]);
18023 digest[ 5] = hex_to_u32 ((const u8 *) &input_buf[ 40]);
18024 digest[ 6] = hex_to_u32 ((const u8 *) &input_buf[ 48]);
18025 digest[ 7] = hex_to_u32 ((const u8 *) &input_buf[ 56]);
18026 digest[ 8] = hex_to_u32 ((const u8 *) &input_buf[ 64]);
18027 digest[ 9] = hex_to_u32 ((const u8 *) &input_buf[ 72]);
18028 digest[10] = hex_to_u32 ((const u8 *) &input_buf[ 80]);
18029 digest[11] = hex_to_u32 ((const u8 *) &input_buf[ 88]);
18030 digest[12] = hex_to_u32 ((const u8 *) &input_buf[ 96]);
18031 digest[13] = hex_to_u32 ((const u8 *) &input_buf[104]);
18032 digest[14] = hex_to_u32 ((const u8 *) &input_buf[112]);
18033 digest[15] = hex_to_u32 ((const u8 *) &input_buf[120]);
18034
18035 digest[ 0] = byte_swap_32 (digest[ 0]);
18036 digest[ 1] = byte_swap_32 (digest[ 1]);
18037 digest[ 2] = byte_swap_32 (digest[ 2]);
18038 digest[ 3] = byte_swap_32 (digest[ 3]);
18039 digest[ 4] = byte_swap_32 (digest[ 4]);
18040 digest[ 5] = byte_swap_32 (digest[ 5]);
18041 digest[ 6] = byte_swap_32 (digest[ 6]);
18042 digest[ 7] = byte_swap_32 (digest[ 7]);
18043 digest[ 8] = byte_swap_32 (digest[ 8]);
18044 digest[ 9] = byte_swap_32 (digest[ 9]);
18045 digest[10] = byte_swap_32 (digest[10]);
18046 digest[11] = byte_swap_32 (digest[11]);
18047 digest[12] = byte_swap_32 (digest[12]);
18048 digest[13] = byte_swap_32 (digest[13]);
18049 digest[14] = byte_swap_32 (digest[14]);
18050 digest[15] = byte_swap_32 (digest[15]);
18051
18052 return (PARSER_OK);
18053 }
18054
18055 int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18056 {
18057 if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH);
18058
18059 if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED);
18060
18061 u32 *digest = (u32 *) hash_buf->digest;
18062
18063 salt_t *salt = hash_buf->salt;
18064
18065 pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt;
18066
18067 /**
18068 * parse line
18069 */
18070
18071 // iterations
18072
18073 char *iter_pos = input_buf + 4;
18074
18075 u32 iter = atoi (iter_pos);
18076
18077 if (iter < 1) return (PARSER_SALT_ITERATION);
18078 if (iter > 999999) return (PARSER_SALT_ITERATION);
18079
18080 // first is *raw* salt
18081
18082 char *salt_pos = strchr (iter_pos, ':');
18083
18084 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18085
18086 salt_pos++;
18087
18088 char *hash_pos = strchr (salt_pos, ':');
18089
18090 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18091
18092 u32 salt_len = hash_pos - salt_pos;
18093
18094 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18095
18096 hash_pos++;
18097
18098 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18099
18100 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18101
18102 // decode salt
18103
18104 char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf;
18105
18106 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18107
18108 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18109
18110 salt_buf_ptr[salt_len + 3] = 0x01;
18111 salt_buf_ptr[salt_len + 4] = 0x80;
18112
18113 salt->salt_len = salt_len;
18114 salt->salt_iter = iter - 1;
18115
18116 // decode hash
18117
18118 u8 tmp_buf[100];
18119
18120 memset (tmp_buf, 0, sizeof (tmp_buf));
18121
18122 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18123
18124 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18125
18126 memcpy (digest, tmp_buf, 16);
18127
18128 // add some stuff to normal salt to make sorted happy
18129
18130 salt->salt_buf[0] = pbkdf2_md5->salt_buf[0];
18131 salt->salt_buf[1] = pbkdf2_md5->salt_buf[1];
18132 salt->salt_buf[2] = pbkdf2_md5->salt_buf[2];
18133 salt->salt_buf[3] = pbkdf2_md5->salt_buf[3];
18134 salt->salt_buf[4] = salt->salt_iter;
18135
18136 return (PARSER_OK);
18137 }
18138
18139 int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18140 {
18141 if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH);
18142
18143 if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED);
18144
18145 u32 *digest = (u32 *) hash_buf->digest;
18146
18147 salt_t *salt = hash_buf->salt;
18148
18149 pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt;
18150
18151 /**
18152 * parse line
18153 */
18154
18155 // iterations
18156
18157 char *iter_pos = input_buf + 5;
18158
18159 u32 iter = atoi (iter_pos);
18160
18161 if (iter < 1) return (PARSER_SALT_ITERATION);
18162 if (iter > 999999) return (PARSER_SALT_ITERATION);
18163
18164 // first is *raw* salt
18165
18166 char *salt_pos = strchr (iter_pos, ':');
18167
18168 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18169
18170 salt_pos++;
18171
18172 char *hash_pos = strchr (salt_pos, ':');
18173
18174 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18175
18176 u32 salt_len = hash_pos - salt_pos;
18177
18178 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18179
18180 hash_pos++;
18181
18182 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18183
18184 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18185
18186 // decode salt
18187
18188 char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf;
18189
18190 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18191
18192 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18193
18194 salt_buf_ptr[salt_len + 3] = 0x01;
18195 salt_buf_ptr[salt_len + 4] = 0x80;
18196
18197 salt->salt_len = salt_len;
18198 salt->salt_iter = iter - 1;
18199
18200 // decode hash
18201
18202 u8 tmp_buf[100];
18203
18204 memset (tmp_buf, 0, sizeof (tmp_buf));
18205
18206 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18207
18208 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18209
18210 memcpy (digest, tmp_buf, 16);
18211
18212 digest[0] = byte_swap_32 (digest[0]);
18213 digest[1] = byte_swap_32 (digest[1]);
18214 digest[2] = byte_swap_32 (digest[2]);
18215 digest[3] = byte_swap_32 (digest[3]);
18216
18217 // add some stuff to normal salt to make sorted happy
18218
18219 salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0];
18220 salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1];
18221 salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2];
18222 salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3];
18223 salt->salt_buf[4] = salt->salt_iter;
18224
18225 return (PARSER_OK);
18226 }
18227
18228 int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18229 {
18230 if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH);
18231
18232 if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED);
18233
18234 u64 *digest = (u64 *) hash_buf->digest;
18235
18236 salt_t *salt = hash_buf->salt;
18237
18238 pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt;
18239
18240 /**
18241 * parse line
18242 */
18243
18244 // iterations
18245
18246 char *iter_pos = input_buf + 7;
18247
18248 u32 iter = atoi (iter_pos);
18249
18250 if (iter < 1) return (PARSER_SALT_ITERATION);
18251 if (iter > 999999) return (PARSER_SALT_ITERATION);
18252
18253 // first is *raw* salt
18254
18255 char *salt_pos = strchr (iter_pos, ':');
18256
18257 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18258
18259 salt_pos++;
18260
18261 char *hash_pos = strchr (salt_pos, ':');
18262
18263 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18264
18265 u32 salt_len = hash_pos - salt_pos;
18266
18267 if (salt_len > 64) return (PARSER_SALT_LENGTH);
18268
18269 hash_pos++;
18270
18271 u32 hash_b64_len = input_len - (hash_pos - input_buf);
18272
18273 if (hash_b64_len > 88) return (PARSER_HASH_LENGTH);
18274
18275 // decode salt
18276
18277 char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf;
18278
18279 salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len);
18280
18281 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18282
18283 salt_buf_ptr[salt_len + 3] = 0x01;
18284 salt_buf_ptr[salt_len + 4] = 0x80;
18285
18286 salt->salt_len = salt_len;
18287 salt->salt_iter = iter - 1;
18288
18289 // decode hash
18290
18291 u8 tmp_buf[100];
18292
18293 memset (tmp_buf, 0, sizeof (tmp_buf));
18294
18295 int hash_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_b64_len, tmp_buf);
18296
18297 if (hash_len < 16) return (PARSER_HASH_LENGTH);
18298
18299 memcpy (digest, tmp_buf, 64);
18300
18301 digest[0] = byte_swap_64 (digest[0]);
18302 digest[1] = byte_swap_64 (digest[1]);
18303 digest[2] = byte_swap_64 (digest[2]);
18304 digest[3] = byte_swap_64 (digest[3]);
18305 digest[4] = byte_swap_64 (digest[4]);
18306 digest[5] = byte_swap_64 (digest[5]);
18307 digest[6] = byte_swap_64 (digest[6]);
18308 digest[7] = byte_swap_64 (digest[7]);
18309
18310 // add some stuff to normal salt to make sorted happy
18311
18312 salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0];
18313 salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1];
18314 salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2];
18315 salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3];
18316 salt->salt_buf[4] = salt->salt_iter;
18317
18318 return (PARSER_OK);
18319 }
18320
18321 int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18322 {
18323 if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH);
18324
18325 if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED);
18326
18327 uint *digest = (uint *) hash_buf->digest;
18328
18329 salt_t *salt = hash_buf->salt;
18330
18331 /**
18332 * parse line
18333 */
18334
18335 char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$"
18336
18337 char *hash_pos = strchr (salt_pos, '$');
18338
18339 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18340
18341 u32 salt_len = hash_pos - salt_pos;
18342
18343 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18344
18345 hash_pos++;
18346
18347 u32 hash_len = input_len - 10 - 2 - 2 - salt_len - 1;
18348
18349 if (hash_len != 16) return (PARSER_HASH_LENGTH);
18350
18351 // decode hash
18352
18353 digest[ 0] = hex_to_u32 ((const u8 *) &hash_pos[0]);
18354 digest[ 1] = hex_to_u32 ((const u8 *) &hash_pos[8]);
18355 digest[ 2] = 0;
18356 digest[ 3] = 0;
18357 digest[ 4] = 0;
18358 digest[ 5] = 0;
18359 digest[ 6] = 0;
18360 digest[ 7] = 0;
18361 digest[ 8] = 0;
18362 digest[ 9] = 0;
18363 digest[10] = 0;
18364 digest[11] = 0;
18365 digest[12] = 0;
18366 digest[13] = 0;
18367 digest[14] = 0;
18368 digest[15] = 0;
18369
18370 // decode salt
18371
18372 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18373 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18374
18375 salt->salt_iter = ROUNDS_ECRYPTFS;
18376 salt->salt_len = 8;
18377
18378 return (PARSER_OK);
18379 }
18380
18381 int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18382 {
18383 if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH);
18384
18385 if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED);
18386
18387 unsigned char c19 = itoa64_to_int (input_buf[19]);
18388
18389 if (c19 & 3) return (PARSER_HASH_VALUE);
18390
18391 salt_t *salt = hash_buf->salt;
18392
18393 u32 *digest = (u32 *) hash_buf->digest;
18394
18395 // iteration count
18396
18397 salt->salt_iter = itoa64_to_int (input_buf[1])
18398 | itoa64_to_int (input_buf[2]) << 6
18399 | itoa64_to_int (input_buf[3]) << 12
18400 | itoa64_to_int (input_buf[4]) << 18;
18401
18402 // set salt
18403
18404 salt->salt_buf[0] = itoa64_to_int (input_buf[5])
18405 | itoa64_to_int (input_buf[6]) << 6
18406 | itoa64_to_int (input_buf[7]) << 12
18407 | itoa64_to_int (input_buf[8]) << 18;
18408
18409 salt->salt_len = 4;
18410
18411 u8 tmp_buf[100];
18412
18413 memset (tmp_buf, 0, sizeof (tmp_buf));
18414
18415 base64_decode (itoa64_to_int, (const u8 *) input_buf + 9, 11, tmp_buf);
18416
18417 memcpy (digest, tmp_buf, 8);
18418
18419 uint tt;
18420
18421 IP (digest[0], digest[1], tt);
18422
18423 digest[0] = rotr32 (digest[0], 31);
18424 digest[1] = rotr32 (digest[1], 31);
18425 digest[2] = 0;
18426 digest[3] = 0;
18427
18428 return (PARSER_OK);
18429 }
18430
18431 int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18432 {
18433 if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH);
18434
18435 if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED);
18436
18437 u32 *digest = (u32 *) hash_buf->digest;
18438
18439 salt_t *salt = hash_buf->salt;
18440
18441 /**
18442 * parse line
18443 */
18444
18445 char *type_pos = input_buf + 6 + 1;
18446
18447 char *salt_pos = strchr (type_pos, '*');
18448
18449 if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18450
18451 u32 type_len = salt_pos - type_pos;
18452
18453 if (type_len != 1) return (PARSER_SALT_LENGTH);
18454
18455 salt_pos++;
18456
18457 char *crypted_pos = strchr (salt_pos, '*');
18458
18459 if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18460
18461 u32 salt_len = crypted_pos - salt_pos;
18462
18463 if (salt_len != 16) return (PARSER_SALT_LENGTH);
18464
18465 crypted_pos++;
18466
18467 u32 crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1;
18468
18469 if (crypted_len != 32) return (PARSER_SALT_LENGTH);
18470
18471 /**
18472 * copy data
18473 */
18474
18475 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]);
18476 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[8]);
18477
18478 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18479 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18480
18481 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &crypted_pos[ 0]);
18482 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &crypted_pos[ 8]);
18483 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &crypted_pos[16]);
18484 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &crypted_pos[24]);
18485
18486 salt->salt_len = 24;
18487 salt->salt_iter = ROUNDS_RAR3;
18488
18489 // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and
18490 // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it.
18491
18492 digest[0] = 0xc43d7b00;
18493 digest[1] = 0x40070000;
18494 digest[2] = 0;
18495 digest[3] = 0;
18496
18497 return (PARSER_OK);
18498 }
18499
18500 int rar5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18501 {
18502 if ((input_len < DISPLAY_LEN_MIN_13000) || (input_len > DISPLAY_LEN_MAX_13000)) return (PARSER_GLOBAL_LENGTH);
18503
18504 if (memcmp (SIGNATURE_RAR5, input_buf, 1 + 4 + 1)) return (PARSER_SIGNATURE_UNMATCHED);
18505
18506 u32 *digest = (u32 *) hash_buf->digest;
18507
18508 salt_t *salt = hash_buf->salt;
18509
18510 rar5_t *rar5 = (rar5_t *) hash_buf->esalt;
18511
18512 /**
18513 * parse line
18514 */
18515
18516 char *param0_pos = input_buf + 1 + 4 + 1;
18517
18518 char *param1_pos = strchr (param0_pos, '$');
18519
18520 if (param1_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18521
18522 u32 param0_len = param1_pos - param0_pos;
18523
18524 param1_pos++;
18525
18526 char *param2_pos = strchr (param1_pos, '$');
18527
18528 if (param2_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18529
18530 u32 param1_len = param2_pos - param1_pos;
18531
18532 param2_pos++;
18533
18534 char *param3_pos = strchr (param2_pos, '$');
18535
18536 if (param3_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18537
18538 u32 param2_len = param3_pos - param2_pos;
18539
18540 param3_pos++;
18541
18542 char *param4_pos = strchr (param3_pos, '$');
18543
18544 if (param4_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18545
18546 u32 param3_len = param4_pos - param3_pos;
18547
18548 param4_pos++;
18549
18550 char *param5_pos = strchr (param4_pos, '$');
18551
18552 if (param5_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18553
18554 u32 param4_len = param5_pos - param4_pos;
18555
18556 param5_pos++;
18557
18558 u32 param5_len = input_len - 1 - 4 - 1 - param0_len - 1 - param1_len - 1 - param2_len - 1 - param3_len - 1 - param4_len - 1;
18559
18560 char *salt_buf = param1_pos;
18561 char *iv = param3_pos;
18562 char *pswcheck = param5_pos;
18563
18564 const uint salt_len = atoi (param0_pos);
18565 const uint iterations = atoi (param2_pos);
18566 const uint pswcheck_len = atoi (param4_pos);
18567
18568 /**
18569 * verify some data
18570 */
18571
18572 if (param1_len != 32) return (PARSER_SALT_VALUE);
18573 if (param3_len != 32) return (PARSER_SALT_VALUE);
18574 if (param5_len != 16) return (PARSER_SALT_VALUE);
18575
18576 if (salt_len != 16) return (PARSER_SALT_VALUE);
18577 if (iterations == 0) return (PARSER_SALT_VALUE);
18578 if (pswcheck_len != 8) return (PARSER_SALT_VALUE);
18579
18580 /**
18581 * store data
18582 */
18583
18584 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_buf[ 0]);
18585 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_buf[ 8]);
18586 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_buf[16]);
18587 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_buf[24]);
18588
18589 rar5->iv[0] = hex_to_u32 ((const u8 *) &iv[ 0]);
18590 rar5->iv[1] = hex_to_u32 ((const u8 *) &iv[ 8]);
18591 rar5->iv[2] = hex_to_u32 ((const u8 *) &iv[16]);
18592 rar5->iv[3] = hex_to_u32 ((const u8 *) &iv[24]);
18593
18594 salt->salt_len = 16;
18595
18596 salt->salt_sign[0] = iterations;
18597
18598 salt->salt_iter = ((1 << iterations) + 32) - 1;
18599
18600 /**
18601 * digest buf
18602 */
18603
18604 digest[0] = hex_to_u32 ((const u8 *) &pswcheck[ 0]);
18605 digest[1] = hex_to_u32 ((const u8 *) &pswcheck[ 8]);
18606 digest[2] = 0;
18607 digest[3] = 0;
18608
18609 return (PARSER_OK);
18610 }
18611
18612 int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18613 {
18614 if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH);
18615
18616 u32 *digest = (u32 *) hash_buf->digest;
18617
18618 salt_t *salt = hash_buf->salt;
18619
18620 digest[0] = hex_to_u32 ((const u8 *) &input_buf[ 0]);
18621 digest[1] = hex_to_u32 ((const u8 *) &input_buf[ 8]);
18622 digest[2] = hex_to_u32 ((const u8 *) &input_buf[16]);
18623 digest[3] = hex_to_u32 ((const u8 *) &input_buf[24]);
18624 digest[4] = hex_to_u32 ((const u8 *) &input_buf[32]);
18625 digest[5] = hex_to_u32 ((const u8 *) &input_buf[40]);
18626 digest[6] = hex_to_u32 ((const u8 *) &input_buf[48]);
18627 digest[7] = hex_to_u32 ((const u8 *) &input_buf[56]);
18628
18629 if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED);
18630
18631 uint salt_len = input_len - 64 - 1;
18632
18633 char *salt_buf = input_buf + 64 + 1;
18634
18635 char *salt_buf_ptr = (char *) salt->salt_buf;
18636
18637 salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len);
18638
18639 if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH);
18640
18641 salt->salt_len = salt_len;
18642
18643 /**
18644 * we can precompute the first sha256 transform
18645 */
18646
18647 uint w[16];
18648
18649 w[ 0] = byte_swap_32 (salt->salt_buf[ 0]);
18650 w[ 1] = byte_swap_32 (salt->salt_buf[ 1]);
18651 w[ 2] = byte_swap_32 (salt->salt_buf[ 2]);
18652 w[ 3] = byte_swap_32 (salt->salt_buf[ 3]);
18653 w[ 4] = byte_swap_32 (salt->salt_buf[ 4]);
18654 w[ 5] = byte_swap_32 (salt->salt_buf[ 5]);
18655 w[ 6] = byte_swap_32 (salt->salt_buf[ 6]);
18656 w[ 7] = byte_swap_32 (salt->salt_buf[ 7]);
18657 w[ 8] = byte_swap_32 (salt->salt_buf[ 8]);
18658 w[ 9] = byte_swap_32 (salt->salt_buf[ 9]);
18659 w[10] = byte_swap_32 (salt->salt_buf[10]);
18660 w[11] = byte_swap_32 (salt->salt_buf[11]);
18661 w[12] = byte_swap_32 (salt->salt_buf[12]);
18662 w[13] = byte_swap_32 (salt->salt_buf[13]);
18663 w[14] = byte_swap_32 (salt->salt_buf[14]);
18664 w[15] = byte_swap_32 (salt->salt_buf[15]);
18665
18666 uint pc256[8];
18667
18668 pc256[0] = SHA256M_A;
18669 pc256[1] = SHA256M_B;
18670 pc256[2] = SHA256M_C;
18671 pc256[3] = SHA256M_D;
18672 pc256[4] = SHA256M_E;
18673 pc256[5] = SHA256M_F;
18674 pc256[6] = SHA256M_G;
18675 pc256[7] = SHA256M_H;
18676
18677 sha256_64 (w, pc256);
18678
18679 salt->salt_buf_pc[0] = pc256[0];
18680 salt->salt_buf_pc[1] = pc256[1];
18681 salt->salt_buf_pc[2] = pc256[2];
18682 salt->salt_buf_pc[3] = pc256[3];
18683 salt->salt_buf_pc[4] = pc256[4];
18684 salt->salt_buf_pc[5] = pc256[5];
18685 salt->salt_buf_pc[6] = pc256[6];
18686 salt->salt_buf_pc[7] = pc256[7];
18687
18688 digest[0] -= pc256[0];
18689 digest[1] -= pc256[1];
18690 digest[2] -= pc256[2];
18691 digest[3] -= pc256[3];
18692 digest[4] -= pc256[4];
18693 digest[5] -= pc256[5];
18694 digest[6] -= pc256[6];
18695 digest[7] -= pc256[7];
18696
18697 return (PARSER_OK);
18698 }
18699
18700 int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18701 {
18702 if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH);
18703
18704 if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED);
18705
18706 u32 *digest = (u32 *) hash_buf->digest;
18707
18708 salt_t *salt = hash_buf->salt;
18709
18710 /**
18711 * parse line
18712 */
18713
18714 char *data_len_pos = input_buf + 1 + 10 + 1;
18715
18716 char *data_buf_pos = strchr (data_len_pos, '$');
18717
18718 if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18719
18720 u32 data_len_len = data_buf_pos - data_len_pos;
18721
18722 if (data_len_len < 1) return (PARSER_SALT_LENGTH);
18723 if (data_len_len > 5) return (PARSER_SALT_LENGTH);
18724
18725 data_buf_pos++;
18726
18727 u32 data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1;
18728
18729 if (data_buf_len < 64) return (PARSER_HASH_LENGTH);
18730
18731 if (data_buf_len % 16) return (PARSER_HASH_LENGTH);
18732
18733 u32 data_len = atoi (data_len_pos);
18734
18735 if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH);
18736
18737 /**
18738 * salt
18739 */
18740
18741 char *salt_pos = data_buf_pos;
18742
18743 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18744 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18745 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]);
18746 salt->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]);
18747
18748 // this is actually the CT, which is also the hash later (if matched)
18749
18750 salt->salt_buf[4] = hex_to_u32 ((const u8 *) &salt_pos[32]);
18751 salt->salt_buf[5] = hex_to_u32 ((const u8 *) &salt_pos[40]);
18752 salt->salt_buf[6] = hex_to_u32 ((const u8 *) &salt_pos[48]);
18753 salt->salt_buf[7] = hex_to_u32 ((const u8 *) &salt_pos[56]);
18754
18755 salt->salt_len = 32; // note we need to fix this to 16 in kernel
18756
18757 salt->salt_iter = 10 - 1;
18758
18759 /**
18760 * digest buf
18761 */
18762
18763 digest[0] = salt->salt_buf[4];
18764 digest[1] = salt->salt_buf[5];
18765 digest[2] = salt->salt_buf[6];
18766 digest[3] = salt->salt_buf[7];
18767
18768 return (PARSER_OK);
18769 }
18770
18771 int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18772 {
18773 if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH);
18774
18775 if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED);
18776
18777 u32 *digest = (u32 *) hash_buf->digest;
18778
18779 salt_t *salt = hash_buf->salt;
18780
18781 /**
18782 * parse line
18783 */
18784
18785 char *salt_pos = input_buf + 11 + 1;
18786
18787 char *iter_pos = strchr (salt_pos, ',');
18788
18789 if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18790
18791 u32 salt_len = iter_pos - salt_pos;
18792
18793 if (salt_len != 20) return (PARSER_SALT_LENGTH);
18794
18795 iter_pos++;
18796
18797 char *hash_pos = strchr (iter_pos, ',');
18798
18799 if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED);
18800
18801 u32 iter_len = hash_pos - iter_pos;
18802
18803 if (iter_len > 5) return (PARSER_SALT_LENGTH);
18804
18805 hash_pos++;
18806
18807 u32 hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1;
18808
18809 if (hash_len != 64) return (PARSER_HASH_LENGTH);
18810
18811 /**
18812 * salt
18813 */
18814
18815 salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]);
18816 salt->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]);
18817 salt->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]) & 0xffff0000;
18818 salt->salt_buf[3] = 0x00018000;
18819
18820 salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]);
18821 salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]);
18822 salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]);
18823 salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]);
18824
18825 salt->salt_len = salt_len / 2;
18826
18827 salt->salt_iter = atoi (iter_pos) - 1;
18828
18829 /**
18830 * digest buf
18831 */
18832
18833 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18834 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18835 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18836 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18837 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18838 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
18839 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
18840 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
18841
18842 return (PARSER_OK);
18843 }
18844
18845 int androidfde_samsung_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf)
18846 {
18847 if ((input_len < DISPLAY_LEN_MIN_12900) || (input_len > DISPLAY_LEN_MAX_12900)) return (PARSER_GLOBAL_LENGTH);
18848
18849 u32 *digest = (u32 *) hash_buf->digest;
18850
18851 salt_t *salt = hash_buf->salt;
18852
18853 /**
18854 * parse line
18855 */
18856
18857 char *hash_pos = input_buf + 64;
18858 char *salt1_pos = input_buf + 128;
18859 char *salt2_pos = input_buf;
18860
18861 /**
18862 * salt
18863 */
18864
18865 salt->salt_buf[ 0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]);
18866 salt->salt_buf[ 1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]);
18867 salt->salt_buf[ 2] = hex_to_u32 ((const u8 *) &salt1_pos[16]);
18868 salt->salt_buf[ 3] = hex_to_u32 ((const u8 *) &salt1_pos[24]);
18869
18870 salt->salt_buf[ 4] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]);
18871 salt->salt_buf[ 5] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]);
18872 salt->salt_buf[ 6] = hex_to_u32 ((const u8 *) &salt2_pos[16]);
18873 salt->salt_buf[ 7] = hex_to_u32 ((const u8 *) &salt2_pos[24]);
18874
18875 salt->salt_buf[ 8] = hex_to_u32 ((const u8 *) &salt2_pos[32]);
18876 salt->salt_buf[ 9] = hex_to_u32 ((const u8 *) &salt2_pos[40]);
18877 salt->salt_buf[10] = hex_to_u32 ((const u8 *) &salt2_pos[48]);
18878 salt->salt_buf[11] = hex_to_u32 ((const u8 *) &salt2_pos[56]);
18879
18880 salt->salt_len = 48;
18881
18882 salt->salt_iter = ROUNDS_ANDROIDFDE_SAMSUNG - 1;
18883
18884 /**
18885 * digest buf
18886 */
18887
18888 digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]);
18889 digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]);
18890 digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]);
18891 digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]);
18892 digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]);
18893 digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]);
18894 digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]);
18895 digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]);
18896
18897 return (PARSER_OK);
18898 }
18899
18900 /**
18901 * parallel running threads
18902 */
18903
18904 #ifdef WIN
18905
18906 BOOL WINAPI sigHandler_default (DWORD sig)
18907 {
18908 switch (sig)
18909 {
18910 case CTRL_CLOSE_EVENT:
18911
18912 /*
18913 * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042
18914 * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler
18915 * function otherwise it is too late (e.g. after returning from this function)
18916 */
18917
18918 myabort ();
18919
18920 SetConsoleCtrlHandler (NULL, TRUE);
18921
18922 hc_sleep (10);
18923
18924 return TRUE;
18925
18926 case CTRL_C_EVENT:
18927 case CTRL_LOGOFF_EVENT:
18928 case CTRL_SHUTDOWN_EVENT:
18929
18930 myabort ();
18931
18932 SetConsoleCtrlHandler (NULL, TRUE);
18933
18934 return TRUE;
18935 }
18936
18937 return FALSE;
18938 }
18939
18940 BOOL WINAPI sigHandler_benchmark (DWORD sig)
18941 {
18942 switch (sig)
18943 {
18944 case CTRL_CLOSE_EVENT:
18945
18946 myabort ();
18947
18948 SetConsoleCtrlHandler (NULL, TRUE);
18949
18950 hc_sleep (10);
18951
18952 return TRUE;
18953
18954 case CTRL_C_EVENT:
18955 case CTRL_LOGOFF_EVENT:
18956 case CTRL_SHUTDOWN_EVENT:
18957
18958 myquit ();
18959
18960 SetConsoleCtrlHandler (NULL, TRUE);
18961
18962 return TRUE;
18963 }
18964
18965 return FALSE;
18966 }
18967
18968 void hc_signal (BOOL WINAPI (callback) (DWORD))
18969 {
18970 if (callback == NULL)
18971 {
18972 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE);
18973 }
18974 else
18975 {
18976 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE);
18977 }
18978 }
18979
18980 #else
18981
18982 void sigHandler_default (int sig)
18983 {
18984 myabort ();
18985
18986 signal (sig, NULL);
18987 }
18988
18989 void sigHandler_benchmark (int sig)
18990 {
18991 myquit ();
18992
18993 signal (sig, NULL);
18994 }
18995
18996 void hc_signal (void (callback) (int))
18997 {
18998 if (callback == NULL) callback = SIG_DFL;
18999
19000 signal (SIGINT, callback);
19001 signal (SIGTERM, callback);
19002 signal (SIGABRT, callback);
19003 }
19004
19005 #endif
19006
19007 void status_display ();
19008
19009 void *thread_keypress (void *p)
19010 {
19011 int benchmark = *((int *) p);
19012
19013 uint quiet = data.quiet;
19014
19015 tty_break();
19016
19017 while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
19018 {
19019 int ch = tty_getchar();
19020
19021 if (ch == -1) break;
19022
19023 if (ch == 0) continue;
19024
19025 #ifdef _POSIX
19026 if (ch != '\n')
19027 #endif
19028
19029 hc_thread_mutex_lock (mux_display);
19030
19031 log_info ("");
19032
19033 switch (ch)
19034 {
19035 case 's':
19036 case '\n':
19037
19038 log_info ("");
19039
19040 status_display ();
19041
19042 log_info ("");
19043
19044 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19045 if (quiet == 0) fflush (stdout);
19046
19047 break;
19048
19049 case 'b':
19050
19051 log_info ("");
19052
19053 bypass ();
19054
19055 log_info ("");
19056
19057 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19058 if (quiet == 0) fflush (stdout);
19059
19060 break;
19061
19062 case 'p':
19063
19064 log_info ("");
19065
19066 SuspendThreads ();
19067
19068 log_info ("");
19069
19070 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19071 if (quiet == 0) fflush (stdout);
19072
19073 break;
19074
19075 case 'r':
19076
19077 log_info ("");
19078
19079 ResumeThreads ();
19080
19081 log_info ("");
19082
19083 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19084 if (quiet == 0) fflush (stdout);
19085
19086 break;
19087
19088 case 'c':
19089
19090 log_info ("");
19091
19092 if (benchmark == 1) break;
19093
19094 stop_at_checkpoint ();
19095
19096 log_info ("");
19097
19098 if (quiet == 0) fprintf (stdout, "%s", PROMPT);
19099 if (quiet == 0) fflush (stdout);
19100
19101 break;
19102
19103 case 'q':
19104
19105 log_info ("");
19106
19107 if (benchmark == 1)
19108 {
19109 myquit ();
19110 }
19111 else
19112 {
19113 myabort ();
19114 }
19115
19116 break;
19117 }
19118
19119 hc_thread_mutex_unlock (mux_display);
19120 }
19121
19122 tty_fix();
19123
19124 return (p);
19125 }
19126
19127 /**
19128 * rules common
19129 */
19130
19131 bool class_num (const u8 c)
19132 {
19133 return ((c >= '0') && (c <= '9'));
19134 }
19135
19136 bool class_lower (const u8 c)
19137 {
19138 return ((c >= 'a') && (c <= 'z'));
19139 }
19140
19141 bool class_upper (const u8 c)
19142 {
19143 return ((c >= 'A') && (c <= 'Z'));
19144 }
19145
19146 bool class_alpha (const u8 c)
19147 {
19148 return (class_lower (c) || class_upper (c));
19149 }
19150
19151 int conv_ctoi (const u8 c)
19152 {
19153 if (class_num (c))
19154 {
19155 return c - '0';
19156 }
19157 else if (class_upper (c))
19158 {
19159 return c - 'A' + 10;
19160 }
19161
19162 return -1;
19163 }
19164
19165 int conv_itoc (const u8 c)
19166 {
19167 if (c < 10)
19168 {
19169 return c + '0';
19170 }
19171 else if (c < 37)
19172 {
19173 return c + 'A' - 10;
19174 }
19175
19176 return -1;
19177 }
19178
19179 /**
19180 * device rules
19181 */
19182
19183 #define INCR_POS if (++rule_pos == rule_len) return (-1)
19184 #define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0
19185 #define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8
19186 #define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16
19187 #define MAX_KERNEL_RULES 255
19188 #define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff)
19189 #define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19190 #define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19191
19192 #define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8
19193 #define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16
19194 #define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff)
19195 #define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff)
19196
19197 int cpu_rule_to_kernel_rule (char rule_buf[BUFSIZ], uint rule_len, kernel_rule_t *rule)
19198 {
19199 uint rule_pos;
19200 uint rule_cnt;
19201
19202 for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19203 {
19204 switch (rule_buf[rule_pos])
19205 {
19206 case ' ':
19207 rule_cnt--;
19208 break;
19209
19210 case RULE_OP_MANGLE_NOOP:
19211 SET_NAME (rule, rule_buf[rule_pos]);
19212 break;
19213
19214 case RULE_OP_MANGLE_LREST:
19215 SET_NAME (rule, rule_buf[rule_pos]);
19216 break;
19217
19218 case RULE_OP_MANGLE_UREST:
19219 SET_NAME (rule, rule_buf[rule_pos]);
19220 break;
19221
19222 case RULE_OP_MANGLE_LREST_UFIRST:
19223 SET_NAME (rule, rule_buf[rule_pos]);
19224 break;
19225
19226 case RULE_OP_MANGLE_UREST_LFIRST:
19227 SET_NAME (rule, rule_buf[rule_pos]);
19228 break;
19229
19230 case RULE_OP_MANGLE_TREST:
19231 SET_NAME (rule, rule_buf[rule_pos]);
19232 break;
19233
19234 case RULE_OP_MANGLE_TOGGLE_AT:
19235 SET_NAME (rule, rule_buf[rule_pos]);
19236 SET_P0_CONV (rule, rule_buf[rule_pos]);
19237 break;
19238
19239 case RULE_OP_MANGLE_REVERSE:
19240 SET_NAME (rule, rule_buf[rule_pos]);
19241 break;
19242
19243 case RULE_OP_MANGLE_DUPEWORD:
19244 SET_NAME (rule, rule_buf[rule_pos]);
19245 break;
19246
19247 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19248 SET_NAME (rule, rule_buf[rule_pos]);
19249 SET_P0_CONV (rule, rule_buf[rule_pos]);
19250 break;
19251
19252 case RULE_OP_MANGLE_REFLECT:
19253 SET_NAME (rule, rule_buf[rule_pos]);
19254 break;
19255
19256 case RULE_OP_MANGLE_ROTATE_LEFT:
19257 SET_NAME (rule, rule_buf[rule_pos]);
19258 break;
19259
19260 case RULE_OP_MANGLE_ROTATE_RIGHT:
19261 SET_NAME (rule, rule_buf[rule_pos]);
19262 break;
19263
19264 case RULE_OP_MANGLE_APPEND:
19265 SET_NAME (rule, rule_buf[rule_pos]);
19266 SET_P0 (rule, rule_buf[rule_pos]);
19267 break;
19268
19269 case RULE_OP_MANGLE_PREPEND:
19270 SET_NAME (rule, rule_buf[rule_pos]);
19271 SET_P0 (rule, rule_buf[rule_pos]);
19272 break;
19273
19274 case RULE_OP_MANGLE_DELETE_FIRST:
19275 SET_NAME (rule, rule_buf[rule_pos]);
19276 break;
19277
19278 case RULE_OP_MANGLE_DELETE_LAST:
19279 SET_NAME (rule, rule_buf[rule_pos]);
19280 break;
19281
19282 case RULE_OP_MANGLE_DELETE_AT:
19283 SET_NAME (rule, rule_buf[rule_pos]);
19284 SET_P0_CONV (rule, rule_buf[rule_pos]);
19285 break;
19286
19287 case RULE_OP_MANGLE_EXTRACT:
19288 SET_NAME (rule, rule_buf[rule_pos]);
19289 SET_P0_CONV (rule, rule_buf[rule_pos]);
19290 SET_P1_CONV (rule, rule_buf[rule_pos]);
19291 break;
19292
19293 case RULE_OP_MANGLE_OMIT:
19294 SET_NAME (rule, rule_buf[rule_pos]);
19295 SET_P0_CONV (rule, rule_buf[rule_pos]);
19296 SET_P1_CONV (rule, rule_buf[rule_pos]);
19297 break;
19298
19299 case RULE_OP_MANGLE_INSERT:
19300 SET_NAME (rule, rule_buf[rule_pos]);
19301 SET_P0_CONV (rule, rule_buf[rule_pos]);
19302 SET_P1 (rule, rule_buf[rule_pos]);
19303 break;
19304
19305 case RULE_OP_MANGLE_OVERSTRIKE:
19306 SET_NAME (rule, rule_buf[rule_pos]);
19307 SET_P0_CONV (rule, rule_buf[rule_pos]);
19308 SET_P1 (rule, rule_buf[rule_pos]);
19309 break;
19310
19311 case RULE_OP_MANGLE_TRUNCATE_AT:
19312 SET_NAME (rule, rule_buf[rule_pos]);
19313 SET_P0_CONV (rule, rule_buf[rule_pos]);
19314 break;
19315
19316 case RULE_OP_MANGLE_REPLACE:
19317 SET_NAME (rule, rule_buf[rule_pos]);
19318 SET_P0 (rule, rule_buf[rule_pos]);
19319 SET_P1 (rule, rule_buf[rule_pos]);
19320 break;
19321
19322 case RULE_OP_MANGLE_PURGECHAR:
19323 return (-1);
19324 break;
19325
19326 case RULE_OP_MANGLE_TOGGLECASE_REC:
19327 return (-1);
19328 break;
19329
19330 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19331 SET_NAME (rule, rule_buf[rule_pos]);
19332 SET_P0_CONV (rule, rule_buf[rule_pos]);
19333 break;
19334
19335 case RULE_OP_MANGLE_DUPECHAR_LAST:
19336 SET_NAME (rule, rule_buf[rule_pos]);
19337 SET_P0_CONV (rule, rule_buf[rule_pos]);
19338 break;
19339
19340 case RULE_OP_MANGLE_DUPECHAR_ALL:
19341 SET_NAME (rule, rule_buf[rule_pos]);
19342 break;
19343
19344 case RULE_OP_MANGLE_SWITCH_FIRST:
19345 SET_NAME (rule, rule_buf[rule_pos]);
19346 break;
19347
19348 case RULE_OP_MANGLE_SWITCH_LAST:
19349 SET_NAME (rule, rule_buf[rule_pos]);
19350 break;
19351
19352 case RULE_OP_MANGLE_SWITCH_AT:
19353 SET_NAME (rule, rule_buf[rule_pos]);
19354 SET_P0_CONV (rule, rule_buf[rule_pos]);
19355 SET_P1_CONV (rule, rule_buf[rule_pos]);
19356 break;
19357
19358 case RULE_OP_MANGLE_CHR_SHIFTL:
19359 SET_NAME (rule, rule_buf[rule_pos]);
19360 SET_P0_CONV (rule, rule_buf[rule_pos]);
19361 break;
19362
19363 case RULE_OP_MANGLE_CHR_SHIFTR:
19364 SET_NAME (rule, rule_buf[rule_pos]);
19365 SET_P0_CONV (rule, rule_buf[rule_pos]);
19366 break;
19367
19368 case RULE_OP_MANGLE_CHR_INCR:
19369 SET_NAME (rule, rule_buf[rule_pos]);
19370 SET_P0_CONV (rule, rule_buf[rule_pos]);
19371 break;
19372
19373 case RULE_OP_MANGLE_CHR_DECR:
19374 SET_NAME (rule, rule_buf[rule_pos]);
19375 SET_P0_CONV (rule, rule_buf[rule_pos]);
19376 break;
19377
19378 case RULE_OP_MANGLE_REPLACE_NP1:
19379 SET_NAME (rule, rule_buf[rule_pos]);
19380 SET_P0_CONV (rule, rule_buf[rule_pos]);
19381 break;
19382
19383 case RULE_OP_MANGLE_REPLACE_NM1:
19384 SET_NAME (rule, rule_buf[rule_pos]);
19385 SET_P0_CONV (rule, rule_buf[rule_pos]);
19386 break;
19387
19388 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19389 SET_NAME (rule, rule_buf[rule_pos]);
19390 SET_P0_CONV (rule, rule_buf[rule_pos]);
19391 break;
19392
19393 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19394 SET_NAME (rule, rule_buf[rule_pos]);
19395 SET_P0_CONV (rule, rule_buf[rule_pos]);
19396 break;
19397
19398 case RULE_OP_MANGLE_TITLE:
19399 SET_NAME (rule, rule_buf[rule_pos]);
19400 break;
19401
19402 default:
19403 return (-1);
19404 break;
19405 }
19406 }
19407
19408 if (rule_pos < rule_len) return (-1);
19409
19410 return (0);
19411 }
19412
19413 int kernel_rule_to_cpu_rule (char rule_buf[BUFSIZ], kernel_rule_t *rule)
19414 {
19415 uint rule_cnt;
19416 uint rule_pos;
19417 uint rule_len = BUFSIZ - 1; // maximum possible len
19418
19419 char rule_cmd;
19420
19421 for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_KERNEL_RULES; rule_pos++, rule_cnt++)
19422 {
19423 GET_NAME (rule);
19424
19425 if (rule_cnt > 0) rule_buf[rule_pos++] = ' ';
19426
19427 switch (rule_cmd)
19428 {
19429 case RULE_OP_MANGLE_NOOP:
19430 rule_buf[rule_pos] = rule_cmd;
19431 break;
19432
19433 case RULE_OP_MANGLE_LREST:
19434 rule_buf[rule_pos] = rule_cmd;
19435 break;
19436
19437 case RULE_OP_MANGLE_UREST:
19438 rule_buf[rule_pos] = rule_cmd;
19439 break;
19440
19441 case RULE_OP_MANGLE_LREST_UFIRST:
19442 rule_buf[rule_pos] = rule_cmd;
19443 break;
19444
19445 case RULE_OP_MANGLE_UREST_LFIRST:
19446 rule_buf[rule_pos] = rule_cmd;
19447 break;
19448
19449 case RULE_OP_MANGLE_TREST:
19450 rule_buf[rule_pos] = rule_cmd;
19451 break;
19452
19453 case RULE_OP_MANGLE_TOGGLE_AT:
19454 rule_buf[rule_pos] = rule_cmd;
19455 GET_P0_CONV (rule);
19456 break;
19457
19458 case RULE_OP_MANGLE_REVERSE:
19459 rule_buf[rule_pos] = rule_cmd;
19460 break;
19461
19462 case RULE_OP_MANGLE_DUPEWORD:
19463 rule_buf[rule_pos] = rule_cmd;
19464 break;
19465
19466 case RULE_OP_MANGLE_DUPEWORD_TIMES:
19467 rule_buf[rule_pos] = rule_cmd;
19468 GET_P0_CONV (rule);
19469 break;
19470
19471 case RULE_OP_MANGLE_REFLECT:
19472 rule_buf[rule_pos] = rule_cmd;
19473 break;
19474
19475 case RULE_OP_MANGLE_ROTATE_LEFT:
19476 rule_buf[rule_pos] = rule_cmd;
19477 break;
19478
19479 case RULE_OP_MANGLE_ROTATE_RIGHT:
19480 rule_buf[rule_pos] = rule_cmd;
19481 break;
19482
19483 case RULE_OP_MANGLE_APPEND:
19484 rule_buf[rule_pos] = rule_cmd;
19485 GET_P0 (rule);
19486 break;
19487
19488 case RULE_OP_MANGLE_PREPEND:
19489 rule_buf[rule_pos] = rule_cmd;
19490 GET_P0 (rule);
19491 break;
19492
19493 case RULE_OP_MANGLE_DELETE_FIRST:
19494 rule_buf[rule_pos] = rule_cmd;
19495 break;
19496
19497 case RULE_OP_MANGLE_DELETE_LAST:
19498 rule_buf[rule_pos] = rule_cmd;
19499 break;
19500
19501 case RULE_OP_MANGLE_DELETE_AT:
19502 rule_buf[rule_pos] = rule_cmd;
19503 GET_P0_CONV (rule);
19504 break;
19505
19506 case RULE_OP_MANGLE_EXTRACT:
19507 rule_buf[rule_pos] = rule_cmd;
19508 GET_P0_CONV (rule);
19509 GET_P1_CONV (rule);
19510 break;
19511
19512 case RULE_OP_MANGLE_OMIT:
19513 rule_buf[rule_pos] = rule_cmd;
19514 GET_P0_CONV (rule);
19515 GET_P1_CONV (rule);
19516 break;
19517
19518 case RULE_OP_MANGLE_INSERT:
19519 rule_buf[rule_pos] = rule_cmd;
19520 GET_P0_CONV (rule);
19521 GET_P1 (rule);
19522 break;
19523
19524 case RULE_OP_MANGLE_OVERSTRIKE:
19525 rule_buf[rule_pos] = rule_cmd;
19526 GET_P0_CONV (rule);
19527 GET_P1 (rule);
19528 break;
19529
19530 case RULE_OP_MANGLE_TRUNCATE_AT:
19531 rule_buf[rule_pos] = rule_cmd;
19532 GET_P0_CONV (rule);
19533 break;
19534
19535 case RULE_OP_MANGLE_REPLACE:
19536 rule_buf[rule_pos] = rule_cmd;
19537 GET_P0 (rule);
19538 GET_P1 (rule);
19539 break;
19540
19541 case RULE_OP_MANGLE_PURGECHAR:
19542 return (-1);
19543 break;
19544
19545 case RULE_OP_MANGLE_TOGGLECASE_REC:
19546 return (-1);
19547 break;
19548
19549 case RULE_OP_MANGLE_DUPECHAR_FIRST:
19550 rule_buf[rule_pos] = rule_cmd;
19551 GET_P0_CONV (rule);
19552 break;
19553
19554 case RULE_OP_MANGLE_DUPECHAR_LAST:
19555 rule_buf[rule_pos] = rule_cmd;
19556 GET_P0_CONV (rule);
19557 break;
19558
19559 case RULE_OP_MANGLE_DUPECHAR_ALL:
19560 rule_buf[rule_pos] = rule_cmd;
19561 break;
19562
19563 case RULE_OP_MANGLE_SWITCH_FIRST:
19564 rule_buf[rule_pos] = rule_cmd;
19565 break;
19566
19567 case RULE_OP_MANGLE_SWITCH_LAST:
19568 rule_buf[rule_pos] = rule_cmd;
19569 break;
19570
19571 case RULE_OP_MANGLE_SWITCH_AT:
19572 rule_buf[rule_pos] = rule_cmd;
19573 GET_P0_CONV (rule);
19574 GET_P1_CONV (rule);
19575 break;
19576
19577 case RULE_OP_MANGLE_CHR_SHIFTL:
19578 rule_buf[rule_pos] = rule_cmd;
19579 GET_P0_CONV (rule);
19580 break;
19581
19582 case RULE_OP_MANGLE_CHR_SHIFTR:
19583 rule_buf[rule_pos] = rule_cmd;
19584 GET_P0_CONV (rule);
19585 break;
19586
19587 case RULE_OP_MANGLE_CHR_INCR:
19588 rule_buf[rule_pos] = rule_cmd;
19589 GET_P0_CONV (rule);
19590 break;
19591
19592 case RULE_OP_MANGLE_CHR_DECR:
19593 rule_buf[rule_pos] = rule_cmd;
19594 GET_P0_CONV (rule);
19595 break;
19596
19597 case RULE_OP_MANGLE_REPLACE_NP1:
19598 rule_buf[rule_pos] = rule_cmd;
19599 GET_P0_CONV (rule);
19600 break;
19601
19602 case RULE_OP_MANGLE_REPLACE_NM1:
19603 rule_buf[rule_pos] = rule_cmd;
19604 GET_P0_CONV (rule);
19605 break;
19606
19607 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
19608 rule_buf[rule_pos] = rule_cmd;
19609 GET_P0_CONV (rule);
19610 break;
19611
19612 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
19613 rule_buf[rule_pos] = rule_cmd;
19614 GET_P0_CONV (rule);
19615 break;
19616
19617 case RULE_OP_MANGLE_TITLE:
19618 rule_buf[rule_pos] = rule_cmd;
19619 break;
19620
19621 case 0:
19622 return rule_pos - 1;
19623 break;
19624
19625 default:
19626 return (-1);
19627 break;
19628 }
19629 }
19630
19631 if (rule_cnt > 0)
19632 {
19633 return rule_pos;
19634 }
19635
19636 return (-1);
19637 }
19638
19639 /**
19640 * CPU rules : this is from hashcat sources, cpu based rules
19641 */
19642
19643 #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
19644 #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
19645
19646 #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
19647 #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
19648 #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
19649
19650 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
19651 /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
19652 #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
19653
19654 int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
19655 {
19656 int pos;
19657
19658 for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
19659
19660 return (arr_len);
19661 }
19662
19663 int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
19664 {
19665 int pos;
19666
19667 for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
19668
19669 return (arr_len);
19670 }
19671
19672 int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
19673 {
19674 int pos;
19675
19676 for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
19677
19678 return (arr_len);
19679 }
19680
19681 int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
19682 {
19683 int l;
19684 int r;
19685
19686 for (l = 0; l < arr_len; l++)
19687 {
19688 r = arr_len - 1 - l;
19689
19690 if (l >= r) break;
19691
19692 MANGLE_SWITCH (arr, l, r);
19693 }
19694
19695 return (arr_len);
19696 }
19697
19698 int mangle_double (char arr[BLOCK_SIZE], int arr_len)
19699 {
19700 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19701
19702 memcpy (&arr[arr_len], arr, (size_t) arr_len);
19703
19704 return (arr_len * 2);
19705 }
19706
19707 int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
19708 {
19709 if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
19710
19711 int orig_len = arr_len;
19712
19713 int i;
19714
19715 for (i = 0; i < times; i++)
19716 {
19717 memcpy (&arr[arr_len], arr, orig_len);
19718
19719 arr_len += orig_len;
19720 }
19721
19722 return (arr_len);
19723 }
19724
19725 int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
19726 {
19727 if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
19728
19729 mangle_double (arr, arr_len);
19730
19731 mangle_reverse (arr + arr_len, arr_len);
19732
19733 return (arr_len * 2);
19734 }
19735
19736 int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
19737 {
19738 int l;
19739 int r;
19740
19741 for (l = 0, r = arr_len - 1; r > 0; r--)
19742 {
19743 MANGLE_SWITCH (arr, l, r);
19744 }
19745
19746 return (arr_len);
19747 }
19748
19749 int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
19750 {
19751 int l;
19752 int r;
19753
19754 for (l = 0, r = arr_len - 1; l < r; l++)
19755 {
19756 MANGLE_SWITCH (arr, l, r);
19757 }
19758
19759 return (arr_len);
19760 }
19761
19762 int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
19763 {
19764 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19765
19766 arr[arr_len] = c;
19767
19768 return (arr_len + 1);
19769 }
19770
19771 int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
19772 {
19773 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19774
19775 int arr_pos;
19776
19777 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19778 {
19779 arr[arr_pos + 1] = arr[arr_pos];
19780 }
19781
19782 arr[0] = c;
19783
19784 return (arr_len + 1);
19785 }
19786
19787 int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19788 {
19789 if (upos >= arr_len) return (arr_len);
19790
19791 int arr_pos;
19792
19793 for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
19794 {
19795 arr[arr_pos] = arr[arr_pos + 1];
19796 }
19797
19798 return (arr_len - 1);
19799 }
19800
19801 int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19802 {
19803 if (upos >= arr_len) return (arr_len);
19804
19805 if ((upos + ulen) > arr_len) return (arr_len);
19806
19807 int arr_pos;
19808
19809 for (arr_pos = 0; arr_pos < ulen; arr_pos++)
19810 {
19811 arr[arr_pos] = arr[upos + arr_pos];
19812 }
19813
19814 return (ulen);
19815 }
19816
19817 int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19818 {
19819 if (upos >= arr_len) return (arr_len);
19820
19821 if ((upos + ulen) >= arr_len) return (arr_len);
19822
19823 int arr_pos;
19824
19825 for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
19826 {
19827 arr[arr_pos] = arr[arr_pos + ulen];
19828 }
19829
19830 return (arr_len - ulen);
19831 }
19832
19833 int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19834 {
19835 if (upos >= arr_len) return (arr_len);
19836
19837 if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
19838
19839 int arr_pos;
19840
19841 for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
19842 {
19843 arr[arr_pos + 1] = arr[arr_pos];
19844 }
19845
19846 arr[upos] = c;
19847
19848 return (arr_len + 1);
19849 }
19850
19851 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)
19852 {
19853 if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
19854
19855 if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
19856
19857 if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
19858
19859 if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
19860
19861 if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
19862
19863 memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
19864
19865 memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
19866
19867 memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
19868
19869 return (arr_len + arr2_cpy);
19870 }
19871
19872 int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
19873 {
19874 if (upos >= arr_len) return (arr_len);
19875
19876 arr[upos] = c;
19877
19878 return (arr_len);
19879 }
19880
19881 int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
19882 {
19883 if (upos >= arr_len) return (arr_len);
19884
19885 memset (arr + upos, 0, arr_len - upos);
19886
19887 return (upos);
19888 }
19889
19890 int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
19891 {
19892 int arr_pos;
19893
19894 for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
19895 {
19896 if (arr[arr_pos] != oldc) continue;
19897
19898 arr[arr_pos] = newc;
19899 }
19900
19901 return (arr_len);
19902 }
19903
19904 int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
19905 {
19906 int arr_pos;
19907
19908 int ret_len;
19909
19910 for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
19911 {
19912 if (arr[arr_pos] == c) continue;
19913
19914 arr[ret_len] = arr[arr_pos];
19915
19916 ret_len++;
19917 }
19918
19919 return (ret_len);
19920 }
19921
19922 int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
19923 {
19924 if (ulen > arr_len) return (arr_len);
19925
19926 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19927
19928 char cs[100];
19929
19930 memcpy (cs, arr, ulen);
19931
19932 int i;
19933
19934 for (i = 0; i < ulen; i++)
19935 {
19936 char c = cs[i];
19937
19938 arr_len = mangle_insert (arr, arr_len, i, c);
19939 }
19940
19941 return (arr_len);
19942 }
19943
19944 int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
19945 {
19946 if (ulen > arr_len) return (arr_len);
19947
19948 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19949
19950 int upos = arr_len - ulen;
19951
19952 int i;
19953
19954 for (i = 0; i < ulen; i++)
19955 {
19956 char c = arr[upos + i];
19957
19958 arr_len = mangle_append (arr, arr_len, c);
19959 }
19960
19961 return (arr_len);
19962 }
19963
19964 int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
19965 {
19966 if ( arr_len == 0) return (arr_len);
19967 if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
19968
19969 char c = arr[upos];
19970
19971 int i;
19972
19973 for (i = 0; i < ulen; i++)
19974 {
19975 arr_len = mangle_insert (arr, arr_len, upos, c);
19976 }
19977
19978 return (arr_len);
19979 }
19980
19981 int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
19982 {
19983 if ( arr_len == 0) return (arr_len);
19984 if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
19985
19986 int arr_pos;
19987
19988 for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
19989 {
19990 int new_pos = arr_pos * 2;
19991
19992 arr[new_pos] = arr[arr_pos];
19993
19994 arr[new_pos + 1] = arr[arr_pos];
19995 }
19996
19997 return (arr_len * 2);
19998 }
19999
20000 int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20001 {
20002 if (upos >= arr_len) return (arr_len);
20003 if (upos2 >= arr_len) return (arr_len);
20004
20005 MANGLE_SWITCH (arr, upos, upos2);
20006
20007 return (arr_len);
20008 }
20009
20010 int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
20011 {
20012 MANGLE_SWITCH (arr, upos, upos2);
20013
20014 return (arr_len);
20015 }
20016
20017 int mangle_chr_shiftl (char arr[BLOCK_SIZE], int arr_len, int upos)
20018 {
20019 if (upos >= arr_len) return (arr_len);
20020
20021 arr[upos] <<= 1;
20022
20023 return (arr_len);
20024 }
20025
20026 int mangle_chr_shiftr (char arr[BLOCK_SIZE], int arr_len, int upos)
20027 {
20028 if (upos >= arr_len) return (arr_len);
20029
20030 arr[upos] >>= 1;
20031
20032 return (arr_len);
20033 }
20034
20035 int mangle_chr_incr (char arr[BLOCK_SIZE], int arr_len, int upos)
20036 {
20037 if (upos >= arr_len) return (arr_len);
20038
20039 arr[upos] += 1;
20040
20041 return (arr_len);
20042 }
20043
20044 int mangle_chr_decr (char arr[BLOCK_SIZE], int arr_len, int upos)
20045 {
20046 if (upos >= arr_len) return (arr_len);
20047
20048 arr[upos] -= 1;
20049
20050 return (arr_len);
20051 }
20052
20053 int mangle_title (char arr[BLOCK_SIZE], int arr_len)
20054 {
20055 int upper_next = 1;
20056
20057 int pos;
20058
20059 for (pos = 0; pos < arr_len; pos++)
20060 {
20061 if (arr[pos] == ' ')
20062 {
20063 upper_next = 1;
20064
20065 continue;
20066 }
20067
20068 if (upper_next)
20069 {
20070 upper_next = 0;
20071
20072 MANGLE_UPPER_AT (arr, pos);
20073 }
20074 else
20075 {
20076 MANGLE_LOWER_AT (arr, pos);
20077 }
20078 }
20079
20080 return (arr_len);
20081 }
20082
20083 int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], u32 rp_gen_func_min, u32 rp_gen_func_max)
20084 {
20085 u32 rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
20086
20087 u32 j;
20088
20089 u32 rule_pos = 0;
20090
20091 for (j = 0; j < rp_gen_num; j++)
20092 {
20093 u32 r = 0;
20094 u32 p1 = 0;
20095 u32 p2 = 0;
20096 u32 p3 = 0;
20097
20098 switch ((char) get_random_num (0, 9))
20099 {
20100 case 0:
20101 r = get_random_num (0, sizeof (grp_op_nop));
20102 rule_buf[rule_pos++] = grp_op_nop[r];
20103 break;
20104
20105 case 1:
20106 r = get_random_num (0, sizeof (grp_op_pos_p0));
20107 rule_buf[rule_pos++] = grp_op_pos_p0[r];
20108 p1 = get_random_num (0, sizeof (grp_pos));
20109 rule_buf[rule_pos++] = grp_pos[p1];
20110 break;
20111
20112 case 2:
20113 r = get_random_num (0, sizeof (grp_op_pos_p1));
20114 rule_buf[rule_pos++] = grp_op_pos_p1[r];
20115 p1 = get_random_num (1, 6);
20116 rule_buf[rule_pos++] = grp_pos[p1];
20117 break;
20118
20119 case 3:
20120 r = get_random_num (0, sizeof (grp_op_chr));
20121 rule_buf[rule_pos++] = grp_op_chr[r];
20122 p1 = get_random_num (0x20, 0x7e);
20123 rule_buf[rule_pos++] = (char) p1;
20124 break;
20125
20126 case 4:
20127 r = get_random_num (0, sizeof (grp_op_chr_chr));
20128 rule_buf[rule_pos++] = grp_op_chr_chr[r];
20129 p1 = get_random_num (0x20, 0x7e);
20130 rule_buf[rule_pos++] = (char) p1;
20131 p2 = get_random_num (0x20, 0x7e);
20132 while (p1 == p2)
20133 p2 = get_random_num (0x20, 0x7e);
20134 rule_buf[rule_pos++] = (char) p2;
20135 break;
20136
20137 case 5:
20138 r = get_random_num (0, sizeof (grp_op_pos_chr));
20139 rule_buf[rule_pos++] = grp_op_pos_chr[r];
20140 p1 = get_random_num (0, sizeof (grp_pos));
20141 rule_buf[rule_pos++] = grp_pos[p1];
20142 p2 = get_random_num (0x20, 0x7e);
20143 rule_buf[rule_pos++] = (char) p2;
20144 break;
20145
20146 case 6:
20147 r = get_random_num (0, sizeof (grp_op_pos_pos0));
20148 rule_buf[rule_pos++] = grp_op_pos_pos0[r];
20149 p1 = get_random_num (0, sizeof (grp_pos));
20150 rule_buf[rule_pos++] = grp_pos[p1];
20151 p2 = get_random_num (0, sizeof (grp_pos));
20152 while (p1 == p2)
20153 p2 = get_random_num (0, sizeof (grp_pos));
20154 rule_buf[rule_pos++] = grp_pos[p2];
20155 break;
20156
20157 case 7:
20158 r = get_random_num (0, sizeof (grp_op_pos_pos1));
20159 rule_buf[rule_pos++] = grp_op_pos_pos1[r];
20160 p1 = get_random_num (0, sizeof (grp_pos));
20161 rule_buf[rule_pos++] = grp_pos[p1];
20162 p2 = get_random_num (1, sizeof (grp_pos));
20163 while (p1 == p2)
20164 p2 = get_random_num (1, sizeof (grp_pos));
20165 rule_buf[rule_pos++] = grp_pos[p2];
20166 break;
20167
20168 case 8:
20169 r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
20170 rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
20171 p1 = get_random_num (0, sizeof (grp_pos));
20172 rule_buf[rule_pos++] = grp_pos[p1];
20173 p2 = get_random_num (1, sizeof (grp_pos));
20174 rule_buf[rule_pos++] = grp_pos[p1];
20175 p3 = get_random_num (0, sizeof (grp_pos));
20176 rule_buf[rule_pos++] = grp_pos[p3];
20177 break;
20178 }
20179 }
20180
20181 return (rule_pos);
20182 }
20183
20184 int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
20185 {
20186 char mem[BLOCK_SIZE];
20187
20188 if (in == NULL) return (RULE_RC_REJECT_ERROR);
20189
20190 if (out == NULL) return (RULE_RC_REJECT_ERROR);
20191
20192 if (in_len < 1) return (RULE_RC_REJECT_ERROR);
20193
20194 if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
20195
20196 int out_len = in_len;
20197 int mem_len = in_len;
20198
20199 memcpy (out, in, out_len);
20200
20201 int rule_pos;
20202
20203 for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
20204 {
20205 int upos; int upos2;
20206 int ulen;
20207
20208 switch (rule[rule_pos])
20209 {
20210 case ' ':
20211 break;
20212
20213 case RULE_OP_MANGLE_NOOP:
20214 break;
20215
20216 case RULE_OP_MANGLE_LREST:
20217 out_len = mangle_lrest (out, out_len);
20218 break;
20219
20220 case RULE_OP_MANGLE_UREST:
20221 out_len = mangle_urest (out, out_len);
20222 break;
20223
20224 case RULE_OP_MANGLE_LREST_UFIRST:
20225 out_len = mangle_lrest (out, out_len);
20226 if (out_len) MANGLE_UPPER_AT (out, 0);
20227 break;
20228
20229 case RULE_OP_MANGLE_UREST_LFIRST:
20230 out_len = mangle_urest (out, out_len);
20231 if (out_len) MANGLE_LOWER_AT (out, 0);
20232 break;
20233
20234 case RULE_OP_MANGLE_TREST:
20235 out_len = mangle_trest (out, out_len);
20236 break;
20237
20238 case RULE_OP_MANGLE_TOGGLE_AT:
20239 NEXT_RULEPOS (rule_pos);
20240 NEXT_RPTOI (rule, rule_pos, upos);
20241 if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
20242 break;
20243
20244 case RULE_OP_MANGLE_REVERSE:
20245 out_len = mangle_reverse (out, out_len);
20246 break;
20247
20248 case RULE_OP_MANGLE_DUPEWORD:
20249 out_len = mangle_double (out, out_len);
20250 break;
20251
20252 case RULE_OP_MANGLE_DUPEWORD_TIMES:
20253 NEXT_RULEPOS (rule_pos);
20254 NEXT_RPTOI (rule, rule_pos, ulen);
20255 out_len = mangle_double_times (out, out_len, ulen);
20256 break;
20257
20258 case RULE_OP_MANGLE_REFLECT:
20259 out_len = mangle_reflect (out, out_len);
20260 break;
20261
20262 case RULE_OP_MANGLE_ROTATE_LEFT:
20263 mangle_rotate_left (out, out_len);
20264 break;
20265
20266 case RULE_OP_MANGLE_ROTATE_RIGHT:
20267 mangle_rotate_right (out, out_len);
20268 break;
20269
20270 case RULE_OP_MANGLE_APPEND:
20271 NEXT_RULEPOS (rule_pos);
20272 out_len = mangle_append (out, out_len, rule[rule_pos]);
20273 break;
20274
20275 case RULE_OP_MANGLE_PREPEND:
20276 NEXT_RULEPOS (rule_pos);
20277 out_len = mangle_prepend (out, out_len, rule[rule_pos]);
20278 break;
20279
20280 case RULE_OP_MANGLE_DELETE_FIRST:
20281 out_len = mangle_delete_at (out, out_len, 0);
20282 break;
20283
20284 case RULE_OP_MANGLE_DELETE_LAST:
20285 out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
20286 break;
20287
20288 case RULE_OP_MANGLE_DELETE_AT:
20289 NEXT_RULEPOS (rule_pos);
20290 NEXT_RPTOI (rule, rule_pos, upos);
20291 out_len = mangle_delete_at (out, out_len, upos);
20292 break;
20293
20294 case RULE_OP_MANGLE_EXTRACT:
20295 NEXT_RULEPOS (rule_pos);
20296 NEXT_RPTOI (rule, rule_pos, upos);
20297 NEXT_RULEPOS (rule_pos);
20298 NEXT_RPTOI (rule, rule_pos, ulen);
20299 out_len = mangle_extract (out, out_len, upos, ulen);
20300 break;
20301
20302 case RULE_OP_MANGLE_OMIT:
20303 NEXT_RULEPOS (rule_pos);
20304 NEXT_RPTOI (rule, rule_pos, upos);
20305 NEXT_RULEPOS (rule_pos);
20306 NEXT_RPTOI (rule, rule_pos, ulen);
20307 out_len = mangle_omit (out, out_len, upos, ulen);
20308 break;
20309
20310 case RULE_OP_MANGLE_INSERT:
20311 NEXT_RULEPOS (rule_pos);
20312 NEXT_RPTOI (rule, rule_pos, upos);
20313 NEXT_RULEPOS (rule_pos);
20314 out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
20315 break;
20316
20317 case RULE_OP_MANGLE_OVERSTRIKE:
20318 NEXT_RULEPOS (rule_pos);
20319 NEXT_RPTOI (rule, rule_pos, upos);
20320 NEXT_RULEPOS (rule_pos);
20321 out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
20322 break;
20323
20324 case RULE_OP_MANGLE_TRUNCATE_AT:
20325 NEXT_RULEPOS (rule_pos);
20326 NEXT_RPTOI (rule, rule_pos, upos);
20327 out_len = mangle_truncate_at (out, out_len, upos);
20328 break;
20329
20330 case RULE_OP_MANGLE_REPLACE:
20331 NEXT_RULEPOS (rule_pos);
20332 NEXT_RULEPOS (rule_pos);
20333 out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
20334 break;
20335
20336 case RULE_OP_MANGLE_PURGECHAR:
20337 NEXT_RULEPOS (rule_pos);
20338 out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
20339 break;
20340
20341 case RULE_OP_MANGLE_TOGGLECASE_REC:
20342 /* todo */
20343 break;
20344
20345 case RULE_OP_MANGLE_DUPECHAR_FIRST:
20346 NEXT_RULEPOS (rule_pos);
20347 NEXT_RPTOI (rule, rule_pos, ulen);
20348 out_len = mangle_dupechar_at (out, out_len, 0, ulen);
20349 break;
20350
20351 case RULE_OP_MANGLE_DUPECHAR_LAST:
20352 NEXT_RULEPOS (rule_pos);
20353 NEXT_RPTOI (rule, rule_pos, ulen);
20354 out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
20355 break;
20356
20357 case RULE_OP_MANGLE_DUPECHAR_ALL:
20358 out_len = mangle_dupechar (out, out_len);
20359 break;
20360
20361 case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
20362 NEXT_RULEPOS (rule_pos);
20363 NEXT_RPTOI (rule, rule_pos, ulen);
20364 out_len = mangle_dupeblock_prepend (out, out_len, ulen);
20365 break;
20366
20367 case RULE_OP_MANGLE_DUPEBLOCK_LAST:
20368 NEXT_RULEPOS (rule_pos);
20369 NEXT_RPTOI (rule, rule_pos, ulen);
20370 out_len = mangle_dupeblock_append (out, out_len, ulen);
20371 break;
20372
20373 case RULE_OP_MANGLE_SWITCH_FIRST:
20374 if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
20375 break;
20376
20377 case RULE_OP_MANGLE_SWITCH_LAST:
20378 if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
20379 break;
20380
20381 case RULE_OP_MANGLE_SWITCH_AT:
20382 NEXT_RULEPOS (rule_pos);
20383 NEXT_RPTOI (rule, rule_pos, upos);
20384 NEXT_RULEPOS (rule_pos);
20385 NEXT_RPTOI (rule, rule_pos, upos2);
20386 out_len = mangle_switch_at_check (out, out_len, upos, upos2);
20387 break;
20388
20389 case RULE_OP_MANGLE_CHR_SHIFTL:
20390 NEXT_RULEPOS (rule_pos);
20391 NEXT_RPTOI (rule, rule_pos, upos);
20392 mangle_chr_shiftl (out, out_len, upos);
20393 break;
20394
20395 case RULE_OP_MANGLE_CHR_SHIFTR:
20396 NEXT_RULEPOS (rule_pos);
20397 NEXT_RPTOI (rule, rule_pos, upos);
20398 mangle_chr_shiftr (out, out_len, upos);
20399 break;
20400
20401 case RULE_OP_MANGLE_CHR_INCR:
20402 NEXT_RULEPOS (rule_pos);
20403 NEXT_RPTOI (rule, rule_pos, upos);
20404 mangle_chr_incr (out, out_len, upos);
20405 break;
20406
20407 case RULE_OP_MANGLE_CHR_DECR:
20408 NEXT_RULEPOS (rule_pos);
20409 NEXT_RPTOI (rule, rule_pos, upos);
20410 mangle_chr_decr (out, out_len, upos);
20411 break;
20412
20413 case RULE_OP_MANGLE_REPLACE_NP1:
20414 NEXT_RULEPOS (rule_pos);
20415 NEXT_RPTOI (rule, rule_pos, upos);
20416 if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
20417 break;
20418
20419 case RULE_OP_MANGLE_REPLACE_NM1:
20420 NEXT_RULEPOS (rule_pos);
20421 NEXT_RPTOI (rule, rule_pos, upos);
20422 if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
20423 break;
20424
20425 case RULE_OP_MANGLE_TITLE:
20426 out_len = mangle_title (out, out_len);
20427 break;
20428
20429 case RULE_OP_MANGLE_EXTRACT_MEMORY:
20430 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20431 NEXT_RULEPOS (rule_pos);
20432 NEXT_RPTOI (rule, rule_pos, upos);
20433 NEXT_RULEPOS (rule_pos);
20434 NEXT_RPTOI (rule, rule_pos, ulen);
20435 NEXT_RULEPOS (rule_pos);
20436 NEXT_RPTOI (rule, rule_pos, upos2);
20437 if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
20438 break;
20439
20440 case RULE_OP_MANGLE_APPEND_MEMORY:
20441 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20442 if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20443 memcpy (out + out_len, mem, mem_len);
20444 out_len += mem_len;
20445 break;
20446
20447 case RULE_OP_MANGLE_PREPEND_MEMORY:
20448 if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
20449 if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
20450 memcpy (mem + mem_len, out, out_len);
20451 out_len += mem_len;
20452 memcpy (out, mem, out_len);
20453 break;
20454
20455 case RULE_OP_MEMORIZE_WORD:
20456 memcpy (mem, out, out_len);
20457 mem_len = out_len;
20458 break;
20459
20460 case RULE_OP_REJECT_LESS:
20461 NEXT_RULEPOS (rule_pos);
20462 NEXT_RPTOI (rule, rule_pos, upos);
20463 if (out_len > upos) return (RULE_RC_REJECT_ERROR);
20464 break;
20465
20466 case RULE_OP_REJECT_GREATER:
20467 NEXT_RULEPOS (rule_pos);
20468 NEXT_RPTOI (rule, rule_pos, upos);
20469 if (out_len < upos) return (RULE_RC_REJECT_ERROR);
20470 break;
20471
20472 case RULE_OP_REJECT_CONTAIN:
20473 NEXT_RULEPOS (rule_pos);
20474 if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
20475 break;
20476
20477 case RULE_OP_REJECT_NOT_CONTAIN:
20478 NEXT_RULEPOS (rule_pos);
20479 if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
20480 break;
20481
20482 case RULE_OP_REJECT_EQUAL_FIRST:
20483 NEXT_RULEPOS (rule_pos);
20484 if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20485 break;
20486
20487 case RULE_OP_REJECT_EQUAL_LAST:
20488 NEXT_RULEPOS (rule_pos);
20489 if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20490 break;
20491
20492 case RULE_OP_REJECT_EQUAL_AT:
20493 NEXT_RULEPOS (rule_pos);
20494 NEXT_RPTOI (rule, rule_pos, upos);
20495 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20496 NEXT_RULEPOS (rule_pos);
20497 if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
20498 break;
20499
20500 case RULE_OP_REJECT_CONTAINS:
20501 NEXT_RULEPOS (rule_pos);
20502 NEXT_RPTOI (rule, rule_pos, upos);
20503 if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
20504 NEXT_RULEPOS (rule_pos);
20505 int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
20506 if (cnt < upos) return (RULE_RC_REJECT_ERROR);
20507 break;
20508
20509 case RULE_OP_REJECT_MEMORY:
20510 if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
20511 break;
20512
20513 default:
20514 return (RULE_RC_SYNTAX_ERROR);
20515 break;
20516 }
20517 }
20518
20519 memset (out + out_len, 0, BLOCK_SIZE - out_len);
20520
20521 return (out_len);
20522 }